ADHOCw
What is ADHOC ?
ADHOC is a free software developed by the Interferometry Group of Marseille's Observatory.
ADHOC is the main software developed and used by the Interferometric Group of Marseille's Observatory to reduce the 3D data coming from Photon Counting or CCD observations. It contains also general 2D modules useful for simple imagery. It is commonly used to reduce CIGALE, TIGER and PYTHEAS observations.
ADHOC is the acronym for Analyse et Dépouillement Homogčne des Observations Cigale. ADHOC software has been designed in 1987 in order to reduce data from the scanning Pérot-Fabry instrument CIGALE build in Marseille's Observatory. Up to 1998, the successive versions of ADHOC run on DOS operating systems. Since 1998, the software migrated to Windows environnement..
ADHOC is able to reduce data from a number of large telescopes : 3m60 CFHT (Hawaii), 3m60 ESO (Chile), 1m50 ESO (Chile), 6m SAO (Russia), 1m93 OHP (France), 2m60 Byurakan (Armenia), 2m San Pedro Martir (Mexico), 1m50 Bosque Allegre (Argentina), 1m60 Mt Megantic (Canada), ... In 2001, about 150 papers in international magazines with external referees could refer to ADHOC software.
ADHOC concept is to minimize the training time for users. All the user interface is graphical and a very friendly and complete HTML help is available at every moment.
ADHOC software has been written by J. BOULESTEIX (Observatoire de Marseille) : boulesteix@oamp.fr .
ADHOCw present version is working on Windows 32 bits systems (95/98/NT/2000), uses multi-tasking and manages completely file sharing on networks. Direct dialog or macros can be used. There are no size limitations in the 3D dimensions of the data that ADHOCw can reduce. ADHOCw works mainly on 4 bytes floating values, witch offers a large dynamics for the data.
ADHOCw software is free of use and can be duplicated. Information of the interest of users is welcome and a user list is maintained by boulesteix@oamp.fr who will inform regularly of the availability of the new releases.
ADHOCw (ADHOC for Windows) code source is written in C with the Borland C++ Builder tool using the classical Microsoft Windows primitives.
ADHOCw allows simultaneous computations at the same time (16 simultaneous tasks maximum) and on the same shared files.
ADHOCw accepts batch macros which can be easily edited by the users.
System and hardware requirements for the Windows version
ADHOCw (ADHOC for windows) must run on Windows 32 bits operating systems (Windows 95/98, Windows NT or Windows 2000).
Executable code is compatible with Intel 80386, Intel 80486, Intel Pentium, Intel Pentium Pro, Intel Pentium II, Intel Celeron, Intel Pentium III, Intel Pentium IV, AMD Duron, AMD Althon and other Intel, AMD or Cyrix equivalent chips. Executable code is optimized for speed execution.
16 Mb memory for Windows 95/98 and 32 Mb memory for Windows NT/2000 is a minimum. 32-48 Mb and 64-96 Mb are respectively recommended. Tiny memory increases the frequency of swaps on disk and therefore reduces the execution speed of the programs.
1024 x 768 x 256 screen is recommended for 2D display. 1280 x 1024 x 256 screen is recommended for 3D display. Nevertheless, the software runs always with reduced screen dimensions. The recommended screen parameters for the different ADHOCw programs are :
| program | screen size | nb of colors | pixels per inch | |
| ADw2D | 2D display program | 1024x768 | 256 | 96 |
| ADw3D | 3D display program | 1280x1024 | 256 | 96 |
| ADwT1 | data reduction program | 800x600 | 16 | 96 |
| ADwFT | file translation program | 640x480 | 16 | 96 |
| ADwIPCS | photon counting acquisition program | 1280x1024 | 256 | 96 |
Printers available inside Windows are used by ADHOCw, but Window print screen programs (Pizzazp, Printscreen, ...) are recommended. One of these tools is available on the ADHOCw Internet access (http://www-obs.cnrs-mrs.fr)..
System and hardware requirements for the Linux version
The ADHOCl (ADHOC for Linux) version will be available at the end of the year 2001.
The main program dispatches tasks on other programs and modules. So only one program gives the access to all functions : its name is ADHOCW.EXE. The best is to run it from the shortcuts created during installation.

You can run a program by double-clicking on its name or by selecting it (one clock
only) and then clicking on the "Execute" button. The "Help" button
gives you access to the global ADHOCw HTML help.
Note that the indication below the executable file names represents the optimal screen
size and colors. If your system doesn't offer such a screen, or is the resolution is not
96 pixels per inch, a warning screen message will be displayed,
but you will nevertheless be able to run the program in a reduced display mode.
Note that several ADHOCw, ADw2D, ADw3D, ADwT1 or ADwFT programs can run at the same time, on the same directory (same data) or on different directories (different simultaneous treatments).
Shared files and network access
The ADHOC software manages completely the Windows networks : you can access and write (if permitted by the manager) to any data file located on another computer. All the files are completely shared in reading but locked only to one writing user at the same time. A good example of the macro syntax for network input and output files can be seen in the ADwT1 function C04.
Data reduction program ADwT1 and File translation program ADwFT allow batches. Batches are operations (macros) which are stored in advance in an ASCII file in order to be sequentially executed later. ADwT1 macros are very easy to create : after filling the parameters box of a given function, you can choose either to execute immediately the function by pressing the "Execute" button , either to write/append the macro code onto a batch/macro ADM ASCII file by pressing the "Store macro" button. The main ADwT1 menu allows you to run a batch/macro ADM file instead of a function by pressing the "Exec a batch file" button.
The macros have a simple syntax (a code operation and parameters), as examples show it. Macro comment lines are allowed. The file in which macros can be stored is an ASCII file of ADM suffix (AHOHCw macro). This ADM file can be edited easily by the user in order to generate new sequences.
In addition, it is possible to chain different ADM macro files defined in different directories in a global macro batch (ADB file).
Null values are values which are not displayed and not
taken in account during computations (for example pixels without valid measure). 2D and 3D
files can have null values.
For files containing floating values (new ADHOC, floating FITS), the null value is
-3.1E+38. All values less than -3.0E+38 are considered as null.
For files containing integer values (old ADHOC, integer FITS), the null value is -32768.
All values less than -32000 are considered as null.
Coordinates
The coordinates are numbered from 1 (never from 0) in ADHOCw. For instance, in a 256 x 256 x 24 cube, the valid user coordinates are 1 to 256 in X and Y and 1 to 24 in Z.
Input and output data file types
| Program | Accepted input file types | Created output file types |
|---|---|---|
| ADw2D | new ADHOCw (AD2,AD3) old ADHOC (DA2,DA3) FITS (any type) |
new ADHOCw (AD2,AD3) |
| ADw3D | new ADHOCw (AD2,AD3) FITS (any type) |
new ADHOCw (AD2,AD3) |
| ADwT1 | new ADHOCw (AD2,AD3) old ADHOC (DA2, DA3) |
new ADHOC (AD2,AD3) |
| ADwFT | new ADHOCw (AD2,AD3) old ADHOC (DA2,DA3) FITS (any type) IDL and binary (any type) ElCcompressed (Chile) |
new ADHOCw (AD2,AD3) old ADHOC (DA2,DA3) FITS (any type) IDL and binary (any type) ElC compressed (Chili) |
| ADwIPCS | new ADHOCw (AD2,AD3) old ADHOC (DA2,DA3) FITS (any type) IPCS coordinates (ADA, CIG) |
new ADHOCw (AD2,AD3) |
Read the new ADHOCw format characteristics, the old ADHOC format characteristics, the FITS format characteristics, the IDL/binary format characteristics.
ADHOCw files, formats and suffixes
All ADHOC files accept long names (up to 256 characters including the path). The extension must be less than 30 characters.
All ADHOC files can be shared and read or written from other computers through the network.
| Suffix | Type of file | Type of data | Description |
| AD1 | 1D data (profile) | ASCII | click here for AD1 format |
| AD2 | 2D data (image) | binary float | click here for AD2 structure |
| AD3 | 3D data (cube) | binary float | click here for AD3 structure |
| ADA | ADwIPCS photon counting acquisition | binary int | click here for ADA structure |
| ADB | ADwT1 global batch macro command | ASCII | click here for ADB structure |
| ADC | ADw2D context | binary | internal ADHOC system structure |
| ADH | ADwT1 Pytheas work | binary | internal ADHOC system structure |
| ADJ | ADw2D/ADw3D 16 colors user palette | binary | internal ADHOC system structure |
| ADK | ADw2D kinematical parameters | ASCII | internal ADHOC system structure |
| ADL | ADwT1 general logbook | ASCII | printable normal ASCII file |
| ADM | ADwT1 macro | ASCII | click here for ADM format |
| ADP | ADwT1 parameters | ASCII | click here for ADP format |
| ADQ | ADwT1 parameters (spare) | ASCII | click here for ADQ format |
| ADR | ADwT1 precession object list | binary | internal ADHOC system structure |
| ADS | ADwT1 seeing correction parameters | ASCII | click here for ADS format |
| ADT | ADwIPCS acquisition track logbook | ASCII | click here for ADT format |
| ADV | ADw2D crowns parameters | ASCII | click here for ADV format |
| ADX | ADwT1 photometric correction parameters | ASCII | click here for ADX format |
| ADZ | ADwT1 zones coordinates | ASCII | click here for ADZ format |
All ADHOCw help is in HTML. An internal simple HTML browser is incorporated to ADHOC. But the ADHOCw HTML help can be directly accessible to your favorite HTML browser (Netscape, IExplorer, ...) for extended operations (extraction of text or images, special printings, ...). The ADHOCw HTML help is located in the \adhocw\help\adhocw.htm file..
The SWHTML software used is a standalone free shareware. The author is jerry@iss.u-net.com.
You can also easily print your complete copy of the User's Manual.
Additional information : structure of the ADHOCw files
This document describes the different formats which are managed by the program ADHOCw
File Translator :
1) New ADHOCw format
2) Old ADHOC/Visu2/Visu3 format
3) Elc compressed format
4) IDL and binary formats. In this section examples to read or write
data are given for Fortran or C programmers.
5) FITS format
===================================================================
1) New ADHOCw data format :
The new ADHOCw data format will be the default files format for the new ADHOCw software
(Windows95/WindowsNT).
The new ADHOCw structure has been defined in order to optimize the read/write operations
from/to the hard disk.
a- Principle :
. the format is identical for 2-D and 3-D data
. data are stored as 4 bytes floating values (-3.4E381 to +3.4E381)
. parameters and comment are stored at the end of the file
. default suffixes for the new ADHOC files are *.AD2 (for 2-D) and *.AD3 (for 3-D)
b- Differences with the old ADHOC/VISU2/VISU3 format :
. data dynamics is no more limited to -32767 +32879
. comments can now be 127 characters (78 previously)
. separate parameter files are no more used
. size of the files is twice the previous
c- Compatibility :
. the structure is simple, in order to read easily ADHOCw files from user's programs
written in Fortran or Basic (without parameters & comments)
. the structure is IDL compatible (without parameters & comments)
d- C library :
. a C++ (object oriented C) library is available for users (binary and C code)
e- Structure :
. data : lx*ly*lz*4 bytes (lx,ly and lz are the dimension of the cube) (lz=0 for 2-D)
. parameters : 128 bytes
. comment : 128 bytes
==> so, the total length of the file is (lx*ly*lz)*4+256 bytes
f- Coding :
. as coding is different from PC and UNIX machines, the 4 first bytes of the parameters
(which contain an integer value representing the number of dimensions of the data) will be
used as test.
g- Parameters :
. all values are 4 bytes (integers, floats or character blocks)
. all integers are long integers (4 bytes)
. 10 first values are common for 2-D and 3-D files
. other values are specific to these different files
. values are compatible with old ADHOC files (*.DA2 and *.DA3)
For all files (2D and 3D) :
| location | bytes | type | mnemo | description | default |
| 0 | 0-3 | integer | nbdim | nb of dimensions | 3 |
| 1 | 4-7 | character | id1 | identification 1/2 | " " |
| 2 | 7-11 | character | id2 | identification 2/2 | " " |
| 3 | 12-15 | integer | lx | dimension in X | 256 |
| 4 | 16-19 | integer | ly | dimension in Y | 256 |
| 5 | 20-23 | integer | lz | dimension in Z | 24 |
| 6 | 24-27 | float | scale | arcsec/pixel | 1. |
| 7 | 28-31 | integer | ix0 | top-left corner | 0 |
| 8 | 32-35 | integer | iy0 | bottom-right corner | 0 |
| 9 | 36-39 | float | zoom | zoom | 1. |
Note : nbdim can be 2, 3, or -3
2 = 2-D
3 = 3-D ordered in spectra (Z*X*Y) [default for ADHOC]
-3 = 3-D ordered in channels (X*Y*Z)
For 2-D files :
| location | bytes | type | mnemo | description | default |
| 10 | 40-43 | integer | modevis | last visualization mode | 0 |
| 11 | 44-47 | float | thrshld | last threshold | 0. |
| 12 | 47-51 | float | step | last step | 1. |
| 13 | 52-55 | integer | nbiso | last nb of displayed isophotes | 256 |
| 14 | 56-59 | integer | pal | last displayed palette | 1 |
| 15 | 60-127 | unused |
Note : these values are just keeping the last displaying parameters (as for *.%%% VISU2 parameter files)
For 3-D files :
| location | bytes | type | mnemo | description | default |
| 10 | 40-43 | float | xl1 | lambda of the 1st channel (in Angstroems) | 6600. |
| 11 | 44-47 | float | xil | interfringe (in Angstroems) | 8.22 |
| 12 | 47-51 | float | vr0 | mean radial velocity of the object (km/s) | 0. |
| 13 | 52-55 | float | corrv | heliocentric RV correction (km/s) | 0. |
| 14 | 56-59 | float | p0 | PF interference order | 793. |
| 15 | 60-63 | float | xlp | reference lambda for p0 (in Angstroems) | 6563. |
| 16 | 64-67 | float | xl0 | observed zero-velocity lambda (in Angstroems) | 6563. |
| 17 | 68-71 | float | vr1 | radial velocity of the 1st channel (in km./s) | 0. |
| 18 | 72-75 | float | xik | interfringe (in km/s) | 386. |
| 19 | 76-127 | unused |
Note : these values are similar to *.%%3 ADHOC/VISU3 parameter files
h- Comments :
. 128 bytes
. when read or written, the 128th byte is automatically
forced to 0 (for C compatibility)
===================================================================
2) Old ADHOC-DOS/Visu2/Visu3 format :
a - structure des fichiers 2-D de type xxxxxxxx.DA2 : nl enregistrements (nl = dimension Y
= ydim) de npl valeurs (npl = dimension X = xdim). 1 valeur = 2 octets (integer*2)
b - structure des fichiers 3-D de type xxxxxxxx.DA3 : n enregistrements (n = nl*npl = nb
de pixels = xdim*ydim) de m valeurs (m = dimension Z = nb de canaux). 1 valeur = 2 octets
(integer*2)
c - fichier parametre 2-D de type xxxxxxxx.%%% : Il est cree par VISU2 s'il n'existe pas.
Ce fichier ASCII est imprimable et peut etre edite. Il contient 2
4 lignes :
. ligne 1 : dimension X, dimension Y (xdim, ydim) (format libre)
. ligne 2 : commentaire (78 caractres maxi) (format: a78 )
. ligne 3 : sauvegarde des niveaux de visualisation del'image par VISU2 (ligne eventuelle
automatiquement creee si absente).Format libre : contient 12 valeurs :seuil, pas, palette,
mode visualisation, mode logarithmique, zoom par rapport a 256, Xo coin HG fenetre, Yo
coin HG fenetre, seuil isophotes superposees, pas isophotes superposees, nombre
d'isophotes superposees, limite de qualite (masquage)
. ligne 4 : sauvegarde des inhibitions de niveaux de visualisation de VISU2 (ligne
eventuelle automatiquement creee si absente). Format libre : contient 15 valeurs.
d - fichier parametre 3-D de type xxxxxxxx.%%3 : Il peut ventuellement etre cree par
la fonction ADHOC No 74 s'il n'existe pas. Ce fichier ASCII est imprimable et peut etre
edite. Il contient 5 lignes :
. ligne 1 : idim, icarre, ix1, ix2, iy1, iy2, nc
. idim = dimension : TOUJOURS 3
. icarre = carre elementaire : TOUJOURS 1
. ix1 = TOUJOURS 1
. ix2 = dimension X
. iy1 = TOUJOURS 1
. iy2 = dimension Y
. nc = nombre de canaux
. ligne 2 : xikms, vr1, ckms, clamb, xlamb1, xilamb (format libre) ou:
. xikms = interfrange en km/s a la lambda observee
. vr1 = vitesse radiale du premier canal
. ckms = km/s par canal a la lambda observae
. clamb = A par canal a la lambda observee
. xlamb1 = longueur d'onde du premier canal
. xilamb = interfrange en A a la lambda observee
. ligne 3 : commentaire (78 caracteres maxi) (format: a78 )
. ligne 4 : identification (5 car.) et nom objet (20 car.) (format: a5,5x,a20 )
. ligne 5 : vitesse de correction au soleil (format libre). Cette cinquieme ligne ne sert
(si elle existe) que pour VISU3 pour corriger le tic de la mesure en VR qui se positionne
verticalement au dessus du profil trace. Cette cinquieme ligne peut etre absente, auquel
cas, il n'y aura pas de decalage de tic dans VISU3.
===================================================================
3) ElC compressed format :
These formats are special and come from La Silla Survey or Mexico observations. The are
also common on Sun-Unix data reduction software written by Etienne le Coarer.
Note that the begining of thses compressed files contains ASCII strings which indicate
some precious information (size of the image, scanning wavelength, identification of the
object). This information can be read easily from any ASCII text editor.
====================================================================
4) IDL and binary formats :
These formats are extremely simple : The 2D or 3D arrays are written in binary.
4 types of data formats are available :
. integers*2
. floats*4
. swapped integers*2 from Unix
. swapped floats*4 from Unix
Swapped UNix mode has 4 rules :
- bytes (and not bits) are swapped
- short int 16 values are looked in 4 bytes blocks (byte 1 [ab] and byte 2 [cd] are
[abcd])
- 4 bytes blocks (2*int16, 1*int32 or 1*float32) are swapped like this : [abcd] ->
[dcba]
- characters strings (for instance comments) are not swapped
Example of program in Fortran for 2D images and integers*2 and floats*4:
integer*2 itab(50)
dimension tab(50)
lx=50
ly=50
c opening output files
open (unit=21,file='int.idl',access='direct',
$recl=lx*2,status='unknown')
open (unit=22,file='float.idl',access='direct',
$recl=lx*4,status='unknown')
c array initialization
do 1 i=1,lx
itab(i)=i
tab(i)=i
1 continue
c writing the 2D data pixel
do 11 j=1,ly
write(21,rec=j)(itab(i),i=1,lx)
write(22,rec=j)(tab(i),i=1,lx)
11 continue
c closing files
close(21)
close(22)
end
Example of program in Fortran for 3D cubes and integers*2 and floats*4:
integer*2 itab(50,60)
dimension tab(50,60)
lx=50
ly=60
lz=24
c opening output files
open (unit=21,file='int.idl',access='direct',
$recl=lz*2,status='unknown')
open (unit=22,file='float.idl',access='direct',
$recl=lz*4,status='unknown')
c array initialization
do 1 k=1,lz
itab(k)=k
tab(k)=k
1 continue
c writing the 3D data profile
do 11 j=1,ly
do 11 i=1,lx
index=(j-1)*lx
write(21,rec=index)(itab(k),k=1,lz)
write(22,rec=index)(tab(k),k=1,lz)
11 continue
c closing files
close(21)
close(22)
end
Example of program in C++ for 2D images and integers*2 and floats*4:
{
int lx=50, ly=60, i, j;
float* tab;
short int* itab;
tab= new float [lx];
itab= new short int [lx];
// opening output files
lu_int=sopen("int.idl",O_BINARY,O_RDONLY,SH_DENYNONE);
lu_float=sopen("int.float",O_BINARY,O_RDONLY,SH_DENYNONE);
// array initialization
for (i=0; i<lx; i++)
{
itab[i]=i;
tab[i]=i;
}
// writing the 2D data pixel
for (j=0; j<ly; j++)
{
lseek(lu_int,2L*lx*j,SEEK_SET);
write(lu_int,itab,2L*lx);
lseek(lu_float,4L*lx*j,SEEK_SET);
write(lu_float,tab,4L*lx);
}
// closing files
close(lu_int);
close(lu_float);
delete [] itab;
delete [] tab;
}
Example of program in C++ for 3D cubes and integers*2 and floats*4:
{
int lx=50, ly=60, lz=24, i, j, k;
float* tab;
short int* itab;
tab= new float [lz];
itab= new short int [lz];
// opening output files
lu_int=sopen("int.idl",O_BINARY,O_RDONLY,SH_DENYNONE);
lu_float=sopen("int.float",O_BINARY,O_RDONLY,SH_DENYNONE);
// array initialization
for (k=0; k<lz; k++)
{
itab[k]=k;
tab[k]=k;
}
// writing the 3D data profile
for (j=0; j<ly; j++)
{
for (i=0; i<lx; i++)
{
lseek(lu_int,2L*(lx*j*lz+i*lz),SEEK_SET);
write(lu_int,itab,2L*lz);
lseek(lu_float,4L*(lx*j*lz+i*lz),SEEK_SET);
write(lu_float,tab,4L*lz);
}
}
// closing files
close(lu_int);
close(lu_float);
delete [] itab;
delete [] tab;
}
===================================================================
5) FITS format
ADHOCw File Translator accepts almost all of the FITS formats (floats 32 and 64, integers
8, 16 and 32).
FITS was first developed in the late 1970's as a standard data interchange format between
various astronomical observatories. Since then FITS has become the defacto standard data
format supported by most astronomical data analysis software packages.
A FITS file consists of one or more Header + Data Units (HDUs), where the first HDU is called the `Primary HDU', or `Primary Array'. The primary array contains an N-dimensional array of pixels, such as a 1-D spectrum, a 2-D image, or a 3-D data cube. Five different primary datatypes are supported: Unsigned 8-bit bytes, 16 and 32-bit signed integers, and 32 and 64-bit floating point reals.
Any number of additional HDUs may follow the primary array; these additional HDUs are
called FITS `extensions'. There are currently 3 types of extensions defined by the FITS
standard:
-
Image Extension - a N-dimensional array of pixels, like in a primary array
ASCII Table Extension - rows and columns of data in ASCII character format
Binary Table Extension - rows and columns of data in binary representation
-
In each case the HDU consists of an ASCII Header Unit followed by an optional Data Unit.
For historical reasons, each Header or Data unit must be an exact multiple of 2880 8-bit
bytes long. Any unused space is padded with fill characters (ASCII blanks or NULs
depending on the type of unit).
Each Header Unit consists of any number of 80-character keyword records or `card images'
(reminiscent of the 80-column punched cards which were prevalent when the FITS standard
was developed) which have the general form:
-
KEYNAME = value / comment string
-
The keyword names may be up to 8 characters long and can only contain uppercase letters,
the digits 0-9, the hyphen, and the underscore character. The keyword name is (usually)
followed by an equals sign and a space character (= ) in columns 9 - 10 of the record,
followed by the value of the keyword which may be either an integer, a floating point
number, a character string (enclosed in single quotes), or a boolian value (the letter T
or F). The last keyword in the header is always the `END' keyword which has no value or
comment fields. There are many rules governing the exact format of a keyword record (see
the NOST FITS Standard) so it is better to rely on standard interface software like FITSIO
to correctly construct or to parse the keyword records rather than try to deal directly
with the raw FITS formats.
Each Header Unit begins with a series of required keywords which depend on the type of
HDU. These required keywords specify the size and format of the following Data Unit. The
header many contain other optional keywords to describe other aspects of the data, such as
the units or scaling values. Other COMMENT or HISTORY keywords are also frequently added
to further document the data file.
The optional Data Unit immediately follows the last 2880-byte block in the Header Unit.
Some HDUs do not have a Data Unit and only consist of the Header Unit.
If there is more than one HDU in the FITS file, then the Header Unit of the next HDU
immediately follows the last 2880-byte block of the previous Data Unit (or Header Unit if
there is no Data Unit).
===================================================================
6) ADA and ADT photon counting formats
The ADA format (ADHOC Acquisition) is connected the photon counting acquisition program ADwIPCS.
The format is binary. There are 3 possible modes, which are automat˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙