wdm-1.28/configure 755 0 0 73125010221265060 136230ustar AlexeyVoinov 0 0#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for wdm 1.28. # # Report bugs to . # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='wdm' PACKAGE_TARNAME='wdm' PACKAGE_VERSION='1.28' PACKAGE_STRING='wdm 1.28' PACKAGE_BUGREPORT='voins@voins.program.ru' ac_unique_file="install-sh" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB XRDB_PATH XCONSOLE SHUTDOWN FAILSAFE_PATH DEF_SERVER SYSTEM_SHELL SHELL_BASH SHELL_LOGIN CPP EGREP PAMDIR PASSWDLIB USE_PAM SELINUX_LIBS SELINUX_CFLAGS X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS GETWINGSFLAGS XLIBS XCFLAGS XLDFLAGS WCFLAGS WLDFLAGS WLIBS LOGDIR RUNDIR DMDIR GFXDIR PIXMAPFILE PIXMAPCOMMENT WMAKER_PATH AFTERSTEP_PATH BLACKBOX_PATH ICEWM_PATH XSESSION_PATH STARTKDE_PATH WINMGR_PATH WINMGR_NAME WMLIST XGETTEXT MSGFMT I18N NLSDIR FAKEHOME LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_XRDB_PATH_set=${XRDB_PATH+set} ac_env_XRDB_PATH_value=$XRDB_PATH ac_cv_env_XRDB_PATH_set=${XRDB_PATH+set} ac_cv_env_XRDB_PATH_value=$XRDB_PATH ac_env_XCONSOLE_set=${XCONSOLE+set} ac_env_XCONSOLE_value=$XCONSOLE ac_cv_env_XCONSOLE_set=${XCONSOLE+set} ac_cv_env_XCONSOLE_value=$XCONSOLE ac_env_SHUTDOWN_set=${SHUTDOWN+set} ac_env_SHUTDOWN_value=$SHUTDOWN ac_cv_env_SHUTDOWN_set=${SHUTDOWN+set} ac_cv_env_SHUTDOWN_value=$SHUTDOWN ac_env_FAILSAFE_PATH_set=${FAILSAFE_PATH+set} ac_env_FAILSAFE_PATH_value=$FAILSAFE_PATH ac_cv_env_FAILSAFE_PATH_set=${FAILSAFE_PATH+set} ac_cv_env_FAILSAFE_PATH_value=$FAILSAFE_PATH ac_env_DEF_SERVER_set=${DEF_SERVER+set} ac_env_DEF_SERVER_value=$DEF_SERVER ac_cv_env_DEF_SERVER_set=${DEF_SERVER+set} ac_cv_env_DEF_SERVER_value=$DEF_SERVER ac_env_SYSTEM_SHELL_set=${SYSTEM_SHELL+set} ac_env_SYSTEM_SHELL_value=$SYSTEM_SHELL ac_cv_env_SYSTEM_SHELL_set=${SYSTEM_SHELL+set} ac_cv_env_SYSTEM_SHELL_value=$SYSTEM_SHELL ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_WMAKER_PATH_set=${WMAKER_PATH+set} ac_env_WMAKER_PATH_value=$WMAKER_PATH ac_cv_env_WMAKER_PATH_set=${WMAKER_PATH+set} ac_cv_env_WMAKER_PATH_value=$WMAKER_PATH ac_env_AFTERSTEP_PATH_set=${AFTERSTEP_PATH+set} ac_env_AFTERSTEP_PATH_value=$AFTERSTEP_PATH ac_cv_env_AFTERSTEP_PATH_set=${AFTERSTEP_PATH+set} ac_cv_env_AFTERSTEP_PATH_value=$AFTERSTEP_PATH ac_env_BLACKBOX_PATH_set=${BLACKBOX_PATH+set} ac_env_BLACKBOX_PATH_value=$BLACKBOX_PATH ac_cv_env_BLACKBOX_PATH_set=${BLACKBOX_PATH+set} ac_cv_env_BLACKBOX_PATH_value=$BLACKBOX_PATH ac_env_ICEWM_PATH_set=${ICEWM_PATH+set} ac_env_ICEWM_PATH_value=$ICEWM_PATH ac_cv_env_ICEWM_PATH_set=${ICEWM_PATH+set} ac_cv_env_ICEWM_PATH_value=$ICEWM_PATH ac_env_XSESSION_PATH_set=${XSESSION_PATH+set} ac_env_XSESSION_PATH_value=$XSESSION_PATH ac_cv_env_XSESSION_PATH_set=${XSESSION_PATH+set} ac_cv_env_XSESSION_PATH_value=$XSESSION_PATH # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures wdm 1.28 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of wdm 1.28:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-pam don't use PAM for authentication --disable-shadow don't use shadow for authentication --enable-selinux enable SELinux support --enable-debug enable debugging --disable-xinerama explicit disable use of libXinerama --enable-aafont enable support for antialiased fonts. --enable-exitlogin enable ExitLogin command in wdmLogin. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pamdir specify where pam directory is --with-x use the X Window System --with-logdir=PATH specify directory where logfile goes --with-runlockdir=PATH specify directory where run lock goes --with-defuserpath=PATHlist specify list of paths for user sessions --with-defsystempath=PATHlist specify list of paths for superuser sessions --with-wdmdir=PATH specify path for wdm directory --with-gfxdir=PATH specify path for pixmaps directory --with-Logo=PIXMAP_FILENAME specify file in wdm/pixmaps for Logo --with-winmgr=NAME_OF_WM specify an arbitrary window manager --with-winmgr_path=WINMGR_PATH specify path to your window manager --with-wmlist=LIST_OF_WM specify list of window managers --with-nlsdir=PATH specify where locale stuff should go --with-fakehome=PATH path to use as home when no HOME is present. /var/run/wdm Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory XRDB_PATH Path to xrdb program from X XCONSOLE Path to xconsole program SHUTDOWN Path to shutdown program FAILSAFE_PATH Path to program, that is used as failsafe client DEF_SERVER Path to default X server SYSTEM_SHELL Path to default shell CPP C preprocessor WMAKER_PATH Path to wmaker program AFTERSTEP_PATH Path to afterstep program BLACKBOX_PATH Path to blackbox program ICEWM_PATH Path to icewm program XSESSION_PATH Path to xsession program Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF wdm configure 1.28 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by wdm $as_me 1.28, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers include/config.h" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi # Extract the first word of "xrdb", so it can be a program name with args. set dummy xrdb; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_XRDB_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $XRDB_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_XRDB_PATH="$XRDB_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XRDB_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi XRDB_PATH=$ac_cv_path_XRDB_PATH if test -n "$XRDB_PATH"; then echo "$as_me:$LINENO: result: $XRDB_PATH" >&5 echo "${ECHO_T}$XRDB_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi cat >>confdefs.h <<_ACEOF #define XRDB_PROGRAM "$XRDB_PATH" _ACEOF # Extract the first word of "xconsole", so it can be a program name with args. set dummy xconsole; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_XCONSOLE+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $XCONSOLE in [\\/]* | ?:[\\/]*) ac_cv_path_XCONSOLE="$XCONSOLE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XCONSOLE="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi XCONSOLE=$ac_cv_path_XCONSOLE if test -n "$XCONSOLE"; then echo "$as_me:$LINENO: result: $XCONSOLE" >&5 echo "${ECHO_T}$XCONSOLE" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "shutdown", so it can be a program name with args. set dummy shutdown; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SHUTDOWN+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SHUTDOWN in [\\/]* | ?:[\\/]*) ac_cv_path_SHUTDOWN="$SHUTDOWN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/sbin:/usr/sbin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SHUTDOWN="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi SHUTDOWN=$ac_cv_path_SHUTDOWN if test -n "$SHUTDOWN"; then echo "$as_me:$LINENO: result: $SHUTDOWN" >&5 echo "${ECHO_T}$SHUTDOWN" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "xterm", so it can be a program name with args. set dummy xterm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_FAILSAFE_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $FAILSAFE_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_FAILSAFE_PATH="$FAILSAFE_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FAILSAFE_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi FAILSAFE_PATH=$ac_cv_path_FAILSAFE_PATH if test -n "$FAILSAFE_PATH"; then echo "$as_me:$LINENO: result: $FAILSAFE_PATH" >&5 echo "${ECHO_T}$FAILSAFE_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi cat >>confdefs.h <<_ACEOF #define DEF_FAILSAFE_CLIENT "$FAILSAFE_PATH" _ACEOF cat >>confdefs.h <<_ACEOF #define DEF_SESSION "$FAILSAFE_PATH -ls" _ACEOF # Extract the first word of "X", so it can be a program name with args. set dummy X; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_DEF_SERVER+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $DEF_SERVER in [\\/]* | ?:[\\/]*) ac_cv_path_DEF_SERVER="$DEF_SERVER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DEF_SERVER="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi DEF_SERVER=$ac_cv_path_DEF_SERVER if test -n "$DEF_SERVER"; then echo "$as_me:$LINENO: result: $DEF_SERVER" >&5 echo "${ECHO_T}$DEF_SERVER" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi cat >>confdefs.h <<_ACEOF #define DEF_SERVER_LINE ":0 local $DEF_SERVER :0" _ACEOF # Extract the first word of "sh", so it can be a program name with args. set dummy sh; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SYSTEM_SHELL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SYSTEM_SHELL in [\\/]* | ?:[\\/]*) ac_cv_path_SYSTEM_SHELL="$SYSTEM_SHELL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SYSTEM_SHELL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi SYSTEM_SHELL=$ac_cv_path_SYSTEM_SHELL if test -n "$SYSTEM_SHELL"; then echo "$as_me:$LINENO: result: $SYSTEM_SHELL" >&5 echo "${ECHO_T}$SYSTEM_SHELL" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SHELL_BASH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SHELL_BASH in [\\/]* | ?:[\\/]*) ac_cv_path_SHELL_BASH="$SHELL_BASH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SHELL_BASH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi SHELL_BASH=$ac_cv_path_SHELL_BASH if test -n "$SHELL_BASH"; then echo "$as_me:$LINENO: result: $SHELL_BASH" >&5 echo "${ECHO_T}$SHELL_BASH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$SYSTEM_SHELL" = "x"; then { { echo "$as_me:$LINENO: error: the program sh cannot be found" >&5 echo "$as_me: error: the program sh cannot be found" >&2;} { (exit 1); exit 1; }; } fi if test "x$SHELL_BASH" = "x"; then SHELL_LOGIN="$SYSTEM_SHELL -" else SHELL_LOGIN="$SHELL_BASH -login" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/param.h syslog.h libintl.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------- ## ## Report this to voins@voins.program.ru ## ## ------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done echo "$as_me:$LINENO: checking whether sys_siglist is declared" >&5 echo $ECHO_N "checking whether sys_siglist is declared... $ECHO_C" >&6 if test "${ac_cv_have_decl_sys_siglist+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* NetBSD declares sys_siglist in unistd.h. */ #if HAVE_UNISTD_H # include #endif int main () { #ifndef sys_siglist char *p = (char *) sys_siglist; (void)p; /* this removes 'unused var' warning */ #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_have_decl_sys_siglist=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_have_decl_sys_siglist=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_have_decl_sys_siglist" >&5 echo "${ECHO_T}$ac_cv_have_decl_sys_siglist" >&6 if test $ac_cv_have_decl_sys_siglist = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SYS_SIGLIST 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SYS_SIGLIST 0 _ACEOF fi echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t = (char *)0; /* removes 'used unitialized' warning */ char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; (void)s; /* this removes 'unused var' warning */ } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b = (struct s *)0; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; (void)foo; /* this removes 'unused var' warning */ } (void)x; /* this removes 'unused var' warning */ (void)zero; /* this removes 'unused var' warning */ #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6 if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((size_t *) 0) return 0; if (sizeof (size_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6 if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned _ACEOF fi echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 if test "${ac_cv_type_pid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { if ((pid_t *) 0) return 0; if (sizeof (pid_t)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6 if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi echo "$as_me:$LINENO: checking for mkstemp" >&5 echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6 if test "${ac_cv_func_mkstemp+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define mkstemp to an innocuous variant, in case declares mkstemp. For example, HP-UX 11i declares gettimeofday. */ #define mkstemp innocuous_mkstemp /* System header to define __stub macros and hopefully few prototypes, which can conflict with char mkstemp (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef mkstemp /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char mkstemp (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_mkstemp) || defined (__stub___mkstemp) choke me #else char (*f) () = mkstemp; #endif #ifdef __cplusplus } #endif int main () { return f != mkstemp; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_mkstemp=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef mkstemp /* Declare this function with same prototype as __builtin_mkstemp. This removes warning about conflicting type with builtin */ __typeof__(__builtin_mkstemp) mkstemp; __typeof__(__builtin_mkstemp) *f = mkstemp; #endif int main () { return f != __builtin_mkstemp; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_mkstemp=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_mkstemp=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_mkstemp" >&5 echo "${ECHO_T}$ac_cv_func_mkstemp" >&6 if test $ac_cv_func_mkstemp = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_MKSTEMP 1 _ACEOF fi # Check whether --enable-pam or --disable-pam was given. if test "${enable_pam+set}" = set; then enableval="$enable_pam" fi; # Check whether --enable-shadow or --disable-shadow was given. if test "${enable_shadow+set}" = set; then enableval="$enable_shadow" fi; # Check whether --with-pamdir or --without-pamdir was given. if test "${with_pamdir+set}" = set; then withval="$with_pamdir" PAMDIR="$withval" else PAMDIR="/etc/pam.d" fi; USE_PAM=no if test "$enable_pam" != "no" -a "$enable_shadow" != "yes" \ || test "$enable_pam" = "yes" -a "$enable_shadow" = "yes"; then echo "$as_me:$LINENO: checking for main in -lpam" >&5 echo $ECHO_N "checking for main in -lpam... $ECHO_C" >&6 if test "${ac_cv_lib_pam_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpam -ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_pam_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pam_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_pam_main" >&5 echo "${ECHO_T}$ac_cv_lib_pam_main" >&6 if test $ac_cv_lib_pam_main = yes; then USE_PAM=yes PASSWDLIB="-lpam -ldl" cat >>confdefs.h <<_ACEOF #define HAVE_PAM_LIB 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define USE_PAM 1 _ACEOF fi fi if test -z "$PASSWDLIB" \ && ( test "$enable_shadow" != "no" -a "$enable_pam" != "yes" \ || test "$enable_pam" = "yes" -a "$enable_shadow" = "yes" ); then echo "$as_me:$LINENO: checking for main in -lshadow" >&5 echo $ECHO_N "checking for main in -lshadow... $ECHO_C" >&6 if test "${ac_cv_lib_shadow_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lshadow $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_shadow_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_shadow_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_shadow_main" >&5 echo "${ECHO_T}$ac_cv_lib_shadow_main" >&6 if test $ac_cv_lib_shadow_main = yes; then PASSWDLIB="-lshadow" fi for ac_header in shadow.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------- ## ## Report this to voins@voins.program.ru ## ## ------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi echo "$as_me:$LINENO: checking for SELinux support" >&5 echo $ECHO_N "checking for SELinux support... $ECHO_C" >&6 # Check whether --enable-selinux or --disable-selinux was given. if test "${enable_selinux+set}" = set; then enableval="$enable_selinux" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 echo "$as_me:$LINENO: checking for is_selinux_enabled in -lselinux" >&5 echo $ECHO_N "checking for is_selinux_enabled in -lselinux... $ECHO_C" >&6 if test "${ac_cv_lib_selinux_is_selinux_enabled+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lselinux $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char is_selinux_enabled (); int main () { is_selinux_enabled (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_selinux_is_selinux_enabled=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_selinux_is_selinux_enabled=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5 echo "${ECHO_T}$ac_cv_lib_selinux_is_selinux_enabled" >&6 if test $ac_cv_lib_selinux_is_selinux_enabled = yes; then SELINUX_LIBS="-lselinux" cat >>confdefs.h <<_ACEOF #define HAVE_SELINUX_LIB 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define WITH_SELINUX 1 _ACEOF SELINUX_CFLAGS="-DWITH_SELINUX -I/usr/include/selinux" else { echo "$as_me:$LINENO: WARNING: libselinux not found, compiling without SELinux support" >&5 echo "$as_me: WARNING: libselinux not found, compiling without SELinux support" >&2;} fi else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi; echo "$as_me:$LINENO: checking for main in -lutil" >&5 echo $ECHO_N "checking for main in -lutil... $ECHO_C" >&6 if test "${ac_cv_lib_util_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lutil $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_util_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_util_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_util_main" >&5 echo "${ECHO_T}$ac_cv_lib_util_main" >&6 if test $ac_cv_lib_util_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBUTIL 1 _ACEOF LIBS="-lutil $LIBS" fi echo "$as_me:$LINENO: checking for main in -lcrypt" >&5 echo $ECHO_N "checking for main in -lcrypt... $ECHO_C" >&6 if test "${ac_cv_lib_crypt_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypt $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_crypt_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_crypt_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_crypt_main" >&5 echo "${ECHO_T}$ac_cv_lib_crypt_main" >&6 if test $ac_cv_lib_crypt_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBCRYPT 1 _ACEOF LIBS="-lcrypt $LIBS" fi echo "$as_me:$LINENO: checking for killpg in -lucb" >&5 echo $ECHO_N "checking for killpg in -lucb... $ECHO_C" >&6 if test "${ac_cv_lib_ucb_killpg+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lucb $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char killpg (); int main () { killpg (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ucb_killpg=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ucb_killpg=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ucb_killpg" >&5 echo "${ECHO_T}$ac_cv_lib_ucb_killpg" >&6 if test $ac_cv_lib_ucb_killpg = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBUCB 1 _ACEOF LIBS="-lucb $LIBS" fi # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" CFLAGS="$CFLAGS -g -DDEBUG" fi; echo "$as_me:$LINENO: checking for X" >&5 echo $ECHO_N "checking for X... $ECHO_C" >&6 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" fi; # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if test "${ac_cv_have_x+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -fr conftest.dir if mkdir conftest.dir; then cd conftest.dir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat >Imakefile <<'_ACEOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' _ACEOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in so sl a; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -fr conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Intrinsic.h. # First, try using that file with no special directory specified. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # We can compile using X headers with no special include directory. ac_x_includes= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Intrinsic.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lXt $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { XtMalloc (0) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 LIBS=$ac_save_LIBS for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in so sl a; do if test -r $ac_dir/libXt.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$as_me:$LINENO: result: $have_x" >&5 echo "${ECHO_T}$have_x" >&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. cat >>confdefs.h <<\_ACEOF #define X_DISPLAY_MISSING 1 _ACEOF X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . case `(uname -sr) 2>/dev/null` in "SunOS 5"*) echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_R_nospace=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_R_nospace=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_R_nospace = yes; then echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_R_space=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_R_space=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test $ac_R_space = yes; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 X_LIBS="$X_LIBS -R $x_libraries" else echo "$as_me:$LINENO: result: neither works" >&5 echo "${ECHO_T}neither works" >&6 fi fi LIBS=$ac_xsave_LIBS esac fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XOpenDisplay (); int main () { XOpenDisplay (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main () { dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dnet_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_dnet_ntoa=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 if test $ac_cv_lib_dnet_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dnet_ntoa (); int main () { dnet_ntoa (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dnet_stub_dnet_ntoa=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. echo "$as_me:$LINENO: checking for gethostbyname" >&5 echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 if test "${ac_cv_func_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define gethostbyname to an innocuous variant, in case declares gethostbyname. For example, HP-UX 11i declares gettimeofday. */ #define gethostbyname innocuous_gethostbyname /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gethostbyname (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef gethostbyname /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) choke me #else char (*f) () = gethostbyname; #endif #ifdef __cplusplus } #endif int main () { return f != gethostbyname; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef gethostbyname /* Declare this function with same prototype as __builtin_gethostbyname. This removes warning about conflicting type with builtin */ __typeof__(__builtin_gethostbyname) gethostbyname; __typeof__(__builtin_gethostbyname) *f = gethostbyname; #endif int main () { return f != __builtin_gethostbyname; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 if test $ac_cv_func_gethostbyname = no; then echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main () { gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_nsl_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_nsl_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 if test $ac_cv_lib_nsl_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gethostbyname (); int main () { gethostbyname (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_bsd_gethostbyname=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_bsd_gethostbyname=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 if test $ac_cv_lib_bsd_gethostbyname = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. echo "$as_me:$LINENO: checking for connect" >&5 echo $ECHO_N "checking for connect... $ECHO_C" >&6 if test "${ac_cv_func_connect+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define connect to an innocuous variant, in case declares connect. For example, HP-UX 11i declares gettimeofday. */ #define connect innocuous_connect /* System header to define __stub macros and hopefully few prototypes, which can conflict with char connect (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef connect /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_connect) || defined (__stub___connect) choke me #else char (*f) () = connect; #endif #ifdef __cplusplus } #endif int main () { return f != connect; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef connect /* Declare this function with same prototype as __builtin_connect. This removes warning about conflicting type with builtin */ __typeof__(__builtin_connect) connect; __typeof__(__builtin_connect) *f = connect; #endif int main () { return f != __builtin_connect; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_connect=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 echo "${ECHO_T}$ac_cv_func_connect" >&6 if test $ac_cv_func_connect = no; then echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 if test "${ac_cv_lib_socket_connect+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char connect (); int main () { connect (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_socket_connect=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_socket_connect=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 if test $ac_cv_lib_socket_connect = yes; then X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. echo "$as_me:$LINENO: checking for remove" >&5 echo $ECHO_N "checking for remove... $ECHO_C" >&6 if test "${ac_cv_func_remove+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define remove to an innocuous variant, in case declares remove. For example, HP-UX 11i declares gettimeofday. */ #define remove innocuous_remove /* System header to define __stub macros and hopefully few prototypes, which can conflict with char remove (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef remove /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_remove) || defined (__stub___remove) choke me #else char (*f) () = remove; #endif #ifdef __cplusplus } #endif int main () { return f != remove; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef remove /* Declare this function with same prototype as __builtin_remove. This removes warning about conflicting type with builtin */ __typeof__(__builtin_remove) remove; __typeof__(__builtin_remove) *f = remove; #endif int main () { return f != __builtin_remove; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_remove=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 echo "${ECHO_T}$ac_cv_func_remove" >&6 if test $ac_cv_func_remove = no; then echo "$as_me:$LINENO: checking for remove in -lposix" >&5 echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 if test "${ac_cv_lib_posix_remove+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char remove (); int main () { remove (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_posix_remove=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_posix_remove=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 if test $ac_cv_lib_posix_remove = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo "$as_me:$LINENO: checking for shmat" >&5 echo $ECHO_N "checking for shmat... $ECHO_C" >&6 if test "${ac_cv_func_shmat+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shmat to an innocuous variant, in case declares shmat. For example, HP-UX 11i declares gettimeofday. */ #define shmat innocuous_shmat /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shmat (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shmat /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shmat) || defined (__stub___shmat) choke me #else char (*f) () = shmat; #endif #ifdef __cplusplus } #endif int main () { return f != shmat; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef shmat /* Declare this function with same prototype as __builtin_shmat. This removes warning about conflicting type with builtin */ __typeof__(__builtin_shmat) shmat; __typeof__(__builtin_shmat) *f = shmat; #endif int main () { return f != __builtin_shmat; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shmat=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 echo "${ECHO_T}$ac_cv_func_shmat" >&6 if test $ac_cv_func_shmat = no; then echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 if test "${ac_cv_lib_ipc_shmat+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shmat (); int main () { shmat (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ipc_shmat=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ipc_shmat=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 if test $ac_cv_lib_ipc_shmat = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char IceConnectionNumber (); int main () { IceConnectionNumber (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_ICE_IceConnectionNumber=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi XCFLAGS="$X_CFLAGS" XLDFLAGS="$X_LIBS" XLIBS="$X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS" # Check whether --enable-xinerama or --disable-xinerama was given. if test "${enable_xinerama+set}" = set; then enableval="$enable_xinerama" fi; if test "$enable_xinerama" = "yes" -o -z "$enable_xinerama"; then echo "$as_me:$LINENO: checking for XineramaIsActive in -lXinerama" >&5 echo $ECHO_N "checking for XineramaIsActive in -lXinerama... $ECHO_C" >&6 if test "${ac_cv_lib_Xinerama_XineramaIsActive+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXinerama $XLDFLAGS $XLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char XineramaIsActive (); int main () { XineramaIsActive (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_Xinerama_XineramaIsActive=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_Xinerama_XineramaIsActive=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_Xinerama_XineramaIsActive" >&5 echo "${ECHO_T}$ac_cv_lib_Xinerama_XineramaIsActive" >&6 if test $ac_cv_lib_Xinerama_XineramaIsActive = yes; then XLIBS="$XLIBS -lXinerama" cat >>confdefs.h <<\_ACEOF #define HAVE_XINERAMA 1 _ACEOF fi fi # Extract the first word of "get-wings-flags", so it can be a program name with args. set dummy get-wings-flags; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_GETWINGSFLAGS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$GETWINGSFLAGS"; then ac_cv_prog_GETWINGSFLAGS="$GETWINGSFLAGS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GETWINGSFLAGS="get-wings-flags" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi GETWINGSFLAGS=$ac_cv_prog_GETWINGSFLAGS if test -n "$GETWINGSFLAGS"; then echo "$as_me:$LINENO: result: $GETWINGSFLAGS" >&5 echo "${ECHO_T}$GETWINGSFLAGS" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$GETWINGSFLAGS"; then { { echo "$as_me:$LINENO: error: 'get-wings-flags' command was not found in \$PATH, please upgrade your WindowMaker." >&5 echo "$as_me: error: 'get-wings-flags' command was not found in \$PATH, please upgrade your WindowMaker." >&2;} { (exit 1); exit 1; }; } fi WCFLAGS=`get-wings-flags --cflags` WLDFLAGS=`get-wings-flags --ldflags` WLIBS=`get-wings-flags --libs` echo "$as_me:$LINENO: checking for prefix" >&5 echo $ECHO_N "checking for prefix... $ECHO_C" >&6 if test "$prefix" = "NONE"; then prefix="/usr/local" fi echo "$as_me:$LINENO: result: $prefix" >&5 echo "${ECHO_T}$prefix" >&6 echo "$as_me:$LINENO: checking for exec_prefix" >&5 echo $ECHO_N "checking for exec_prefix... $ECHO_C" >&6 if test "$exec_prefix" = "NONE"; then exec_prefix=$prefix fi echo "$as_me:$LINENO: result: $exec_prefix" >&5 echo "${ECHO_T}$exec_prefix" >&6 echo "$as_me:$LINENO: checking for logdir" >&5 echo $ECHO_N "checking for logdir... $ECHO_C" >&6 # Check whether --with-logdir or --without-logdir was given. if test "${with_logdir+set}" = set; then withval="$with_logdir" fi; if test "x$with_logdir" != "x"; then LOGDIR=$with_logdir else LOGDIR="/var/log" fi echo "$as_me:$LINENO: result: $LOGDIR" >&5 echo "${ECHO_T}$LOGDIR" >&6 echo "$as_me:$LINENO: checking for runlockdir" >&5 echo $ECHO_N "checking for runlockdir... $ECHO_C" >&6 # Check whether --with-runlockdir or --without-runlockdir was given. if test "${with_runlockdir+set}" = set; then withval="$with_runlockdir" fi; if test "x$with_runlockdir" != "x"; then RUNDIR=$with_runlockdir else RUNDIR="/var/run" fi echo "$as_me:$LINENO: result: $RUNDIR" >&5 echo "${ECHO_T}$RUNDIR" >&6 echo "$as_me:$LINENO: checking for defuserpath" >&5 echo $ECHO_N "checking for defuserpath... $ECHO_C" >&6 # Check whether --with-defuserpath or --without-defuserpath was given. if test "${with_defuserpath+set}" = set; then withval="$with_defuserpath" fi; if test "x$with_defuserpath" != "x"; then cat >>confdefs.h <<_ACEOF #define DEF_USER_PATH "$with_defuserpath" _ACEOF echo "$as_me:$LINENO: result: $with_defuserpath" >&5 echo "${ECHO_T}$with_defuserpath" >&6 else cat >>confdefs.h <<\_ACEOF #define DEF_USER_PATH "/usr/local/bin:/bin:/usr/bin" _ACEOF echo "$as_me:$LINENO: result: using default: /usr/local/bin:/bin:/usr/bin" >&5 echo "${ECHO_T}using default: /usr/local/bin:/bin:/usr/bin" >&6 fi echo "$as_me:$LINENO: checking for defsystempath" >&5 echo $ECHO_N "checking for defsystempath... $ECHO_C" >&6 # Check whether --with-defsystempath or --without-defsystempath was given. if test "${with_defsystempath+set}" = set; then withval="$with_defsystempath" fi; if test "x$with_defsystempath" != "x"; then cat >>confdefs.h <<_ACEOF #define DEF_SYSTEM_PATH "$with_defsystempath" _ACEOF echo "$as_me:$LINENO: result: $with_defsystempath" >&5 echo "${ECHO_T}$with_defsystempath" >&6 else cat >>confdefs.h <<\_ACEOF #define DEF_SYSTEM_PATH "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin" _ACEOF echo "$as_me:$LINENO: result: using default: /sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin" >&5 echo "${ECHO_T}using default: /sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin" >&6 fi echo "$as_me:$LINENO: checking if wdmdir has been specified" >&5 echo $ECHO_N "checking if wdmdir has been specified... $ECHO_C" >&6 # Check whether --with-wdmdir or --without-wdmdir was given. if test "${with_wdmdir+set}" = set; then withval="$with_wdmdir" fi; if test "x$with_wdmdir" != "x"; then DMDIR="$with_wdmdir" echo "$as_me:$LINENO: result: yes, using $DMDIR" >&5 echo "${ECHO_T}yes, using $DMDIR" >&6 else DMDIR="$prefix/etc/wdm" echo "$as_me:$LINENO: result: no, using $DMDIR" >&5 echo "${ECHO_T}no, using $DMDIR" >&6 fi cat >>confdefs.h <<_ACEOF #define WDMDIR "$DMDIR" _ACEOF cat >>confdefs.h <<_ACEOF #define DEF_XDM_CONFIG "$DMDIR/wdm-config" _ACEOF cat >>confdefs.h <<_ACEOF #define DEF_WDMLOGIN_CONFIG "$DMDIR/wdmLogin-config" _ACEOF cat >>confdefs.h <<_ACEOF #define DEF_CHOOSER "$DMDIR/chooser" _ACEOF cat >>confdefs.h <<_ACEOF #define DEF_AUTH_DIR "$DMDIR/authdir" _ACEOF echo "$as_me:$LINENO: checking if gfxdir has been specified" >&5 echo $ECHO_N "checking if gfxdir has been specified... $ECHO_C" >&6 # Check whether --with-gfxdir or --without-gfxdir was given. if test "${with_gfxdir+set}" = set; then withval="$with_gfxdir" fi; if test "x$with_gfxdir" != "x"; then GFXDIR="$with_gfxdir" echo "$as_me:$LINENO: result: yes, using $GFXDIR" >&5 echo "${ECHO_T}yes, using $GFXDIR" >&6 else GFXDIR="$prefix/share/pixmaps/wdm" echo "$as_me:$LINENO: result: no, using $GFXDIR" >&5 echo "${ECHO_T}no, using $GFXDIR" >&6 fi cat >>confdefs.h <<_ACEOF #define WGFXDIR "$GFXDIR" _ACEOF echo "$as_me:$LINENO: checking if Logo pixmap specified" >&5 echo $ECHO_N "checking if Logo pixmap specified... $ECHO_C" >&6 # Check whether --with-Logo or --without-Logo was given. if test "${with_Logo+set}" = set; then withval="$with_Logo" fi; if test "x$with_Logo" != "x"; then PIXMAPFILE="$with_Logo" PIXMAPCOMMENT="" echo "$as_me:$LINENO: result: $with_Logo" >&5 echo "${ECHO_T}$with_Logo" >&6 else PIXMAPFILE="Eagle.xpm" PIXMAPCOMMENT="! " echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "wmaker", so it can be a program name with args. set dummy wmaker; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_WMAKER_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $WMAKER_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WMAKER_PATH="$WMAKER_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WMAKER_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi WMAKER_PATH=$ac_cv_path_WMAKER_PATH if test -n "$WMAKER_PATH"; then echo "$as_me:$LINENO: result: $WMAKER_PATH" >&5 echo "${ECHO_T}$WMAKER_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$WMAKER_PATH" != "x"; then WMLIST=WindowMaker else WMAKER_PATH=wmaker fi # Extract the first word of "afterstep", so it can be a program name with args. set dummy afterstep; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_AFTERSTEP_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $AFTERSTEP_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_AFTERSTEP_PATH="$AFTERSTEP_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AFTERSTEP_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi AFTERSTEP_PATH=$ac_cv_path_AFTERSTEP_PATH if test -n "$AFTERSTEP_PATH"; then echo "$as_me:$LINENO: result: $AFTERSTEP_PATH" >&5 echo "${ECHO_T}$AFTERSTEP_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$AFTERSTEP_PATH" != "x"; then WMLIST=$WMLIST:AfterStep else AFTERSTEP_PATH=afterstep fi # Extract the first word of "blackbox", so it can be a program name with args. set dummy blackbox; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_BLACKBOX_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $BLACKBOX_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_BLACKBOX_PATH="$BLACKBOX_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_BLACKBOX_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi BLACKBOX_PATH=$ac_cv_path_BLACKBOX_PATH if test -n "$BLACKBOX_PATH"; then echo "$as_me:$LINENO: result: $BLACKBOX_PATH" >&5 echo "${ECHO_T}$BLACKBOX_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$BLACKBOX_PATH" != "x"; then WMLIST=$WMLIST:BlackBox else BLACKBOX_PATH=blackbox fi # Extract the first word of "icewm", so it can be a program name with args. set dummy icewm; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_ICEWM_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $ICEWM_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_ICEWM_PATH="$ICEWM_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ICEWM_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi ICEWM_PATH=$ac_cv_path_ICEWM_PATH if test -n "$ICEWM_PATH"; then echo "$as_me:$LINENO: result: $ICEWM_PATH" >&5 echo "${ECHO_T}$ICEWM_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$ICEWM_PATH" != "x"; then WMLIST=$WMLIST:IceWm else ICEWM_PATH=icewm fi # Extract the first word of "xsession", so it can be a program name with args. set dummy xsession; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_XSESSION_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $XSESSION_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_XSESSION_PATH="$XSESSION_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XSESSION_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi XSESSION_PATH=$ac_cv_path_XSESSION_PATH if test -n "$XSESSION_PATH"; then echo "$as_me:$LINENO: result: $XSESSION_PATH" >&5 echo "${ECHO_T}$XSESSION_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$XSESSION_PATH" != "x"; then WMLIST=$WMLIST:Xsession else XSESSION_PATH=xsession fi # Extract the first word of "startkde", so it can be a program name with args. set dummy startkde; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_STARTKDE_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $STARTKDE_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_STARTKDE_PATH="$STARTKDE_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_STARTKDE_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi STARTKDE_PATH=$ac_cv_path_STARTKDE_PATH if test -n "$STARTKDE_PATH"; then echo "$as_me:$LINENO: result: $STARTKDE_PATH" >&5 echo "${ECHO_T}$STARTKDE_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$STARTKDE_PATH" != "x"; then WMLIST=$WMLIST:KDE else STARTKDE_PATH=startkde fi # Check whether --with-winmgr or --without-winmgr was given. if test "${with_winmgr+set}" = set; then withval="$with_winmgr" fi; if test "x$with_winmgr" != "x"; then WINMGR_NAME=$with_winmgr # Extract the first word of "$WINMGR_NAME", so it can be a program name with args. set dummy $WINMGR_NAME; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_WINMGR_PATH+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $WINMGR_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WINMGR_PATH="$WINMGR_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WINMGR_PATH="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi WINMGR_PATH=$ac_cv_path_WINMGR_PATH if test -n "$WINMGR_PATH"; then echo "$as_me:$LINENO: result: $WINMGR_PATH" >&5 echo "${ECHO_T}$WINMGR_PATH" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$WINMGR_PATH" = "x"; then # Check whether --with-winmgr_path or --without-winmgr_path was given. if test "${with_winmgr_path+set}" = set; then withval="$with_winmgr_path" fi; if test "x$with_winmgr_path" != "x"; then WINMGR_PATH=$with_winmgr_path fi fi echo "$as_me:$LINENO: checking for winmgr_path" >&5 echo $ECHO_N "checking for winmgr_path... $ECHO_C" >&6 if test "x$WINMGR_PATH" = "x"; then { { echo "$as_me:$LINENO: error: unable to locate $WINMGR_NAME, use --with-winmgr_path" >&5 echo "$as_me: error: unable to locate $WINMGR_NAME, use --with-winmgr_path" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $WINMGR_PATH" >&5 echo "${ECHO_T}$WINMGR_PATH" >&6 WMLIST=$WMLIST:$WINMGR_NAME fi echo "$as_me:$LINENO: checking if window manager list specified" >&5 echo $ECHO_N "checking if window manager list specified... $ECHO_C" >&6 # Check whether --with-wmlist or --without-wmlist was given. if test "${with_wmlist+set}" = set; then withval="$with_wmlist" fi; if test "x$with_wmlist" != "x"; then WMLIST="$with_wmlist" echo "$as_me:$LINENO: result: $with_wmlist" >&5 echo "${ECHO_T}$with_wmlist" >&6 { echo "$as_me:$LINENO: WARNING: make sure Xsession and Xclients support the above list" >&5 echo "$as_me: WARNING: make sure Xsession and Xclients support the above list" >&2;} else echo "$as_me:$LINENO: result: no, default to $WMLIST" >&5 echo "${ECHO_T}no, default to $WMLIST" >&6 fi INTLIBS="" echo "$as_me:$LINENO: checking for gettext" >&5 echo $ECHO_N "checking for gettext... $ECHO_C" >&6 if test "${ac_cv_func_gettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define gettext to an innocuous variant, in case declares gettext. For example, HP-UX 11i declares gettimeofday. */ #define gettext innocuous_gettext /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gettext (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef gettext /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettext (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_gettext) || defined (__stub___gettext) choke me #else char (*f) () = gettext; #endif #ifdef __cplusplus } #endif int main () { return f != gettext; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_gettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __GNUC__ choke me #else #undef gettext /* Declare this function with same prototype as __builtin_gettext. This removes warning about conflicting type with builtin */ __typeof__(__builtin_gettext) gettext; __typeof__(__builtin_gettext) *f = gettext; #endif int main () { return f != __builtin_gettext; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_gettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_gettext=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_gettext" >&5 echo "${ECHO_T}$ac_cv_func_gettext" >&6 if test $ac_cv_func_gettext = yes; then HAVEGETTEXT="yes" else echo "$as_me:$LINENO: checking for gettext in -lintl" >&5 echo $ECHO_N "checking for gettext in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_gettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gettext (); int main () { gettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_gettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_gettext=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_gettext" >&5 echo "${ECHO_T}$ac_cv_lib_intl_gettext" >&6 if test $ac_cv_lib_intl_gettext = yes; then INTLIBS="-lintl" HAVEGETTEXT="yes" else INTLIBS="" fi fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_XGETTEXT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$XGETTEXT"; then ac_cv_prog_XGETTEXT="$XGETTEXT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XGETTEXT="xgettext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi XGETTEXT=$ac_cv_prog_XGETTEXT if test -n "$XGETTEXT"; then echo "$as_me:$LINENO: result: $XGETTEXT" >&5 echo "${ECHO_T}$XGETTEXT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_MSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$MSGFMT"; then ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MSGFMT="msgfmt" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi MSGFMT=$ac_cv_prog_MSGFMT if test -n "$MSGFMT"; then echo "$as_me:$LINENO: result: $MSGFMT" >&5 echo "${ECHO_T}$MSGFMT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$XGETTEXT" != "x"; then if $XGETTEXT --help 2>&1 | grep illegal &> /dev/null; then echo "xgettext isn't GNU version" XGETTEXT="" fi fi I18N=no if test "x$MSGFMT" != "x" -a "x$HAVEGETTEXT" != "x"; then cat >>confdefs.h <<\_ACEOF #define I18N 1 _ACEOF I18N=yes fi # Check whether --with-nlsdir or --without-nlsdir was given. if test "${with_nlsdir+set}" = set; then withval="$with_nlsdir" fi; if test "x$NLSDIR" = "x"; then if test "x$with_nlsdir" != "x"; then NLSDIR=$with_nlsdir else NLSDIR=$prefix/lib/locale fi fi cat >>confdefs.h <<_ACEOF #define NLSDIR "$NLSDIR" _ACEOF # Check whether --with-fakehome or --without-fakehome was given. if test "${with_fakehome+set}" = set; then withval="$with_fakehome" fi; FAKEHOME=/var/run/wdm if test "x$with_fakehome" != "x"; then FAKEHOME=$with_fakehome fi cat >>confdefs.h <<_ACEOF #define FAKEHOME "$FAKEHOME" _ACEOF # Check whether --enable-aafont or --disable-aafont was given. if test "${enable_aafont+set}" = set; then enableval="$enable_aafont" fi; if test "$enable_aafont" = "yes"; then cat >>confdefs.h <<\_ACEOF #define USE_AA 1 _ACEOF fi # Check whether --enable-exitlogin or --disable-exitlogin was given. if test "${enable_exitlogin+set}" = set; then enableval="$enable_exitlogin" fi; if test "$enable_exitlogin" = "yes"; then cat >>confdefs.h <<\_ACEOF #define WITH_EXITLOGIN 1 _ACEOF fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by wdm $as_me 1.28, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ wdm config.status 1.28 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@XRDB_PATH@,$XRDB_PATH,;t t s,@XCONSOLE@,$XCONSOLE,;t t s,@SHUTDOWN@,$SHUTDOWN,;t t s,@FAILSAFE_PATH@,$FAILSAFE_PATH,;t t s,@DEF_SERVER@,$DEF_SERVER,;t t s,@SYSTEM_SHELL@,$SYSTEM_SHELL,;t t s,@SHELL_BASH@,$SHELL_BASH,;t t s,@SHELL_LOGIN@,$SHELL_LOGIN,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@PAMDIR@,$PAMDIR,;t t s,@PASSWDLIB@,$PASSWDLIB,;t t s,@USE_PAM@,$USE_PAM,;t t s,@SELINUX_LIBS@,$SELINUX_LIBS,;t t s,@SELINUX_CFLAGS@,$SELINUX_CFLAGS,;t t s,@X_CFLAGS@,$X_CFLAGS,;t t s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t s,@X_LIBS@,$X_LIBS,;t t s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t s,@GETWINGSFLAGS@,$GETWINGSFLAGS,;t t s,@XLIBS@,$XLIBS,;t t s,@XCFLAGS@,$XCFLAGS,;t t s,@XLDFLAGS@,$XLDFLAGS,;t t s,@WCFLAGS@,$WCFLAGS,;t t s,@WLDFLAGS@,$WLDFLAGS,;t t s,@WLIBS@,$WLIBS,;t t s,@LOGDIR@,$LOGDIR,;t t s,@RUNDIR@,$RUNDIR,;t t s,@DMDIR@,$DMDIR,;t t s,@GFXDIR@,$GFXDIR,;t t s,@PIXMAPFILE@,$PIXMAPFILE,;t t s,@PIXMAPCOMMENT@,$PIXMAPCOMMENT,;t t s,@WMAKER_PATH@,$WMAKER_PATH,;t t s,@AFTERSTEP_PATH@,$AFTERSTEP_PATH,;t t s,@BLACKBOX_PATH@,$BLACKBOX_PATH,;t t s,@ICEWM_PATH@,$ICEWM_PATH,;t t s,@XSESSION_PATH@,$XSESSION_PATH,;t t s,@STARTKDE_PATH@,$STARTKDE_PATH,;t t s,@WINMGR_PATH@,$WINMGR_PATH,;t t s,@WINMGR_NAME@,$WINMGR_NAME,;t t s,@WMLIST@,$WMLIST,;t t s,@XGETTEXT@,$XGETTEXT,;t t s,@MSGFMT@,$MSGFMT,;t t s,@I18N@,$I18N,;t t s,@NLSDIR@,$NLSDIR,;t t s,@FAKEHOME@,$FAKEHOME,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } # Do quote $f, to prevent DOS paths from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi wdm-1.28/Makefile.in 644 0 0 5002610221265060 137340ustar AlexeyVoinov 0 0# @configure_input@ # # WARNING: Makefile.in is generated by etc/makefile.cook # Do not send patches for this file. CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ DEFS = @DEFS@ LIBS = @LIBS@ srcdir = @srcdir@ XCFLAGS = @XCFLAGS@ XLDFLAGS = @XLDFLAGS@ XLIBS = @XLIBS@ WCFLAGS = @WCFLAGS@ WLDFLAGS = @WLDFLAGS@ WLIBS = @WLIBS@ SELINUX_CFLAGS = @SELINUX_CFLAGS@ SELINUX_LIBS = @SELINUX_LIBS@ PASSWDLIB = @PASSWDLIB@ CC = @CC@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ DESTDIR = NLSDIR = @NLSDIR@ xgettext = @XGETTEXT@ msgfmt = @MSGFMT@ ranlib = @RANLIB@ ar = ar cc = $(CC) cflags = $(CPPFLAGS) $(CFLAGS) $(DEFS) -I./include ldflags = $(LDFLAGS) -L./bin libs = $(LIBS) -lwdm wdmLogin_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) wdmLogin_ldflags = $(ldflags) $(XLDFLAGS) $(WLDFLAGS) wdmLogin_libs = $(libs) $(XLIBS) $(WLIBS) wdmPrefs_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) wdmPrefs_ldflags = $(ldflags) $(XLDFLAGS) $(WLDFLAGS) wdmPrefs_libs = $(libs) $(XLIBS) $(WLIBS) wdmChooser_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) wdmChooser_ldflags = $(ldflags) $(XLDFLAGS) $(WLDFLAGS) wdmChooser_libs = $(libs) $(XLIBS) $(WLIBS) TestLogin_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) TestLogin_ldflags = $(ldflags) $(XLDFLAGS) $(WLDFLAGS) TestLogin_libs = $(libs) $(XLIBS) $(WLIBS) wdm_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) $(SELINUX_CFLAGS) wdm_ldflags = $(ldflags) $(XLDFLAGS) $(WLDFLAGS) wdm_libs = $(libs) $(XLIBS) $(WLIBS) $(PASSWDLIB) $(SELINUX_LIBS) \ -lXmu -lXau -lXdmcp libwdm_cflags = $(cflags) $(XCFLAGS) $(WCFLAGS) INSTALL=@INSTALL@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_SCRIPT=@INSTALL_SCRIPT@ INSTALL_DATA=@INSTALL_DATA@ prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ DMDIR=@DMDIR@ GFXDIR=@GFXDIR@ MANDIR=@mandir@ PAMDIR=@PAMDIR@ USE_PAM=@USE_PAM@ NLSDIR=@NLSDIR@ I18N=@I18N@ FAKEHOME=@FAKEHOME@ all: all-bin all-doc all-config all-nls-$(I18N) install: install-bin install-config install-doc install-gfx install-nls-$(I18N) all-bin: bin/TestLogin bin/wdm bin/wdmChooser bin/wdmLogin bin/wdmPrefs install-bin: $(DESTDIR)$(bindir)/wdm $(DESTDIR)$(bindir)/wdmLogin all-config: configs/Xclients configs/Xservers configs/Xservers.ws configs/Xsession configs/Xsetup_0 configs/wdm-config configs/wdmReconfig install-config: $(DESTDIR)$(DMDIR)/GiveConsole $(DESTDIR)$(DMDIR)/TakeConsole $(DESTDIR)$(DMDIR)/Xaccess $(DESTDIR)$(DMDIR)/Xresources $(DESTDIR)$(DMDIR)/Xservers.fs $(DESTDIR)$(DMDIR)/Xsession.XFree86 $(DESTDIR)$(DMDIR)/Xsession.orig $(DESTDIR)$(DMDIR)/Xclients $(DESTDIR)$(DMDIR)/Xservers $(DESTDIR)$(DMDIR)/Xservers.ws $(DESTDIR)$(DMDIR)/Xsession $(DESTDIR)$(DMDIR)/Xsetup_0 $(DESTDIR)$(DMDIR)/wdm-config $(DESTDIR)$(DMDIR)/wdmReconfig $(DESTDIR)$(DMDIR)/wdm-config.in $(DESTDIR)$(DMDIR)/Xclients.in install-pam-$(USE_PAM) $(DESTDIR)$(DMDIR)/authdir install -d -m 0700 $(DESTDIR)$(FAKEHOME) install-pam-no: install-pam-yes: $(DESTDIR)$(PAMDIR)/wdm $(DESTDIR)$(DMDIR)/authdir: $(INSTALL) -m 700 -d $@ all-doc: doc/wdm.man all-nls-yes: po/cs.mo po/cy.mo po/de.mo po/en.mo po/es.mo po/fr_FR.mo po/ja.mo po/ru.mo all-nls-no: install-doc: $(DESTDIR)$(MANDIR)/man1/wdmLogin.1 $(DESTDIR)$(MANDIR)/man1/wdm.1 install-gfx: $(DESTDIR)$(GFXDIR)/Eagle.xpm $(DESTDIR)$(GFXDIR)/Earth.jpg $(DESTDIR)$(GFXDIR)/Earth200x130.xpm $(DESTDIR)$(GFXDIR)/GnuLinux-logo.jpg $(DESTDIR)$(GFXDIR)/Stars.jpg $(DESTDIR)$(GFXDIR)/StarsLogo.jpg $(DESTDIR)$(GFXDIR)/gnuLogo.xpm install-nls-yes: $(DESTDIR)$(NLSDIR)/cs/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/cy/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/de/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/en/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/es/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/fr_FR/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/ja/LC_MESSAGES/wdm.mo $(DESTDIR)$(NLSDIR)/ru/LC_MESSAGES/wdm.mo install-nls-no: src/TestLogin/TestLogin.o: src/TestLogin/TestLogin.c include/wdmlib.h $(CC) -c $(TestLogin_cflags) src/TestLogin/TestLogin.c -o src/TestLogin/TestLogin.o src/chooser.o: src/chooser.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h $(CC) -c $(cflags) src/chooser.c -o src/chooser.o src/libwdm/debug.o: src/libwdm/debug.c include/wdmlib.h $(CC) -c $(libwdm_cflags) src/libwdm/debug.c -o src/libwdm/debug.o src/libwdm/environment.o: src/libwdm/environment.c include/wdmlib.h $(CC) -c $(libwdm_cflags) src/libwdm/environment.c -o src/libwdm/environment.o src/libwdm/names.o: src/libwdm/names.c $(CC) -c $(libwdm_cflags) src/libwdm/names.c -o src/libwdm/names.o src/libwdm/plcheckers.o: src/libwdm/plcheckers.c include/wdmlib.h $(CC) -c $(libwdm_cflags) src/libwdm/plcheckers.c -o src/libwdm/plcheckers.o src/wdm/Greet.o: src/wdm/Greet.c include/dm.h include/wdmconfig.h include/config.h include/greet.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/Greet.c -o src/wdm/Greet.o src/wdm/access.o: src/wdm/access.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/access.c -o src/wdm/access.o src/wdm/auth.o: src/wdm/auth.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h include/wdmlib.h include/dm_socket.h $(CC) -c $(wdm_cflags) src/wdm/auth.c -o src/wdm/auth.o src/wdm/choose.o: src/wdm/choose.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/choose.c -o src/wdm/choose.o src/wdm/daemon.o: src/wdm/daemon.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/daemon.c -o src/wdm/daemon.o src/wdm/dm.o: src/wdm/dm.c include/dm.h include/wdmconfig.h include/config.h include/wdm.h include/dm_auth.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/dm.c -o src/wdm/dm.o src/wdm/dpylist.o: src/wdm/dpylist.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/dpylist.c -o src/wdm/dpylist.o src/wdm/file.o: src/wdm/file.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/file.c -o src/wdm/file.o src/wdm/genauth.o: src/wdm/genauth.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/genauth.c -o src/wdm/genauth.o src/wdm/loghelpers.o: src/wdm/loghelpers.c include/wdmlib.h include/dm.h include/wdmconfig.h include/config.h $(CC) -c $(wdm_cflags) src/wdm/loghelpers.c -o src/wdm/loghelpers.o src/wdm/mitauth.o: src/wdm/mitauth.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h $(CC) -c $(wdm_cflags) src/wdm/mitauth.c -o src/wdm/mitauth.o src/wdm/netaddr.o: src/wdm/netaddr.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/netaddr.c -o src/wdm/netaddr.o src/wdm/policy.o: src/wdm/policy.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h include/dm_socket.h $(CC) -c $(wdm_cflags) src/wdm/policy.c -o src/wdm/policy.o src/wdm/protodpy.o: src/wdm/protodpy.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/protodpy.c -o src/wdm/protodpy.o src/wdm/reset.o: src/wdm/reset.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/reset.c -o src/wdm/reset.o src/wdm/resource.o: src/wdm/resource.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/resource.c -o src/wdm/resource.o src/wdm/server.o: src/wdm/server.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/server.c -o src/wdm/server.o src/wdm/session.o: src/wdm/session.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h include/greet.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/session.c -o src/wdm/session.o src/wdm/socket.o: src/wdm/socket.c include/dm.h include/wdmconfig.h include/config.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/socket.c -o src/wdm/socket.o src/wdm/util.o: src/wdm/util.c include/dm.h include/wdmconfig.h include/config.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/util.c -o src/wdm/util.o src/wdm/verify.o: src/wdm/verify.c include/dm.h include/wdmconfig.h include/config.h include/greet.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/verify.c -o src/wdm/verify.o src/wdm/xdmcp.o: src/wdm/xdmcp.c include/dm.h include/wdmconfig.h include/config.h include/dm_auth.h include/dm_socket.h include/wdmlib.h $(CC) -c $(wdm_cflags) src/wdm/xdmcp.c -o src/wdm/xdmcp.o src/wdmChooser/chooser.o: src/wdmChooser/chooser.c include/wdmlib.h $(CC) -c $(wdmChooser_cflags) src/wdmChooser/chooser.c -o src/wdmChooser/chooser.o src/wdmLogin/Login.o: src/wdmLogin/Login.c include/wdmconfig.h include/config.h include/wdmlib.h include/wdmLogin.h $(CC) -c $(wdmLogin_cflags) src/wdmLogin/Login.c -o src/wdmLogin/Login.o src/wdmLogin/config.o: src/wdmLogin/config.c include/wdmconfig.h include/config.h include/wdmlib.h include/wdmLogin.h $(CC) -c $(wdmLogin_cflags) src/wdmLogin/config.c -o src/wdmLogin/config.o src/wdmPrefs/prefs.o: src/wdmPrefs/prefs.c include/config.h include/wdmlib.h include/wdmPrefs.h $(CC) -c $(wdmPrefs_cflags) src/wdmPrefs/prefs.c -o src/wdmPrefs/prefs.o src/wdmPrefs/testPanel.o: src/wdmPrefs/testPanel.c include/config.h include/wdmlib.h include/wdmPrefs.h $(CC) -c $(wdmPrefs_cflags) src/wdmPrefs/testPanel.c -o src/wdmPrefs/testPanel.o src/wdmPrefs/testPanel2.o: src/wdmPrefs/testPanel2.c include/config.h include/wdmlib.h include/wdmPrefs.h $(CC) -c $(wdmPrefs_cflags) src/wdmPrefs/testPanel2.c -o src/wdmPrefs/testPanel2.o bin/TestLogin: src/TestLogin/TestLogin.o bin/libwdm.a mkdir -p bin $(CC) $(TestLogin_ldflags) src/TestLogin/TestLogin.o $(TestLogin_libs) -o bin/TestLogin $(DESTDIR)$(bindir)/TestLogin: bin/TestLogin $(INSTALL) -d $(@D) $(INSTALL_PROGRAM) bin/TestLogin $@ bin/wdm: src/wdm/Greet.o src/wdm/access.o src/wdm/auth.o src/wdm/choose.o src/wdm/daemon.o src/wdm/dm.o src/wdm/dpylist.o src/wdm/file.o src/wdm/genauth.o src/wdm/loghelpers.o src/wdm/mitauth.o src/wdm/netaddr.o src/wdm/policy.o src/wdm/protodpy.o src/wdm/reset.o src/wdm/resource.o src/wdm/server.o src/wdm/session.o src/wdm/socket.o src/wdm/util.o src/wdm/verify.o src/wdm/xdmcp.o bin/libwdm.a mkdir -p bin $(CC) $(wdm_ldflags) src/wdm/Greet.o src/wdm/access.o src/wdm/auth.o src/wdm/choose.o src/wdm/daemon.o src/wdm/dm.o src/wdm/dpylist.o src/wdm/file.o src/wdm/genauth.o src/wdm/loghelpers.o src/wdm/mitauth.o src/wdm/netaddr.o src/wdm/policy.o src/wdm/protodpy.o src/wdm/reset.o src/wdm/resource.o src/wdm/server.o src/wdm/session.o src/wdm/socket.o src/wdm/util.o src/wdm/verify.o src/wdm/xdmcp.o $(wdm_libs) -o bin/wdm $(DESTDIR)$(bindir)/wdm: bin/wdm $(INSTALL) -d $(@D) $(INSTALL_PROGRAM) bin/wdm $@ bin/wdmChooser: src/wdmChooser/chooser.o bin/libwdm.a mkdir -p bin $(CC) $(wdmChooser_ldflags) src/wdmChooser/chooser.o $(wdmChooser_libs) -o bin/wdmChooser $(DESTDIR)$(bindir)/wdmChooser: bin/wdmChooser $(INSTALL) -d $(@D) $(INSTALL_PROGRAM) bin/wdmChooser $@ bin/wdmLogin: src/wdmLogin/Login.o src/wdmLogin/config.o bin/libwdm.a mkdir -p bin $(CC) $(wdmLogin_ldflags) src/wdmLogin/Login.o src/wdmLogin/config.o $(wdmLogin_libs) -o bin/wdmLogin $(DESTDIR)$(bindir)/wdmLogin: bin/wdmLogin $(INSTALL) -d $(@D) $(INSTALL_PROGRAM) bin/wdmLogin $@ bin/wdmPrefs: src/wdmPrefs/prefs.o src/wdmPrefs/testPanel.o src/wdmPrefs/testPanel2.o bin/libwdm.a mkdir -p bin $(CC) $(wdmPrefs_ldflags) src/wdmPrefs/prefs.o src/wdmPrefs/testPanel.o src/wdmPrefs/testPanel2.o $(wdmPrefs_libs) -o bin/wdmPrefs $(DESTDIR)$(bindir)/wdmPrefs: bin/wdmPrefs $(INSTALL) -d $(@D) $(INSTALL_PROGRAM) bin/wdmPrefs $@ bin/libwdm.a: src/libwdm/debug.o src/libwdm/environment.o src/libwdm/names.o src/libwdm/plcheckers.o mkdir -p bin $(ar) cru bin/libwdm.a src/libwdm/debug.o src/libwdm/environment.o src/libwdm/names.o src/libwdm/plcheckers.o $(ranlib) bin/libwdm.a $(DESTDIR)$(MANDIR)/man1/wdmLogin.1: doc/wdmLogin.man $(INSTALL) -d $(@D) $(INSTALL_DATA) doc/wdmLogin.man $@ doc/wdm.man: doc/wdm.man.in CONFIG_FILES=$@:doc/wdm.man.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(MANDIR)/man1/wdm.1: doc/wdm.man $(INSTALL) -d $(@D) $(INSTALL_DATA) doc/wdm.man $@ $(DESTDIR)$(GFXDIR)/Eagle.xpm: pixmaps/Eagle.xpm $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/Eagle.xpm $@ $(DESTDIR)$(GFXDIR)/Earth.jpg: pixmaps/Earth.jpg $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/Earth.jpg $@ $(DESTDIR)$(GFXDIR)/Earth200x130.xpm: pixmaps/Earth200x130.xpm $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/Earth200x130.xpm $@ $(DESTDIR)$(GFXDIR)/GnuLinux-logo.jpg: pixmaps/GnuLinux-logo.jpg $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/GnuLinux-logo.jpg $@ $(DESTDIR)$(GFXDIR)/Stars.jpg: pixmaps/Stars.jpg $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/Stars.jpg $@ $(DESTDIR)$(GFXDIR)/StarsLogo.jpg: pixmaps/StarsLogo.jpg $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/StarsLogo.jpg $@ $(DESTDIR)$(GFXDIR)/gnuLogo.xpm: pixmaps/gnuLogo.xpm $(INSTALL) -d $(@D) $(INSTALL_DATA) pixmaps/gnuLogo.xpm $@ po/cs.mo: po/cs.po $(msgfmt) -o $@ po/cs.po $(DESTDIR)$(NLSDIR)/cs/LC_MESSAGES/wdm.mo: po/cs.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/cs.mo $@ po/cy.mo: po/cy.po $(msgfmt) -o $@ po/cy.po $(DESTDIR)$(NLSDIR)/cy/LC_MESSAGES/wdm.mo: po/cy.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/cy.mo $@ po/de.mo: po/de.po $(msgfmt) -o $@ po/de.po $(DESTDIR)$(NLSDIR)/de/LC_MESSAGES/wdm.mo: po/de.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/de.mo $@ po/en.mo: po/en.po $(msgfmt) -o $@ po/en.po $(DESTDIR)$(NLSDIR)/en/LC_MESSAGES/wdm.mo: po/en.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/en.mo $@ po/es.mo: po/es.po $(msgfmt) -o $@ po/es.po $(DESTDIR)$(NLSDIR)/es/LC_MESSAGES/wdm.mo: po/es.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/es.mo $@ po/fr_FR.mo: po/fr_FR.po $(msgfmt) -o $@ po/fr_FR.po $(DESTDIR)$(NLSDIR)/fr_FR/LC_MESSAGES/wdm.mo: po/fr_FR.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/fr_FR.mo $@ po/ja.mo: po/ja.po $(msgfmt) -o $@ po/ja.po $(DESTDIR)$(NLSDIR)/ja/LC_MESSAGES/wdm.mo: po/ja.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/ja.mo $@ po/ru.mo: po/ru.po $(msgfmt) -o $@ po/ru.po $(DESTDIR)$(NLSDIR)/ru/LC_MESSAGES/wdm.mo: po/ru.mo $(INSTALL) -d $(@D) $(INSTALL_DATA) po/ru.mo $@ $(DESTDIR)$(DMDIR)/GiveConsole: configs/GiveConsole $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/GiveConsole $@ $(DESTDIR)$(DMDIR)/TakeConsole: configs/TakeConsole $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/TakeConsole $@ $(DESTDIR)$(DMDIR)/Xaccess: configs/Xaccess $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xaccess $@ $(DESTDIR)$(DMDIR)/Xresources: configs/Xresources $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xresources $@ $(DESTDIR)$(DMDIR)/Xservers.fs: configs/Xservers.fs $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xservers.fs $@ $(DESTDIR)$(DMDIR)/Xsession.XFree86: configs/Xsession.XFree86 $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/Xsession.XFree86 $@ $(DESTDIR)$(DMDIR)/Xsession.orig: configs/Xsession.orig $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xsession.orig $@ configs/Xclients: configs/Xclients.in CONFIG_FILES=$@:configs/Xclients.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/Xclients: configs/Xclients $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/Xclients $@ configs/Xservers: configs/Xservers.in CONFIG_FILES=$@:configs/Xservers.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/Xservers: configs/Xservers $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xservers $@ configs/Xservers.ws: configs/Xservers.ws.in CONFIG_FILES=$@:configs/Xservers.ws.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/Xservers.ws: configs/Xservers.ws $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xservers.ws $@ configs/Xsession: configs/Xsession.in CONFIG_FILES=$@:configs/Xsession.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/Xsession: configs/Xsession $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/Xsession $@ configs/Xsetup_0: configs/Xsetup_0.in CONFIG_FILES=$@:configs/Xsetup_0.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/Xsetup_0: configs/Xsetup_0 $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/Xsetup_0 $@ configs/wdm-config: configs/wdm-config.in CONFIG_FILES=$@:configs/wdm-config.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/wdm-config: configs/wdm-config $(INSTALL) -d $(@D) $(INSTALL) -m 0600 configs/wdm-config $@ configs/wdmReconfig: configs/wdmReconfig.in CONFIG_FILES=$@:configs/wdmReconfig.in CONFIG_HEADERS= ./config.status $(DESTDIR)$(DMDIR)/wdmReconfig: configs/wdmReconfig $(INSTALL) -d $(@D) $(INSTALL) -m 0755 configs/wdmReconfig $@ $(DESTDIR)$(PAMDIR)/wdm: configs/wdm.pamd $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/wdm.pamd $@ $(DESTDIR)$(DMDIR)/wdm-config.in: configs/wdm-config.in $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/wdm-config.in $@ $(DESTDIR)$(DMDIR)/Xclients.in: configs/Xclients.in $(INSTALL) -d $(@D) $(INSTALL) -m 0644 configs/Xclients.in $@ clean: rm -f src/TestLogin/TestLogin.o src/chooser.o src/libwdm/debug.o src/libwdm/environment.o src/libwdm/names.o src/libwdm/plcheckers.o src/wdm/Greet.o src/wdm/access.o src/wdm/auth.o src/wdm/choose.o src/wdm/daemon.o src/wdm/dm.o src/wdm/dpylist.o src/wdm/file.o src/wdm/genauth.o src/wdm/loghelpers.o src/wdm/mitauth.o src/wdm/netaddr.o src/wdm/policy.o src/wdm/protodpy.o src/wdm/reset.o src/wdm/resource.o src/wdm/server.o src/wdm/session.o src/wdm/socket.o src/wdm/util.o src/wdm/verify.o src/wdm/xdmcp.o src/wdmChooser/chooser.o src/wdmLogin/Login.o src/wdmLogin/config.o src/wdmPrefs/prefs.o src/wdmPrefs/testPanel.o src/wdmPrefs/testPanel2.o configs/Xclients configs/Xservers configs/Xservers.ws configs/Xsession configs/Xsetup_0 configs/wdm-config configs/wdmReconfig po/cs.mo po/cy.mo po/de.mo po/en.mo po/es.mo po/fr_FR.mo po/ja.mo po/ru.mo doc/wdm.man bin/TestLogin bin/wdm bin/wdmChooser bin/wdmLogin bin/wdmPrefs bin/libwdm.a distclean: rm -f src/TestLogin/TestLogin.o src/chooser.o src/libwdm/debug.o src/libwdm/environment.o src/libwdm/names.o src/libwdm/plcheckers.o src/wdm/Greet.o src/wdm/access.o src/wdm/auth.o src/wdm/choose.o src/wdm/daemon.o src/wdm/dm.o src/wdm/dpylist.o src/wdm/file.o src/wdm/genauth.o src/wdm/loghelpers.o src/wdm/mitauth.o src/wdm/netaddr.o src/wdm/policy.o src/wdm/protodpy.o src/wdm/reset.o src/wdm/resource.o src/wdm/server.o src/wdm/session.o src/wdm/socket.o src/wdm/util.o src/wdm/verify.o src/wdm/xdmcp.o src/wdmChooser/chooser.o src/wdmLogin/Login.o src/wdmLogin/config.o src/wdmPrefs/prefs.o src/wdmPrefs/testPanel.o src/wdmPrefs/testPanel2.o configs/Xclients configs/Xservers configs/Xservers.ws configs/Xsession configs/Xsetup_0 configs/wdm-config configs/wdmReconfig po/cs.mo po/cy.mo po/de.mo po/en.mo po/es.mo po/fr_FR.mo po/ja.mo po/ru.mo doc/wdm.man bin/TestLogin bin/wdm bin/wdmChooser bin/wdmLogin bin/wdmPrefs bin/libwdm.a bin/TestLogin bin/wdm bin/wdmChooser bin/wdmLogin bin/wdmPrefs config.status config.log include/config.h include/gnuLogo.xpm Makefile if test -e bin; then rmdir bin; fi po/wdm.pot: src/TestLogin/TestLogin.c src/chooser.c src/libwdm/debug.c src/libwdm/environment.c src/libwdm/names.c src/libwdm/plcheckers.c src/wdm/Greet.c src/wdm/access.c src/wdm/auth.c src/wdm/choose.c src/wdm/daemon.c src/wdm/dm.c src/wdm/dpylist.c src/wdm/file.c src/wdm/genauth.c src/wdm/loghelpers.c src/wdm/mitauth.c src/wdm/netaddr.c src/wdm/policy.c src/wdm/protodpy.c src/wdm/reset.c src/wdm/resource.c src/wdm/server.c src/wdm/session.c src/wdm/socket.c src/wdm/util.c src/wdm/verify.c src/wdm/xdmcp.c src/wdmChooser/chooser.c src/wdmLogin/Login.c src/wdmLogin/config.c src/wdmPrefs/prefs.c src/wdmPrefs/testPanel.c src/wdmPrefs/testPanel2.c $(xgettext) --keyword=_ --keyword=N_ --default-domain=wdm --output=$@ src/TestLogin/TestLogin.c src/chooser.c src/libwdm/debug.c src/libwdm/environment.c src/libwdm/names.c src/libwdm/plcheckers.c src/wdm/Greet.c src/wdm/access.c src/wdm/auth.c src/wdm/choose.c src/wdm/daemon.c src/wdm/dm.c src/wdm/dpylist.c src/wdm/file.c src/wdm/genauth.c src/wdm/loghelpers.c src/wdm/mitauth.c src/wdm/netaddr.c src/wdm/policy.c src/wdm/protodpy.c src/wdm/reset.c src/wdm/resource.c src/wdm/server.c src/wdm/session.c src/wdm/socket.c src/wdm/util.c src/wdm/verify.c src/wdm/xdmcp.c src/wdmChooser/chooser.c src/wdmLogin/Login.c src/wdmLogin/config.c src/wdmPrefs/prefs.c src/wdmPrefs/testPanel.c src/wdmPrefs/testPanel2.c wdm-1.28/include/config.h.in 644 0 0 755710221265060 153300ustar AlexeyVoinov 0 0/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Value is a path to default authdir */ #undef DEF_AUTH_DIR /* Value is a path to default chooser program */ #undef DEF_CHOOSER /* Value is a path for program used as failsafe client */ #undef DEF_FAILSAFE_CLIENT /* Value is default command to start X server */ #undef DEF_SERVER_LINE /* Value is a command for default session */ #undef DEF_SESSION /* "Value is a list of paths for superuser sessions" */ #undef DEF_SYSTEM_PATH /* "Value is a list of paths for user sessions" */ #undef DEF_USER_PATH /* Value is a path to default wdmLogin config file */ #undef DEF_WDMLOGIN_CONFIG /* Value is a path to default wdm config file */ #undef DEF_XDM_CONFIG /* what to use as HOME value */ #undef FAKEHOME /* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you don't. */ #undef HAVE_DECL_SYS_SIGLIST /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `crypt' library (-lcrypt). */ #undef HAVE_LIBCRYPT /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `ucb' library (-lucb). */ #undef HAVE_LIBUCB /* Define to 1 if you have the `util' library (-lutil). */ #undef HAVE_LIBUTIL /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have mkstemp function to use it instead of mktemp. */ #undef HAVE_MKSTEMP /* Define if libpam is installed */ #undef HAVE_PAM_LIB /* Define if libselinux is installed */ #undef HAVE_SELINUX_LIB /* Define to 1 if you have the header file. */ #undef HAVE_SHADOW_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if Xinerama library is installed */ #undef HAVE_XINERAMA /* Define if you want internationalization support */ #undef I18N /* where to look for locale files */ #undef NLSDIR /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you want support for antialiased fonts */ #undef USE_AA /* Define if you want wdm to use pam for auth */ #undef USE_PAM /* Value is a path to wdm directory */ #undef WDMDIR /* Value is a path to the pixmaps directory */ #undef WGFXDIR /* Define if you want to have ExitLogin */ #undef WITH_EXITLOGIN /* Define if you want wdm to be compiled with SELinux support */ #undef WITH_SELINUX /* Value is a path for xrdb program */ #undef XRDB_PROGRAM /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned' if does not define. */ #undef size_t wdm-1.28/ChangeLog 644 0 0 10066310221265060 134640ustar AlexeyVoinov 0 026-Mar-2005 16:56 [wdm.1.28] prepare for release none 26-Mar-2005 16:32 [wdm.1.27] patch by Thomas Glanzmann I don't think those changes was necessary, but if they make someone's life little better, why not apply it? :) It is said, that without these, wdm didn't work correctly on sunray servers 26-Mar-2005 14:26 [wdm.1.27] fix pam_open_session "I'm running wdm-1.27 on FreeBSD 5.2-CURRENT. Since version 1.26, PAM code seems not to work. ( This means that ssh-agent is not started even if pam_ssh.so is enabled. ) I have checked src/wdm/session.c. If system has setusercontext(), I guess that pam_open_session() will never be called." Reported by Kan Sasaki 22-Mar-2005 21:09 [wdm.1.27] update aa code Antialiasing API has chaged in new wmaker. I need to update code. New code uses some #ifdefs. They should go away soon. 20-Mar-2005 16:46 [wdm.1.27] update config config file for aegis needs to be updated because create_symlinks_before_build field is obsolete. I need to use development_directory_style.source_file_symlink field. 19-Mar-2005 17:17 [wdm.1.27] fix fd leak - II Last descriptor leaked si return value of mkstemp function. I'm totally forgot, that this function returns value. Thanks Michael Gernoth for reminding me about it. :) 19-Mar-2005 13:31 [wdm.1.27] fix fd leak - I wdm leaks file descriptors to child processes. That's bad. This change fixed all leaked pipes and file descriptor for log. The only one left is leaked descriptor for removed auth file 09-Oct-2004 14:12 [wdm.1.27] Welsh translation Welsh translation sent to me by Kevin Donnelly 05-Oct-2004 21:53 [wdm.1.27] problem with xdmcp and ipv6 Jennifer Elaan reported "that wdm drops the connection to the X server after login but before running Xsession.". Later she mailed me with "My partner just isolated and corrected this problem. The culprit is bad handling of IPv6 packets, which triggers a debug message with invalid arguments." 05-Oct-2004 21:49 [wdm.1.27] rebuild glibc was updated. I need rebuild 06-Mar-2004 12:52 [wdm.1.27] fix AUTHORS add latest translators and contributors to AUTHORS file. 28-Feb-2004 14:19 [wdm.1.27] prepare for release update NEWS 28-Feb-2004 13:30 [wdm.1.26] fix warning on FreeBSD found another warning while compiling on FreeBSD. "src/ wdm/util.c:139: warning: implicit declaration of function `sigsetmask'." I don't see that on Linux. I simplified part dealing with signals. The setpgrp function differs on FreeBSD and Linux, but setpgid is not. I tested everything at least to compile on Linux and FreeBSD. I hope it will work on other BSD systems as well. 28-Feb-2004 13:28 [wdm.1.26] remove ExitLogin ExitLogin is generally not needed. There is new option to configure --enable-exitlogin for those who wants it. 23-Feb-2004 11:35 [wdm.1.26] make clean make clean target should remove everything that can be rebuild wiht simple make. including generated config files. 23-Feb-2004 11:18 [wdm.1.26] fix text in INSTALL file Section 4 about make clean and make distclean is not correct. Also name of configs directory should be fixed (it refers to ./config). 22-Feb-2004 13:27 [wdm.1.26] typo in configure help it displays BLACLBOX_PATH instead of BLACKBOX_PATH 22-Feb-2004 13:11 [wdm.1.26] warnings in src/wdm/resource.c src/wdm/resource.c cannot be recompiled with gcc-3.3.2 because of warnings: "src/wdm/resource.c:231: warning: dereferencing type-punned pointer will break strict- aliasing rules". Everything that raised that warning was converted to union. I hope nothing is broken. 22-Feb-2004 10:37 [wdm.1.26] FreeBSD compatibility - III don't use -D flag of install which is GNU specific and is not available in BSD install. reported by Geir Ove Myhr 21-Feb-2004 14:07 [wdm.1.26] obsolete header remove inclusion of it is obsolete and should be replaced with . reported by Geir Ove Myhr 21-Feb-2004 14:03 [wdm.1.26] i18n Don't call gettext (directly) in wdmLogin if I18N is not defined. reported by Geir Ove Myhr 21-Feb-2004 13:54 [wdm.1.26] FreeBSD compatibility - II remove wrong prototypes for setgrent etc. reported by Geir Ove Myhr 21-Feb-2004 13:45 [wdm.1.26] FreeBSD compatibility include into loghelpers.c explicitly. reported by Geir Ove Myhr 01-Dec-2003 22:40 [wdm.1.26] wdm - SELinux support SELinux support added by Tom Vogt 19-Nov-2003 22:48 [wdm.1.26] french translation added french translation by Mathieu Roy 22-Sep-2003 21:18 [wdm.1.26] fix debug compilation there's some calls to Debug left, can be reproduced with --enable-debug option specified to configure (reported by vlaad). I removed offending code, because it's not used anywhere. 19-Sep-2003 00:27 [wdm.1.26] prepare for release update NEWS 18-Sep-2003 21:27 [wdm.1.25] fix etc/configre.cook etc/configure.cook fails if PACKAGE_VERSION is undefined 13-Sep-2003 11:23 [wdm.1.25] remove xdm sources wdm doesn't require separate xdm source tree to build. I never used this source tree for anything. I remove xdm sources from tarball. 13-Sep-2003 10:16 [wdm.1.25] fix pam rights escalation this bug and fix is from kdm. I don't know if it actually fixes something. I only added check for return value of pam_setcred function call. 10-Sep-2003 00:49 [wdm.1.25] add README.aa this file should contain simple recipe how to enable aa. 07-Sep-2003 22:16 [wdm.1.25] draw simple test panel create two panels, and make them switch with buttons on top. 07-Sep-2003 11:24 [wdm.1.25] wdm doesn't stop if parent wdm process is stopped the problem is in new logging code. parent process should process signals and kill it's child. 05-Sep-2003 09:42 [wdm.1.25] last warning I missed one warning :( because of missing --enable- aafont option 05-Sep-2003 00:10 [wdm.1.25] fix daemon mode src/wdm/resource.c sets the debug value to 1 by default. It used to be 0 by default. This causes a problem in that a value of 1 prevents wdm from running as a daemon. Line 140 of src/wdm/dm.c contains an if statement that only calls BecomeDaemon if debugLevel == 0. Reported by Noah Meyerhans 04-Sep-2003 09:42 [wdm.1.25] fix czech translation updated cs.po by Vladimir Nadvornik 02-Sep-2003 22:02 [wdm.1.25] AC_CHECK_DECLS -> AC_DECL_SYS_SIGLIST there's specialized version in autoconf. why not use it? :) 01-Sep-2003 22:49 [wdm.1.25] fix warnings due to bug in autoconf `const' was defined to be empty in config.h. that's bad. some warnings disappeared in build environment. 31-Aug-2003 22:31 [wdm.1.25] remove support for DECnet and Chaos same sutuation as with STREAMSCONN. I'm not sure that code can work at all. 31-Aug-2003 21:12 [wdm.1.25] fix Makefile The distclean rule in Makefile.in never deletes bin/ libwdm.a, and consequently the call to rmdir bin fails. Reported by Noah Meyerhans 31-Aug-2003 20:59 [wdm.1.25] fix tarball creation tarball is named .bz2 but compressed with gzip. fix it. 31-Aug-2003 19:24 [wdm.1.25] remove support for sysv streams sysv streams was never supported by wdm, there was never option to enable it. I cannot test this code because I dont't have access to OS wih streams. I remove it. 31-Aug-2003 17:25 [wdm.1.25] czech translation add czech translation by Vladimir Nadvornik 16-Jul-2003 23:33 [wdm.1.25] rename closeAction function 03-Jul-2003 12:48 [wdm.1.25] function to add section buttons in wdmPrefs Very basic functions. panels and buttons are not destroyed, views not switching. Just adding buttons. 01-Jul-2003 13:01 [wdm.1.25] fix copyright notice in TestLogin 01-Jul-2003 12:28 [wdm.1.25] spanish translation add spanish translation by Manolo Padron Martinez 01-Jul-2003 11:48 [wdm.1.25] fix TestLogin TestLogin is broken now, because wdmLogin 17-Jun-2003 23:10 [wdm.1.25] run some tests via sudo some tests nned root priviledges. (ie test for switching users functions). 17-Jun-2003 17:09 [wdm.1.25] create common parts of interface for wdmPrefs buttons like "close" and "save", section selector, should be common for all sections. 15-Jun-2003 20:49 [wdm.1.25] remove old env functions - III replace remaining printEnv and freeEnv with WDMFreeEnv and WDMPrintEnv 15-Jun-2003 20:27 [wdm.1.25] remove old env functions - II replace setEnv and putEnv with WDMSetEnv and WDMPutEnv 15-Jun-2003 14:55 [wdm.1.25] remove old env functions - I getEnv function replaced with WDMGetEnv 15-Jun-2003 12:30 [wdm.1.25] quick fix for dup2/3 problem wdm/wdmlogin communication tied to fd #3, that's bad, because if any other file opened, then communication channel breaks. Solution is to pass filedescriptor as commandline parameter to wdmLogin. 13-Jun-2003 11:10 [wdm.1.25] stricter compiler options add -Werror to CFLAGS, so I will never ignore warnings in future. Fix all current warnings 12-Jun-2003 23:39 [wdm.1.25] add "en" locale add en.po, replace long default help text string with a lot shorter one. C locale will get only short help text. User should use en locale to get full english help text. 12-Jun-2003 10:19 [wdm.1.25] WDMPrintEnv function It's better to have it... 11-Jun-2003 17:45 [wdm.1.25] fix install script install part of Makefile should create directory used as fakeroot. If that directory doesn't exists then aa will not work. 11-Jun-2003 14:42 [wdm.1.25] GPL notice in prefs.c I forgot to add GPL notice to prefs.c 10-Jun-2003 23:13 [wdm.1.25] wdmChooser create wdmChooser skeleton. 10-Jun-2003 22:51 [wdm.1.25] wdmPrefs wdmPrefs will support only proplist format configs. first version should support all options for wdmLogin available in proplist config. (geometry, aafonts, multibyte). This change will introduce the program skeleton. 09-Jun-2003 23:19 [wdm.1.25] automate version numbers get version number from branch 09-Jun-2003 11:07 [wdm.1.25] automate build of wdm-current development builds should not build tarball at all.if requested it should build wdm-current.tar.bz2. only integration build creates "real" tarballs 09-Jun-2003 00:04 [wdm.1.25] fix ChangeLog after migration to new repository some wrong messages goes into ChangeLog. remove it. 08-Jun-2003 23:58 [wdm.1.25] fix problems with bl* symlinks build fails with error 'symlink already exists' 07-Jun-2003 13:30 [wdm.1.25] -a option to config animation option should be taken from wdmLogin-config. command line will be here for few releases for compatibility. 06-Jun-2003 18:58 [wdm.1.25] prepare for release update NEWS, INSTALL, version in configure.ac 06-Jun-2003 17:49 [wdm.1.24] #ifdef parts for antialiasing fonts antialiasing available only in cvs snapshots. Make it conditional. 06-Jun-2003 15:46 [wdm.1.24] fix AA wdmLogin crashes when started with AA enabled. 05-Jun-2003 17:30 [wdm.1.24] fix i18n build/install if msgfmt is not found Makefile is still tries to create .mo and install it. (reported by vlaad) 05-Jun-2003 17:13 [wdm.1.24] geometry option for wdmLogin geometry option will allow wdmLogin panel to be moved and resized. That option will be the first in wdmLogin's own config file. 04-Jun-2003 16:49 [wdm.1.24] fix WDMCheckPLDictionary current implementation have some disadvantages. 04-Jun-2003 16:16 [wdm.1.24] fix debug test debug test is broken. 03-Jun-2003 21:41 [wdm.1.24] add warning to Makefile.in warn that Makefile.in is generated. Also remove some duplicated variables from Makefile.head 03-Jun-2003 18:28 [wdm.1.24] fix wstrndup wstrndup was added to WINGs only in cvs snapshots. Replace it with something else(reported by jmmv) 03-Jun-2003 17:37 [wdm.1.24] fix compile/link flag results of get-wings-flags changed. update etc/ Howto.conf (actual only for my personal computer :) ) 01-Jun-2003 12:00 [wdm.1.24] prepare for release update NEWS, change version in configure.ac 01-Jun-2003 11:28 [wdm.1.23] update man pages describe new options to control logs 01-Jun-2003 11:04 [wdm.1.23] fix default debug level error and panic messages should go in log 01-Jun-2003 00:08 [wdm.1.23] scripts stderr -> log write function to run scripts and capture stderr and put it into log using WDM... functions. 19-May-2003 13:00 [wdm.1.23] fix etc/makefile.cook fix wrong deps for *a,M 19-May-2003 10:45 [wdm.1.23] env functions in libwdm reimplement functions to work with environment and remove it from util.c, and put into libwdm/env.c 14-May-2003 21:25 [wdm.1.23] add logging options -logfile option will allow to redirect all messages to specified file, -syslog option will allow to redirect all errors, warnings and debug messages to syslog with specified facility. 12-May-2003 21:27 [wdm.1.23] use new log functions New logging functions is ready, replace all calls to older functions with newer, remove error.c to ensure no older functions is called anywhere. 07-May-2003 21:06 [wdm.1.23] move pixmaps directory patch by Julio Merino . "...It adds a new option to configure, --with-gfxdir that allows to change the pixmaps directory; it defaults to $prefix/ share/pixmaps/wdm (maybe it's better to set it to $datadir/pixmaps/wdm), and modifies configuration files to adjust paths...." 06-May-2003 08:05 [wdm.1.23] remove double check for shmat configure scripts checks for shmat twice. AC_PATH_XTRA does check for shmat, because libX11 needs it. Additional check is removed. 06-May-2003 07:52 [wdm.1.23] rewrite code for shadow there's no libshadow on linux system, I'll rewrite portions of code dealing with shadow. shadow code will always be enabled if pam is not used and if shadow.h is found in the system. This code can be disabled with -- disable-shadow option to configure script. 04-May-2003 22:07 [wdm.1.23] fix typo in configure.ac reported by Michael Buesch 04-May-2003 21:48 [wdm.1.23] remove double check for unistd.h reported by Michael Buesch 04-May-2003 17:36 [wdm.1.23] fix configure.ac AC_DEFINE(USE_PAM... was in section that is executed if libpam was not found. 04-May-2003 11:56 [wdm.1.23] better pam/shadow check current defaults (use /etc/passwd) is bad. the better approach will be to check for pam first, if it is not present then check for shadow, if it is not present also uset /etc/passwd. Provide options to explicit control what to use 02-May-2003 23:41 [wdm.1.23] fix typo in configure.ac silly typo in there... :) 02-May-2003 23:36 [wdm.1.23] add --disable-xinerama to configure If anyone will need to disable compiling and linking with xinerama, it can be done :) 02-May-2003 23:09 [wdm.1.23] replace compiled-in logo with gradient replace compiled-in wdm logo with nice gradient. It would be much less troubles maintaining code without compiled in pixmap. 30-Apr-2003 22:29 [wdm.1.23] remove warnings I hate warnings... The only warning still left is about too long lines in gnuLogo.xpm, which is inclded by default. I'll replace it later with nice gradient. 30-Apr-2003 21:17 [wdm.1.23] stricter compiler options Add -Wall -O2 -pedantic options to CFLAGS, so more warning will be on display 30-Apr-2003 21:00 [wdm.1.23] enhance set of WDMDebug... functions WDMDebug... functions should have ability to output info using syslog. There should be variants for different message levels. Currently I certainly need WDMWarning and WDMError. 26-Apr-2003 16:27 [wdm.1.23] remove message about gfx noted by Steve Lion 26-Apr-2003 11:06 [wdm.1.23] rearrange lines in xinerama code I hate code duplication :). 26-Apr-2003 10:48 [wdm.1.23] fix xinerama head option Patch from Carlos Torres . 26-Apr-2003 10:37 [wdm.1.23] add option for xinerama option should allow selecting the head on wich to draw wdm panel 26-Apr-2003 10:27 [wdm.1.23] rewrite of configure.ac - II merge all additional libs in LIBS, merge LIBXINERAMA in XLIBS. I don't like a lot of LIB* variables. I removed linking to libXt, because login panel uses WINGs instead. 25-Apr-2003 22:31 [wdm.1.23] rewrite of configure.ac - I since I'm not supporting ancient versions of WINGs, I can remove a lot of steff from it. Rewrite started by removeing all guessing about needed libraries. Modern WINGs have get-wings-flags script, that report all those flags for me. 13-Apr-2003 19:03 [wdm.1.23] basic support for Xcursors add parameter that allow selecting of xcursor theme. 08-Apr-2003 20:31 [wdm.1.23] fix ... failed messages all ... failed messages was created at runtime. They don't get into .po's 31-Mar-2003 20:43 [wdm.1.23] prepare for release update configure.ac and NEWS 30-Mar-2003 22:20 [wdm.1.22] fix shake animation fix shake animation using idea from Michael Buesch . remove unneeded timeRem variable. 28-Mar-2003 22:28 [wdm.1.22] apply patch for animation Michael Buesch sent me a patch for animation roll-up code. 28-Mar-2003 22:25 [wdm.1.22] revert back to old main loop with new main loop using WMScreenMainLoop there's no way to see roll-up animation on exit. 18-Mar-2003 22:46 [wdm.1.22] updated german translation Michael Buesch updated german .po. 16-Mar-2003 19:52 [wdm.1.22] german translation add german translation by Michael Buesch 15-Mar-2003 11:19 [wdm.1.22] add names.c to libwdm names.c will contain functions to work with host names and addresses. supported protocols are ipv4, ipv6. Later these functions will replace netaddr.c fromo xdm. I will not support streams, DECnet and Chaos. 11-Mar-2003 23:32 [wdm.1.22] add WDMCheckPLStringOrArray This checker will check if pl is string then return duplicated string, otherwise it will call WDMCheckPLArray. 11-Mar-2003 23:02 [wdm.1.22] addnull option to arrayspec if addnull is True, than NULL results from checker will be appended to list as well as non-NULL, otherwise NULL result will be dropped. 10-Mar-2003 21:37 [wdm.1.22] add PLAccess resource PLAccess resource will be used instead of Xaccess resource. PLAccess specifies file inproplist format. If PLAccess is not defined then Xaccess with old functions will be used. 10-Mar-2003 14:42 [wdm.1.22] unified interface for checkers. plcheckers interface redesigned. WDMCheckPLDictionary added. Now all checkers completely driven with simple data structures. It would be very easy to add new checkers, like WDMCheckPLInteger etc. 10-Mar-2003 14:36 [wdm.1.22] add debugging functions to libwdm I need some functions to provide debug info. I don't want to use functions present in xdm. Later new functions will be used in wdm program too 04-Mar-2003 22:55 [wdm.1.22] target for creating wdm.pot outside of aegis translatore probably will not be using aegis, so make Makefile a little friendlier for them :) 04-Mar-2003 22:32 [wdm.1.22] test plcheckers functions now with new testing scripts, there should be tests for all this functions 04-Mar-2003 21:42 [wdm.1.22] fix WDMCheckPLString WDMCheckPLString should always return allocated string. 04-Mar-2003 20:46 [wdm.1.22] add LIBS to test scripts LDFLAGS will be added before source file, LIBS will be added after source file to compiler command line 04-Mar-2003 20:33 [wdm.1.22] fix test scripts -L should point not just to directory but to bin/ subdirectory in it 03-Mar-2003 07:55 [wdm.1.22] basic testing scripts I need tests for wdmlib. 27-Feb-2003 20:34 [wdm.1.22] fix i18n.cook should use [resolve ...] on source *.po's 27-Feb-2003 16:34 [wdm.1.22] explicit project name for ChangeLog gen Use explicit project name for ChangeLog generation, so branches will have full ChangeLog. 27-Feb-2003 16:29 [wdm.1.22] autobuild ChangeLog from repository short description of what was done now is only in NEWS 27-Feb-2003 16:22 [wdm.1.22] update NEWS update NEWS what have been done so far. Later I can forget to mention something 27-Feb-2003 14:14 [wdm.1.22] rename ChangeLog ChangeLog is renamed to ChangeLog.old. New ChangeLog will be generated from repository history. 27-Feb-2003 07:59 [wdm.1.22] cook library for creating makefiles create cook library for generating makefiles, it should make makefile.cook a lots more readable. 27-Feb-2003 07:04 [wdm.1.22] checks for ar and ranlib configure script should check for ar and ranlib. Every other script should use variables instead of hardcoded values. 27-Feb-2003 06:34 [wdm.1.22] simplify options handling no need to duplicate optarg. more accurate forming of command line in Greet.c 27-Feb-2003 02:10 [wdm.1.22] use indent on wdmLogin/Login.c I'm about to rewrite lots of code in Login.c. I want to use my style, that is closer to kernel style. Copyright notice changed to more GPLish one. :) 27-Feb-2003 01:48 [wdm.1.22] redundant check for '=' in options since wdm in Greet.c never uses '=' to form options passed to wdmLogin, check for '=' in wdmLogin is redundant and should be removed 27-Feb-2003 01:41 [wdm.1.22] remove LOGNAME_LEN since LoginName and Password has now unlimited length, LOGNAME_LEN macro is not needed any more. 27-Feb-2003 01:38 [wdm.1.22] add wdmLoginConfig resource wdmLoginConfig resource will be passed to wdmLogin program. wdmLogin program will read it and configure itself according to data in that file. This will provide more flexible configuration for wdmLogin and will not tie wdm and wdmLogin as it is now. 27-Feb-2003 01:17 [wdm.1.22] add -c option to wdmLogin -c option will be used to pass name of configuration file to wdmLogin. Any login panel-dependand information such as background picture, window geometry etc should go there. 27-Feb-2003 00:27 [wdm.1.22] wrappers for WDMCheck... wdmlib should provide a way to convert checkers into void*(*)(void*,void*). 27-Feb-2003 00:09 [wdm.1.22] add WDMCheckPLArray WDMCheckPLArray will check for correctness of array with repeated elements. 26-Feb-2003 23:32 [wdm.1.22] add WDMCheckPLString WDMCheckPLString would check if pl is a string 26-Feb-2003 23:11 [wdm.1.22] remove dummy.c since we have real library sources, we don't need dummy.c any more. 26-Feb-2003 22:57 [wdm.1.22] start plcheckers.c part of libwdm plcheckers.c will contain function to check correctness of property lists, used as configuration data. 26-Feb-2003 22:54 [wdm.1.22] fix library compilation flags libwdm shoud be compiled with all x11flags 26-Feb-2003 22:04 [wdm.1.22] bugfix release (clone of 2.D003) 1.22.1 26-Feb-2003 21:57 [wdm.1.22] fix pam service name (clone of 2.D002) service name should wdm, not xdm 26-Feb-2003 21:49 [wdm.1.22] fix makefile to build library makefile is now broken, it doesn't create library, so nothing is built. 26-Feb-2003 21:10 [wdm.1.22] library build script library of common functions will be very useful. duumy.c is provided so library will be created. 26-Feb-2003 10:52 [wdm.1.22] s/xdm/wdm/ in mans there's a lot of mentions of xdm where wdm should be 20-Feb-2003 00:53 [wdm.1.22] fix segfault when I choose Reboot or Halt there's segfault, probably because of new handling of LoginName and LoginPswd 16-Feb-2003 13:41 [wdm.1.22] remove limits on login and password From: voins@voins.program.ru Date: Sun Feb 16 13:41:23 2003 no more limits! 15-Feb-2003 21:14 [wdm.1.22] simplify wdmLogin: remove dpy and screen_number dpy global variable is not really needed, everything is already present in WMScreen structure. screen_number is not needed also. 15-Feb-2003 13:11 [wdm.1.22] i18n - III, translate help message rearrange help message, so it will not require snprintf, just strcat. HelpFile global variable removed 15-Feb-2003 11:03 [wdm.1.22] use wstrdup replace malloc/strcpy pairs with wstrdup call. It is better, because wstrdup uses wmalloc that never returns NULL pointer. 14-Feb-2003 00:01 [wdm.1.22] simplify wdmLogin: remove old code there's a lot of code for ancient versions of WINGs. remove this code or replace with proper new code. 13-Feb-2003 23:58 [wdm.1.22] smooth scale is cli option specify -s to disable smooth scaling 09-Feb-2003 19:17 [wdm.1.22] prepare for release change version number, check that everything is ok 09-Feb-2003 18:39 [wdm.1.21] update wdmLogin.man wdmLogin.man should contain information about translations 09-Feb-2003 17:28 [wdm.1.21] update ChangeLog and NEWS none 08-Feb-2003 18:43 [wdm.1.21] resize menu russian translation for 'reboot' is too long. It can be shorten. I'll widen options popup a little 08-Feb-2003 18:24 [wdm.1.21] i18n - II translate all other strings 08-Feb-2003 13:53 [wdm.1.21] update man page update man page to reflect i18n changes in config 08-Feb-2003 13:43 [wdm.1.21] some locale settings in config language resource in wdm-config if defined will be used instead of default root locale 08-Feb-2003 11:01 [wdm.1.21] include locale.h 07-Feb-2003 23:15 [wdm.1.21] use configured paths to xgettext and msgfmt replace hardcoded paths with values from configure script 07-Feb-2003 22:58 [wdm.1.21] xgettext should not affect I18N xgettext used only in development, I18N should be undefined if there's no msgfmt program 07-Feb-2003 22:28 [wdm.1.21] check for msgfmt check for msgfmt program in configure 07-Feb-2003 22:23 [wdm.1.21] update README and AUTHORS its out f date 07-Feb-2003 20:55 [wdm.1.21] short ja.po add short version of ja.po 07-Feb-2003 08:03 [wdm.1.21] short ru.po add short ru.po, and update build system to create *.mo from *.po 06-Feb-2003 22:02 [wdm.1.21] i18n - I translate 100% static strings 06-Feb-2003 07:47 [wdm.1.21] check for libintl.h need to check for libintl.h header 05-Feb-2003 07:58 [wdm.1.21] test for gettext in configure add gettext test in configure.ac 02-Feb-2003 18:05 [wdm.1.21] remove WmOption variable same with OptionStr. it isn't really needed. 02-Feb-2003 17:10 [wdm.1.21] remove OptionStr variable I don't see any need in that. all info already present in ExitStr array. 01-Feb-2003 16:27 [wdm.1.21] smooth scaling use smooth scaling if available 31-Jan-2003 23:21 [wdm.1.21] unlimit WM list list of window managers should not be limited to 14 31-Jan-2003 23:04 [wdm.1.21] The "wdm" program, branch 1. Migration to newer xdm base 31-Jan-2003 00:07 [wdm.1.21] enable creation of tar.bz2 it is useful to provide both on site 30-Jan-2003 08:04 [wdm.1.21] update TODO list new items in TODO list, so everyone can see it. 05-Jan-2003 22:29 [wdm.1.21] prepare for release this will be wdm-1.21. Fix README files. update ChangeLog file. 14-Dec-2002 12:33 [wdm.1.20] clean and distclean targets add clean and distclean targets to generated Makefile 13-Dec-2002 22:53 [wdm.1.20] apply debian patch extract everything useful from debian patch and apply it. 13-Dec-2002 19:52 [wdm.1.20] program list create list of prorams dynamically 12-Dec-2002 17:18 [wdm.1.20] pixmaps install rearrange and install pixmaps 10-Dec-2002 16:16 [wdm.1.20] configs install move configs from src/config to config, dynamically calculate files to build and files to install 10-Dec-2002 16:15 [wdm.1.20] fix list of project files if aegis -l pf called without change number it doesn't exclude removed files. 10-Dec-2002 13:36 [wdm.1.20] create Makefile.head Put all variables in /** */ comments into Makefile.head 10-Dec-2002 13:25 [wdm.1.20] the last (i think) try 10-Dec-2002 13:20 [wdm.1.20] fix integration build again another attempt to fix integration build 10-Dec-2002 13:13 [wdm.1.20] fix integration build build failed because of use of PACKAGE_VERSION variable, that can be undefined if Howto.conf is not created yet. 10-Dec-2002 13:12 [wdm.1.20] fix build deps all %.0 should depend on etc/Howto.conf because of compilation flags. 09-Dec-2002 15:37 [wdm.1.20] install mans man installation is calculated based on *.man sources in project 06-Dec-2002 16:08 [wdm.1.20] install target add install target to generated Makefile. Only basic install is done. A lot of things to automate. A lot of things to install 06-Dec-2002 15:19 [wdm.1.20] add generated files to configure.ac add generated files to configure.ac: they will be generated when building outside of aegis environment, and will not when building using aegis? because of -- no-create option. 06-Dec-2002 14:26 [wdm.1.20] build mans build mans for doc directory 05-Dec-2002 10:11 [wdm.1.20] fix tarball name tarball name constructed using PACKAGE_VERSION 05-Dec-2002 10:04 [wdm.1.20] fix integration build some operations must be performed twice. may be because of removal of targets second attempt is successfull. 04-Dec-2002 17:28 [wdm.1.20] split up Howto.conf split up Howto.conf by parts, to fine tune dependencies 04-Dec-2002 16:05 [wdm.1.20] generate Makefile generate Makefile able to build wdm. 04-Dec-2002 13:38 [wdm.1.20] build create build system 03-Dec-2002 16:52 [wdm.1.20] rearrange files rearrange files in src by program 03-Dec-2002 16:22 [wdm.1.20] remove unused tests some test results is never used. remove them 03-Dec-2002 16:10 [wdm.1.20] fill in Howto.conf create parameters to fill in by configure in Howto.conf 03-Dec-2002 15:47 [wdm.1.20] create tarball create simple tarball with confiugure included in it 03-Dec-2002 13:15 [wdm.1.20] remove dep on automake automake is no longer needed. currently the build is broken. no build at all? except for generated configs. 02-Dec-2002 17:37 [wdm.1.20] fix Xclients and build proces build process is broken somehow. 02-Dec-2002 17:22 [wdm.1.20] configure.in -> configure.ac rename it 02-Dec-2002 17:18 [wdm.1.20] remove generating from configure.in remove generating of wdm configs from configure.in. put it into etc/Howto.cook. 02-Dec-2002 16:53 [wdm.1.20] remove remaining generated configs none 02-Dec-2002 15:29 [wdm.1.20] remove generated wdm-config remove generated wdm-config from sources and generate it from configure script. 02-Dec-2002 13:47 [wdm.1.20] another change in configure.in rearrange tests 02-Dec-2002 10:14 [wdm.1.20] remove old autoconf files config.h.in is now always generated by autogen.sh. acconfig.h is not needed for autoconf >= 2.5 29-Nov-2002 15:57 [wdm.1.20] rewrite configure.in configure.in is bad. rewrite. 28-Nov-2002 16:36 [wdm.1.20] remove checks for xdm sources xdm sources is not required. src/ dir has all sources needed to build wdm 28-Nov-2002 15:37 [wdm.1.20] remove warnings remove annoying warnings 28-Nov-2002 14:21 [wdm.1.20] fix configure.in current configure requires hacks to allow header files inclusion from /usr/X11R6/include. 28-Nov-2002 11:54 [wdm.1.20] remove patches directory all patches already applied. patches dir is not needed any more. 28-Nov-2002 11:41 [wdm.1.20] change directory structure unpack xdm....tar.gz, copy sources, apply patches, and remove that part from Makefile.am 27-Nov-2002 17:33 [wdm.1.20] apply wrlib patch apply wrlib patch I use in building wdm package for ALT Linux 27-Nov-2002 17:28 [wdm.1.20] apply longpasswd patch apply longpasswd patch I use in building wdm package for ALT Linux 27-Nov-2002 17:24 [wdm.1.20] apply vns2 patch apply vns2 patch I use in building wdm package for ALT Linux 27-Nov-2002 16:54 [wdm.1.20] fix build fix wdmpam patch in patches dir. 27-Nov-2002 16:41 [wdm.1.20] fix mkinstalldirs remove rcs keyword from it 27-Nov-2002 16:39 [wdm.1.20] import sources & skeleton config import existing sources of wdm-1.20, create basic config that allows building of wdm wdm-1.28/AUTHORS 644 0 0 463710221265060 127260ustar AlexeyVoinov 0 0Gene Czarcinski Creator of original wdm package (former DisplayMaker) Largo The "logo" artwork: The standard/default DisplayMaker logo is based on the GnuLinux-logo artwork. Tom Rothamel Original creator of the idea of using an external program for the Login Panel as well as the basic protocol for communication between greet and the external program (using a pipe to send the username and password ext->xdm and signals xdm->ext. Tom created the "xdm-extgreet" package using this idea. The pip I/O routines are based on Tom's in.c, out.c. David Reviejo Created a new look for the login panel. Cleaner and also made the help information a scroll view. Marcelo Magallon For the man pages and debugging. Alfredo K Kojima and Dan Pascu for creating WindowMaker and WINGs. Without WINGs, wdm would not have happened. Bevan Broun compiled it successfully on an SGI Indy under Irix 6.5.2 Berend De Schouwer Corrected the configure.in file to allow people to compile wdm easily without needing any ugly hack into the configure script. Salman Ahmed installation bug report and Xsession patch. Don Bottstein patch to configure. Alexander Kabaev patch to session.c. patch to correct some hanging problems under at least FreeBSD. Miodrag Vallat various ideas, patches, and general help. Matsubayashi, 'Shaolin' Kohji and Mr. Furukawa patch to the pam code. Egmont Koblinger patch to center some messages one to each other on the login panel. bug/wishes report which I haven't forgotten at all... Jerome Alet maintainer of wdm code since wdm-1.1 to wdm-1.20 Gregory S. Youngblood maintainer of wdm code since 2000 to 2003 Alexey Voinov maintainer of wdm code since wdm-1.20 Grigory Batalov russian translation Hiroshi Miura japanese translation Michael Buesch german translation Tom Vogt SELinux support Mathieu Roy french translation Vladimir Nadvornik czech translation Manolo Padron Martinez spanish translation wdm-1.28/COPYING 644 0 0 4310510221265060 127220ustar AlexeyVoinov 0 0 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. wdm-1.28/ChangeLog.old 644 0 0 4525510221265060 142260ustar AlexeyVoinov 0 01.22.1 - Feb 20 2003 - Alexey Voinov - pam service name changed from "xdm" to "wdm" 1.22 - Feb 09 2003 - Alexey Voinov - Xdm-base of wdm have been upgraded to xdm from XFree86-4.2.1.1. I haven't touched greet.c yet because it works as it is and there will be a lot of changes in greet.c soon. - Use smooth scaling for logo image in wdmLogin if that function is available in libwraster. - List of window managers is now unlimited. - wdmLogin interface translated. I have ja.po from Hiroshi Miura and ru.po from Grigory Batalov . Default help text is not translated. Set wdmLocale resource in wdm-config to locale you want wdmLogin to run in. - Some unneeded global variables in wdmLogin removed. 1.21 - Jan 05 2003 - Alexey Voinov - Applied all my patches used in ALT Linux package. This fixes problem with long passwords, makes wdm compile and run with newer WindowMaker (post 0.80.2 cvs), fixes some problems with pam. - Adapted and applied patch from Debian package. (wdm-1.20-17) This adds Xinerama support, updates wdm.man, introduces some minor changes. - configure.in rewriten and renamed to configure.ac. Can be broken for some systems. Mail me if it is true for you. autoconf >= 2.53 is now required (for developers). - Directories rearranged. New directory structure allows me to fully automate generation of Makefile.in (automake is not used anymore). Now src/ keeps complete wdm sources, xdm/ keeps complete xdm sources, used as a base for wdm. xdm/ directory is needed for referencal purposes only. 1.20 - Feb 29 2000 - Jerome Alet - Jerome Alet: Modified xdm-3.3.2-resource2.patch to allow most of wdm's configuration resources to be set on a per display basis instead of on a per display manager basis. Modified INSTALL to give more detailed information on the installation procedure for some Linux distros. - Matsubayashi, 'Shaolin' Kohji and Mr. Furukawa: Modified src/config/wdm.pamd and patches/xdm-3.3.2-pamwdm.patch according to xdm-3.3.6 handling of the pam stuff correcting the problem with incorrect user permissions settings on devices when the user logged in. - Alexander N. Kabaev: Modified Login.c because of signal handling problems: it appears that calling DestroyLoginPanel directly from within the SIGTERM handler could cause wdm hangs. - Egmont Koblinger: Modified Login.c to center "Login authentication" and "Welcome to" one to each other. 1.19 - Sep 21 1999 - Jerome Alet Modified Greet.c and Login.c in order to not pass at all the username and password for the default user on wdmLogin's command line. Now wdm does all the bad stuff, wdmLogin just returns an empty username+password to wdm. Modified the manpages accordingly. Modified src/config/Makefile.am in order for wdm-config to be created and installed. 1.18 - Sep 16 1999 - Miod Vallat: Modified configure.in and Login.c to correctly set the maximum login name length. - Jerome Alet: Modified Login.c Greet.c and resource.c to define 2 new X resources: WdmDefaultUser and WdmDefaultPasswd which can be set in wdm-config to allow anyone to log in without typing neither a username nor a password. USE WITH EXTREME CAUTION. Modified wdm.man.in, wdmLogin.man.in, wdm-config.in and wdm-config too. Modified src/config/Makefile.am in order for wdm-config to be installed only root-readable because it could eventually contain a clear text password. 1.17 - Sep 8 1999 - Alexander Kabaev: Modified session.c to allow the environnement settings set in /etc/login.conf to propagate correctly to the client session. - Miodrag Vallat: - Modified configure.in to solve the libpng/libz problem. - Added the two Irix patches in the patches subdirectory. - Did some cleanups to the source trees, the manpages, and the code. 1.16 - Jul 7 1999 Jerome Alet with a patch from Don Bottstein - Modified configure.in to correctly set GFX_INC_PATH and GFX_LIB_PATH with the help of Don's patch to configure. 1.15 - Jul 6 1999 Jerome Alet with help from Salman Ahmed - Modified src/Makefile.am deleting the # before 'pixmaps' - Modified src/config/Xsession.in moving the XRDB block before the ~user/.xsession launch - Modified README to include something about the mailing list. 1.14 - Jul 1 1999 Jerome Alet - Modified TestLogin.c replacing #include with #include . The compile time warning is gone. - some changes to the doc (README, etc...) talking about the new maintainer. 1.13 - Jun 30 1999 Jerome Alet - modified Login.c to allow the tab key to move from the username field to password and back. - modified Login.c and Greet.c to incorporate debian's patches to allow MD5 passwords. 1.12 - Jun 18 1999 Berend De Schouwer - the configure script was loosing GFXLIBS, now it seems to work fine. 1.11 - Jun 18 1999 Jerome Alet - Added a call to XSetInputFocus in order for the login panel to get the focus wherever the mouse pointer is. 1.1 - Jun 11 1999 Jerome Alet - fixed a bug in Login.c where wmStr[255] was written but wmStr was declared as being only 16 long. In fact wmStr was not the good variable, it was wmOption[255] instead. - update Login.c to compile with WindowMaker 0.60 - modified Login.c to allow None to be set to wdmWm in order for the user to have only the NoChange choice. - modified Login.c Greet.c resource.c to allow a new resource named wdmHelpFile. This resource points to a text file to be displayed in the help panel. - modified CreateHelpFrames to compute the help panel size according to the text to display's number of lines. 1.0 - Sep 13 1998 Gene Czarcinski - for FreeBSD support, add check for libtiff34 in addition to libtiff; if both found, it should not hurt. - update configure.in to support gif stuff (new in WindowMaker 0.19.3) -- do both ungif and gif libs even though WindowMaker just uses gif for now - even though there is no clear reason for it, FreeBSD requires Xt so add it (it should not hurt anyway) - add xrdb -load /dev/null to the beginning of Xsession to cleaup wdm resources - remove checking for a number of header files for which nothing is done and, even when not found on some systems, seems to make no difference. - finalize the RollUp animation to be a diagonal ... this seems to "look" the best (but of course someone will not think so). - fix bug where startkde was found but Xclients was not modified correctly 0.90 - Sep 06 1998 Gene Czarcinski - Release 1.0 "candidate" - create wdmReconfig.in (wdmReconfig) for rpm post install updating of wdm-config and Xclients - if WINGs == 980901, add call to WMSetScrollViewLineScroll to speed up scrolling. - add closing rollup options (for now, just in src), to rollup vertical, horizontal, or diagonal. - added more information on ./configure options to INSTALL - add --with-local ./configure option which will appropriately usr /usr/local/{bin,include,lib} - removed --enable-debugWINGs options, this is now controlled by --enable-debug - changed animation slightly to make it more "Nextish" (at least, my exposure to what "Nextish" looks like). - more fiddling with the size and location of the popup buttons in order to handle better "looking" window manager names (e.g., WindowMaker rather than wmaker) - remove the '-t3' from the shutdown commands in wdm-config; add comments and examples for different systems in wdm-config, Xsession, and Xclients - fixed configure so that if the shell for login is sh, it is invoked as '/bin/sh -' which is equivalent to '/bin/bash -login' - add comment to install about reviewing and changing config files for different systems. - slightly change the size and location of the help frame to make it look better. - change the size and location of buttons for better symetry - fixed code for go button so it works properly - delete old xlogin stuff in src/config/Xresources: it was conflicting with other stuff on some(?) systems 0.18 - Aug 29 1998 Gene Czarcinski - add the capability to set the proper location for bash and sh in the XSetup_0, Xsession, and Xclients shell scripts. - change configure and src/Makefile.am to use GFXLIBS and GFXFLAGS properly ... --with-gfx-libs= and --with-gfx-incs= should now work properly on more systems. - change Xclients to add an arbitrarily named window manager since we cannot anticipate all of them. ./configure is changed to specify it via --with-winmgr and (if needed) --with-winmgr_path - fix src/config/Makefile.am (Xsession and Xclients not cleaned) - change Xclients, etc. so that the code for window manager programs which are not found are commented out. - do not compile chooser since it is not installed anyway. This will be "fixed" in Release 2 (or something greater than 1). - change Xsession to simplify it and attempt to make it more system independent. - finally (?) fixed how info and error messages work (redo whole logic). It turned out the problem was the order of displaying the messages and doing the authentication (display MUST be first or a race condition results). Did not have to redo msg handling itself but it did result in simpler code. - add new xresource DisplayManager*wdmAnomations to enable or display the shake and rollup animations. true=enabled, false=disabled; default if not specified is true. [user request, too slow on some displays] - change the way setting the background (root window) is specified so that if it is NOT specified or the value is the literal none, then the background is NOT set. The user can still set the background via other means [user request]. - New look for the login panel (supposedly more Nextish). Whether is is or not, I like the new look. - Change help to use a ScrollView (this may be 0.18.x dependent) but that is the way it goes. - Shuffle the library order to put -lWINGs and -lwraster in front of the other libraries (makes a difference on some systems) 0.12 - Aug 24 1998 Gene Czarcinski - add more wdm/Xsession examples - make Xclients.in more configurable and add stuff to configure.in so that we locate the various window manager paths and then "build" a wmlist based on what is found - updated README and INSTALL - add --with-wmlist=< > to specify a list of optional window managers to start - add --with-Logo=< > to specify Logo pixmap filename (can be any file since this is used in the wdm-config file) - Add code to Login to attempt to keep the same aspect ratio in the Logo image as was in the original image. If the image is smaller that 200x130, keep it as is. The image will be cenetered in the Logo display area. - add examples of options to wd-config (as comments) - make lower case in configure: --with-wdmdir=, --with-defuserpath= and --with-defsystempath= - bugfix: configure.in so --with-WDMDIR works properly 0.11 - Aug 20 1998 Gene Czarcinski - use two levels of versioning and add a third level for internal stuff only. - With the WINGs in WindowMaker 0.18.0 some interfaces changes ... The new WINGs uses WINGS_H_VERSION 980730. - WMCreateScreen is different. If WINGs > 980722, use WMInitializeApplication; WMCreateScreen; - configure for -lPropList (I wonder how everthing worked before?) - add code to select PopUp item (required > 980722) - Thank you Alfredo: if WINGs >980722, use the new WMSetTextFieldSecure function, otherwise continue to resize the area to almost invisible. - change the distributed setting of wdmVerify to true -- this means that the default for using Reboot, Halt, or Exit is to require the user to enter a valid userid/password. 0.10.4 - Aug 18 1998 Gene Czarcinski - man pages for wdm and wdmLogin courtesy Marcelo Magallon . Now I just have to get them to install properly. These may need to be changed to _.in files so that they can be "configured" properly to reflect the system on which it is being installed. - fix configure.in so looking for wraster (and WINGs) will look in the added paths (should fix debian problem). - to be consistant, wdm/config is now named wdm/wdm-config - Marcelo's man pages now install - Login.c help updated to document ExitLogin's operation ... it terminates the xserver but the daemon must be terminated by other means. - apparently, some systems put lots of libraries under /usr/X11R6/lib rather than /usr/lib so lets make it easier for them ... for most libchecks, add $XLFLAGS $XLIBS - fixup how we create the wd._.spec file so versioning is done automagically. 0.10.3 - Aug 16 1998 Gene Czarcinski - fix install bug in src/config/Makefile.am on non-pam systems where install-data-local not defined on such systems - add --with-pamdir= option for use if pam's directory is not /etc/pam.d - modified Makefiles to support DESTDIR for all installs ... DESTDIR useful for testing install but especially useful to specify BuildRoot for rpm - Add checking for existance of the pam directory and warn user if it does not (but is OK if using rpm BuildRoot) - add code to Login to adjust the font size of the name is too long (currently, this is a kluge) - add/change code in src/Greet.c so that SessionExit() is called if there is a pipe i/o read error -- this means that the external Login program has failed. SessionExit will terminate rather than getting into a startup loop. This fixes the "known bug" below. - fixup code in src/Login.c so messages (info and error) are displayed properly -- unmap both frames before maping either new one (Clear does unconditional unmap). - replace some of the logo and pixmap artwork in src/pixmaps - add checking to configure for where WINGs.h is and change how the -lWINGs and -lwraster are defined BETA 3: DONE - add more testing for pam DONE - add test to make sure the Login process has started properly so wdm does not loop attempting to start it. If it does not, need to exit wdm. DONE - create the rpm spec file DONE - make rpms as well as tarball DONE - test to make sure that exit verification works DONE - fix Login code so error messages are displayed properly work in progress - create README/INSTALL/AUTHORS/?? documentation 0.10.2 - Aug 15 1998 Gene Czarcinski - add test for xdm source and try to untar if not present - second public beta (beta2) - Known serious bug: if the fork/exec of wdmLogin fails because it does not exist or is not executable, the wdm will get into an unbreakable loop trying to start it. BETA 2: DONE HOPEFULLY - fix automake/autoconf files so this package can be used on other systems such as FreeBSD (a big change) ... and it still works on RedHat Linux (tested on multiple systems) DONE - eliminate getopt_long from Login.c ... replace it with getopt which is defined in unistd.h and should be available on "most" systems ... since getopt only supports simple parameter options (no long one), the definitions in the wdm/config file has to change ... it is not just data. DONE - put pam files into the src/config directory DONE - install the DisplayMaker pam control file into /etc/pam.d if --enable-pam is specified work in progress - create README/INSTALL/AUTHORS/?? documentation DONE -- DisplayMaker -> wdm - finalize the name of this package and fixup any changes. DONE - during configuration, test if xdm has been untared; automatically untar xdm if not; else error (installer goof prevention) 0.10.1 - Aug 14 1998 Gene Czarcinski - fix minor bug in wdm/config - put wdm.pamd into src/config and change Makefiles so wdm.pamd is installed as /etc/pam.d/wdm 0.10.0 - Aug 14 1998 Gene Czarcinski - rename the package/program from DisplayMaker to wdm - redo the whole set of configuration files and Makerfiles in an attempt to make this less dependent on Linux so it can compile and run on systems such as FreeBSD. The approach used was patterned after the one used by kde for kdm. 0.9.0 - Aug 13 1998 Gene Czarcinski - first public beta BETA 1: DONE - create the xdm/Greet.c (xdm/greeter/greet.c) replacement which implements the external Login interface. DONE - ?? automate application of the PAM patch .. patches are applied by Makefile DONE - pam .. the pam definition .. is pam realy enabled/working?? DONE - change service name to DisplayMaker and create pam control file DONE - move pixmaps under src and add README DONE - are configs correct for authdir DONE - update resources.c for specifying Gdm parameters DONE - rename to DisplayMaker: dmaker and dmakerLogin DONE - the LoginPanel "look" may need some work DONE - make reboot and halt work. DONE - add code to put halt/reboot info into system logs ... who did it and any other info DONE - change resources so only wm, logo, and bg instead of Arg1...Arg9 DONE - make sure (or fix) that we have good Xresources for the user ... need to figure out a good Xsession, xinitrc, Xclient set ... just doing xinitrc is not good enough .. I wonder just which program does load ~/.Xdefaults DONE - Makefile.am for xdm/config DONE - configuration files DONE - fixup cursor so it is a pointer DONE - add setting of the background in GLogin DONE - add lots of background setting args DONE - add a help panel in Login DONE - add getting the pixmap from a file in GLogin DONE - add tests of the args passed to Login in LoginTest DONE - add arg to Login for specifying a pixmap file DONE - fix in/out so they compile clean work in progress - create README/INSTALL/AUTHORS/?? documentation DONE - fix the Makefile.am and configure.in files so they are "more correct" DONE - ?? is xdm-extgreet tarball needed or just documentation and in/out (ask the author??) DONE - create clean patches DONE - check with author on logo artwork 0.8.15 - Aug 13 1998 - Gene Czarcinski - nearing the first beta - pam works (see README.pam) - LoginPanel graphics a bit better - chooser still the old stuff and not installed - no man documentation yet - ping not coded - DisplayMaker will work with remote system (testing) 0.8.10 - Aug 12 1998 - Gene Czarcinski - restructured directories and Makefiles so there is a single source tree, the XFree86 sources are used as a base, and patches are applied in src to create DisplayMaker 0.8.9 - Aug 11 1998 - Gene Czarcinski - all code working, need to finish some documentation and pull a distribution package together. Status of code: - chooser still the old code and not installed - ping (test if connection is still alive) not implemented yet - xdm man page needs lots of work - better README documentation wdm-1.28/INSTALL 644 0 0 4170310221265060 127220ustar AlexeyVoinov 0 0Basic Installation ================== The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). This package requires the following: 1. XFree86 installed (it was developed with 3.3.2) 2. WindowMaker >= 0.70.0 (for WINGs and wraster libraries and header files). There are no other dependencies on WindowMaker and wdm can run any other window manager such as AfterStep, icewm, BlackBox, etc. 3. autoconf => 2.53 for maintenance (any building)... (automake is not used any more) 4. libXft or libXft2 is required if you have compiled WINGs with Xft support. NOTE: The wdm tarball currently contains the xdm sources. They keeped for referential purposes only. It would be easier to update xdm base of wdm to newer xdm versions. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. ./configure --help can be used to see what options are available. configure script will try to detect library to use for authentication. First it checks for pam. If pam library was not found than it checks for shadow. If shadow is not supported it falls back to looking in /etc/passwd. Any check can be disabled with --disable-pam or --diable-shadow option. Specifying --enable-pam or --enable-shadow will check only for requested library. 2. Type `make' to compile the package. A number of the configure options can be overriden (or just plain specified) on the make command line. *****Examine (and optionally modify) the configuration files in ./configs directory 3. Type `make install' to install the programs and any data files and documentation. To install into a path other than that specified by ./configure --prefix=<...> (such as testing the install), you can use make DESTDIR=<...> install. For exmaple: make DESTDIR=/tmp/wdm-root install will install the binaries into /tmp/wdm-root/usr/local/bin. 4. You can remove all files created by make command in source code directory by typing `make clean'. To also remove the files created by `configure' script type `make distclean'. 5. Modify system initialization (/etc/inittab on RedHat Linux) to invoke wdm at system startup or start wdm (as root) with the following command line: wdm -nodaemon or wdm -nodaemon -config /usr/local/etc/wdm/wdm-config Please note: if you start wdm "detached", you will be unable to actually terminate the wdm process. for Debian GNU/Linux systems, what I find easier is to modify /etc/init.d/xdm to launch wdm instead of xdm (if you don't need both) for RedHat based Linux systems, modify /etc/inittab the following way: ensure this file contains the following lines (don't duplicate existing lines beginning with 'id' or 'x', modify them in place): id:5:initdefault: x:5:respawn:/usr/local/bin/wdm -nodaemon for other systems, I don't know. By default, wdm installs into /usr/local/bin, /usr/local/man, /usr/local/etc/wdm (configuration files), and (if pam is enabled), /etc/pam.d ***************************************** ATTENTION: According to Bevan Broun (bevanb@ee.uwa.edu.au) there's a problem compiling wdm under Irix 6.5.2 because setpgrp needs no argument under Irix. It's a problem in xdm's code, not wdm's code, so no patch was made by me (Jerome) but the temporary solution is to modify the lines where setpgrp is called and it works fine. A better solution would be to put some new autoconf/automake test but I don't know how to do. If you're an autoconf guru don't hesitate to help me :-) Jerome ALET - alet@unice.fr July 1st 1999 ***************************************** *** ./configure options more or less specific to wdm ********************* --prefix=PREFIX specifies the path prefix for installation [/usr/local/ --enable-debug sets parameters for debugging and (if they exist) the non-standard names for the debug versions of the WINGs libraries --disable-pam disable check for pam. --disable-shadow disable check for shadow --with-pamdir=PAMDIR if PAM is enabled, this specifies the path for the PAM directory [/etc/pam.d] --with-local use /usr/local/{bin,include,lib} paths appropriately --with-logdir=PATH specifies the directory where the logfile goes --with-runlockdir=PATH specify the directory where run lock goes --with-defuserpath=PATHLIST specify list of paths for user sessions --with-defsystempath=PATHLIST specify list of paths for superuser sessions --with-wdmdir=PATH specify the full directory pathname for wdm's configuration files [/etc/X11/wdm] --with-gfxdir=PATH specify the full directory pathname for pixmaps used for backgrounds and Logos. [/usr/share/pixmaps/wdm] --with-Logo=PIXMAP_FILENAME specify a file to be loaded as the "logo" from the pixmap directory --with-winmgr=NAME_OF_WM specify an arbitrary window manager --with-winmgr_path=WINMGR_PATH specify path for the arbitrary window manager --with-wmlist=LIST_OF_WMs specify a (colon separated) list of window managers which can be started ... overrides ./configure's search for window managers. --with-nlsdir=PATH specify path where to look for locale specific .mo-files. --with-fakeroot=PATH That option allows to change path that will be passed to wdmLogin in HOME environment variable. This is workaround for bug in fontconfig. By default it points to /var/run/wdm. --enable-aafont Enable support for antialiased fonts. This will work only with post-0.80.2 cvs snapshots of libWINGs. ***NOTE***********************************************************NOTE**** Please examine (and modify if necessary) the Xsession* and Xclients* files in the wdm config directory (by default: /usr/local/etc/wdm). Also, note that this files MUST be marked executable. These files are the shell files which actually create the user's environment and start the window manager. The can also have a ~/.xsession or a ~/.Xclients file in which case these files are executed (and MUST be marked executable). In addition, review the other other files (especially wdm-config) in the wdm config directory and change them as necessary for your system. For example, if installing on a non Linux system such as FreeBSD, you will need to change the parameters for the shutdown commands. You may also need to edit Xsession and Xclients to change how the shell program is called and its parameters. Xsession and Xclients are separate so that a user can create their own version of Xclients and put it in their home directory as ~/.Xclients ./configure attempts to properly configure the files in wdm's config directory but differences between systems can result in the need to manually tailor these files for your system. Please examine these files before trying wdm. ************************************************************************** Authentication options ====================== wdm supports three options: 1. use pam if found and no --disable-pam option was specified in command line. 2. use shadow if check for pam failed and no --disable-shadow option was specified at command line. 3. use passwords from /etc/passwd. Window Manager Options ====================== ./configure and Xclients include startup code for a number of window managers. This includes the programs named wmaker, afterstep, blackbox, icewm, xsession, and kde (really startkde). ./configure trys to locate these programs but if not found Xclients will have their respective startup code commented out. There are also two options for specifying an arbitrary window manager: --with-winmgr=NAME and --with-winmgr_path=PATH. If specified, this name will be added to the list of available window managers. If --with-wmlist=<...> is used to specify a list of window manager program names (colon separated), then be sure to check/modify Xsession and Xclients so that the window managers start properly. Graphics options ================ wdm uses the WINGs and wraster libraries. Therefore, ./configure should be run with the same graphic options you used to install WindowMaker. --with-Logo=<...> can be used to specify a Logo pixmap. NOTE ==== 1. The Xsession and Xclients distributed scripts are configured for running on RedHat Linux 5.1. If this is what you are running, it should work. Otherwise, they may need some modification. 2. The primary configuration file is wdm/wdm-config. This is an Xresource file. The new (added) options are: DisplayManager*wdmLogin: DisplayManager*wdmBg: DisplayManager*wdmLogo: DisplayManager*wdmWm: DisplayManager*wdmReboot: DisplayManager*wdmHalt: DisplayManager*wdmVerify: -- Verify user for reboot/halt/exit DisplayManager*wdmRoot: -- user must be verified root to exit DisplayManager*wdmLoginConfig: DisplayManager*wdmHelpFile: DisplayManager*wdmAnimations: -- Enable animations for events. DisplayManager*wdmLocale: DisplayManager*wdmCursorTheme: DisplayManager*wdmXineramaHead: background specifications: pixmap:full_path_to_background_pixmap solid: hgradient: vgradient: dgradient: h=horizontal, v=vertical, d=diagonal multi-gradients. 3. wdmLogin program uses separate configuration file in proplist format. Filename is defined with wdmLoginConfig resource in wdm-config file. Here's example of that file with all options filled with default values. { geometry = (530, 240); aa = no; multibyte = no; } "aa" and "multibyte" options available if wdm was compiled with --enable-aafont option. "geometry" option can also have two addittional integers, that will specify screen position of login panel. Like: geometry = (530, 240, 50, 100); Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. There is a separate option to specify the location of wdm's configuration directory: --with-wdmdir=<...>. For example, if you use --prefix=/usr/X11R6 but you want the configuration directory in /etc/X11, use --with-wdm-dir=/etc/X11. There is also a special option for the pam directory --with-pamdir=. Be default, the pam configuration file is installed in /etc/pam.d if --enable-pam is specified. Use --with-pamdir=<...> to put it somewhere else. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. wdm-1.28/NASA_image_guideline.html 644 0 0 2201310221265060 164610ustar AlexeyVoinov 0 0 Guidelines

"NASA is deeply committed to spreading the unique knowledge that flows from its aeronautics and space research...."

Read NASA Administrator Daniel S. Goldin's welcome letter, bio and speeches.

Welcome to NASA Web


Navigating NASA's
Strategic Enterprises
Aeronautics and Space Transportation Tech.
Human Exploration and Development of Space
Earth Science
Space Science
More About NASA:
Doing Business with NASA
Educational Resources
Freedom of Information Act
History
News and Information
Organization and Subject Index
Research Opportunities
Scientific and Technical Information
See a Launch
Space Shuttle Launches
Spinoffs and Commercial Technology
Visiting NASA

Reproduction Guidelines for Use of NASA Images and Emblems

NASA images generally are not copyrighted. You may use NASA imagery, video and audio material for educational or informational purposes, including photo collections, textbooks, public exhibits and Internet Web pages. This general permission does not include the NASA insignia logo (the blue "meatball" insignia), the NASA logotype (the red "worm" logo) and the NASA seal. These images may not be used by persons who are not NASA employees or on products (including Web pages) that are not NASA sponsored.

If the NASA material is to be used for commercial purposes, especially including advertisements, it must not explicitly or implicitly convey NASA's endorsement of commercial goods or services. If a NASA image includes an identifiable person, using the image for commercial purposes may infringe that person's right of privacy or publicity, and permission should be obtained from the person.

Any questions regarding application of any NASA image or emblem should be directed to:

  Bert Ulrich
  Public Services Division
  NASA Headquarters
  Code POS
  Washington, DC  20546

  Tel: (202)358-1713
  Fax: (202)358-4331
  Internet: bert.ulrich@hq.nasa.gov
Please be advised that:

1) NASA does not endorse or sponsor any commercial product, service, or activity.

2) The use of the NASA name, initials, any NASA emblems (including the NASA Insignia, the NASA Logo and the NASA Seal) which would express or imply such endorsement or sponsorship is strictly prohibited.

3) Use of the NASA name or initials as an identifying symbol by organizations other than NASA (such as on foods, packaging, containers, signs, or any promotional material) is prohibited.

4) NASA does permit the use of the NASA Logo and Insignia on novelty and souvenir-type items. However, such items may be sold and manufactured only after a proposal has been submitted to and approved by a representative from the Public Services Division (see above information for address, numbers, etc.) in accordance with 14 CFR (Code of Federal Regulations) Part 1221. Permission is granted on a nonexclusive basis as it is not NASA's policy to grant exclusive rights to use any of the Agency identities.

5) No approval for use is authorized by NASA when the use can be construed as an endorsement by NASA of a product, service, or activity.

6) NASA emblems should be reproduced only from original reproduction proofs, transparencies, or computer files available from NASA Headquarters. Please be advised that approval must be granted by the Public Services Division (see above information for address, numbers, etc.) before any reproduction materials can be obtained.


[Frequently Asked Questions] [Hot Topics] [Multimedia Gallery] [NASA Home] [NASA Television] [Today@NASA] [NASA Privacy Statement] [Site Map]

Author: Brian Dunbar
Curator: Boeing Information Services
Comments and Questions
Last Updated: Aug 4, 1998

wdm-1.28/NEWS 644 0 0 2533010221265060 123660ustar AlexeyVoinov 0 0See TODO, README, README.pam, and ChangeLog wdm-1.28 -- Mar 27 2005 - problem with xdmcp not working properly if there's ipv6 network packet was fixed (thanks to Jennifer Elaan ) - welsh translation added (by Kevin Donnelly ) - several file-descriptor leaks were fixed wdm-1.27 -- Feb 28 2004 - french translation added (by Mathieu Roy ) - SELinux support added (by Tom Vogt ) - some FreeBSD compatibility issue fixed - some minor bugs fixed - ExitLogin item removed from menu in wdmLogin by default. to reenable it use --enable-exitlogin wdm-1.26 -- Sep 18 2003 - more options in wdmLogin-config file - development of wdmPrefs and wdmChooser programs started. - en locale is now different from C locale. [that trick allowed to remove last compile-time warning] - wdm now compiles with -Wall -Werror. :) - install target of Makefile.in fixed - daemon mode works again - fixed problem with wdm not reacting to signals sent to process with pid written to pid file. - spanish translation added (by Manolo Padron Martinez ) - czech translation added (by Vladimir Nadvornik ) - parts of code dealing with streams (-DSTREAMSCONN) DECnet (-DDNETCONN) and Chaos was completely removed from wdm sources. More unused code will be removed later - xdm source tree removed from wdm tarball. - fixed problem with pam (same as in kdm) wdm-1.25 -- Jun 06 2003 - removed call to wstrndup function, that appeared only in post 0.80.1 cvs snapshots. - fixed bug in Makefile.in, that caused generation of .mo files even without msgfmt program. - added workaround for bug in libfontconfig, which caused wdmLogin to crash. - added geometry option for wdmLogin. It was placed in wdmLogin-config file. see INSTALL for more info. - added support for antialiaesed fonts. New options was placed in wdmLogin-config file. Note two new options for configure script: --with-fakeroot and --enable-aafont. If you enable antialiased fonts, then expect first run to be very long. That's because fontconfig will build cache of fonts. wdm-1.24 -- Jun 01 2003 - pixmaps have been moved to /usr/share/pixmaps/wdm by default. You can always specify other locations with --with-gfxdir option to configure script (patch by Julio Merino ) - logging functions rewritten. it is now possible to redirect all messages from wdm to syslog or to file. - option to select on which display login panel will appear when using xinerama (with help from Carlos Torres ). - configure.ac rewritten. It may stop working on some systems. Report me if you have such system. All graphics format detection code removed. wdm never uses this libraries directly only via libwraster. - added basic support for xcursor_themes (for XFree86 4.3.0, see description of wdmCursorTheme resource in wdm man page). - translations fixed. now all "... failed" messages displayed correctly. wdm-1.23 -- Mar 31 2003 - ChangeLog is now generated from repository history. Old ChangeLog is saved as ChangeLog.old. - man page fixed. There was references to xdm everywhere. :) - default help message translated. - started process of separation wdmLogin configuration file from wdm configuration file. - lots of internal improvements in wdmLogin. - german translation added (by Michael Buesch ) - fixes for animations in wdmLogin (by Michael Buesch ) There's traces of ongoing development like libwdm. It's not used now in any sources, but will be used in some of future versions. wdm-1.22.1 -- Feb 20 2003 There was a bug. I forgot to change pam service name from xdm to wdm. This release fixes it. wdm-1.22 -- Feb 09 2003 - xdm-base upgraded to xdm from XFree86-4.2.1. - wdmLogin translated to russian and japanese. Now, what will be in next releases: - compatibility with ancient versions of WINGs will be dropped. - configuration files will be changed to PropList format (If you want to arue, mail me or chat with me at #wdm on irc.ornet.ru, or #windowmaker on irc.freenode.net) - wdm <-> wdmLogin protocol will be changed to implement better PAM support. wdm-1.21 -- Jan 07 2003 - development started again. This release collects almost all patches I can find on net. If you have more patches please send them. - directories rearranged, build system rewritten (see README.voins for explanations). - everything is ready to start migration to newer xdm base. wdm-1.20 -- Feb 29 2000 - a problem which forbid for some wdm's resources to be set differently for multiple displays was corrected. - a problem with incorrect user permissions being set on devices (e.g. mixer) was corrected by replacing some xdm-3.3.2 code with xdm-3.3.6. I think all the xdm stuff definitely should be updated to the latest version. - a problem with random wdm hangs under at least FreeBSD was corrected. - more detailed installation instructions are given for Linux systems. Feel free to send anything useful for other systems. - some messages weren't centered one to each other on the login panel, this looked ugly. wdm-1.19 -- Sep 21 1999 - a security problem was present when using the default username and password: they were passed in clear on wdmLogin's command line whenever wdm launched wdmLogin. Now wdm reads them as before, but uses them internally instead of passing them to wdmLogin which passed them back to wdm: it was stupid and was a big security hole, so it's corrected now. ENJOY. - a Makefile problem caused wdm-login to not be created at all. This problem was only noticed by new users. It works fine now. wdm-1.18 -- Sep 16 1999 - a problem about login name length was corrected - a default username / default password can now be set in wdm-config. USE WITH EXTREME CAUTION AND WITH A VERY RESTRICTED ACCOUNT (e.g. no shell, etc...) ELSE YOU COULD VERY WELL OPEN A HUGE SECURITY HOLE TO ANYONE WHO HAS A PHYSICAL ACCESS TO THE MACHINE. AND DON'T FORGET TO: chmod 600 wdm-config chown root.root wdm-config wdm-1.17 -- Sep 8 1999 - user environnement settings in /etc/login.conf now propagate correctly to the client session. - some modifications were done to compile for Irix. - a problem about libz and libpng when configuring was corrected. - some cleanups to the source trees and the code. wdm-1.16 -- Jul 7 1999 - GFX_LIB_PATH and GFX_INC_PATH now are set correctly in configure. wdm-1.15 -- Jul 6 1999 - the pixmaps weren't installed anymore, now it's corrected. - wdm's Xsession didn't load X resources before running ~user/.xsession but after. - a mailing list was set up (see README) wdm-1.14 -- Jul 1 1999 - the warning when compiling TestLogin.c is gone - cosmetic changes to the doc - the primary site from 1.1 and above becomes: http://cortex.unice.fr/~jerome/WindowMaker/wdm/ wdm-1.13 -- Jun 30 1999 - the tab key now moves from username to password and back - the debian patches to allow MD5 passwords have been incorporated wdm-1.12 -- Jun 18 1999 - the configure script seems to be corrected now wdm-1.11 -- Jun 18 1999 - the login panel now has the focus wdm-1.1 -- Jun 11 1999 - modified the sources to work with WindowMaker 0.60 - fixed a buffer overflow bug in Login.c - added the support for None in the window managers list to allow only NoChange to be displayed - added the support for external help file to be displayed in the help panel - modified the manpages accordingly wdm-1.0 -- Sep 13 1998 - added support for GIF (both libgif and libungif) - add check for libtiff34 as well as libtiff - "RollUp" animation finalized as diagonal - wdm Xresourses now cleaned up when Xsession is started - to simlify configuration/installation on FreeBSD, -lXt is now included (will not hurt even if it is not used) - bugfixes - configuration changes to make it easier to install and run wdm on different systems - minor changes in the "look" of the login and help panels to make them a bit more symetrical. wdm-0.90 -- beta eight, pre Rel 1.0, Sep 06 1998 - wdmReconfig for rpm install auto update of Xclients and wdm-config - adjust Login panel's "look" to make it more symetrical - new "rollup" .. diagonal - many changes to ./configure to make it more system independent - added --with-local for using /usr/local/{bin,include,lib} appropriately - made --enable-debug handle WINGs debug also - more into in INSTALL - some bugfixes wdm-0.18 -- beta seven -- Aug 29 1998 - new look for the panel ... both "flatter" and 3d as well. - help now uses a scrolled view for the text and a single button is used to open and close the help panel. - many changes to configure for different systems - bugfixes - new ./configure options --with-winmgr to specify arbitrary windowmanager - new wdmAnimations Xresource to enable/disable shake and rollup animations - changed wdmBg Xresource so that if it is missing of has the value none, then the background is not set (the user can still set it via other means) - chooser is no longer compiled by wdm .. it was not installed anyway. wdm-0.12 -- beta six -- Aug 24 1998 - ./configure will now look for a number of window managers and use the found path in Xclients. It also build WMLIST based on the found window managers. This can continue to be overriden by the --with-wmlist=<...> option. - added Xsession.XFree86 example. - INSTALL and README so that INSTALL now contains the configuration and installation information - ./configure --with-wmlist=<...> can be used to specify a list of optional window managers which the user can specify. The list is placed into wdm-config. The default (if not specified is wmaker:afterstep - ./configure --with-Logo=<...> can be used to specify alternate file (from .../wdm/pixmaps directory) to be used as the Logo. - The Logo will now try to keep the aspect ratio the same as the original image. Smaller images are not resized. The resulting image is centered in the Logo area. - some configure parameters changed to lower case: --with-wdmdir=, --with-defuserpath= and --withsystempath= wdm 0.11 - Aug 20 1998 Gene Czarcinski - fifth public beta ... first release next - more porting stuff so this can be compiled on other systems - updated Login so it will work with both WINGs 980730 (WindowMaker 0.18.1b) and WINGs 980722 (WindowMaker 0.17.5) - When compiled with WINGs 980730, the Password Text Entry area uses the new "Secure" mode which displays better - The default distributed mode for the wdmVeryify xresources is true -- this requires entering a valid username/password when performing Reboot/Halt/ExitLogin. wdm-1.28/README 644 0 0 334410221265060 125300ustar AlexeyVoinov 0 0wdm -- WINGs Display Manager Wdm combines the functions of a graphical display manager identifying and authenticating a user on a system with some of the functions of a session manager in selecting and starting a window manager. Optionally, wdm can shutdwn (rebott or halt) the system. Wdm is a modification of XFree86's xdm package for graphically handling authentication and system login. Most of xdm has been preserved (XFree86 4.2.1.1) with the Login interface based on a WINGs implementation using Tom Rothamel's "external greet" interface (see AUTHORS). See file COPYING for license and warranty information. See the ChangeLog, NEWS, and TODO files for additional information. See the INSTALL file for information about configuration adn installation. ***NOTE***********************************************************NOTE**** Please examine (and modify if necessary) the Xsession, Xclients, and wdm-config files in the wdm config directory (by default: /usr/local/etc/wdm). Also, NOTE that the Xsession and Xclients (or ~./Xclients) files MUST be marked executable. These files are the shell files which actually create the user's environment and start the window manager. In addition, there can be a ~/.xsession or a ~/.Xclients file for each user in which case these files are executed (and MUST be marked executable). ************************************************************************** Comments, bug reports, and corrections (patches) for other systems are appreciated. Homepage for wdm is at http://voins.program.ru/wdm/ Old wdm mailing list is dead (AFAIK). You can subscribe to new wdm mailing list at http://lrn.ru/mailman/listinfo/wdm/ There's IRC channel #wdm at irc.ornet.ru. -- Alexey Voinov wdm-1.28/README.aa 644 0 0 171510221265060 131100ustar AlexeyVoinov 0 0How to enable font antialiasing in wdmLogin. ------------------------------------------- 1. You need post-0.80.2 cvs snapshot of WindowMaker for antialiased fonts. 2. Recompile wdm with --enable-aafont and --with-fakehome= options passed to configure script. in --with-fakehome option should point to some directory where fontconfig library can create fonts cache file. It's better to use some empty directory that is safe to expose (in case there's some nasty bugs hiding in wdm). I usually use /var/run/wdm as value. 3. Create directory that was passed to --with-fakehome option. 4. Create wdmLogin-config file in directory passed with --with-wdmdir option. Default value for this option is /usr/local/etc/wdm/. Put following lines in that file: { aa = yes; multibyte = yes; } In some encodings multibyte can be safely set to 'no'. 5. Restart wdm. Note: first run after reconfiguration would be slow because fontconfig will create font cache. wdm-1.28/README.config 644 0 0 77210221265060 137560ustar AlexeyVoinov 0 0wdm Sample Configuration config/ directory contains a collection of files which describe a sample configuration of wdm. This files were derived from xdm sample configuration. Some files in this directory are generated according to parameters passed to configure script. All files in this directory are copied to $(DMDIR) with 'make install' command. Only a few of the many configuration parameters which wdm can be tuned with are set in this sample, read the wdm manual page for a complete description. wdm-1.28/README.newGnuLinuxlogo 644 0 0 331210221265060 156660ustar AlexeyVoinov 0 0Return-Path: Received: from lestat.gnu.net (lestat.gnu.net [207.213.15.139]) by camel23.mindspring.com (8.8.5/8.8.5) with ESMTP id RAA05306 for ; Sat, 1 Aug 1998 17:22:46 -0400 (EDT) Received: from freak (1Cust168.tnt1.muskegon.mi.da.uu.net [153.37.174.168]) by lestat.gnu.net (8.8.8/8.8.7) with SMTP id OAA19923; Sat, 1 Aug 1998 14:22:43 -0700 Message-Id: <3.0.3.32.19980801171716.009b5180@gnu.net> X-Sender: largo@gnu.net X-Mailer: QUALCOMM Windows Eudora Pro Version 3.0.3 (32) Date: Sat, 01 Aug 1998 17:17:16 -0500 To: "Gene C." From: Largo Subject: Re: [WM] new GnuLinux logo Cc: wmaker@linuxcenter.com In-Reply-To: <3.0.5.32.19980801171620.02d71da0@pop.mindspring.com> References: <3.0.3.32.19980730180821.0099f408@gnu.net> <199804061027.NAA01895@services.iiruc.ro> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" no problem Gene! :) that's why I made it... so that people in the GNU/WindowMaker community could use it however they wanted. :) good luck! I can't wait to see the finished product. :) At 05:16 PM 8/1/98 -0400, Gene C. wrote: >I really like you new logo and if you have no objection, I would like to >use it as the "logo" on a WINGs-based xdm-like app I am creating. I would >use the "head shot" and perhaps the the leters G N U. > >It will be about another week before I have a version ready for testing but >I will send you a copy of the "logo" after I hack it. > >Thanks, Gene Czarcinski > -=-=-=-=-=-=-=-=-=-=-=- -- L A R G O -- - http://wm.gnu.net/ - -=-=-=-=-=-=-=-=-=-=-=- wdm-1.28/README.pam 644 0 0 102110221265060 132720ustar AlexeyVoinov 0 0Red Hat normally runs pam. The pam patch for wdm sets the service name to wdm. The pam config file for wdm is currently AUTOMATICALLY INSTALLED. However, if you want to do it again and if your system is running pam, and you have compiled wdm with --enable-pam, then simply copy wdm.pamd to /etc/pam.d/wdm NOTE: For some reason, the NAME of the file placed into /etc/pam.d MUST BE ALL LOWER CASE!!! Even if the name specified in the pam_start is mixed case, the actual file must be named all lower case. wdm-1.28/README.pixmaps 644 0 0 123510221265060 142050ustar AlexeyVoinov 0 0The files in this directory can be used the "logo" for the login panel. "gnuLogo.xpm" is the "default" included by Login. The alternates can be used by specifying DisplayManager*wdmLogo /.../pixmaps/ at runtime. The Eagle is my work. Source of this artwork: most of it came from NASA (see the file NASA_image_guideline.html) The star shots were taken by the Hubble Space Telescope (see http://nssdc.gsfc.nasa.gov/photo_gallery/photodallery-astro-nebula.html and the FAQ: http://nssdc.gsfc.nasa.gov/photo_gallery/photogallery-faq.html). The Earth picture was taken by GOES8. See the file README.newGnulogo for info from Largo on the use of his artwork. wdm-1.28/README.voins 644 0 0 245710221265060 136710ustar AlexeyVoinov 0 0Q: Why I have rewritten all build scripts for wdm? A: I'm using aegis for development (http://aegis.sourceforge.net/) New build scripts allows me to create Makefile.in, wdm-xxx.tar.{gz|bz2} automatically. To create a new program which will be installed into $prefix/bin dircetory I only need to create some .c source file in src/newprogram/ directory. It will be automatically added to all places where it should be. Now the best way to do development of wdm is to get wdm-xxx.ae file from http://voins.program.ru/wdm, and 'aedist -rec' this file into aegis. New directory structure: src/ -- Wdm sources, untared and uncompressed. All patches (from patches/ directory) applied. xdm/ -- Xdm sources, untared and uncompressed. Wdm is built on top of xdm. Working with untared sources is much easier than working with tar.gz. That directory will be very useful when I start porting wdm to newer xdm base. configs/ -- (moved from src/configs) Config files that mostly goes to $DMDIR directory. Note, all generated config files removed from source tarball. They will be generated at 'make all' stage doc/ -- man files (no changes here) etc/ -- some configuration files needed for aegis include/ -- all .h files of all programs pixmaps/ -- (moved from src/pixmaps) all graphics files. wdm-1.28/TODO 644 0 0 136310221265060 123370ustar AlexeyVoinov 0 0Here's list of things todo: - separate program to do configuration for wdm? - wdmChooser program, replacement for chooser with WINGs look. - need to reorganize and split Login.c into more than a single file, it is getting a bit too big and if chooser code is added, it will only get bigger. - better PAM support. "When a user's password expires wdm simply rejects thier login rather then forcing them to change their password like /bin/login does." Little reading of PAM documentation and source code showe that PAM support is indeed rudimentary, and can be improved. It requires changes in wdm <-> wdmLogin interface and major rewrite of greet.c and verify.c. - migrate configuration files to PropList format. See README.new-config. wdm-1.28/config 644 0 0 43710221265060 130200ustar AlexeyVoinov 0 0configuration_directory = "etc/config.d"; development_directory_style = { source_file_symlink = false; }; new_test_filename = "test/${zpad $hundred 2}/t${zpad $number 4}${left $type 1}.hh"; test_command = "$sh -c \"LDFLAGS='' CFLAGS='' $shell ${s etc/runtest.sh} $fn $p $c $spe\""; wdm-1.28/configs/GiveConsole 644 0 0 60610221265060 154160ustar AlexeyVoinov 0 0#!/bin/sh # Assign ownership of the console to the invoking user # $XConsortium: GiveConsole,v 1.2 93/09/28 14:29:20 gildea Exp $ # # By convention, both xconsole and xterm -C check that the # console is owned by the invoking user and is readable before attaching # the console output. This way a random user can invoke xterm -C without # causing serious grief. # chown $USER /dev/console wdm-1.28/configs/TakeConsole 644 0 0 37110221265060 154070ustar AlexeyVoinov 0 0#!/bin/sh # Reassign ownership of the console to root, this should disallow # assignment of console output to any random users's xterm # $XConsortium: TakeConsole,v 1.2 93/09/28 14:30:29 gildea Exp $ # chmod 622 /dev/console chown root /dev/console wdm-1.28/configs/Xaccess 644 0 0 367010221265060 146160ustar AlexeyVoinov 0 0# $XConsortium: Xaccess,v 1.5 91/08/26 11:52:51 rws Exp $ # # Access control file for XDMCP connections # # To control Direct and Broadcast access: # # pattern # # To control Indirect queries: # # pattern list of hostnames and/or macros ... # # To use the chooser: # # pattern CHOOSER BROADCAST # # or # # pattern CHOOSER list of hostnames and/or macros ... # # To define macros: # # %name list of hosts ... # # The first form tells xdm which displays to respond to itself. # The second form tells xdm to forward indirect queries from hosts matching # the specified pattern to the indicated list of hosts. # The third form tells xdm to handle indirect queries using the chooser; # the chooser is directed to send its own queries out via the broadcast # address and display the results on the terminal. # The fourth form is similar to the third, except instead of using the # broadcast address, it sends DirectQuerys to each of the hosts in the list # # In all cases, xdm uses the first entry which matches the terminal; # for IndirectQuery messages only entries with right hand sides can # match, for Direct and Broadcast Query messages, only entries without # right hand sides can match. # * #any host can get a login window # # To hardwire a specific terminal to a specific host, you can # leave the terminal sending indirect queries to this host, and # use an entry of the form: # #terminal-a host-a # # The nicest way to run the chooser is to just ask it to broadcast # requests to the network - that way new hosts show up automatically. # Sometimes, however, the chooser can't figure out how to broadcast, # so this may not work in all environments. # * CHOOSER BROADCAST #any indirect host can get a chooser # # If you'd prefer to configure the set of hosts each terminal sees, # then just uncomment these lines (and comment the CHOOSER line above) # and edit the %hostlist line as appropriate # #%hostlist host-a host-b #* CHOOSER %hostlist # wdm-1.28/configs/Xclients.in 644 0 0 1311110221265060 154320ustar AlexeyVoinov 0 0#!@SHELL_LOGIN@ # @configure_input@ ######################################################################## # -*- sh -*- # # # # ~/.Xclients: used by startx (xinit) to start up a window manager and # # any other clients you always want to start an X session with. # # # # This version of Xclients is intended for use with wdm. This # # separate file is used rather than the Red Hat Linux Xclients # # file located as /etc/X11/xinit/Xclients because it has been # # extensively modified to handle starting many different window # # or session managers and do that on systems other than Red Hat Linux. # # # # Systems other than RedHat Linux will like need editing of this # # file to tailor the file for the particular system. # # # ######################################################################## # try to find executable in PATH FindInPath() { prog=$1 shift result= for p in `echo $PATH|tr ':' ' '`; do if test -e $p/$prog; then result=$p/$prog break; fi done } # these files are left sitting around by TheNextLevel. rm -f $HOME/Xrootenv.0 rm -f /tmp/fvwmrc* 2>/dev/null # check for and set x-resources if [ -f $HOME/.Xresources ] ; then @XRDB_PATH@ -merge $HOME/.Xresources fi if [ -f $HOME/.Xdefaults ] ; then @XRDB_PATH@ -merge $HOME/.Xdefaults fi WINMGR_NAME=@WINMGR_NAME@ if test -z "$WINMGR_NAME"; then WINMGR_NAME="UserDefined" fi # First thing - check the user preferences if [ -f $HOME/.wm_style ] ; then WMSTYLE=`cat $HOME/.wm_style` case "$WMSTYLE" in # # first, a general purpose entry: $WINMGR_NAME*) # startup a window manager WINMGR_PATH=@WINMGR_PATH@ if test -x "$WINMGR_PATH" ; then echo Starting $WINMGR_NAME >$HOME/.xwm.msgs exec $WINMGR_PATH >>$HOME/.xwm.msgs 2>&1 fi ;; wmaker*|WindowMaker*) # startup WindowMaker WMAKER_PATH=@WMAKER_PATH@ if ! test -x $WMAKER_PATH ; then FindInPath $WMAKER_PATH if test -n "$result" -a -x "$result"; then WMAKER_PATH="$result"; fi fi if test -x $WMAKER_PATH ; then echo Starting WindowMaker >$HOME/.xwm.msgs env > "$HOME"/Xrootenv.0 exec $WMAKER_PATH >>$HOME/.xwm.msgs 2>&1 fi ;; afterstep*|Afterstep*|AfterStep*) # we have to start up afterstep AFTERSTEP_PATH=@AFTERSTEP_PATH@ if ! test -x $AFTERSTEP_PATH ; then FindInPath $AFTERSTEP_PATH if test -n "$result" -a -x "$result"; then AFTERSTEP_PATH="$result"; fi fi if [ -x $AFTERSTEP_PATH -a -f /usr/share/afterstep/wmconfig.conf ] ; then mkdir -p $HOME/GNUstep/Library/AfterStep wmconfig --output=afterstep --directories /usr/share/afterstep/wmconfig.conf 2>/dev/null env > "$HOME"/Xrootenv.0 # if this works, we stop here eval "exec $AFTERSTEP_PATH" > "$HOME"/.AfterStep-errors 2>&1 fi ;; blackbox*|BlackBox) # startup blackbox BLACKBOX_PATH=@BLACKBOX_PATH@ if ! test -x $BLACKBOX_PATH ; then FindInPath $BLACKBOX_PATH if test -n "$result" -a -x "$result"; then BLACKBOX_PATH="$result"; fi fi if [ -x $BLACKBOX_PATH ] ; then echo Starting BlackBox >$HOME/.xwm.msgs exec $BLACKBOX_PATH >>$HOME/.xwm.msgs 2>&1 fi ;; icewm*|IceWm) # startup icewm ICEWM_PATH=@ICEWM_PATH@ if ! test -x $ICEWM_PATH ; then FindInPath $ICEWM_PATH if test -n "$result" -a -x "$result"; then ICEWM_PATH="$result"; fi fi if [ -x $ICEWM_PATH ] ; then echo Starting icewm >$HOME/.xwm.msgs exec $ICEWM_PATH >>$HOME/.xwm.msgs 2>&1 fi ;; xsession*|Xsession*) # startup xsession XSESSION_PATH=@XSESSION_PATH@ if ! test -x $XSESSION_PATH ; then FindInPath $XSESSION_PATH if test -n "$result" -a -x "$result"; then XSESSION_PATH="$result"; fi fi if [ -x $XSESSION_PATH ] ; then echo Starting xsession >$HOME/.xwm.msgs exec $XSESSION_PATH -console >>$HOME/.xwm.msgs 2>&1 fi ;; startkde*|kde*|KDE*) # startup kde STARTKDE_PATH=@STARTKDE_PATH@ if ! test -x $STARTKDE_PATH ; then FindInPath $STARTKDE_PATH if test -n "$result" -a -x "$result"; then STARTKDE_PATH="$result"; fi fi if [ -x $STARTKDE_PATH ] ; then echo Starting kde >$HOME/.xwm.msgs exec $STARTKDE_PATH -console >>$HOME/.xwm.msgs 2>&1 fi ;; esac fi # first, find an M4-enabled config file (such as # the one from AnotherLevel) for fvwm2 or fvwm95. RCFILE="" for tryfile in "$HOME/.fvwm2rc.m4" "/etc/X11/AnotherLevel/fvwm2rc.m4"; do if [ -f "$tryfile" ]; then RCFILE="$tryfile" break fi done # if it really exists, use it; if not, fvwm2 or fvwm95 will # automagically look for a config file in the regular places. if [ -n "$RCFILE" ]; then FVWMOPTIONS="-cmd 'FvwmM4 -debug $RCFILE'" else FVWMOPTIONS="" fi # TheNextLevel is supposed to work # with both fvwm95 and fvwm2 # (try fvwm95 first, then fvwm2). for FVWMVER in 95 95-2 2; do if [ -n "$(type -path fvwm${FVWMVER})" ]; then env > "$HOME"/Xrootenv.0 # if this works, we stop here eval "exec fvwm${FVWMVER} ${FVWMOPTIONS}" > "$HOME"/.FVWM${FVWMVER}-errors 2>&1 fi done # gosh, neither fvwm95 nor fvwm2 is available; # let's try regular fvwm (AnotherLevel doesn't work with fvwm1). if [ -n "$(type -path fvwm)" ]; then # if this works, we stop here exec fvwm fi # No other window or session manager found. # Use twm as a last resort. xterm & exec twm wdm-1.28/configs/Xresources 644 0 0 101410221265060 153550ustar AlexeyVoinov 0 0! $XConsortium: Xresources /main/8 1996/11/11 09:24:46 swick $ XConsole.text.geometry: 480x130 XConsole.verbose: true XConsole*iconic: true XConsole*font: fixed Chooser*geometry: 700x500+300+200 Chooser*allowShellResize: false Chooser*viewport.forceBars: true Chooser*label.font: *-new century schoolbook-bold-i-normal-*-240-* Chooser*label.label: XDMCP Host Menu from CLIENTHOST Chooser*list.font: -*-*-medium-r-normal-*-*-230-*-*-c-*-iso8859-1 Chooser*Command.font: *-new century schoolbook-bold-r-normal-*-180-* wdm-1.28/configs/Xservers.fs 644 0 0 57610221265060 154370ustar AlexeyVoinov 0 0# $XConsortium: Xservers.fs,v 1.3 93/09/28 14:30:31 gildea Exp $ # # Xservers file, fileserver prototype (any machine without a display) # # Put X terminals which don't support XDMCP in this file; you will # want to leave those terminals on and connected to the network, else # xdm will have a tougher time managing them. # # Each line should look like: # # XterminalName:0 foreign wdm-1.28/configs/Xservers.in 644 0 0 77310221265060 154340ustar AlexeyVoinov 0 0# $XConsortium: Xserv.ws.cpp,v 1.3 93/09/28 14:30:30 gildea Exp $ # @configure_input@ # # Xservers file, workstation prototype # # This file should contain an entry to start the server on the # local display; if you have more than one display (not screen), # you can add entries to the list (one per line). If you also # have some X terminals connected which do not support XDMCP, # you can add them here as well. Each X terminal line should # look like: # XTerminalName:0 foreign # :0 local @DEF_SERVER@ wdm-1.28/configs/Xservers.ws.in 644 0 0 77310221265060 160640ustar AlexeyVoinov 0 0# $XConsortium: Xserv.ws.cpp,v 1.3 93/09/28 14:30:30 gildea Exp $ # @configure_input@ # # Xservers file, workstation prototype # # This file should contain an entry to start the server on the # local display; if you have more than one display (not screen), # you can add entries to the list (one per line). If you also # have some X terminals connected which do not support XDMCP, # you can add them here as well. Each X terminal line should # look like: # XTerminalName:0 foreign # :0 local @DEF_SERVER@ wdm-1.28/configs/Xsession.XFree86 644 0 0 122210221265060 162150ustar AlexeyVoinov 0 0#!/bin/sh # $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ # modified to pass argument to the startup file. # redirect errors to a file in user's home directory if we can for errfile in "$HOME/.xsession-errors" "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER" do if ( cp /dev/null "$errfile" 2> /dev/null ) then chmod 600 "$errfile" exec > "$errfile" 2>&1 break fi done case $# in 1) case $1 in failsafe) exec xterm -geometry 80x24-0-0 ;; esac esac startup=$HOME/.xsession resources=$HOME/.Xresources if [ -f "$startup" ]; then exec "$startup $1" else if [ -f "$resources" ]; then xrdb -load "$resources" fi exec xsm fi wdm-1.28/configs/Xsession.in 644 0 0 542210221265060 154420ustar AlexeyVoinov 0 0#!@SHELL_LOGIN@ # @configure_input@ # $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ # This is the basic login script for a user. Much of the logic/code # for selecting and invoking the window manager is in the related file # Xclients. The reason for the separate file is so that individual # users can have tailored Xclients files in their home directories as # ~/.Xclients. # cleanup wdm resources @XRDB_PATH@ -load /dev/null case $# in 1) case $1 in failsafe) exec @FAILSAFE@ -geometry 80x24-0-0 ;; esac echo $1 >$HOME/.wm_style esac # redirect errors to a file in user's home directory if we can for errfile in "$HOME/.xsession-errors" "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER" do if ( cp /dev/null "$errfile" 2> /dev/null ) then chmod 600 "$errfile" exec > "$errfile" 2>&1 break fi done # clean up after xbanner # (RedHat code: need freetemp executed IF xbanner is run by Xsetup_0) # wdm sets the background itself so xbanner is not needed and # should not be run. For other backgrounds, you are on your own. # freetemp # Note that ~/.xsession and ~/.Xclients really serve the same function. # The ~/.xsession file comes from xdm and is intended as the user's # means of starting X programs such as a session or window manager. # X also creates an xinitrc file for use when starting x with 'startx'. # Red Hat Linux adds a package called xinitrc (and does not install # the xinitrc from XFree86). The xinitrc package defines two files # xinitrc (which is started by startx) and Xclients (and ~/.Xclients). # # The code below will use the "standard" ~/.xsession or ~/.Xclients # so that a user can use a single script whether startx or xdm is # used. # In the code below, note that control will be transfered to the first # program (shell script) found to exist and the programs that follow # are never executed. If a user wants to execute some other program # or script before starting a window manager and then continue with # the execution of the login script, this program should be executed # by a user's ~./Xclients or ~/.xsession file and then the window manager # should be started. # # For example, the following could be used as a ~/.Xclients # #!/bin/sh # if [ -x $HOME/.mystartup ]; then # . $HOME/.mystartup # fi # exec @DMDIR@/Xclients startup=$HOME/.xsession resources=$HOME/.Xresources if [ -f $resources ]; then @XRDB_PATH@ -load $resources fi if [ -x $startup ]; then exec $startup fi if [ -x $HOME/.Xclients ]; then exec $HOME/.Xclients fi if [ -x @DMDIR@/Xclients ]; then exec @DMDIR@/Xclients fi # if nothing else, start X's standard session manager exec xsm wdm-1.28/configs/Xsession.orig 644 0 0 141510221265060 157720ustar AlexeyVoinov 0 0#!/bin/bash -login # $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ case $# in 1) case $1 in failsafe) exec xterm -geometry 80x24-0-0 ;; esac esac # redirect errors to a file in user's home directory if we can for errfile in "$HOME/.xsession-errors" "${TMPDIR-/tmp}/xses-$USER" "/tmp/xses-$USER" do if ( cp /dev/null "$errfile" 2> /dev/null ) then chmod 600 "$errfile" exec > "$errfile" 2>&1 break fi done # clean up after xbanner freetemp startup=$HOME/.xsession resources=$HOME/.Xresources if [ -x "$startup" ]; then exec "$startup" elif [ -x "$HOME/.Xclients" ]; then exec "$HOME/.Xclients" elif [ -x /etc/X11/xinit/Xclients ]; then exec /etc/X11/xinit/Xclients else if [ -f "$resources" ]; then xrdb -load "$resources" fi exec xsm fi wdm-1.28/configs/Xsetup_0.in 644 0 0 40110221265060 153060ustar AlexeyVoinov 0 0#!@SYSTEM_SHELL@ # @configure_input@ # $XConsortium: Xsetup_0,v 1.3 93/09/28 14:30:31 gildea Exp $ @XCONSOLE@ -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail # /usr/X11R6/bin/xbanner # if xbanner is used, change Xsession to do freetemp wdm-1.28/configs/wdm-config.in 644 0 0 610710221265060 156620ustar AlexeyVoinov 0 0! $XConsortium: xdm-conf.cpp /main/3 1996/01/15 15:17:26 gildea $ ! ! wdm configuration file input (sed in Makefile) ! DisplayManager.errorLogFile: @LOGDIR@/xdm-errors.log DisplayManager.pidFile: @RUNDIR@/xdm-pid DisplayManager.keyFile: @DMDIR@/xdm-keys DisplayManager.servers: @DMDIR@/Xservers DisplayManager.accessFile: @DMDIR@/Xaccess ! All displays should use authorization, but we cannot be sure ! X terminals will be configured that way, so by default ! use authorization only for local displays :0, :1, etc. DisplayManager._0.authorize: true DisplayManager._1.authorize: true ! The following three resources set up display :0 as the console. DisplayManager._0.setup: @DMDIR@/Xsetup_0 DisplayManager._0.startup: @DMDIR@/GiveConsole DisplayManager._0.reset: @DMDIR@/TakeConsole ! DisplayManager*resources: @DMDIR@/Xresources DisplayManager*session: @DMDIR@/Xsession DisplayManager*authComplain: false DisplayManager*wdmLogin: @exec_prefix@/bin/wdmLogin ! ! display screen background--if not set or set to none, then the ! background is not set by wdm. ! DisplayManager*wdmBg: none DisplayManager*wdmBg: solid:RoyalBlue ! DisplayManager*wdmBg: dgradient:RoyalBlue,FireBrick,Black ! DisplayManager*wdmBg: hgradient:RoyalBlue,FireBrick,Black ! DisplayManager*wdmBg: vgradient:RoyalBlue,FireBrick,Black ! DisplayManager*wdmBg: pixmap:@GFXDIR@/Stars.jpg ! ! optional pixmap for logo @PIXMAPCOMMENT@DisplayManager*wdmLogo: @GFXDIR@/@PIXMAPFILE@ ! ! optional help file to display in the help panel ! long lines may cause an ugly display ! DisplayManager*wdmHelpFile: /etc/motd ! ! optional default username and password (in clear text) ! which wdm should use if nothing is typed by the user. ! it's strongly suggested that wdm-config should be ! chmod 600 and owned by root if you want to use this ! feature, or else you could open a huge security hole ! in your system, letting anyone to log in as this default ! user. In any case if you want to use this feature do ! it with a very restricted account, and especially NOT ! WITH THE root ACCOUNT !!! !DisplayManager*wdmDefaultUser: nobody !DisplayManager*wdmDefaultPasswd: dumb_clear_text_passwd ! ! list of window managers which can be started ! or 'None' if you want only NoChange to appear ! e.g.: DisplayManager*wdmWm: None DisplayManager*wdmWm: @WMLIST@ ! ! commands for reboot and halt ! -- be sure to edit these if the ! system is not linux. DisplayManager*wdmReboot: @SHUTDOWN@ -r now DisplayManager*wdmHalt: @SHUTDOWN@ -h now ! alternates (for Linux) ! DisplayManager*wdmReboot: @SHUTDOWN@ -t3 -r now ! DisplayManager*wdmHalt: @SHUTDOWN@ -t3 -h now ! ! true/false to require valid username/passwd to reboot,halt, or exit DisplayManager*wdmVerify: true ! true/false to require root as valid username/passwd to reboot,halt, or exit DisplayManager*wdmRoot: false ! true=enable, false=disable shake and rollup animations DisplayManager*wdmAnimations: true wdm-1.28/configs/wdm.pamd 644 0 0 60210221265060 147040ustar AlexeyVoinov 0 0#%PAM-1.0 auth required /lib/security/pam_pwdb.so shadow nullok auth required /lib/security/pam_nologin.so account required /lib/security/pam_pwdb.so password required /lib/security/pam_cracklib.so password required /lib/security/pam_pwdb.so shadow nullok use_authtok session required /lib/security/pam_pwdb.so session optional /lib/security/pam_console.so wdm-1.28/configs/wdmReconfig.in 644 0 0 536710221265060 161030ustar AlexeyVoinov 0 0#!@SHELL_LOGIN@ # @configure_input@ ################################################################# # This is a "simple" script which is intended to be run by rpm # as a post install function to look at the system where wdm is # being installed and create Xclients and wdm-config files which # reflect the window managers available on that system. # This software is Copyright (C) 1998 by Gene Czarcinski. # This software falls under the GNU Public License. Please read # the COPYING file for more information ################################################################# save_ifs="$IFS" IFS=: path=$PATH:/usr/local/bin:/usr/bin:/usr/X11R6/bin: WMLIST="" rc_word=wmaker WMAKER_PATH="wmaker" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then WMAKER_PATH=$rc_dir/$rc_word WMLIST=WindowMaker break fi done rc_word=afterstep AFTERSTEP_PATH="afterstep" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then AFTERSTEP_PATH=$rc_dir/$rc_word WMLIST="$WMLIST:AfterStep" break fi done rc_word=blackbox BLACKBOX_PATH="blackbox" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then BLACKBOX_PATH=$rc_dir/$rc_word WMLIST="$WMLIST:BlackBox" break fi done rc_word=icewm ICEWM_PATH="icewm" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then ICEWM_PATH=$rc_dir/$rc_word WMLIST="$WMLIST:IceWm" break fi done rc_word=xsession XSESSION_PATH="xsession" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then XSESSION_PATH=$rc_dir/$rc_word WMLIST="$WMLIST:Xsession" break fi done rc_word=startkde STARTKDE_PATH="startkde" for rc_dir in $path; do if test -x $rc_dir/$rc_word; then STARTKDE_PATH=$rc_dir/$rc_word WMLIST="$WMLIST:KDE" break fi done # update wdm-config configfile=@DMDIR@/wdm-config rm -f $configfile sed \ -e "s:@DMDIR\@:@DMDIR@:" \ -e "s:@BINDIR\@:@BINDIR@:" \ -e "s:@SHUTDOWN\@:@SHUTDOWN@:" \ -e "s:@LOGDIR\@:@LOGDIR@:" \ -e "s:@RUNDIR\@:@RUNDIR@:" \ -e "s:@PIXMAPFILE\@:@PIXMAPFILE@:" \ -e "s:@PIXMAPCOMMENT\@:@PIXMAPCOMMENT@:" \ -e "s:@exec_prefix\@:@exec_prefix@:" \ -e "s/@WMLIST\@/$WMLIST/" \ $configfile.in \ > $configfile chmod 644 $configfile # update Xclients configfile=@DMDIR@/Xclients rm -f $configfile sed -e "s:@XRDB_PATH\@:@XRDB_PATH@:" \ -e "s'@WMAKER_PATH\@'$WMAKER_PATH'" \ -e "s'@AFTERSTEP_PATH\@'$AFTERSTEP_PATH'" \ -e "s'@BLACKBOX_PATH\@'$BLACKBOX_PATH'" \ -e "s'@ICEWM_PATH\@'$ICEWM_PATH'" \ -e "s'@XSESSION_PATH\@'$XSESSION_PATH'" \ -e "s'@STARTKDE_PATH\@'$STARTKDE_PATH'" \ -e "s:@WINMGR_NAME\@::" \ -e "s:@WINMGR_PATH\@::" \ $configfile.in \ > $configfile chmod 755 $configfile wdm-1.28/configure.ac 644 0 0 3101010221265060 141450ustar AlexeyVoinov 0 0dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.53) AC_INIT([wdm],[0.0],[voins@voins.program.ru]) AC_CONFIG_SRCDIR(install-sh) AC_CONFIG_HEADERS(include/config.h) AC_PROG_INSTALL AC_PROG_CC AC_PROG_RANLIB AC_ARG_VAR(XRDB_PATH, [Path to xrdb program from X]) AC_PATH_PROG(XRDB_PATH, xrdb) AC_DEFINE_UNQUOTED(XRDB_PROGRAM, "$XRDB_PATH", [Value is a path for xrdb program]) AC_SUBST(XRDB_PATH) AC_ARG_VAR(XCONSOLE, [Path to xconsole program]) AC_PATH_PROG(XCONSOLE, xconsole) AC_SUBST(XCONSOLE) AC_ARG_VAR(SHUTDOWN, [Path to shutdown program]) AC_PATH_PROG(SHUTDOWN,shutdown,,$PATH:/sbin:/usr/sbin) AC_SUBST(SHUTDOWN) AC_ARG_VAR(FAILSAFE_PATH, [Path to program, that is used as failsafe client]) AC_PATH_PROG(FAILSAFE_PATH, xterm) AC_DEFINE_UNQUOTED(DEF_FAILSAFE_CLIENT, "$FAILSAFE_PATH", [Value is a path for program used as failsafe client]) AC_DEFINE_UNQUOTED(DEF_SESSION, "$FAILSAFE_PATH -ls", [Value is a command for default session]) AC_SUBST(FAILSAFE_PATH) AC_ARG_VAR(DEF_SERVER, [Path to default X server]) AC_PATH_PROG(DEF_SERVER, X) AC_DEFINE_UNQUOTED(DEF_SERVER_LINE, ":0 local $DEF_SERVER :0", [Value is default command to start X server]) AC_SUBST(DEF_SERVER) AC_ARG_VAR(SYSTEM_SHELL, [Path to default shell]) AC_PATH_PROG(SYSTEM_SHELL, sh) AC_PATH_PROG(SHELL_BASH,bash,,$PATH:/usr/local/bin) if test "x$SYSTEM_SHELL" = "x"; then AC_MSG_ERROR(the program sh cannot be found) fi dnl hope this is correct: if test "x$SHELL_BASH" = "x"; then SHELL_LOGIN="$SYSTEM_SHELL -" else SHELL_LOGIN="$SHELL_BASH -login" fi AC_SUBST(SHELL_LOGIN) AC_SUBST(SYSTEM_SHELL) AC_HEADER_STDC AC_CHECK_HEADERS(fcntl.h sys/param.h syslog.h libintl.h) AC_DECL_SYS_SIGLIST AC_C_CONST AC_TYPE_SIZE_T AC_TYPE_PID_T dnl if there is mkstemp use it instead of mktemp AC_CHECK_FUNC(mkstemp, [AC_DEFINE(HAVE_MKSTEMP, 1, [Define if you have mkstemp function to use it instead of mktemp.])]) dnl Password processing options AC_ARG_ENABLE(pam, AC_HELP_STRING([--disable-pam], [don't use PAM for authentication])) AC_ARG_ENABLE(shadow, AC_HELP_STRING([--disable-shadow], [don't use shadow for authentication])) AC_ARG_WITH(pamdir, AC_HELP_STRING([--with-pamdir],[specify where pam directory is]), [PAMDIR="$withval"], [PAMDIR="/etc/pam.d"]) AC_SUBST(PAMDIR) USE_PAM=no if test "$enable_pam" != "no" -a "$enable_shadow" != "yes" \ || test "$enable_pam" = "yes" -a "$enable_shadow" = "yes"; then AC_CHECK_LIB(pam, main, [ USE_PAM=yes PASSWDLIB="-lpam -ldl" AC_DEFINE_UNQUOTED(HAVE_PAM_LIB, 1, [Define if libpam is installed]) AC_DEFINE(USE_PAM, 1, [Define if you want wdm to use pam for auth])], ,-ldl) fi if test -z "$PASSWDLIB" \ && ( test "$enable_shadow" != "no" -a "$enable_pam" != "yes" \ || test "$enable_pam" = "yes" -a "$enable_shadow" = "yes" ); then AC_CHECK_LIB(shadow, main,[PASSWDLIB="-lshadow"]) AC_CHECK_HEADERS(shadow.h) fi AC_SUBST(PASSWDLIB) AC_SUBST(USE_PAM) AC_MSG_CHECKING(for SELinux support) AC_ARG_ENABLE(selinux, AC_HELP_STRING([--enable-selinux], [enable SELinux support]), [ AC_MSG_RESULT(yes) AC_CHECK_LIB(selinux, is_selinux_enabled, [SELINUX_LIBS="-lselinux" AC_DEFINE_UNQUOTED(HAVE_SELINUX_LIB, 1, [Define if libselinux is installed]) AC_DEFINE(WITH_SELINUX, 1, [Define if you want wdm to be compiled with SELinux support]) SELINUX_CFLAGS="-DWITH_SELINUX -I/usr/include/selinux" ], [ AC_MSG_WARN([libselinux not found, compiling without SELinux support]) ]) ], [ AC_MSG_RESULT(no) ]) AC_SUBST(SELINUX_LIBS) AC_SUBST(SELINUX_CFLAGS) AC_CHECK_LIB(util, main) dnl for FreeBSD AC_CHECK_LIB(crypt, main) dnl for BSD and RHL AC_CHECK_LIB(ucb, killpg) dnl for Solaris2.4 AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[enable debugging]), [ CFLAGS="$CFLAGS -g -DDEBUG" ]) AC_PATH_XTRA XCFLAGS="$X_CFLAGS" XLDFLAGS="$X_LIBS" XLIBS="$X_PRE_LIBS -lXext -lX11 -lm $X_EXTRA_LIBS" AC_ARG_ENABLE(xinerama, AC_HELP_STRING([--disable-xinerama],[explicit disable use of libXinerama])) if test "$enable_xinerama" = "yes" -o -z "$enable_xinerama"; then AC_CHECK_LIB(Xinerama, XineramaIsActive, [ XLIBS="$XLIBS -lXinerama" AC_DEFINE(HAVE_XINERAMA, 1, Define if Xinerama library is installed) ],,[$XLDFLAGS $XLIBS]) fi dnl WINGs support AC_CHECK_PROG(GETWINGSFLAGS,get-wings-flags,get-wings-flags,,[$PATH]) if test -z "$GETWINGSFLAGS"; then AC_MSG_ERROR(['get-wings-flags' command was not found in \$PATH, please upgrade your WindowMaker.]) fi WCFLAGS=`get-wings-flags --cflags` WLDFLAGS=`get-wings-flags --ldflags` WLIBS=`get-wings-flags --libs` AC_SUBST(XLIBS) AC_SUBST(XCFLAGS) AC_SUBST(XLDFLAGS) AC_SUBST(WCFLAGS) AC_SUBST(WLDFLAGS) AC_SUBST(WLIBS) dnl =============================================== dnl prefix dnl handle this here so we can use it dnl =============================================== dnl First, check for prefix: AC_MSG_CHECKING(for prefix) if test "$prefix" = "NONE"; then prefix="/usr/local" fi AC_MSG_RESULT($prefix) AC_MSG_CHECKING(for exec_prefix) if test "$exec_prefix" = "NONE"; then exec_prefix=$prefix fi AC_MSG_RESULT($exec_prefix) dnl =============================================== dnl specify some WITH options for these settings dnl =============================================== AC_MSG_CHECKING(for logdir) AC_ARG_WITH(logdir, AC_HELP_STRING([--with-logdir=PATH],[specify directory where logfile goes])) if test "x$with_logdir" != "x"; then LOGDIR=$with_logdir else LOGDIR="/var/log" fi AC_SUBST(LOGDIR) AC_MSG_RESULT($LOGDIR) AC_MSG_CHECKING(for runlockdir) AC_ARG_WITH(runlockdir, AC_HELP_STRING([--with-runlockdir=PATH],[specify directory where run lock goes])) if test "x$with_runlockdir" != "x"; then RUNDIR=$with_runlockdir else RUNDIR="/var/run" fi AC_SUBST(RUNDIR) AC_MSG_RESULT($RUNDIR) AC_MSG_CHECKING(for defuserpath) AC_ARG_WITH(defuserpath, AC_HELP_STRING([--with-defuserpath=PATHlist],[specify list of paths for user sessions])) if test "x$with_defuserpath" != "x"; then AC_DEFINE_UNQUOTED(DEF_USER_PATH,"$with_defuserpath", "Value is a list of paths for user sessions") AC_MSG_RESULT($with_defuserpath) else AC_DEFINE(DEF_USER_PATH,"/usr/local/bin:/bin:/usr/bin") AC_MSG_RESULT([using default: /usr/local/bin:/bin:/usr/bin]) fi AC_MSG_CHECKING(for defsystempath) AC_ARG_WITH(defsystempath, AC_HELP_STRING([--with-defsystempath=PATHlist],[specify list of paths for superuser sessions])) if test "x$with_defsystempath" != "x"; then AC_DEFINE_UNQUOTED(DEF_SYSTEM_PATH,"$with_defsystempath", "Value is a list of paths for superuser sessions") AC_MSG_RESULT($with_defsystempath) else AC_DEFINE(DEF_SYSTEM_PATH,"/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin") AC_MSG_RESULT([using default: /sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin]) fi dnl user must use --with-wdmdir= rather than --sysconfigdir= to put it dnl somewhere other than $prefix/etc dnl AC_MSG_CHECKING(if wdmdir has been specified) AC_ARG_WITH(wdmdir, AC_HELP_STRING([--with-wdmdir=PATH],[specify path for wdm directory])) if test "x$with_wdmdir" != "x"; then DMDIR="$with_wdmdir" AC_MSG_RESULT([yes, using $DMDIR]) else DMDIR="$prefix/etc/wdm" AC_MSG_RESULT([no, using $DMDIR]) fi AC_DEFINE_UNQUOTED(WDMDIR, "$DMDIR", [Value is a path to wdm directory]) AC_DEFINE_UNQUOTED(DEF_XDM_CONFIG, "$DMDIR/wdm-config", [Value is a path to default wdm config file]) AC_DEFINE_UNQUOTED(DEF_WDMLOGIN_CONFIG, "$DMDIR/wdmLogin-config", [Value is a path to default wdmLogin config file]) AC_DEFINE_UNQUOTED(DEF_CHOOSER, "$DMDIR/chooser", [Value is a path to default chooser program]) AC_DEFINE_UNQUOTED(DEF_AUTH_DIR, "$DMDIR/authdir", [Value is a path to default authdir]) AC_SUBST(DMDIR) dnl Let the user specify a location for pixmap files. dnl AC_MSG_CHECKING(if gfxdir has been specified) AC_ARG_WITH(gfxdir, AC_HELP_STRING([--with-gfxdir=PATH],[specify path for pixmaps directory])) if test "x$with_gfxdir" != "x"; then GFXDIR="$with_gfxdir" AC_MSG_RESULT([yes, using $GFXDIR]) else GFXDIR="$prefix/share/pixmaps/wdm" AC_MSG_RESULT([no, using $GFXDIR]) fi AC_DEFINE_UNQUOTED(WGFXDIR, "$GFXDIR", [Value is a path to the pixmaps directory]) AC_SUBST(GFXDIR) AC_MSG_CHECKING(if Logo pixmap specified) AC_ARG_WITH(Logo, AC_HELP_STRING([--with-Logo=PIXMAP_FILENAME],[specify file in wdm/pixmaps for Logo])) if test "x$with_Logo" != "x"; then PIXMAPFILE="$with_Logo" PIXMAPCOMMENT="" AC_MSG_RESULT($with_Logo) else PIXMAPFILE="Eagle.xpm" PIXMAPCOMMENT="! " AC_MSG_RESULT(no) fi AC_SUBST(PIXMAPFILE) AC_SUBST(PIXMAPCOMMENT) AC_ARG_VAR(WMAKER_PATH, [Path to wmaker program]) AC_PATH_PROG(WMAKER_PATH,wmaker,,$PATH:/usr/local/bin) if test "x$WMAKER_PATH" != "x"; then WMLIST=WindowMaker else WMAKER_PATH=wmaker fi AC_SUBST(WMAKER_PATH) AC_ARG_VAR(AFTERSTEP_PATH, [Path to afterstep program]) AC_PATH_PROG(AFTERSTEP_PATH,afterstep,,$PATH:/usr/local/bin) if test "x$AFTERSTEP_PATH" != "x"; then WMLIST=$WMLIST:AfterStep else AFTERSTEP_PATH=afterstep fi AC_SUBST(AFTERSTEP_PATH) AC_ARG_VAR(BLACKBOX_PATH, [Path to blackbox program]) AC_PATH_PROG(BLACKBOX_PATH,blackbox,,$PATH:/usr/local/bin) if test "x$BLACKBOX_PATH" != "x"; then WMLIST=$WMLIST:BlackBox else BLACKBOX_PATH=blackbox fi AC_SUBST(BLACKBOX_PATH) AC_ARG_VAR(ICEWM_PATH, [Path to icewm program]) AC_PATH_PROG(ICEWM_PATH,icewm,,$PATH:/usr/local/bin) if test "x$ICEWM_PATH" != "x"; then WMLIST=$WMLIST:IceWm else ICEWM_PATH=icewm fi AC_SUBST(ICEWM_PATH) AC_ARG_VAR(XSESSION_PATH, [Path to xsession program]) AC_PATH_PROG(XSESSION_PATH,xsession,,$PATH:/usr/local/bin) if test "x$XSESSION_PATH" != "x"; then WMLIST=$WMLIST:Xsession else XSESSION_PATH=xsession fi AC_SUBST(XSESSION_PATH) AC_PATH_PROG(STARTKDE_PATH,startkde,,$PATH:/usr/local/bin) if test "x$STARTKDE_PATH" != "x"; then WMLIST=$WMLIST:KDE else STARTKDE_PATH=startkde fi AC_SUBST(STARTKDE_PATH) AC_ARG_WITH(winmgr, AC_HELP_STRING([--with-winmgr=NAME_OF_WM], [specify an arbitrary window manager])) if test "x$with_winmgr" != "x"; then WINMGR_NAME=$with_winmgr AC_PATH_PROG(WINMGR_PATH,$WINMGR_NAME,,$PATH:/usr/local/bin) if test "x$WINMGR_PATH" = "x"; then AC_ARG_WITH(winmgr_path, AC_HELP_STRING([--with-winmgr_path=WINMGR_PATH], [specify path to your window manager])) if test "x$with_winmgr_path" != "x"; then WINMGR_PATH=$with_winmgr_path fi fi AC_MSG_CHECKING(for winmgr_path) if test "x$WINMGR_PATH" = "x"; then AC_MSG_ERROR([unable to locate $WINMGR_NAME, use --with-winmgr_path]) fi AC_MSG_RESULT($WINMGR_PATH) WMLIST=$WMLIST:$WINMGR_NAME fi AC_SUBST(WINMGR_PATH) AC_SUBST(WINMGR_NAME) AC_MSG_CHECKING(if window manager list specified) AC_ARG_WITH(wmlist, AC_HELP_STRING([--with-wmlist=LIST_OF_WM],[specify list of window managers])) if test "x$with_wmlist" != "x"; then WMLIST="$with_wmlist" AC_MSG_RESULT($with_wmlist) AC_MSG_WARN(make sure Xsession and Xclients support the above list) else AC_MSG_RESULT([no, default to $WMLIST]) fi AC_SUBST(WMLIST) dnl dnl gettext tests (partially copy/paste from WindowMaker's configure.ac) dnl INTLIBS="" AC_CHECK_FUNC(gettext, [HAVEGETTEXT="yes"], AC_CHECK_LIB(intl, gettext, [INTLIBS="-lintl" HAVEGETTEXT="yes"], INTLIBS="")) AC_CHECK_PROG(XGETTEXT, xgettext, xgettext) AC_CHECK_PROG(MSGFMT, msgfmt, msgfmt) if test "x$XGETTEXT" != "x"; then if $XGETTEXT --help 2>&1 | grep illegal &> /dev/null; then echo "xgettext isn't GNU version" XGETTEXT="" fi fi I18N=no if test "x$MSGFMT" != "x" -a "x$HAVEGETTEXT" != "x"; then AC_DEFINE(I18N, 1, [Define if you want internationalization support]) I18N=yes fi AC_SUBST(I18N) AC_ARG_WITH(nlsdir, AC_HELP_STRING([--with-nlsdir=PATH],[specify where locale stuff should go])) if test "x$NLSDIR" = "x"; then if test "x$with_nlsdir" != "x"; then NLSDIR=$with_nlsdir else NLSDIR=$prefix/lib/locale fi fi AC_DEFINE_UNQUOTED(NLSDIR, "$NLSDIR", [where to look for locale files]) AC_SUBST(NLSDIR) AC_SUBST(XGETTEXT) AC_SUBST(MSGFMT) dnl this is hackaround for libfontconfig bug AC_ARG_WITH(fakehome, AC_HELP_STRING([--with-fakehome=PATH],[path to use as home when no HOME is present. [/var/run/wdm] ])) FAKEHOME=/var/run/wdm if test "x$with_fakehome" != "x"; then FAKEHOME=$with_fakehome fi AC_DEFINE_UNQUOTED(FAKEHOME, "$FAKEHOME", [what to use as HOME value]) AC_SUBST(FAKEHOME) AC_ARG_ENABLE(aafont, AC_HELP_STRING([--enable-aafont],[enable support for antialiased fonts.])) if test "$enable_aafont" = "yes"; then AC_DEFINE(USE_AA, 1, [Define if you want support for antialiased fonts]) fi AC_ARG_ENABLE(exitlogin, AC_HELP_STRING([--enable-exitlogin],[enable ExitLogin command in wdmLogin.])) if test "$enable_exitlogin" = "yes"; then AC_DEFINE(WITH_EXITLOGIN, 1, [Define if you want to have ExitLogin]) fi AC_CONFIG_FILES([Makefile]) AC_OUTPUT wdm-1.28/doc/wdm.man.in 644 0 0 7121410221265060 143270ustar AlexeyVoinov 0 0.TH wdm 1x "July 2002" .SH NAME wdm \- WINGs Display Manager .SH SYNOPSIS .B wdm [ options ] .SH DESCRIPTION \fBwdm\fP is an X display manager based on the original X11 X Display Manager (xdm). It features numerous functionality improvements, including the ability to reboot or halt the machine (once the proper password has been supplied) and to select from a list of available X sessions to start. The look of the login panel is somewhat configurable, too. .SH OPTIONS .PP Except for \fB\-config\fP, all of these options can be specified as resources. .IP "\fB\-config\fP \fIconfiguration_file\fP" Names the configuration file, which specifies resources to control the behavior of \fIwdm\fP. \fI#configdir#/wdm-config\fP is the default. .IP "\fB\-nodaemon\fP" Specifies ``false'' as the value for the \fBDisplayManager.daemonMode\fP resource. This suppresses the normal daemon behavior, which is for \fIwdm\fP to close all file descriptors, disassociate itself from the controlling terminal, and put itself in the background when it first starts up. .IP "\fB\-debug\fP \fIdebug_level\fP" Specifies the numeric value for the \fBDisplayManager.debugLevel\fP resource. A non-zero value causes \fIwdm\fP to print lots of debugging statements to the terminal; it also disables the \fBDisplayManager.daemonMode\fP resource, forcing \fIwdm\fP to run synchronously. To interpret these debugging messages, a copy of the source code for \fIwdm\fP is almost a necessity. No attempt has been made to rationalize or standardize the output. .IP "\fB\-error\fP \fIerror_log_file\fP" Specifies the value for the \fBDisplayManager.errorLogFile\fP resource. This file contains errors from \fIwdm\fP as well as anything written to stderr by the various scripts and programs run during the progress of the session. .IP "\fB\-syslog\fP \fIfacility\fP" Specifies the value for the \fBDisplayManager.syslogFacility\fP resource. This is factility to use with all messages if log is redirected to syslog. .IP "\fB\-usesyslog\fP" Specifies ``true'' as the value for the \fBDisplayManager.useSyslog\dP resource. This will force all messages go to syslog with facility specified by \fBDisplayManager.syslogFacility\fP resource. .IP "\fB\-useerrfile\fP" Specifies ``false'' as the value for the \fBDisplayManager.useSyslog\dP resource. This will force all messages go to log file specified by \fBDisplayManager.errorLogFile\fP resource. .IP "\fB\-resources\fP \fIresource_file\fP" Specifies the value for the \fBDisplayManager*resources\fP resource. This file is loaded using \fIxrdb\fP to specify configuration parameters for the authentication widget. .IP "\fB\-server\fP \fIserver_entry\fP" Specifies the value for the \fBDisplayManager.servers\fP resource. .IP "\fB\-udpPort\fP \fIport_number\fP" Specifies the value for the \fBDisplayManager.requestPort\fP resource. This sets the port-number which .I wdm will monitor for XDMCP requests. As XDMCP uses the registered well-known UDP port 177, this resource should not be changed except for debugging. If set to 0 wdm will not listen for XDMCP or Chooser requests. .IP "\fB\-session\fP \fIsession_program\fP" Specifies the value for the \fBDisplayManager*session\fP resource. This indicates the program to run as the session after the user has logged in. .IP "\fB\-xrm\fP \fIresource_specification\fP" Allows an arbitrary resource to be specified, as in most X Toolkit applications. .SH RESOURCES .PP At many stages the actions of .I wdm can be controlled through the use of its configuration file, which is in the X resource format. Some resources modify the behavior of .I wdm on all displays, while others modify its behavior on a single display. Where actions relate to a specific display, the display name is inserted into the resource name between ``DisplayManager'' and the final resource name segment. .PP For local displays, the resource name and class are as read from the \fIXservers\fP file. .PP For remote displays, the resource name is what the network address of the display resolves to. See the \fBremoveDomain\fP resource. The name must match exactly; \fIwdm\fP is not aware of all the network aliases that might reach a given display. If the name resolve fails, the address is used. The resource class is as sent by the display in the XDMCP Manage request. .PP Because the resource manager uses colons to separate the name of the resource from its value and dots to separate resource name parts, .I wdm substitutes underscores for both dots and colons when generating the resource name. For example, \fBDisplayManager.expo_x_org_0.startup\fP is the name of the resource which defines the startup shell file for the ``expo.x.org:0'' display. .\" .IP "\fBDisplayManager.servers\fP" This resource either specifies a file name full of server entries, one per line (if the value starts with a slash), or a single server entry. See the section \fBLocal Server Specification\fP for the details. .IP "\fBDisplayManager.requestPort\fP" This indicates the UDP port number which .I wdm uses to listen for incoming XDMCP requests. Unless you need to debug the system, leave this with its default value of 177. .IP "\fBDisplayManager.errorLogFile\fP" Error output is normally directed at the system console. To redirect it, set this resource to a file name. A method to send these messages to .I syslog should be developed for systems which support it; however, the wide variety of interfaces precludes any system-independent implementation. This file also contains any output directed to stderr by the \fIXsetup, Xstartup, Xsession\fP and \fIXreset\fP files, so it will contain descriptions of problems in those scripts as well. .IP "\fBDisplayManager.debugLevel\fP" If the integer value of this resource is greater than zero, reams of debugging information will be printed. It also disables daemon mode, which would redirect the information into the bit-bucket, and allows non-root users to run .I wdm, which would normally not be useful. .IP "\fBDisplayManager.daemonMode\fP" Normally, .I wdm attempts to make itself into a daemon process unassociated with any terminal. This is accomplished by forking and leaving the parent process to exit, then closing file descriptors and releasing the controlling terminal. In some environments this is not desired (in particular, when debugging). Setting this resource to ``false'' will disable this feature. .IP "\fBDisplayManager.pidFile\fP" The filename specified will be created to contain an ASCII representation of the process-id of the main .I wdm process. .I Xdm also uses file locking on this file to attempt to eliminate multiple daemons running on the same machine, which would cause quite a bit of havoc. .IP "\fBDisplayManager.lockPidFile\fP" This is the resource which controls whether .I wdm uses file locking to keep multiple display managers from running amok. On System V, this uses the \fIlockf\fP library call, while on BSD it uses \fIflock.\fP .IP "\fBDisplayManager.authDir\fP" This names a directory under which .I wdm stores authorization files while initializing the session. The default value is \fI#configdir#.\fP Can be overridden for specific displays by DisplayManager.\fIDISPLAY\fP.authFile. .IP \fBDisplayManager.autoRescan\fP This boolean controls whether .I wdm rescans the configuration, servers, access control and authentication keys files after a session terminates and the files have changed. By default it is ``true.'' You can force .I wdm to reread these files by sending a SIGHUP to the main process. .IP "\fBDisplayManager.removeDomainname\fP" When computing the display name for XDMCP clients, the name resolver will typically create a fully qualified host name for the terminal. As this is sometimes confusing, .I wdm will remove the domain name portion of the host name if it is the same as the domain name of the local host when this variable is set. By default the value is ``true.'' .IP "\fBDisplayManager.keyFile\fP" XDM-AUTHENTICATION-1 style XDMCP authentication requires that a private key be shared between .I wdm and the terminal. This resource specifies the file containing those values. Each entry in the file consists of a display name and the shared key. By default, .I wdm does not include support for XDM-AUTHENTICATION-1, as it requires DES which is not generally distributable because of United States export restrictions. .IP \fBDisplayManager.accessFile\fP To prevent unauthorized XDMCP service and to allow forwarding of XDMCP IndirectQuery requests, this file contains a database of hostnames which are either allowed direct access to this machine, or have a list of hosts to which queries should be forwarded to. The format of this file is described in the section .B "XDMCP Access Control." .IP \fBDisplayManager.exportList\fP A list of additional environment variables, separated by white space, to pass on to the \fIXsetup\fP, \fIXstartup\fP, \fIXsession\fP, and \fIXreset\fP programs. .IP \fBDisplayManager.randomFile\fP A file to checksum to generate the seed of authorization keys. This should be a file that changes frequently. The default is \fI/dev/mem\fP. .IP \fBDisplayManager.greeterLib\fP On systems that support a dynamically-loadable greeter library, the name of the library. The default is \fI/usr/lib/X11/xdm/libXdmGreet.so\fP. .I This not used in Debian. .IP \fBDisplayManager.choiceTimeout\fP Number of seconds to wait for display to respond after user has selected a host from the chooser. If the display sends an XDMCP IndirectQuery within this time, the request is forwarded to the chosen host. Otherwise, it is assumed to be from a new session and the chooser is offered again. Default is 15. .IP \fBDisplayManager.sourceAddress\fP Use the numeric IP address of the incoming connection on multihomed hosts instead of the host name. This is to avoid trying to connect on the wrong interface which might be down at this time. .IP \fBDisplayManager.willing\fP This specifies a program which is run (as) root when an an XDMCP BroadcastQuery is received and this host is configured to offer XDMCP display management. The output of this program may be displayed on a chooser window. If no program is specified, the string \fIWilling to manage\fP is sent. .PP .\" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP" This resource specifies the name of the file to be loaded by \fIxrdb\fP as the resource database onto the root window of screen 0 of the display. The \fIXsetup\fP program, the Login widget, and \fIchooser\fP will use the resources set in this file. This resource data base is loaded just before the authentication procedure is started, so it can control the appearance of the login window. See the section .B "Authentication Widget," which describes the various resources that are appropriate to place in this file. There is no default value for this resource, but \fI#configdir#/Xresources\fP is the conventional name. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.chooser\fP" Specifies the program run to offer a host menu for Indirect queries redirected to the special host name CHOOSER. \fI/usr/X11R6/bin/chooser\fP is the default. See the sections \fBXDMCP Access Control\fP and \fBChooser\fP. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.xrdb\fP" Specifies the program used to load the resources. By default, .I wdm uses \fI/usr/X11R6/bin/xrdb\fP. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.cpp\fP" This specifies the name of the C preprocessor which is used by \fIxrdb\fP. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.setup\fP" This specifies a program which is run (as root) before offering the Login window. This may be used to change the appearance of the screen around the Login window or to put up other windows (e.g., you may want to run \fIxconsole\fP here). By default, no program is run. The conventional name for a file used here is \fIXsetup\fP. See the section \fBSetup Program.\fP .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.startup\fP" This specifies a program which is run (as root) after the authentication process succeeds. By default, no program is run. The conventional name for a file used here is \fIXstartup\fP. See the section \fBStartup Program.\fP .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.session\fP" This specifies the session to be executed (not running as root). By default, \fI/usr/X11R6/bin/xterm\fP is run. The conventional name is \fIXsession\fP. See the section .B "Session Program." .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.reset\fP" This specifies a program which is run (as root) after the session terminates. By default, no program is run. The conventional name is \fIXreset\fP. See the section .B "Reset Program." .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openDelay\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openRepeat\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.openTimeout\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.startAttempts\fP" These numeric resources control the behavior of .I wdm when attempting to open intransigent servers. \fBopenDelay\fP is the length of the pause (in seconds) between successive attempts, \fBopenRepeat\fP is the number of attempts to make, \fBopenTimeout\fP is the amount of time to wait while actually attempting the open (i.e., the maximum time spent in the .IR connect (2) system call) and \fBstartAttempts\fP is the number of times this entire process is done before giving up on the server. After \fBopenRepeat\fP attempts have been made, or if \fBopenTimeout\fP seconds elapse in any particular attempt, .I wdm terminates and restarts the server, attempting to connect again. This process is repeated \fBstartAttempts\fP times, at which point the display is declared dead and disabled. Although this behavior may seem arbitrary, it has been empirically developed and works quite well on most systems. The default values are 5 for \fBopenDelay\fP, 5 for \fBopenRepeat\fP, 30 for \fBopenTimeout\fP and 4 for \fBstartAttempts\fP. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.pingInterval\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.pingTimeout\fP" To discover when remote displays disappear, .I wdm occasionally pings them, using an X connection and \fIXSync\fP calls. \fBpingInterval\fP specifies the time (in minutes) between each ping attempt, \fBpingTimeout\fP specifies the maximum amount of time (in minutes) to wait for the terminal to respond to the request. If the terminal does not respond, the session is declared dead and terminated. By default, both are set to 5 minutes. If you frequently use X terminals which can become isolated from the managing host, you may wish to increase this value. The only worry is that sessions will continue to exist after the terminal has been accidentally disabled. .I wdm will not ping local displays. Although it would seem harmless, it is unpleasant when the workstation session is terminated as a result of the server hanging for NFS service and not responding to the ping. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.terminateServer\fP" This boolean resource specifies whether the X server should be terminated when a session terminates (instead of resetting it). This option can be used when the server tends to grow without bound over time, in order to limit the amount of time the server is run. The default value is ``false.'' .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.userPath\fP" .I Xdm sets the PATH environment variable for the session to this value. It should be a colon separated list of directories; see .IR sh (1) for a full description. ``:/bin:/usr/bin:/usr/X11R6/bin:/usr/ucb'' is a common setting. The default value can be specified at build time in the X system configuration file with DefaultUserPath. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP" .I Xdm sets the PATH environment variable for the startup and reset scripts to the value of this resource. The default for this resource is specified at build time by the DefaultSystemPath entry in the system configuration file; ``/etc:/bin:/usr/bin:/usr/X11R6/bin:/usr/ucb'' is a common choice. Note the absence of ``.'' from this entry. This is a good practice to follow for root; it avoids many common Trojan Horse system penetration schemes. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP" .I Xdm sets the SHELL environment variable for the startup and reset scripts to the value of this resource. It is \fI/bin/sh\fP by default. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.failsafeClient\fP" If the default session fails to execute, .I wdm will fall back to this program. This program is executed with no arguments, but executes using the same environment variables as the session would have had (see the section \fBSession Program\fP). By default, \fI/usr/X11R6/bin/xterm\fP is used. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabServer\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabTimeout\fP" To improve security, .I wdm grabs the server and keyboard while reading the login name and password. The \fBgrabServer\fP resource specifies if the server should be held for the duration of the name/password reading. When ``false,'' the server is ungrabbed after the keyboard grab succeeds, otherwise the server is grabbed until just before the session begins. The default is ``false.'' The \fBgrabTimeout\fP resource specifies the maximum time .I wdm will wait for the grab to succeed. The grab may fail if some other client has the server grabbed, or possibly if the network latencies are very high. This resource has a default value of 3 seconds; you should be cautious when raising it, as a user can be spoofed by a look-alike window on the display. If the grab fails, .I wdm kills and restarts the server (if possible) and the session. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authorize\fP" .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authName\fP" \fBauthorize\fP is a boolean resource which controls whether .I wdm generates and uses authorization for the local server connections. If authorization is used, \fBauthName\fP is a list of authorization mechanisms to use, separated by white space. XDMCP connections dynamically specify which authorization mechanisms are supported, so \fBauthName\fP is ignored in this case. When \fBauthorize\fP is set for a display and authorization is not available, the user is informed by having a different message displayed in the login widget. By default, \fBauthorize\fP is ``true.'' \fBauthName\fP is ``MIT-MAGIC-COOKIE-1,'' or, if XDM-AUTHORIZATION-1 is available, ``XDM-AUTHORIZATION-1\0MIT-MAGIC-COOKIE-1.'' .IP \fBDisplayManager.\fP\fIDISPLAY\fP\fB.authFile\fP This file is used to communicate the authorization data from .I wdm to the server, using the \fB\-auth\fP server command line option. It should be kept in a directory which is not world-writable as it could easily be removed, disabling the authorization mechanism in the server. If not specified, a name is generated from DisplayManager.authDir and the name of the display. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.authComplain\fP" If set to ``false,'' disables the use of the \fBunsecureGreeting\fP in the login window. See the section \fBAuthentication Widget.\fP The default is ``true.'' .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resetSignal\fP" The number of the signal \fIwdm\fP sends to reset the server. See the section \fBControlling the Server.\fP The default is 1 (SIGHUP). .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.termSignal\fP" The number of the signal \fIwdm\fP sends to terminate the server. See the section \fBControlling the Server.\fP The default is 15 (SIGTERM). .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.resetForAuth\fP" The original implementation of authorization in the sample server reread the authorization file at server reset time, instead of when checking the initial connection. As .I wdm generates the authorization information just before connecting to the display, an old server would not get up-to-date authorization information. This resource causes .I wdm to send SIGHUP to the server after setting up the file, causing an additional server reset to occur, during which time the new authorization information will be read. The default is ``false,'' which will work for all MIT servers. .IP "\fBDisplayManager.\fP\fIDISPLAY\fP\fB.userAuthDir\fP" When .I wdm is unable to write to the usual user authorization file ($HOME/.Xauthority), it creates a unique file name in this directory and points the environment variable XAUTHORITY at the created file. It uses \fI/tmp\fP by default. .IP "\fBDisplayManager.wdmLogin\fP" Specifies the path to \fIwdmLogin\fP(1x) .IP "\fBDisplayManager.wdmWm\fP" Is a colon separated list of window managers to use as options in the login panel. Note that if you include the path to the window manager, it will look \fIugly\fP. You may set this resource to None if you want only NoChange to appear. .IP "\fBDisplayManager.wdmLogo\fP" Path to the logo pixmap, several formats are accepted, read \fIwdmLogin\fP(1x) to find out more. .IP "\fBDisplayManager.wdmHelpFile\fP" Path to a text file which will be displayed in the help panel, read \fIwdmLogin\fP(1x) to find out more. .IP "\fBDisplayManager.wdmDefaultUser\fP" a default username which will be used if no username is typed. .IP "\fBDisplayManager.wdmDefaultPasswd\fP" the clear text password of the default user above. BE VERY CAREFUL when using this two resources, and don't forget to do: chmod 600 wdm-config ; chown root.root wdm-config .IP "\fBDisplayManager.wdmBg\fP" Background specification. Read the .B BACKGROUND IMAGE SPECIFICATION section to find out about the format. If this is not specified, then the background is \fBnot\fP set. .IP "\fBDisplayManager.wdmReboot\fP" Reboot command. .IP "\fBDisplayManager.wdmHalt\fP" Halt command. .IP "\fBDisplayManager.wdmVerify\fP" If true, verify user's identity for reboot/halt/exit. .IP "\fBDisplayManager.wdmRoot\fP" If true, user must be root to exit. .IP "\fBDisplayManager.wdmAnimations\fP" If true, enable animations consisting of shaking the panel (if an error) and rolling up the panel (when closing it). If false, animations are disabled. .IP "\fBDisplayManager.wdmLocale\fP" LANG environment variable will be set to value of this resource before starting wdmLogin. .IP "\fBDisplayManger.wdmCursorTheme\fP" If you have recent version of XFree with support for transparent cursors you can select cursor theme to use on login panel. XCURSOR_THEME environment variable will be set to value of this resource before starting wdmLogin. .SH "CONFIGURATION FILE" The default location of the .I wdm configuration file is \fI#configdir#/wdm-config\fP .LP Here is a reasonable configuration file, which could be named \fIwdm-config\fP: .nf .ta .5i 4i DisplayManager.servers: /usr/X11R6/lib/X11/xdm/Xservers DisplayManager.errorLogFile: /usr/X11R6/lib/X11/xdm/xdm-errors DisplayManager*resources: /usr/X11R6/lib/X11/xdm/Xresources DisplayManager*startup: /usr/X11R6/lib/X11/xdm/Xstartup DisplayManager*session: /usr/X11R6/lib/X11/xdm/Xsession DisplayManager.pidFile: /usr/X11R6/lib/X11/xdm/xdm-pid DisplayManager._0.authorize: true DisplayManager*authorize: false .fi .PP Note that this file mostly contains references to other files. Note also that some of the resources are specified with ``*'' separating the components. These resources can be made unique for each different display, by replacing the ``*'' with the display-name, but normally this is not very useful. See the \fBResources\fP section for a complete discussion. If the entry is a host name, all comparisons are done using network addresses, so any name which converts to the correct network address may be used. For patterns, only canonical host names are used in the comparison, so ensure that you do not attempt to match aliases. Preceding either a host name or a pattern with a `!' character causes hosts which match that entry to be excluded. .PP To only respond to Direct queries for a host or pattern, it can be followed by the optional ``NOBROADCAST'' keyword. This can be used to prevent an wdm server from appearing on menus based on Broadcast queries. .PP An Indirect entry also contains a host name or pattern, but follows it with a list of host names or macros to which indirect queries should be sent. .PP A macro definition contains a macro name and a list of host names and other macros that the macro expands to. To distinguish macros from hostnames, macro names start with a `%' character. Macros may be nested. .PP Indirect entries may also specify to have \fIwdm\fP run \fIchooser\fP to offer a menu of hosts to connect to. See the section \fBChooser\fP. .PP When checking access for a particular display host, each entry is scanned in turn and the first matching entry determines the response. Direct and Broadcast entries are ignored when scanning for an Indirect entry and vice-versa. .PP Blank lines are ignored, `#' is treated as a comment delimiter causing the rest of that line to be ignored, and `\e\fInewline\fP' causes the newline to be ignored, allowing indirect host lists to span multiple lines. .PP Here is an example Xaccess file: .LP .ta 2i 4i .nf # # Xaccess \- XDMCP access control file # # # Direct/Broadcast query entries # !xtra.lcs.mit.edu # disallow direct/broadcast service for xtra bambi.ogi.edu # allow access from this particular display *.lcs.mit.edu # allow access from any display in LCS *.deshaw.com NOBROADCAST # allow only direct access *.gw.com # allow direct and broadcast # # Indirect query entries # %HOSTS expo.lcs.mit.edu xenon.lcs.mit.edu \\ excess.lcs.mit.edu kanga.lcs.mit.edu extract.lcs.mit.edu xenon.lcs.mit.edu #force extract to contact xenon !xtra.lcs.mit.edu dummy #disallow indirect access *.lcs.mit.edu %HOSTS #all others get to choose .fi .SH RESOURCES FILE The \fIXresources\fP file is loaded onto the display as a resource database using .I xrdb. As the authentication widget reads this database before starting up, it usually contains parameters for that widget: .nf .ta .5i 1i xlogin*login.translations: #override\\ CtrlR: abort-display()\\n\\ F1: set-session-argument(failsafe) finish-field()\\n\\ Return: set-session-argument() finish-field() xlogin*borderWidth: 3 xlogin*greeting: CLIENTHOST \& #ifdef COLOR xlogin*greetColor: CadetBlue xlogin*failColor: red \& #endif .fi .PP Please note the translations entry; it specifies a few new translations for the widget which allow users to escape from the default session (and avoid troubles that may occur in it). Note that if \&#override is not specified, the default translations are removed and replaced by the new value, not a very useful result as some of the default translations are quite useful (such as ``: insert-char ()'' which responds to normal typing). .PP This file may also contain resources for the setup program and \fIchooser\fP. .SH "SETUP PROGRAM" The \fIXsetup\fP file is run after the server is reset, but before the Login window is offered. The file is typically a shell script. It is run as root, so should be careful about security. This is the place to change the root background or bring up other windows that should appear on the screen along with the Login widget. .PP In addition to any specified by \fBDisplayManager.exportList\fP, the following environment variables are passed: .nf .ta .5i 2i DISPLAY the associated display name PATH the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP SHELL the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP XAUTHORITY may be set to an authority file .fi .PP Note that since \fIwdm\fP grabs the keyboard, any other windows will not be able to receive keyboard input. They will be able to interact with the mouse, however; beware of potential security holes here. If \fBDisplayManager.\fP\fIDISPLAY\fP\fB.grabServer\fP is set, \fIXsetup\fP will not be able to connect to the display at all. Resources for this program can be put into the file named by \fBDisplayManager.\fP\fIDISPLAY\fP\fB.resources\fP. .PP Here is a sample \fIXsetup\fP script: .nf \& #!/bin/sh \& # Xsetup_0 \- setup script for one workstation xcmsdb < /usr/X11R6/lib/monitors/alex.0 xconsole\0\-geometry\0480x130\-0\-0\0\-notify\0\-verbose\0\-exitOnFail & .fi .SH BACKGROUND IMAGE SPECIFICATION There are several possible ways of specifing a background image. The generic format is \fItype\fP:\fIimage\fP. \fItype\fP can be any of: .TP .B none The backgound is \fBnot\fP set. .TP .B solid it renders a solid backgroud, and \fIimage\fP is a color name .TP \fBhgradient\fP, \fBvgradient\fP, \fBdgradient\fP a gradient (either horizontal, vertical or diagonal) will be rendered. \fIimage\fP is \fBcomma separated\fP of color names, and any number of colors can be specified. .TP \fBpixmap\fP a pixmap will be used for the background. \fIimage\fP is the full path to an image file (tiff, png, jpeg and xpm allowed) and it will be scaled to use the full screen. .SH SEE ALSO \fBwdmLogin\fP(1x) .SH AUTHOR wdm was written by Gene Czarcinski . wdm is based on work by Tom Rothamel and xdm, (c) 1988 X Consortium .PP This man page was written by Marcelo Magallon and extensively modified by Noah Meyerhans . Much of the content was taken from xdm's manual page. wdm-1.28/doc/wdmLogin.man 644 0 0 525510221265060 146750ustar AlexeyVoinov 0 0.TH wdmLogin 1x "August 1998" .SH NAME wdmLogin \- wdm login panel .SH SYNOPSIS \fBwdmLogin\fP [-d \fIdisplay\fP] [-l \fIlogo\fP] [-w \fI\fP] [-b \fIbackground\fP] [-h \fIhelpfile\fP] [-u \fIusername\fP] [-p \fIpassword\fP] .SH DESCRIPTION \fBwdmLogin\fP is greeter designed to work with \fBwdm\fP(1x). It has several features not found on xdm's greeter. wdmLogin should not be called directly, that's wdm's task. .SH OPTIONS .TP .B \-d starts on the specified \fIdisplay\fP .TP .B \-l uses the specified \fIlogo\fP for the panel. The logo will be \fBresized\fP to 200 by 130 pixels. .TP .B \-w presents the \fBcolon separated\fP list of \fIwindow managers\fP, for the user to pick one, or None if you want only NoChange to appear. .TP .B \-a enables animations consisting of shaking the Login panel (if an error) and rolling up the image (when closing the panel). .TP .B \-h uses the specified text file to display in the help panel instead of the static help message which is in the sources. Take care of long lines which may cause display trouble in the help panel. .TP .B \-u use the default username and password as specified in wdm-config if nothing is typed by the user. USE WITH EXTREME CAUTION. .TP .B \-b uses the specified background image (see the next section). If this is not specified, then the background is \fBNOT\fP set. .SH BACKGROUND IMAGE SPECIFICATION There are several possible ways of specifing a background image. The generic format is \-b\fItype\fP:\fIimage\fP. \fItype\fP can be any of: .TP .B none do not set the background. This user can still set the background via other means. .TP .B solid it renders a solid backgroud, and \fIimage\fP is a color name .TP \fBhgradient\fP, \fBvgradient\fP, \fBdgradient\fP a gradient (either horizontal, vertical or diagonal) will be rendered. \fIimage\fP is \fBcomma separated\fP of color names, and any number of colors can be specified. .TP \fBpixmap\fP a pixmap will be used for the background. \fIimage\fP is the full path to an image file (tiff, png, jpeg and xpm allowed) and it will be scaled to use the full screen. .SH FILES \fBwdmLogin\fP can be customized by modifying \fI/etc/X11/wdm/wdm-config\fP. .SH ENVIRONMENT VARIABLES Some variables that defines locale affects the look of wdmLogin. wdm program will set LANG environment variable according to `wdmLocale' resource in wdm-config file. .SH SEE ALSO .BR wdm (1x) , .BR locale (1) .SH AUTHOR wmdLogin was written by Gene Czarcinski . wdm is based on work by Tom Rothamel (xdm's external greeter protocol) and xdm itself, (c) 1988 X Consortium .PP This man page was written by Marcelo Magallon and modified by Jerome Alet wdm-1.28/etc/Howto.conf.in 644 0 0 311010221265060 147660ustar AlexeyVoinov 0 0/* @configure_input@ */ /**/ /* WARNING: Makefile.in is generated by etc/makefile.cook */ /* Do not send patches for this file. */ CFLAGS = @CFLAGS@; CPPFLAGS = @CPPFLAGS@; LDFLAGS = @LDFLAGS@; DEFS = @DEFS@; LIBS = @LIBS@; srcdir = @srcdir@; XCFLAGS = @XCFLAGS@; XLDFLAGS = @XLDFLAGS@; XLIBS = @XLIBS@; WCFLAGS = @WCFLAGS@; WLDFLAGS = @WLDFLAGS@; WLIBS = @WLIBS@; SELINUX_CFLAGS = @SELINUX_CFLAGS@; SELINUX_LIBS = @SELINUX_LIBS@; PASSWDLIB = @PASSWDLIB@; CC = @CC@; PACKAGE_NAME = @PACKAGE_NAME@; PACKAGE_VERSION = @PACKAGE_VERSION@; DESTDIR =; NLSDIR = @NLSDIR@; xgettext = @XGETTEXT@; msgfmt = @MSGFMT@; ranlib = @RANLIB@; ar = ar; cc = [CC]; cflags = [CPPFLAGS] [CFLAGS] [DEFS] [prepost -I /include [search_list]]; ldflags = [LDFLAGS] [prepost -L /bin [search_list]]; libs = [LIBS] -lwdm; wdmLogin_cflags = [cflags] [XCFLAGS] [WCFLAGS]; wdmLogin_ldflags = [ldflags] [XLDFLAGS] [WLDFLAGS]; wdmLogin_libs = [libs] [XLIBS] [WLIBS]; wdmPrefs_cflags = [cflags] [XCFLAGS] [WCFLAGS]; wdmPrefs_ldflags = [ldflags] [XLDFLAGS] [WLDFLAGS]; wdmPrefs_libs = [libs] [XLIBS] [WLIBS]; wdmChooser_cflags = [cflags] [XCFLAGS] [WCFLAGS]; wdmChooser_ldflags = [ldflags] [XLDFLAGS] [WLDFLAGS]; wdmChooser_libs = [libs] [XLIBS] [WLIBS]; TestLogin_cflags = [cflags] [XCFLAGS] [WCFLAGS]; TestLogin_ldflags = [ldflags] [XLDFLAGS] [WLDFLAGS]; TestLogin_libs = [libs] [XLIBS] [WLIBS]; wdm_cflags = [cflags] [XCFLAGS] [WCFLAGS] [SELINUX_CFLAGS]; wdm_ldflags = [ldflags] [XLDFLAGS] [WLDFLAGS]; wdm_libs = [libs] [XLIBS] [WLIBS] [PASSWDLIB] [SELINUX_LIBS] \ -lXmu -lXau -lXdmcp; libwdm_cflags = [cflags] [XCFLAGS] [WCFLAGS]; wdm-1.28/etc/Howto.cook 644 0 0 265210221265060 144010ustar AlexeyVoinov 0 0set mkdir; set time-adjust-back; if [not [defined search_path]] then search_path=; search_list = .; search_path = [tail [split ':' [search_path]]]; search_name = bl; loop { search_dir = [head [search_path]]; if [not [search_dir]] then loopstop; search_path = [tail [search_path]]; if [not [exists-symlink [search_name]]] then { ln -s [search_dir] [search_name] set clearstat; } else { if [not [exists [search_name]]] then { rm -f [search_name] set clearstat; ln -s [search_dir] [search_name] set clearstat; } } search_list = [search_list] [search_name]; search_name = [search_name]bl; } if [match_mask %1C%2 [version]] then { development = 1; integration = 0; } else { development = 0; integration = 1; } version_short = [fromto %1.C%2 %1 [subst D C [version]]]; project_short = [fromto %.[version_short] % [project]]; all =; #include-cooked-nowarn etc/Howto.conf #include-cooked [resolve etc/sourcelist.cook] if [not [defined all]] then all=; all: [all]; { } etc/Howto.conf : etc/Howto.conf.in config.status { CONFIG_FILES\=[target]\:[resolve etc/Howto.conf.in] CONFIG_HEADERS\= [pathname [resolve config.status]]; rm -f config.log; } #include-cooked [resolve etc/configure.cook] #include-cooked [resolve etc/archive.cook] #include-cooked [resolve etc/functions.cook] #include-cooked [resolve etc/build.cook] #include-cooked [resolve etc/i18n.cook] #include-cooked [resolve etc/makefile.cook] wdm-1.28/etc/Makefile.head 644 0 0 45210221265060 147400ustar AlexeyVoinov 0 0INSTALL=@INSTALL@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_SCRIPT=@INSTALL_SCRIPT@ INSTALL_DATA=@INSTALL_DATA@ prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ DMDIR=@DMDIR@ GFXDIR=@GFXDIR@ MANDIR=@mandir@ PAMDIR=@PAMDIR@ USE_PAM=@USE_PAM@ NLSDIR=@NLSDIR@ I18N=@I18N@ FAKEHOME=@FAKEHOME@ wdm-1.28/etc/archive.cook 644 0 0 274010221265060 147200ustar AlexeyVoinov 0 0archive_files = configure Makefile.in include/config.h.in ChangeLog [filter_out xdm/%0% [source_files]]; if [not [defined PACKAGE_VERSION]] then PACKAGE_VERSION=0; if [integration] then { tarball: wdm-[PACKAGE_VERSION].tar.gz wdm-[PACKAGE_VERSION].tar.bz2; } else { tarball: current; } current: wdm-current.tar.bz2; wdm-[PACKAGE_VERSION].tar.bz2 : wdm-[PACKAGE_VERSION].tar.gz { gunzip < wdm-[PACKAGE_VERSION].tar.gz | bzip2 > [target]; } wdm-[PACKAGE_VERSION].tar.gz : [archive_files] { tar --create --file - --dereference [resolve [archive_files]] | tardy -unu 0 -gnu 0 -una Alexey -gna Voinov -p wdm-[PACKAGE_VERSION] -ms 644 -mc 07022 -now [prepost "-rp=" "" [search_list]] | gzip -9 > [target]; } wdm-current.tar.bz2 : [archive_files] { tar --create --file - --dereference [resolve [archive_files]] | tardy -unu 0 -gnu 0 -una Alexey -gna Voinov -p wdm-current -ms 644 -mc 07022 -now [prepost "-rp=" "" [search_list]] | bzip2 -9 > [target]; } project_timestamp = [collect aereport -f [resolve etc/project_timestamp.rpt] -pl 30000 -p wdm | sed -e"'"1,6 d"'"]; echo [project_timestamp] "'>'" [mtime-seconds ChangeLog] "=" [expr [project_timestamp] ">" [mtime-seconds ChangeLog]] set silent; ChangeLog: etc/changelog.rpt etc/archive.cook etc/project_timestamp.rpt set ["if" [expr [project_timestamp] ">" [mtime-seconds ChangeLog]] "then" force] unlink no-time-adjust { aereport -f [resolve etc/changelog.rpt] -pl 30000 -p wdm | sed -e"'"1,6 d"'" > [target]; } wdm-1.28/etc/build.cook 644 0 0 210310221265060 143670ustar AlexeyVoinov 0 0%0%.o : %0%.c etc/functions.cook etc/Howto.conf { [cc] -c [get_cflags [get_program %0]] [resolve %0%.c] -o [target]; } %0%.c.dep : %0%.c etc/build.cook { c_incl -nc -ns -eia -nrec [prepost -I /include [search_list]] --prefix "'cascade %0%.c = '" --suffix "';'" [resolve %0%.c] [addprefix -rlp\= [search_list]] -nsri -o [target]; } %0%.h.dep : %0%.h etc/build.cook { c_incl -nc -ns -eia -nrec [prepost -I /include [search_list]] --prefix "'cascade %0%.h = '" --suffix "';'" [resolve %0%.h] [addprefix -rlp\= [search_list]] -nsri -o [target]; } #include-cooked-nowarn [fromto %0% %0%.dep [match_mask include/%.h [source_files]]] #include-cooked-nowarn [fromto %0% %0%.dep [match_mask src/%0%.c [source_files]]] cascade include/wdmconfig.h = include/config.h; bin/%.a : [c_to_o [select_c %]] etc/Howto.conf { [ar] cru bin/%.a [resolve [c_to_o [select_c %]]]; [ranlib] bin/%.a; } bin/% : [c_to_o [select_c %]] etc/Howto.conf [lib_deps [get_libs %_]] { [cc] [get_cflags %_] [get_ldflags %_] [resolve [c_to_o [select_c %]]] [get_libs %_] -o [target]; } wdm-1.28/etc/changelog.rpt 644 0 0 332610221265060 151010ustar AlexeyVoinov 0 0auto stack, stack_depth; auto history; stack[0] = project_name(); stack_depth = 1; while(stack_depth > 0) { auto pn, ps, i; --stack_depth; pn = stack[stack_depth]; ps = project[pn].state; /* add comleted changes to history */ for(i in ps.branch.history) { auto cs; cs = ps.branch.change[i.change_number]; auto developers, when, key, dn; when = cs.history[count(cs.history) - 1].when; key = strftime("%y%m%d%H%M", when); if(count(i.name) > 0) { dn = "(" ## i.name[0] ## ") "; } else { dn = ""; } if(count(cs.branch.change) == 0) { history[key] = { when = strftime("%d-%b-%Y %H:%M", when); brief = "[" ## pn ## "] " ## dn ## cs.brief_description; descr = cs.description; branch = ""; }; } } /* add branches to stack all */ for(i in keys(ps.branch.change)) { cs = ps.branch.change[i]; if(count(cs.branch) > 0) { stack[stack_depth] = pn ## "." ## i; ++stack_depth; } } /* add change being_integrated to history */ if(ps.branch.currently_integrating_change > 0) { cs = ps.branch.change[ps.branch.currently_integrating_change]; when = cs.history[count(cs.history) - 1].when; key = strftime("%y%m%d%H%M", when); history[key] = { when = strftime("%d-%b-%Y %H:%M", when); brief = "[" ## pn ## "] " ## cs.brief_description; descr = cs.description; branch = ""; }; } } auto sk; /* reverse sorted keys to get descending order */ sk = []; for(i in sort(keys(history))) { sk = [i] ## sk; } for(key in sk) { columns ( {width=18;}, {right=79;} ); auto rk; rk = sprintf("0%d", key); print( history[rk].when, history[rk].brief ); columns ( {left=24; right=79;} ); print(history[rk].descr); print(""); print(""); } wdm-1.28/etc/config.d/architecture 644 0 0 126710221265060 165210ustar AlexeyVoinov 0 0/* * aegis - project change supervisor * This file is in the Public Domain, 1995, 1998 Peter Miller. * * MANIFEST: example architecture definitions for the project config file * * Delete those entries which you do not want to enforce. * Additions to this file are most welcome. * * Remember, if you use heterogeneous development, you will need to pass the * architecture to the build_command, and you will need to extensively re-write * the DMT rules. Aegis expects that the development directory and the * baseline contains object files and executables for all architectures * simultaneously. */ architecture = [ { name = "linux-intel"; pattern = "Linux*i[3-9]86*"; }, ]; wdm-1.28/etc/config.d/cook 644 0 0 165310221265060 147710ustar AlexeyVoinov 0 0/* * aegis - project change supervisor * This file is in the Public Domain, 1995, Peter Miller. * * MANIFEST: example use of cook in project config file */ /* * The build_command field of the config file is used to invoke the relevant * build command. The following command tells cook where to find the recipes. * The ${s Howto.cook} expands to a path into the baseline during development * if the file is not in the change. Look in aesub(5) for more information * about command substitutions. */ build_command = "cook -b ${s etc/Howto.cook} -nl project=$p change=$c version=$v search_path=$sp"; /* * The recipes in the User Guide will all remove their targets before * constructing them, which qualifies them to use the following entry in the * config file. The targets MUST be removed first if this field is true, * otherwise the baseline would cease to be self-consistent. * link_integration_directory = true; */ wdm-1.28/etc/config.d/diff 644 0 0 370710221265060 147500ustar AlexeyVoinov 0 0/* * aegis - project change supervisor * This file is in the Public Domain, 1999 Peter Miller. * * MANIFEST: example use of diff in the project config file * * The ${quote ...} construct is used to quote filenames which contain * shell special characters. A minimum of quoting is performed, so if * the filenames do not contain shell special characters, no quotes will * be used. */ /* * Compare two files using GNU diff. The -U 10 option produces an output * with inserts and deletes shown line, with 10 lines of context before * and after. This is usually superior to -c, as it shows what happened * more clearly (and it takes less space). The -b option could be added * to compare runs of white space as equal. * * This command is used by aed(1) to produce a difference listing when * file in the development directory was originally copied from the * current version in the baseline. * * All of the command substitutions described in aesub(5) are available. * In addition, the following substitutions are also available: * * ${ORiginal} * The absolute path name of a file containing the version * originally copied. Usually in the baseline. * ${Input} * The absolute path name of the edited version of the file. * Usually in the development directory. * ${Output} * The absolute path name of the file in which to write the * difference listing. Usually in the development directory. * * An exit status of 0 means successful, even of the files differ (and * they usually do). An exit status which is non-zero means something * is wrong. (So we need to massage the exit status, because diff does * things a little differently.) * * The non-zero exit status may be used to overload this command with * extra tests, such as line length limits. The difference files must * be produced in addition to these extra tests. */ diff_command = "set +e; " "diff -U10 -a ${quote $original} ${quote $input} > ${quote $output}; " "test $? -le 1"; wdm-1.28/etc/config.d/rcs 644 0 0 1676010221265060 146520ustar AlexeyVoinov 0 0/* * aegis - project change supervisor * This file is in the Public Domain, 1995, 1998, 2000 Peter Miller. * * MANIFEST: example of using rcs in the project config file * * The entries for the commands are listed below. RCS uses a slightly * different model than aegis wants, so some maneuvering is required. * The command strings in this section assume that the RCS commands ci and co * and rcs and rlog are in the command search PATH, but you may like to * hard-wire the paths, or set PATH at the start of each. You should also note * that the strings are always handed to the Bourne shell to be executed, and * are set to exit with an error immediately a sub-command fails. * * In these commands, the RCS file is kept unlocked, since only the owner will * be checking changes in. The RCS functionality for coordinating shared * access is not required. * * One advantage of using RCS version 5.6 or later is that binary files are * supported, should you want to have binary files in the baseline. * * The ${quote ...} construct is used to quote filenames which contain * shell special characters. A minimum of quoting is performed, so if * the filenames do not contain shell special characters, no quotes will * be used. */ /* * This command is used to create a new file history. * This command is always executed as the project owner. * The following substitutions are available: * * ${Input} * absolute path of the source file * ${History} * absolute path of the history file * * The "ci -u" option is used to specify that an unlocked copy will remain in * the baseline. * The "ci -d" option is used to specify that the file time rather than the * current time is to be used for the new revision. * The "ci -M" option is used to specify that the mode date on the original * file is not to be altered. * The "ci -t" option is used to specify that there is to be no description * text for the new RCS file. * The "ci -m" option is used to specify that the change number is to be stored * in the file log if this is actually an update (typically from aenf * after aerm on the same file name). * The "ci -w" option is used to specify the user name at checkin, * since this is always run by the project owner, and we almost * always want to know the developer. * The "rcs -U" option is used to specify that the new RCS file is to have * unstrict locking. * * It is essential that the history_put_command be identical to the * the history_create_command for branching to work correctly. */ history_create_command = "ci -u -d -M -m${quote ($version) ${change description}} \ -w$developer \ -t/dev/null ${quote $input} ${quote $history,v}; \ rcs -U ${quote $history,v}"; /* * This command is used to get a specific edit back from history. * This command is always executed as the project owner. * The following substitutions are available: * * ${History} * absolute path of the history file * ${Edit} * edit number, as given by history_\%query_\%command * ${Output} * absolute path of the destination file * * The "co -r" option is used to specify the edit to be retrieved. * The "co -p" option is used to specify that the results be printed on the * standard output; this is because the destination filename will never * look anything like the history source filename. */ history_get_command = "co -r${quote $edit} -p ${quote $history,v} > ${quote $output}"; /* * This command is used to add a new "top-most" entry to the history file. * This command is always executed as the project owner. * The following substitutions are available: * * ${Input} * absolute path of source file * ${History} * absolute path of history file * * The "ci -f" option is used to specify that a copy is to be checked-in even * if there are no changes. * The "ci -u" option is used to specify that an unlocked copy will remain in * the baseline. * The "ci -d" option is used to specify that the file time rather than the * current time is to be used for the new revision. * The "ci -M" option is used to specify that the mode date on the original * file is not to be altered. * The "ci -m" option is used to specify that the change number is to be stored * in the file log, which allows rlog to be used to find the change * numbers to which each revision of the file corresponds. * The "ci -w" option is used to specify the user name at checkin, * since this is always run by the project owner, and we almost * always want to know the developer. * * It is essential that the history_put_command be identical to the * the history_create_command for branching to work correctly. */ history_put_command = "ci -u -d -M -m${quote ($version) ${change description}} \ -w$developer \ -t/dev/null ${quote $input} ${quote $history,v}; \ rcs -U ${quote $history,v}"; /* * This command is used to query what the history mechanism calls the top-most * edit of a history file. The result may be any arbitrary string, it need not * be anything like a number, just so long as it uniquely identifies the edit * for use by the history_get_command at a later date. The edit number is to * be printed on the standard output. This command is always executed as the * project owner. * * The following substitutions are available: * * ${History} * absolute path of the history file */ history_query_command = "rlog -r ${quote $history,v} | awk '/^head:/ {print $$2}'"; /* * RCS also provides a merge program, which can be used to provide a three-way * merge. It has an output format some sites prefer to the fmerge output. * * This command is used by aed(1) to produce a difference listing when a file * in the development directory is out of date compared to the current version * in the baseline. * * All of the command substitutions described in aesub(5) are available. * In addition, the following substitutions are also available: * * ${ORiginal} * The absolute path name of a file containing the common ancestor * version of ${MostRecent} and {$Input}. Usually the version originally * copied into the change. Usually in a temporary file. * ${Most_Recent} * The absolute path name of a file containing the most recent version. * Usually in the baseline. * ${Input} * The absolute path name of the edited version of the file. Usually in * the development directory. * ${Output} * The absolute path name of the file in which to write the difference * listing. Usually in the development directory. * * An exit status of 0 means successful, even of the files differ (and they * usually do). An exit status which is non-zero means something is wrong. * * The "merge -L" options are used to specify labels for the baseline and the * development directory, respectively, when conflict lines are inserted * into the result. * The "merge -p" options is used to specify that the results are to be printed * on the standard output. */ merge_command = "set +e; \ merge -p -L baseline -L C$c ${quote $mostrecent} ${quote $original} \ ${quote $input} > ${quote $output}; \ test $? -le 1"; /* * Many history tools (including RCS) can modify the contents of the file * when it is committed. While there are usually options to turn this * off, they are seldom used. The problem is: if the commit changes the * file, the source in the repository now no longer matches the object * file in the repository - i.e. the history tool has compromised the * referential integrity of the repository. * * If you use RCS keyword substitution, you will need this next line. * (The default is to report a fatal error.) */ history_put_trashes_file = warn; wdm-1.28/etc/configure.cook 644 0 0 407510221265060 152630ustar AlexeyVoinov 0 0if [not [defined autoheader]] then autoheader=autoheader_2.5; if [not [defined autoconf]] then autoconf=autoconf_2.5; if [not [defined PACKAGE_VERSION]] then PACKAGE_VERSION=0.0; if [exists /usr/local/share/autoconf/install-sh] then install-sh = /usr/local/share/autoconf/install-sh; else if [exists /usr/share/autoconf/install-sh] then install-sh = /usr/share/autoconf/install-sh; if [exists /usr/local/share/automake/install-sh] then install-sh = /usr/local/share/automake/install-sh; else install-sh = /usr/share/automake/install-sh; install-sh: [install-sh] { cp [need] [target]; chmod 755 [target]; } configure: configure.ac etc/configure.cook install-sh set ["if" [not [match [PACKAGE_VERSION] [version_short]]] "then" force] { if [not [exists install-sh]] then ln -s [resolve install-sh] install-sh set clearstat; rm -f [target]; sed -e"'s/\\[0\\.0\\]/\\["[version_short]"\\]/'" < [resolve configure.ac] >tmpfile; [autoconf] tmpfile > [target]; chmod 755 [target]; rm -rf autom4te*.cache tmpfile; } config.status : configure etc/configure.cook { CFLAGS\="\"-O2 -g -Wall -Werror -pedantic\"" [pathname [resolve configure]] --enable-pam --enable-aafont --enable-debug --no-create --cache-file\=/dev/null --verbose --srcdir\=.; } include/config.h.in : configure.ac etc/configure.cook { [autoheader] [resolve configure.ac] > [target]; rm -rf autom4te*.cache; } include/config.h : include/config.h.in config.status etc/configure.cook { CONFIG_FILES\= CONFIG_HEADERS\=[target]\:[resolve include/config.h.in] [pathname [resolve config.status]]; rm -f config.log; } src/config/% : src/config/%.in config.status { CONFIG_FILES\=[target]\:[resolve src/config/%.in] CONFIG_HEADERS\= [pathname [resolve config.status]]; rm -f config.log; } Makefile : Makefile.in config.status { CONFIG_FILES\=[target]\:[resolve Makefile.in] CONFIG_HEADERS\= [pathname [resolve config.status]]; rm -f config.log; } doc/% : doc/%.in config.status { CONFIG_FILES\=[target]\:[resolve doc/%.in] CONFIG_HEADERS\= [pathname [resolve config.status]]; rm -f config.log; } wdm-1.28/etc/functions.cook 644 0 0 222410221265060 153040ustar AlexeyVoinov 0 0function c_to_o = { return [fromto %0%.c %0%.o [arg]]; } function select_c = { return [match_mask src/[@1]/%.c [source_files]]; } function get_cflags = { if [defined [@1]cflags] then return [[@1]cflags]; return [cflags]; } function get_ldflags = { if [defined [@1]ldflags] then return [[@1]ldflags]; return [ldflags]; } function get_libs = { if [defined [@1]libs] then return [[@1]libs]; return [libs]; } function get_program = { if [matches src/%/ [@1]] then return [fromto src/%/ % [@1]]_; return; } function octal = { result =; number = [@1]; loop { if [expr [number] \=\= 0] then loopstop; result = [expr [number] & 7][result]; number = [expr [number] / 8]; } return 0[result]; } function stripext = { return [fromto %0%.%1 %0% [@1]]; } function is_library = { if [match_mask lib% [@1]] then return [@1]; return; } function lib_deps = { targets = [match_mask -l% [arg]]; deps = ; loop { lib = [head [targets]]; if [not [lib]] then loopstop; targets = [tail [targets]]; if [match_mask src/[fromto -l% lib% [lib]]/%.c [source_files]] then deps = [deps] [fromto -l% bin/lib%.a [lib]]; } return [deps]; } wdm-1.28/etc/i18n.cook 644 0 0 76010221265060 140360ustar AlexeyVoinov 0 0%0%.po.merge: %0%.po po/wdm.pot { msgmerge --output\=[target] [resolve %0%.po] [resolve po/wdm.pot]; } %0%.mo: %0%.po { [msgfmt] -o [target] [resolve %0%.po]; } po/wdm.pot: [source_files] { [xgettext] --keyword\=_ --keyword\=N_ --default-domain\=wdm --output\=[target] [resolve [match_mask %0%.c [source_files]]]; } nls/%/LC_MESSAGES/wdm.mo: po/%.mo { mkdir -p nls/%/LC_MESSAGES; cp [resolve po/%.mo] [target]; } nlsdir: [fromto po/%.mo nls/%/LC_MESSAGES/wdm.mo [mo_files]] { } wdm-1.28/etc/makefile.cook 644 0 0 1455110221265060 150770ustar AlexeyVoinov 0 0function make_var = { return [prepost "\\$\\(" "\\)" [arg]]; } function make_line = { echo [arg] >>[target] set silent; } function make_action = { [make_line -e "\"\\t\""[arg]]; } %0%.c.Md: %0%.c etc/makefile.cook { c_incl -nc -ns -eia [prepost -I /include [search_list]] [resolve %0%.c] [addprefix -rlp\= [search_list]] -nsri -o [target]; } %0%.c.M: %0%.c.Md etc/makefile.cook etc/functions.cook etc/sourcelist.cook { rm -f [target]; [make_line "%0%.o: %0%.c" [collect cat [resolve %0%.c.Md]]]; [make_action [make_var CC] -c [make_var [get_program %0]cflags] %0%.c -o %0%.o]; [make_line]; } destbindir = [make_var DESTDIR][make_var bindir]/; destman1dir = [make_var DESTDIR][make_var MANDIR]/man1; configdir = [make_var DESTDIR][make_var DMDIR]; gfxdir = [make_var DESTDIR][make_var GFXDIR]; pamdir = [make_var DESTDIR][make_var PAMDIR]; localedir = [make_var DESTDIR][make_var NLSDIR]; src/%.a.M: etc/makefile.cook etc/functions.cook etc/sourcelist.cook [select_c %] { rm -f [target]; [make_line "bin/%.a: " [c_to_o [select_c %]]]; [make_action mkdir -p bin]; [make_action [make_var ar] cru bin/%.a [c_to_o [select_c %]]]; [make_action [make_var ranlib] bin/%.a]; [make_line]; } src/%.M: etc/makefile.cook etc/functions.cook etc/sourcelist.cook [select_c %] { rm -f [target]; [make_line "bin/%: " [c_to_o [select_c %]] [lib_deps [get_libs %_]]]; [make_action mkdir -p bin] [make_action [make_var CC] [make_var %_ldflags] [c_to_o [select_c %]] [make_var %_libs] -o bin/%]; [make_line]; [make_line [destbindir]%\: bin/%]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL_PROGRAM] bin/% \\$\\@]; [make_line]; } doc/%.man.M: etc/makefile.cook { rm -f [target]; if [in doc/%.man [g_manfiles]] then { [make_line doc/%.man\: doc/%.man.in]; [make_action CONFIG_FILES\=\\$\\@\:doc/%.man.in \ CONFIG_HEADERS\= ./config.status]; [make_line]; } [make_line [destman1dir]/%.1\: doc/%.man]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL_DATA] doc/%.man \\$\\@]; [make_line]; } po/%.mo.M: etc/makefile.cook { rm -f [target]; [make_line po/%.mo\: po/%.po]; [make_action [make_var msgfmt] -o \\$\\@ po/%.po]; [make_line]; [make_line [localedir]/%/LC_MESSAGES/wdm.mo\: po/%.mo]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL_DATA] po/%.mo \\$\\@]; [make_line]; } configs/%.M: etc/makefile.cook etc/functions.cook { rm -f [target]; if [in configs/% [g_configs]] then { [make_line configs/%\: configs/%.in]; [make_action CONFIG_FILES\=\\$\\@\:configs/%.in \ CONFIG_HEADERS\= ./config.status]; [make_line]; } perm = 0644; if [in configs/% [exe_configs]] then perm = [octal [expr [perm] | 0111]]; if [in configs/% [sec_configs]] then perm = [octal [expr [perm] & 0700]]; if [in configs/% [pam_configs]] then { [make_line [pamdir]/[stripext %]\: configs/%]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL] -m [perm] configs/% \\$\\@]; [make_line]; } else { [make_line [configdir]/%\: configs/%]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL] -m [perm] configs/% \\$\\@]; [make_line]; } echo >> [target]; } function is_xpm = { return [matches %.xpm [@1]]; } pixmaps/%.M: etc/makefile.cook { rm -f [target]; [make_line [gfxdir]/%\: pixmaps/%]; [make_action [make_var INSTALL] -d \\$\\(\\@D\\)]; [make_action [make_var INSTALL_DATA] pixmaps/% \\$\\@]; [make_line]; } m_files = [fromto %0% %0%.M [match_mask src/%0%.c [source_files]]] [fromto % src/%.M [program_list]] [fromto % src/%.a.M [libraries_list]] [fromto %0% %0%.M [manfiles]] [fromto %0% %0%.M [gfxfiles]] [fromto %0% %0%.M [mo_files]] [fromto %0% %0%.M [configs] [pam_configs] [i_configs]]; clean_files = [fromto %0%.c %0%.o [match_mask src/%0%.c [source_files]]] [g_configs] [mo_files] [g_manfiles] [addprefix bin/ [program_list]] [fromto % bin/%.a [libraries_list]]; dist_clean_files = [clean_files] [addprefix bin/ [program_list]] config.status config.log include/config.h include/gnuLogo.xpm Makefile; Makefile.in : etc/Howto.conf.in etc/Makefile.head etc/makefile.cook etc/Howto.cook [m_files] { rm -f [target]; sed [resolve etc/Howto.conf.in] \ -e "'s@\\[prepost.*-I.*\\[.*\\]\\]@-I./include@'" \ -e "'s@\\[prepost.*-L.*\\[.*\\]\\]@-L./bin@'" \ -e "'s@\\[\\([^\\[]*\\)\\]@\\$(\\1)@g'" \ -e "'s@;$@@'" \ -e "'s@/\\*\\*\\(.*\\)\\*/@\\1@'" \ -e "'s@/\\*\\(.*\\)\\*/@# \\1@'" \ >> [target]; cat [resolve etc/Makefile.head] >> [target]; [make_line]; [make_line all\: all-bin all-doc all-config all-nls-[make_var I18N]]; [make_line]; [make_line install\: install-bin install-config install-doc install-gfx install-nls-[make_var I18N]]; [make_line]; [make_line all-bin\: [addprefix bin/ [program_list]]]; [make_line]; [make_line install-bin\: [addprefix [destbindir] [stringset [program_list] - [i_program_list]]]]; [make_line]; [make_line]; [make_line all-config\: [g_configs]]; [make_line]; [make_line install-config\: [fromto %0% [configdir]/% [configs] [i_configs]] install-pam-[make_var USE_PAM] [configdir]/authdir]; [make_action install -d -m 0700 [make_var DESTDIR][make_var FAKEHOME]]; [make_line]; [make_line install-pam-no\:]; [make_line]; [make_line install-pam-yes\: [fromto %0%.pamd [pamdir]/% [pam_configs]]]; [make_line]; [make_line [configdir]/authdir\:]; [make_action [make_var INSTALL] -m 700 -d \\$\\@]; [make_line]; [make_line all-doc\: [g_manfiles]]; [make_line]; [make_line all-nls-yes\: [mo_files]]; [make_line]; [make_line all-nls-no\:]; [make_line]; [make_line install-doc\: [fromto %0%.man [destman1dir]/%.1 [manfiles]]]; [make_line]; [make_line install-gfx\: [fromto %0% [gfxdir]/% [gfxfiles]]]; [make_line]; [make_line install-nls-yes\: [fromto po/%.mo [localedir]/%/LC_MESSAGES/wdm.mo [mo_files]]]; [make_line]; [make_line install-nls-no\:]; [make_line]; cat [resolve [m_files]] >> [target]; [make_line]; [make_line clean\:]; [make_action rm -f [clean_files]]; [make_line]; [make_line distclean\:]; [make_action rm -f [dist_clean_files]]; [make_action "'if test -e bin; then rmdir bin; fi'"]; [make_line]; [make_line po/wdm.pot\: [match_mask src/%0%.c [source_files]]]; [make_action [make_var xgettext] --keyword\=_ --keyword\=N_ --default-domain\=wdm --output\=\\$\\@ [match_mask src/%0%.c [source_files]]]; } wdm-1.28/etc/project_timestamp.rpt 644 0 0 164210221265060 167020ustar AlexeyVoinov 0 0columns({left=0;right=0;}); auto stack, stack_depth, pd, pdkey; auto cs; stack[0] = project_name(); stack_depth = 1; while(stack_depth > 0) { auto pn, ps, i; --stack_depth; pn = stack[stack_depth]; ps = project[pn].state; /* add branches to stack all */ for(i in keys(ps.branch.change)) { cs = ps.branch.change[i]; if(count(cs.branch) > 0) { stack[stack_depth] = pn ## "." ## i; ++stack_depth; } auto when, key; when = cs.history[count(cs.history) - 1].when; key = strftime("%y%m%d%H%M", when); if(key > pdkey) { pd = when; pdkey = key; } } /* add change being_integrated to history */ if(ps.branch.currently_integrating_change > 0) { cs = ps.branch.change[ps.branch.currently_integrating_change]; when = cs.history[count(cs.history) - 1].when; key = strftime("%y%m%d%H%M", when); if(key > pdkey) { pd = when; pdkey = key; } } } print(strftime("%s", pd)); wdm-1.28/etc/runtest.sh 644 0 0 263610221265060 144660ustar AlexeyVoinov 0 0#!/bin/sh # # Copyright (C) 2002, 2003 Alexey Voinov # testfilename="$1" export project="$2" export change="$3" export searchpath="$4" export here=`pwd` if test $? -ne 0; then exit 2; fi searchandrun() { prog=$1 shift result= for p in `echo $searchpath|tr ':' ' '`; do if test -e $p/$prog; then result=$p/$prog break; fi done if test -z "$result"; then fail "cannot find script $prog"; fi echo source $result $@ source $result $@ } pass() { set +x echo PASSED [$testfilename] cd $here rm -rf $work exit 0 } fail() { set +x cd $here rm -rf $work echo FAILED [$testfilename${@:+": $@"}] exit 1 } no_result() { set +x cd $here rm -rf $work echo NO RESULT [$testfilename${@:+": $@"}] } trap "no_result" 1 2 3 15 work=`mktemp -dt test.XXXXXXXXXX` if test $? -ne 0; then no_result "cannot create temporary directory"; fi cd $work if test $? -ne 0; then no_result "cannot cd to temporary directory"; fi export PAGER=cat if echo $testfilename | grep -q -e '\.cc$'; then searchandrun etc/runtest_cc.sh $@ elif echo $testfilename | grep -q -e '\.hh$'; then searchandrun etc/runtest_hh.sh $@ elif echo $testfilename | grep -q -e '\.sh$'; then searchandrun etc/runtest_sh.sh $@ elif echo $testfilename | grep -q -e '\.c$'; then searchandrun etc/runtest_c.sh $@ else echo "don't know how to run this test [$testfilename]" exit 1 fi fail "something wrong, shouldn\'t get there." wdm-1.28/etc/runtest_c.sh 644 0 0 171010221265060 147600ustar AlexeyVoinov 0 0#!/bin/sh # # Copyright (C) 2002, 2003 Alexey Voinov # testfilename=$1 project=$2 change=$3 searchpath=$4 includedirs=`echo $searchpath | sed -e's/^/-I/;s/:/\/include -I/g;s/$/\/include/'` libdirs=`echo $searchpath | sed -e's/^/-L/;s/:/\/bin -L/g;s/$/\/bin/'` CFLAGS=${CFLAGS:-"-g"} CFLAGS="$CFLAGS $includedirs" LDFLAGS="$libdirs $LDFLAGS" CC=${CC:-gcc} LDFLAGS="$LDFLAGS `grep -e '^LDFLAGS=' $testfilename|sed -e's/^LDFLAGS=//'`" LIBS="$LIBS `grep -e '^LIBS=' $testfilename|sed -e's/^LIBS=//'`" CFLAGS="$CFLAGS `grep -e '^CFLAGS=' $testfilename|sed -e's/^CFLAGS=//'`" SUDO="`grep -e '^SUDO=' $testfilename|sed -e's/^SUDO=//'`" if test -n "$SUDO"; then SUDO=sudo fi export LD_LIBRARY_PATH=$searchpath echo "--->" $CC $CFLAGS $LDFLAGS $testfilename $LIBS -o testprog $CC $CFLAGS $LDFLAGS $testfilename $LIBS -o testprog if test $? -ne 0; then fail; fi echo "--->" $SUDO ./testprog $SUDO ./testprog if test $? -ne 0; then fail; fi pass wdm-1.28/etc/runtest_cc.sh 644 0 0 155010221265060 151250ustar AlexeyVoinov 0 0#!/bin/sh # # Copyright (C) 2002, 2003 Alexey Voinov # testfilename=$1 project=$2 change=$3 searchpath=$4 includedirs=`echo $searchpath | sed -e's/^/-I/;s/:/\/include -I/g;s/$/\/include/'` libdirs=`echo $searchpath | sed -e's/^/-L/;s/:/\/bin -L/g;s/$/\/bin/'` CFLAGS=${CFLAGS:-"-g"} CXXFLAGS=${CXXFLAGS:-""} CFLAGS="$CFLAGS $includedirs" LDFLAGS="$libdirs $LDFLAGS" CXX=${CXX:-g++} LDFLAGS="$LDFLAGS `grep -e '^LDFLAGS=' $testfilename|sed -e's/^LDFLAGS=//'`" LIBS="$LIBS `grep -e '^LIBS=' $testfilename|sed -e's/^LIBS=//'`" CFLAGS="$CFLAGS `grep -e '^CFLAGS=' $testfilename|sed -e's/^CFLAGS=//'`" export LD_LIBRARY_PATH=$searchpath echo $CXX $CFLAGS $LDFLAGS $testfilename $LIBS -o testprog $CXX $CFLAGS $LDFLAGS $testfilename $LIBS -o testprog if test $? -ne 0; then fail; fi echo ./testprog ./testprog if test $? -ne 0; then fail; fi pass wdm-1.28/etc/runtest_hh.cc 644 0 0 73710221265060 151000ustar AlexeyVoinov 0 0/** * Copyright (C) 2002, 2003 Alexey Voinov * * @file * æÁÊÌ ÄÌÑ ÚÁÐÕÓËÁ .hh-ÔÅÓÔÏ× */ #include #include int main(int argc, char **argv) { CppUnit::TextUi::TestRunner runner; CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest( registry.makeTest() ); bool wasSucessful = runner.run("", false); return !wasSucessful; } wdm-1.28/etc/runtest_hh.sh 644 0 0 211510221265060 151350ustar AlexeyVoinov 0 0#!/bin/sh # # Copyright (C) 2002, 2003 Alexey Voinov # testfilename=$1 project=$2 change=$3 searchpath=$4 includedirs=`echo $searchpath | sed -e's/^/-I/;s/:/\/include -I/g;s/$/\/include/'` libdirs=`echo $searchpath | sed -e's/^/-L/;s/:/\/bin -L/g;s/$/\/bin/'` mainsource= for p in `echo $searchpath|tr ':' ' '`; do if test -e $p/etc/runtest_hh.cc; then mainsource=$p/etc/runtest_hh.cc fi done if test -z "$mainsource"; then fail "cannot find runtest_hh.cc"; fi CFLAGS=${CFLAGS:-"-g"} CFLAGS="$CFLAGS $includedirs" LDFLAGS="$libdirs -lcppunit $LDFLAGS" CC=${CC:-g++} LDFLAGS="$LDFLAGS `grep -e '^LDFLAGS=' $testfilename|sed -e's/^LDFLAGS=//'`" LIBS="$LIBS `grep -e '^LIBS=' $testfilename|sed -e's/^LIBS=//'`" CFLAGS="$CFLAGS `grep -e '^CFLAGS=' $testfilename|sed -e's/^CFLAGS=//'`" export LD_LIBRARY_PATH=$searchpath echo $CC $CFLAGS $LDFLAGS -include $testfilename -o testprog $mainsource $LIBS $CC $CFLAGS $LDFLAGS -include $testfilename -o testprog $mainsource $LIBS if test $? -ne 0; then fail; fi echo ./testprog ./testprog if test $? -ne 0; then fail; fi pass wdm-1.28/etc/runtest_sh.sh 644 0 0 42310221265060 151300ustar AlexeyVoinov 0 0#!/bin/sh # # Copyright (C) 2002, 2003 Alexey Voinov # testfilename=$1 project=$2 change=$3 searchpath=$4 echo $SHELL $testfilename $project $change $searchpath $SHELL $testfilename $project $change $searchpath if test $? -ne 0; then fail; fi pass wdm-1.28/etc/sourcelist.cook 644 0 0 342610221265060 154750ustar AlexeyVoinov 0 0change_files = [collect aegis -list cf -terse -p [project] -c [change]]; project_files = [collect aegis -list pf -terse -p [project] -c [change]]; source_files = [sort [stringset [change_files] [project_files]]]; /* generated man files */ g_manfiles = [fromto %0%.man.in %0%.man [match_mask doc/%.man.in [source_files]]]; /* all man files */ manfiles = [match_mask doc/%.man [source_files]] [g_manfiles]; /* generated config files */ g_configs = [fromto %0%.in %0% [match_mask configs/%.in [source_files]]]; /* all config files */ configs = [filter_out %0%.in [match_mask configs/% [source_files]]] [g_configs]; /* configuration for pam (count generated configs as well) */ pam_configs = [match_mask %0%.pamd [configs]]; /* filter out pam configs from all others */ configs = [filter_out %0%.pamd [configs]]; /* list of executable scripts in config */ exe_configs = [addprefix configs/ Xclients Xsession Xsession.XFree86 wdmReconfig Xsetup_0 GiveConsole TakeConsole]; /* list of config files with restricted access */ sec_configs = [addprefix configs/ wdm-config]; /* list of config files sources to install along with generated files*/ i_configs = [addprefix configs/ wdm-config.in Xclients.in]; /* list of graphics files */ gfxfiles = [match_mask pixmaps/% [source_files]]; /* list of programs in project list */ program_list = [stringset [fromto src/%1/%2.c %1 [match_mask src/%1/%2.c [source_files]]]]; libraries_list = [filter lib% [program_list]]; program_list = [filter_out lib% [program_list]]; /* internal programs that is will not be installed */ i_program_list = TestLogin wdmPrefs wdmChooser; /* list of *.mo files */ mo_files = [fromto %0%.po %0%.mo [match_mask %0%.po [source_files]]]; if [integration] then all = [all] tarball; all = [all] [addprefix bin/ [program_list]] nlsdir; wdm-1.28/include/dm.h 644 0 0 4060110221265060 140610ustar AlexeyVoinov 0 0/* $Xorg: dm.h,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/dm.h,v 3.28 2002/01/14 22:49:45 herrb Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * dm.h * * public interfaces for greet/verify functionality */ #ifndef _DM_H_ #define _DM_H_ 1 #include #include #include #include #include #include #if defined(X_POSIX_C_SOURCE) #define _POSIX_C_SOURCE X_POSIX_C_SOURCE #include #include #undef _POSIX_C_SOURCE #else #include #include #endif #include #define Time_t time_t /* If XDMCP symbol defined, compile to run XDMCP protocol */ #define XDMCP #ifdef XDMCP #include #endif #ifdef pegasus #undef dirty /* Some bozo put a macro called dirty in sys/param.h */ #endif /* pegasus */ #ifndef X_NOT_POSIX #ifdef _POSIX_SOURCE #include #else #define _POSIX_SOURCE #ifdef SCO325 #include #include #endif #include #undef _POSIX_SOURCE #endif # define waitCode(w) (WIFEXITED(w) ? WEXITSTATUS(w) : 0) # define waitSig(w) (WIFSIGNALED(w) ? WTERMSIG(w) : 0) # define waitCore(w) 0 /* not in POSIX. so what? */ typedef int waitType; #else /* X_NOT_POSIX */ #ifdef SYSV # define waitCode(w) (((w) >> 8) & 0x7f) # define waitSig(w) ((w) & 0xff) # define waitCore(w) (((w) >> 15) & 0x01) typedef int waitType; #else /* SYSV */ # include # define waitCode(w) ((w).w_T.w_Retcode) # define waitSig(w) ((w).w_T.w_Termsig) # define waitCore(w) ((w).w_T.w_Coredump) typedef union wait waitType; #endif #endif /* X_NOT_POSIX */ #ifdef USE_PAM #include #endif #ifdef CSRG_BASED #include #ifdef HAS_SETUSERCONTEXT #include #include #ifdef USE_BSDAUTH #include #endif #endif #endif # define waitCompose(sig,core,code) ((sig) * 256 + (core) * 128 + (code)) # define waitVal(w) waitCompose(waitSig(w), waitCore(w), waitCode(w)) typedef enum displayStatus { running, notRunning, zombie, phoenix } DisplayStatus; #ifndef FD_ZERO typedef struct my_fd_set { int fds_bits[1]; } my_fd_set; # define FD_ZERO(fdp) bzero ((fdp), sizeof (*(fdp))) # define FD_SET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] |= (1 << ((f) % (sizeof (int) * 8)))) # define FD_CLR(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] &= ~(1 << ((f) % (sizeof (int) * 8)))) # define FD_ISSET(f,fdp) ((fdp)->fds_bits[(f) / (sizeof (int) * 8)] & (1 << ((f) % (sizeof (int) * 8)))) # define FD_TYPE my_fd_set #else # define FD_TYPE fd_set #endif /* * local - server runs on local host * foreign - server runs on remote host * permanent - session restarted when it exits * transient - session not restarted when it exits * fromFile - started via entry in servers file * fromXDMCP - started with XDMCP */ typedef struct displayType { unsigned int location:1; unsigned int lifetime:1; unsigned int origin:1; } DisplayType; # define Local 1 # define Foreign 0 # define Permanent 1 # define Transient 0 # define FromFile 1 # define FromXDMCP 0 extern DisplayType parseDisplayType (char *string, int *usedDefault); typedef enum fileState { NewEntry, OldEntry, MissingEntry } FileState; struct display { struct display *next; /* Xservers file / XDMCP information */ char *name; /* DISPLAY name */ char *class; /* display class (may be NULL) */ DisplayType displayType; /* method to handle with */ char **argv; /* program name and arguments */ /* display state */ DisplayStatus status; /* current status */ int pid; /* process id of child */ int serverPid; /* process id of server (-1 if none) */ FileState state; /* state during HUP processing */ int startTries; /* current start try */ Time_t lastCrash; /* time of last crash */ #ifdef XDMCP /* XDMCP state */ CARD32 sessionID; /* ID of active session */ XdmcpNetaddr peer; /* display peer address */ int peerlen; /* length of peer address */ XdmcpNetaddr from; /* XDMCP port of display */ int fromlen; CARD16 displayNumber; int useChooser; /* Run the chooser for this display */ ARRAY8 clientAddr; /* for chooser picking */ CARD16 connectionType; /* ... */ #endif /* server management resources */ int serverAttempts; /* number of attempts at running X */ int openDelay; /* open delay time */ int openRepeat; /* open attempts to make */ int openTimeout; /* abort open attempt timeout */ int startAttempts; /* number of attempts at starting */ int pingInterval; /* interval between XSync */ int pingTimeout; /* timeout for XSync */ int terminateServer;/* restart for each session */ int grabServer; /* keep server grabbed for Login */ int grabTimeout; /* time to wait for grab */ int resetSignal; /* signal to reset server */ int termSignal; /* signal to terminate server */ int resetForAuth; /* server reads auth file at reset */ char *keymaps; /* binary compat with DEC */ char *greeterLib; /* greeter shared library name */ /* session resources */ char *resources; /* resource file */ char *xrdb; /* xrdb program */ char *setup; /* Xsetup program */ char *startup; /* Xstartup program */ char *reset; /* Xreset program */ char *session; /* Xsession program */ char *userPath; /* path set for session */ char *systemPath; /* path set for startup/reset */ char *systemShell; /* interpreter for startup/reset */ char *failsafeClient;/* a client to start when the session fails */ char *chooser; /* chooser program */ /* authorization resources */ int authorize; /* enable authorization */ char **authNames; /* authorization protocol names */ unsigned short *authNameLens; /* authorization protocol name lens */ char *clientAuthFile;/* client specified auth file */ char *userAuthDir; /* backup directory for tickets */ int authComplain; /* complain when no auth for XDMCP */ /* information potentially derived from resources */ int authNameNum; /* number of protocol names */ Xauth **authorizations;/* authorization data */ int authNum; /* number of authorizations */ char *authFile; /* file to store authorization in */ int version; /* to keep dynamic greeter clued in */ /* add new fields only after here. And preferably at the end. */ /* Hack for making "Willing to manage" configurable */ char *willing; /* "Willing to manage" program */ }; #ifdef XDMCP #define PROTO_TIMEOUT (30 * 60) /* 30 minutes should be long enough */ #define XDM_BROKEN_INTERVAL (10) /* server crashing more than once within */ /* two minutes is assumed to be broken! */ struct protoDisplay { struct protoDisplay *next; XdmcpNetaddr address; /* UDP address */ int addrlen; /* UDP address length */ unsigned long date; /* creation date */ CARD16 displayNumber; CARD16 connectionType; ARRAY8 connectionAddress; CARD32 sessionID; Xauth *fileAuthorization; Xauth *xdmcpAuthorization; ARRAY8 authenticationName; ARRAY8 authenticationData; XdmAuthKeyRec key; }; #endif /* XDMCP */ struct greet_info { char *name; /* user name */ char *password; /* user password */ char *string; /* random string */ char *passwd; /* binary compat with DEC */ int version; /* for dynamic greeter to see */ /* add new fields below this line, and preferably at the end */ Boolean allow_null_passwd; /* allow null password on login */ Boolean allow_root_login; /* allow direct root login */ }; /* setgroups is not covered by POSIX, arg type varies */ #if defined(SYSV) || defined(SVR4) || defined(__osf__) || defined(linux) || defined(__GNU__) #define GID_T gid_t #else #define GID_T int #endif typedef void (*ChooserFunc)(CARD16 connectionType, ARRAY8Ptr addr, char *closure); struct verify_info { int uid; /* user id */ int gid; /* group id */ char **argv; /* arguments to session */ char **userEnviron; /* environment for session */ char **systemEnviron;/* environment for startup/reset */ int version; /* for dynamic greeter to see */ /* add new fields below this line, and preferably at the end */ }; /* display manager exit status definitions */ # define OBEYSESS_DISPLAY 0 /* obey multipleSessions resource */ # define REMANAGE_DISPLAY 1 /* force remanage */ # define UNMANAGE_DISPLAY 2 /* force deletion */ # define RESERVER_DISPLAY 3 /* force server termination */ # define OPENFAILED_DISPLAY 4 /* XOpenDisplay failed, retry */ #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif typedef union { int i; char* c; } int_resource; typedef union { char** l; char* c; } slist_resource; extern char *config; extern char *servers; extern int_resource request_port; extern int_resource debugLevel; extern char *errorLogFile; extern char *syslogFacility; extern int_resource useSyslog; extern int_resource daemonMode; extern char *pidFile; extern int_resource lockPidFile; extern char *authDir; extern int_resource autoRescan; extern int_resource removeDomainname; extern char *keyFile; extern char *accessFile; extern slist_resource exportList; extern char *randomFile; extern char *greeterLib; extern char *willing; extern int_resource choiceTimeout; /* chooser choice timeout */ extern struct display *FindDisplayByName (char *name), *FindDisplayBySessionID (CARD32 sessionID), *FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber), *FindDisplayByPid (int pid), *FindDisplayByServerPid (int serverPid), *NewDisplay (char *name, char *class); extern struct protoDisplay *FindProtoDisplay ( XdmcpNetaddr address, int addrlen, CARD16 displayNumber); extern struct protoDisplay *NewProtoDisplay ( XdmcpNetaddr address, int addrlen, CARD16 displayNumber, CARD16 connectionType, ARRAY8Ptr connectionAddress, CARD32 sessionID); /* in Login.c */ extern void DrawFail (Widget ctx); /* in access.c */ extern ARRAY8Ptr getLocalAddress (void); extern int AcceptableDisplayAddress (ARRAY8Ptr clientAddress, CARD16 connectionType, xdmOpCode type); extern int ForEachMatchingIndirectHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure); extern int ScanAccessDatabase (void); extern int UseChooser (ARRAY8Ptr clientAddress, CARD16 connectionType); extern void ForEachChooserHost (ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure); /* in choose.c */ extern ARRAY8Ptr IndirectChoice (ARRAY8Ptr clientAddress, CARD16 connectionType); extern int IsIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType); extern int RememberIndirectClient (ARRAY8Ptr clientAddress, CARD16 connectionType); extern void ForgetIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType); extern void ProcessChooserSocket (int fd); /* in chooser.c */ extern void RunChooser (struct display *d); /* in daemon.c */ extern void BecomeDaemon (void); extern void BecomeOrphan (void); /* in dm.c */ extern void CloseOnFork (void); extern void RegisterCloseOnFork (int fd); extern void StartDisplay (struct display *d); #ifndef HAS_SETPROCTITLE extern void SetTitle (char *name, ...); #endif /* in dpylist.c */ extern int AnyDisplaysLeft (void); extern void ForEachDisplay (void (*f)(struct display *)); extern void RemoveDisplay (struct display *old); /* in file.c */ extern void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable); /* in netaddr.c */ extern char *NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp); extern char *NetaddrPort(XdmcpNetaddr netaddrp, int *lenp); extern int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr); extern int NetaddrFamily (XdmcpNetaddr netaddrp); extern int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2); /* in policy.c */ #if 0 extern ARRAY8Ptr Accept (/* struct sockaddr *from, int fromlen, CARD16 displayNumber */); #endif extern ARRAY8Ptr ChooseAuthentication (ARRAYofARRAY8Ptr authenticationNames); extern int CheckAuthentication (struct protoDisplay *pdpy, ARRAY8Ptr displayID, ARRAY8Ptr name, ARRAY8Ptr data); extern int SelectAuthorizationTypeIndex (ARRAY8Ptr authenticationName, ARRAYofARRAY8Ptr authorizationNames); extern int SelectConnectionTypeIndex (ARRAY16Ptr connectionTypes, ARRAYofARRAY8Ptr connectionAddresses); extern int Willing (ARRAY8Ptr addr, CARD16 connectionType, ARRAY8Ptr authenticationName, ARRAY8Ptr status, xdmOpCode type); /* in protodpy.c */ extern void DisposeProtoDisplay(struct protoDisplay *pdpy); /* in reset.c */ extern void pseudoReset (Display *dpy); /* in resource.c */ extern void InitResources (int argc, char **argv); extern void LoadDMResources (void); extern void LoadServerResources (struct display *d); extern void LoadSessionResources (struct display *d); extern void ReinitResources (void); /* in session.c */ #ifdef USE_PAM extern pam_handle_t **thepamhp(void); extern pam_handle_t *thepamh(void); #endif extern char **defaultEnv (void); extern char **systemEnv (struct display *d, char *user, char *home); extern int PingServer(struct display *d, Display *alternateDpy); extern int source (char **environ, char *file); extern void ClearCloseOnFork (int fd); extern void DeleteXloginResources (struct display *d, Display *dpy); extern void LoadXloginResources (struct display *d); extern void ManageSession (struct display *d); extern void SecureDisplay (struct display *d, Display *dpy); extern void SessionExit (struct display *d, int status, int removeAuth); extern void SessionPingFailed (struct display *d); extern void SetupDisplay (struct display *d); extern void UnsecureDisplay (struct display *d, Display *dpy); extern void execute(char **argv, char **environ); /* server.c */ extern char *_SysErrorMsg (int n); extern int StartServer (struct display *d); extern int WaitForServer (struct display *d); extern void ResetServer (struct display *d); /* socket.c */ extern int GetChooserAddr (char *addr, int *lenp); extern void CreateWellKnownSockets (void); /* in util.c */ extern char *localHostname (void); extern char **parseArgs (char **argv, char *string); extern void CleanUpChild (void); extern void freeArgs (char **argv); /* in verify.c */ extern int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify); /* in xdmcp.c */ extern char *NetworkAddressToHostname (CARD16 connectionType, ARRAY8Ptr connectionAddress); extern int AnyWellKnownSockets (void); extern void DestroyWellKnownSockets (void); extern void SendFailed (struct display *d, char *reason); extern void StopDisplay (struct display *d); extern void WaitForChild (void); extern void WaitForSomething (void); extern void init_session_id(void); extern void registerHostname(char *name, int namelen); /* * CloseOnFork flags */ # define CLOSE_ALWAYS 0 # define LEAVE_FOR_DISPLAY 1 #include #if defined(X_NOT_POSIX) && defined(SIGNALRETURNSINT) #define SIGVAL int #else #define SIGVAL void #endif #if defined(X_NOT_POSIX) || defined(__EMX__) || defined(__NetBSD__) && defined(__sparc__) #if defined(SYSV) || defined(__EMX__) #define SIGNALS_RESET_WHEN_CAUGHT #define UNRELIABLE_SIGNALS #endif #define Setjmp(e) setjmp(e) #define Longjmp(e,v) longjmp(e,v) #define Jmp_buf jmp_buf #else #define Setjmp(e) sigsetjmp(e,1) #define Longjmp(e,v) siglongjmp(e,v) #define Jmp_buf sigjmp_buf #endif typedef SIGVAL (*SIGFUNC)(int); SIGVAL (*Signal(int, SIGFUNC Handler))(int); #endif /* _DM_H_ */ wdm-1.28/include/dm_auth.h 644 0 0 620310221265060 150620ustar AlexeyVoinov 0 0/* * $XFree86: xc/programs/xdm/dm_auth.h,v 1.2 2000/05/31 07:15:11 eich Exp $ */ /************************************************************ Copyright 1998 by Thomas E. Dickey All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) 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. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. ********************************************************/ #ifndef _DM_AUTH_H_ #define _DM_AUTH_H_ 1 #include /* for struct display */ extern void MitInitAuth (unsigned short name_len, char *name); extern Xauth *MitGetAuth (unsigned short namelen, char *name); #ifdef HASXDMAUTH extern void XdmInitAuth (unsigned short name_len, char *name); extern Xauth *XdmGetAuth (unsigned short namelen, char *name); #ifdef XDMCP extern void XdmGetXdmcpAuth ( struct protoDisplay *pdpy, unsigned short authorizationNameLen, char *authorizationName); #else #define XdmGetXdmcpAuth NULL #endif #endif #ifdef SECURE_RPC extern void SecureRPCInitAuth (unsigned short name_len, char *name); extern Xauth *SecureRPCGetAuth (unsigned short namelen, char *name); #endif #ifdef K5AUTH extern void Krb5InitAuth (unsigned short name_len, char *name); extern Xauth *Krb5GetAuth (unsigned short namelen, char *name); #endif /* auth.c */ extern int ValidAuthorization (unsigned short name_length, char *name); #ifdef XDMCP extern void SetProtoDisplayAuthorization ( struct protoDisplay *pdpy, unsigned short authorizationNameLen, char *authorizationName); #endif /* XDMCP */ extern int SaveServerAuthorizations (struct display *d, Xauth **auths, int count); extern void CleanUpFileName (char *src, char *dst, int len); extern void RemoveUserAuthorization (struct display *d, struct verify_info *verify); extern void SetAuthorization (struct display *d); extern void SetLocalAuthorization (struct display *d); extern void SetUserAuthorization (struct display *d, struct verify_info *verify); /* genauth.c */ extern void GenerateAuthData (char *auth, int len); #endif /* _DM_AUTH_H_ */ wdm-1.28/include/dm_socket.h 644 0 0 356210221265060 154160ustar AlexeyVoinov 0 0/* * $XFree86: xc/programs/xdm/dm_socket.h,v 1.2 2001/07/23 13:15:52 dawes Exp $ */ /************************************************************ Copyright 1998 by Thomas E. Dickey All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) 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. Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization. ********************************************************/ #ifndef _DM_SOCKET_H_ #define _DM_SOCKET_H_ 1 #include #include #ifndef Lynx # include #else # include #endif #include /* ugly, but we need this after socket.h */ extern ARRAY8Ptr Accept (struct sockaddr *from, int fromlen, CARD16 displayNumber); #endif /* _DM_SOCKET_H_ */ wdm-1.28/include/greet.h 644 0 0 2020310221265060 145630ustar AlexeyVoinov 0 0/* $Xorg: greet.h,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1994, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/greet.h,v 1.8 2001/12/14 20:01:22 dawes Exp $ */ /* * greet.h - interface to xdm's dynamically-loadable modular greeter */ #include /* * Do this rather than break a build over a const-mismatch */ #if defined(__linux__) || defined(CSRG_BASED) #define CRYPT_ARGS const char *s1, const char *s2 #define GETSPNAM_ARGS const char *name #define GETPWNAM_ARGS const char *name #else #define CRYPT_ARGS /*unknown*/ #define GETSPNAM_ARGS /*unknown*/ #define GETPWNAM_ARGS /*unknown*/ #endif #if defined(__FreeBSD__) || defined(__bsdi__) || defined(__osf__) #define SETGRENT_TYPE int #else #define SETGRENT_TYPE void #endif struct dlfuncs { int (*_PingServer)(struct display *d, Display *alternateDpy); void (*_SessionPingFailed)(struct display *d); void (*_WDMDebug)(char * fmt, ...); void (*_RegisterCloseOnFork)(int fd); void (*_SecureDisplay)(struct display *d, Display *dpy); void (*_UnsecureDisplay)(struct display *d, Display *dpy); void (*_ClearCloseOnFork)(int fd); void (*_SetupDisplay)(struct display *d); void (*_WDMError)(char * fmt, ...); void (*_SessionExit)(struct display *d, int status, int removeAuth); void (*_DeleteXloginResources)(struct display *d, Display *dpy); int (*_source)(char **environ, char *file); char **(*_defaultEnv)(void); char **(*_WDMSetEnv)(char **e, const char *name, const char *value); char **(*_WDMPutEnv)(char **env, const char *string); char **(*_parseArgs)(char **argv, char *string); void (*_WDMPrintEnv)(char **e); char **(*_systemEnv)(struct display *d, char *user, char *home); SETGRENT_TYPE (*_setgrent)(void); /* no longer used */ struct group *(*_getgrent)(void); /* no longer used */ void (*_endgrent)(void); /* no longer used */ #ifdef HAVE_SHADOW_H struct spwd *(*_getspnam)(GETSPNAM_ARGS); void (*_endspent)(void); #endif struct passwd *(*_getpwnam)(GETPWNAM_ARGS); #ifdef linux void (*_endpwent)(void); #endif char *(*_crypt)(CRYPT_ARGS); #ifdef USE_PAM pam_handle_t **(*_thepamhp)(void); #endif }; /* * Return values for GreetUser(); * Values must be explictly defined because the greet library * may come from a different vendor. * Negative values indicate an error. */ typedef enum { Greet_Session_Over = 0, /* session managed and over */ Greet_Success = 1, /* greet succeeded, session not managed */ Greet_Failure = -1 /* greet failed */ } greet_user_rtn; /* * GreetUser can either handle the user's session or allow xdm to do it. * The return or exit status of GreetUser indicates to xdm whether it * should start a session. * * GreetUser is passed the xdm struct display pointer, a pointer to a * Display, and pointers to greet and verify structs. If it expectes xdm * to run the session, it fills in the Display pointer and the fields * of the greet and verify structs. * * The verify struct includes the uid, gid, arguments to run the session, * environment for the session, and environment for startup/reset. * * The greet struct includes the user's name and password but these are * really only needed if xdm is compiled with a user-based authorization * option such as SECURE_RPC or K5AUTH. */ extern greet_user_rtn GreetUser( #if NeedFunctionPrototypes struct display *d, Display **dpy, struct verify_info *verify, struct greet_info *greet, struct dlfuncs *dlfcns #endif ); typedef greet_user_rtn (*GreetUserProc)( #if NeedFunctionPrototypes struct display *, Display **, struct verify_info *, struct greet_info *, struct dlfuncs *dlfcns #endif ); #ifdef GREET_LIB /* * The greeter uses some symbols from the main xdm executable. Since some * dynamic linkers are broken, we need to fix things up so that the symbols * are referenced indirectly through function pointers. The definitions * here, are used to hold the pointers to the functions in the main xdm * executable. The pointers are filled in when the GreetUser function is * called, with the pointer values passed as a paramter. */ extern int (*__xdm_PingServer)(struct display *d, Display *alternateDpy); extern void (*__xdm_SessionPingFailed)(struct display *d); extern void (*__xdm_Debug)(char * fmt, ...); extern void (*__xdm_RegisterCloseOnFork)(int fd); extern void (*__xdm_SecureDisplay)(struct display *d, Display *dpy); extern void (*__xdm_UnsecureDisplay)(struct display *d, Display *dpy); extern void (*__xdm_ClearCloseOnFork)(int fd); extern void (*__xdm_SetupDisplay)(struct display *d); extern void (*__xdm_LogError)(char * fmt, ...); extern void (*__xdm_SessionExit)(struct display *d, int status, int removeAuth); extern void (*__xdm_DeleteXloginResources)(struct display *d, Display *dpy); extern int (*__xdm_source)(char **environ, char *file); extern char **(*__xdm_defaultEnv)(void); extern char **(*__xdm_WDMSetEnv)(char **env, char *name, char *value); extern char **(*__xdm_WDMPutEnv)(char **env, const char *string); extern char **(*__xdm_parseArgs)(char **argv, char *string); extern void (*__xdm_WDMPrintEnv)(char **e); extern char **(*__xdm_systemEnv)(struct display *d, char *user, char *home); extern void (*__xdm_LogOutOfMem)(char * fmt, ...); extern void (*__xdm_setgrent)(void); extern struct group *(*__xdm_getgrent)(void); extern void (*__xdm_endgrent)(void); #ifdef HAVE_SHADOW_H extern struct spwd *(*__xdm_getspnam)(GETSPNAM_ARGS); extern void (*__xdm_endspent)(void); #endif extern struct passwd *(*__xdm_getpwnam)(GETPWNAM_ARGS); #ifdef linux extern void (*__xdm_endpwent)(void); #endif extern char *(*__xdm_crypt)(CRYPT_ARGS); #ifdef USE_PAM extern pam_handle_t **(*__xdm_thepamhp)(void); #endif /* * Force the shared library to call through the function pointer * initialized during the initial call into the library. */ #define PingServer (*__xdm_PingServer) #define SessionPingFailed (*__xdm_SessionPingFailed) #define Debug (*__xdm_Debug) #define RegisterCloseOnFork (*__xdm_RegisterCloseOnFork) #define SecureDisplay (*__xdm_SecureDisplay) #define UnsecureDisplay (*__xdm_UnsecureDisplay) #define ClearCloseOnFork (*__xdm_ClearCloseOnFork) #define SetupDisplay (*__xdm_SetupDisplay) #define LogError (*__xdm_LogError) #define SessionExit (*__xdm_SessionExit) #define DeleteXloginResources (*__xdm_DeleteXloginResources) #define source (*__xdm_source) #define defaultEnv (*__xdm_defaultEnv) #define WDMSetEnv (*__xdm_WDMSetEnv) #define WDMPutEnv (*__xdm_WDMPutEnv) #define parseArgs (*__xdm_parseArgs) #define WDMPrintEnv (*__xdm_WDMPrintEnv) #define systemEnv (*__xdm_systemEnv) #define LogOutOfMem (*__xdm_LogOutOfMem) #define setgrent (*__xdm_setgrent) #define getgrent (*__xdm_getgrent) #define endgrent (*__xdm_endgrent) #ifdef HAVE_SHADOW_H #define getspnam (*__xdm_getspnam) #define endspent (*__xdm_endspent) #endif #ifdef linux #define endpwent (*__xdm_endpwent) #endif #define getpwnam (*__xdm_getpwnam) #define crypt (*__xdm_crypt) #define thepamhp (*__xdm_thepamhp) #endif /* GREET_LIB */ wdm-1.28/include/runtest.h 644 0 0 52710221265060 151300ustar AlexeyVoinov 0 0/** * Copyright (C) 2002, 2003 Alexey Voinov * * @file * ÷ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÍÁËÒÏÓÙ ÄÌÑ ÓÏÚÄÁÎÉÑ ÔÅÓÔÏ× */ #ifndef __RUNTEST_H #define __RUNTEST_H #include #define test_assert(x) \ if(!(x)) \ { \ printf("assertion failed: %s in line %i\n", #x, __LINE__); \ return 0; \ } #endif /* __RUNTEST_H */ wdm-1.28/include/wdm.h 644 0 0 226310221265060 142320ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * wdm.h: header file with prototypes for wdm specific functions. */ #ifndef _WDM_H #define _WDM_H /* from src/wdm/loghelpers.c */ extern char *WDMLogMessages(int level, char *buffer, int n); extern void WDMBufferedLogMessages(int level, char *buffer, int n); extern int WDMRedirectFileToLog(int level, pid_t pid, int fd); extern void WDMRedirectStderr(int level); #endif /* _WDM_H */ wdm-1.28/include/wdmLogin.h 644 0 0 230310221265060 152160ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * Copyright (C) 1998 Gene Czarcinski * * 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 * * wdmLogin.h: header file for wdmLogin program */ #ifndef _WDMLOGIN_H #define _WDMLOGIN_H #include #include typedef struct _WDMLoginConfig { WMRect geometry; #ifdef USE_AA Bool aaenabled; Bool multibyte; #endif Bool animations; } WDMLoginConfig; extern WDMLoginConfig *LoadConfiguration(char *configFile); #endif /* _WDMLOGIN_H */ wdm-1.28/include/wdmPrefs.h 644 0 0 65510221265060 152150ustar AlexeyVoinov 0 0#ifndef _WDMPREFS_H #define _WDMPREFS_H typedef struct _Panel { char *description; void (*destroy)(struct _Panel *); void (*show)(struct _Panel *); void (*hide)(struct _Panel *); void (*save)(struct _Panel *); void (*undo)(struct _Panel *); void *data; } Panel; void AddSectionButton(Panel *panel, const char *iconfile); void InitTestPanel(WMWidget *win); void InitTestPanel2(WMWidget *win); #endif /* _WDMPREFS_H */ wdm-1.28/include/wdmconfig.h 644 0 0 126310221265060 154170ustar AlexeyVoinov 0 0#ifndef __WDMCONFIG_H #define __WDMCONFIG_H #ifdef HAVE_CONFIG_H #include #endif #if defined(HAVE_LIBINTL_H) && defined(I18N) #include #define _(text) gettext(text) #else #define _(text) text #endif #define N_(x) x /* kdebase-1.0/kdm/kdm-config.h was used as a model */ /* xdm stuff which should always be defined */ #define UNIXCONN #define TCPCONN #define GREET_USER_STATIC #ifdef HAVE_PAM # define USE_PAM #else # ifdef HAVE_SHADOW # define USESHADOW # endif #endif /* per kde/kdm, too many systems have trouble with secure rpc */ /* disable secure rpc 'for now' */ #undef SECURE_RPC #ifdef sun #define SVR4 1 #endif #endif /* __WDMCONFIG_H */ wdm-1.28/include/wdmlib.h 644 0 0 620210221265060 147160ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 */ #ifndef _WDMLIB_H #define _WDMLIB_H #include #include #include #include #ifndef __GNUC__ #define __attribute__(x) #endif typedef Bool (WDMChecker)(WMPropList *, void *, void *); typedef struct _WDMArraySpec { WDMChecker *checker; void *data; WMFreeDataProc *destructor; Bool addnull; } WDMArraySpec; typedef struct _WDMDictionaryStruct { char *key; WDMChecker *checker; void *data; size_t offset; } WDMDictionaryStruct; typedef struct _WDMDictionarySpec { size_t size; WDMDictionaryStruct *fields; } WDMDictionarySpec; extern Bool WDMCheckPLBool(WMPropList *pl, void *def, void *target); extern Bool WDMCheckPLString(WMPropList *pl, void *def, void *target); extern Bool WDMCheckPLArray(WMPropList *pl, void *def, void *target); extern Bool WDMCheckPLDictionary(WMPropList *pl, void *def, void *target); extern Bool WDMCheckPLStringOrArray(WMPropList *pl, void *def, void *target); #define WDM_LEVEL_PANIC 0 #define WDM_LEVEL_ERROR 1 #define WDM_LEVEL_WARNING 2 #define WDM_LEVEL_INFO 3 #define WDM_LEVEL_DEBUG 4 extern int WDMLogLevel(int level); extern FILE *WDMLogStream(FILE *debugfile); extern void WDMCloseLog(void); extern int WDMStringToFacility(const char *facility); extern void WDMUseSysLog(const char *ident, int facility); extern void WDMLogMessage(int level, char *fmt, ...) __attribute__((format(printf, 2, 3))); extern void WDMDebug(char *fmt, ...) __attribute__((format(printf, 1, 2))); extern void WDMInfo(char *fmt, ...) __attribute__((format(printf, 1, 2))); extern void WDMWarning(char *fmt, ...) __attribute__((format(printf, 1, 2))); extern void WDMError(char *fmt, ...) __attribute__((format(printf, 1, 2))); extern void WDMPanic(char *fmt, ...) __attribute__((noreturn, format(printf, 1, 2))); extern void *WDMSockaddrGetPort(struct sockaddr *from, int *len); extern void *WDMSockaddrGetAddr(struct sockaddr *from, int *len); extern char *WDMGetHostName(struct sockaddr *from); extern char *WDMGetHostAddr(struct sockaddr *from); extern const char *WDMGetEnv(char * const env[], const char *name); extern char **WDMPutEnv(char **env, const char *string); extern char **WDMSetEnv(char **env, const char *name, const char *value); extern char **WDMUnsetEnv(char **env, const char *name); extern void WDMFreeEnv(char **env); extern void WDMPrintEnv(char **env); #endif wdm-1.28/install-sh 755 0 0 1572210221265060 136770ustar AlexeyVoinov 0 0#!/bin/sh # # install - install a program, script, or datafile # # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd=$cpprog shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "$0: no input file specified" >&2 exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d "$dst" ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "$0: $src does not exist" >&2 exit 1 fi if [ x"$dst" = x ] then echo "$0: no destination specified" >&2 exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d "$dst" ] then dst=$dst/`basename "$src"` else : fi fi ## this sed command emulates the dirname command dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` IFS=$oIFS pathcomp='' while [ $# -ne 0 ] ; do pathcomp=$pathcomp$1 shift if [ ! -d "$pathcomp" ] ; then $mkdirprog "$pathcomp" else : fi pathcomp=$pathcomp/ done fi if [ x"$dir_arg" != x ] then $doit $instcmd "$dst" && if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename "$dst"` else dstfile=`basename "$dst" $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename "$dst"` else : fi # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up temp files at exit. trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 trap '(exit $?); exit' 1 2 13 15 # Move or copy the file name to the temp name $doit $instcmd "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && # Now remove or move aside any old file at destination location. We try this # two ways since rm can't unlink itself on some systems and the destination # file might be busy for other reasons. In this case, the final cleanup # might fail but the new file should still install successfully. { if [ -f "$dstdir/$dstfile" ] then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" fi && # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } wdm-1.28/missing 755 0 0 1420210221265060 132620ustar AlexeyVoinov 0 0#! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Franc,ois Pinard , 1996. # 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, 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in` if test -z "$files"; then files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` test -z "$files" || files="$files.in" else files=`echo "$files" | sed -e 's/:/ /g'` fi test -z "$files" && files="config.h.in" touch $files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print \ | sed 's/^\(.*\).am$/touch \1.in/' \ | sh ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 wdm-1.28/mkinstalldirs 755 0 0 123410221265060 144520ustar AlexeyVoinov 0 0#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here wdm-1.28/pixmaps/Eagle.xpm 644 0 0 15413410221265060 151400ustar AlexeyVoinov 0 0/* XPM */ static char * Eagle_xpm[] = { /* width height num_colors chars_per_pixel */ "200 130 171 2", /* colors */ " c DarkBlue", ". c NavyBlue", "X c #192f62", "o c #0a2440", "O c #281c4a", "@ c #19243e", "# c #242c70", "$ c #262957", "% c #1c2e6e", "& c #43284a", "* c #43394b", "= c #3f3c6a", "- c #261547", "; c #16124c", ": c #573a54", "> c #605542", ", c #816650", "< c #9a8373", "1 c #a47c63", "2 c #a8886c", "3 c #7f6c6a", "4 c #6d5a67", "5 c #5d4a5a", "6 c #957754", "7 c #aa8853", "8 c #ae7a36", "9 c #ae8631", "0 c #c18749", "q c #ac9761", "w c #a97d7f", "e c #71686f", "r c #2c365e", "t c #0b194b", "y c #61585f", "u c #92686c", "i c #aa702b", "p c #c09893", "a c #ae8b89", "s c #414768", "d c #181731", "f c #50566d", "g c #92868c", "h c #81767b", "j c #7e5c4c", "k c #91693c", "l c #a45d17", "z c #a86d14", "x c #c0872d", "c c #bd985a", "v c #6f6d8a", "b c #283770", "n c #504b5c", "m c #a29495", "M c #7e6923", "N c #715715", "B c #7f5931", "V c #936725", "C c #90582e", "Z c #b5791c", "A c #d19556", "S c #dcba6c", "D c #8e7d87", "F c #414a76", "G c #445374", "H c #8088a9", "J c #6f5b52", "K c #5d5619", "L c #71480e", "P c #805711", "I c #8d5a10", "U c #c7a687", "Y c #ae9996", "T c #9094a8", "R c #a19aa9", "E c #afacc7", "W c #c6b7bd", "Q c #c6bcce", "! c #c1c5cc", "~ c #d2c9d8", "^ c #5f678a", "/ c #535a80", "( c #2e2835", ") c #323338", "_ c #8f7a72", "` c #9e8b8b", "' c #453716", "] c #804a2b", "[ c #d8a68c", "{ c #d2b7a2", "} c #5f6478", "| c #8d8da8", " . c #99a3b2", ".. c #d0d7ee", "X. c #dfcfd8", "o. c #d3d6d4", "O. c #e8dae0", "+. c #f2e4e8", "@. c #412915", "#. c #582c0b", "$. c #705633", "%. c #703e21", "&. c #d5bcbf", "*. c #d3c4c9", "=. c #ddc7c8", "-. c #f8cdc0", ";. c #e2cfcb", ":. c #998948", ">. c #8e6c51", ",. c #6e4b2b", "<. c #9097b8", "1. c #bfacb1", "2. c #5c3911", "3. c #583c2b", "4. c #d6acb4", "5. c #bfa8a1", "6. c #95753f", "7. c #5c471c", "8. c #9c790f", "9. c #07104a", "0. c #828499", "q. c #a0a7c8", "w. c #bec7e7", "e. c #afa6b2", "r. c #b2a3a1", "t. c #ae9ca6", "y. c #eabcc6", "u. c #717488", "i. c #b1b6d0", "p. c #433731", "a. c #3e2c29", "s. c #704753", "d. c #b2b4b8", "f. c #271c18", "g. c #261514", "h. c #411818", "j. c #584539", "k. c #847754", "l. c #5b4b42", "z. c #34436b", "x. c #191514", "c. c #280c11", "v. c #170b0f", "b. c #1c2319", "n. c #0a0a0d", "m. c #2e251f", "M. c #4b4543", "N. c #0a1316", "B. c #29192e", "V. c #303416", "C. c #5b2832", "Z. c #726554", "A. c #49431b", "S. c #4c4f1c", "D. c #7d7636", "F. c #b1a951", "G. c #7e7d98", "H. c #717a9c", "J. c #647592", "K. c #8c6694", "L. c #3f1a38", "P. c #edd1d6", "I. c #f4dde0", "U. c #f6ecee", "Y. c #e1e6ee", "T. c #f5f6f8", "R. c #e4f4f6", "E. c #d3e3ef", "W. c #180d2b", "Q. c #a2b4d2", "!. c #260d2a", "~. c #091537", /* pixels */ " . . . . . . . . . . . . X X o X . O O O . . . . . . ", " . . . . . . . . . . . X . . X . . @ . X . @ @ @ @ o X . # . . . . . X . . . . . . . . . . . . ", " . . . . . . . . . . $ O . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . . . . . . . . . . ", " . . . . . . . . . # . O . . # . . . # . . . # . . . . % . X X X X . . . . . . . . . . . . . ", " . . . . . . . . . . # . # . . # . . . X % . . . . . . . . . . . . . . . . . . . . . ", " . . . . . O O O # . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . . # . O . . . . . . . . O # & * = * & $ O - ; # # O . . . . . . . . . . . . . . . . . ", " . . . . @ . . . # O O $ : > , < 1 2 < 3 4 5 O . . . X # . . . . . ", " . . . . . . . . . # . # . # . . . . % % X @ # . ; & 5 , 6 7 8 9 0 q 1 2 w e r O . # O . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . # . . t # . @ . @ = r * y , u i i i i 0 0 0 2 p a s . . # . . X . . . . . . . . . ", " . . . . . . % @ . # ; ; . # # . # # . d O = f g h y j j k l i i z x x 0 0 c p 3 . - # . % % . . . ", " . . . # . t . . . . $ . . . @ v b # . . . . . * = n 3 m < M N B V C V i i z Z 0 x 0 A S D $ $ O # X . X $ . . . . . . ", " . . . . % # . . $ . $ r r = = F G H = d # $ . . $ $ O & e 3 J h 2 K L P M V V C I l l z i 0 x A U Y n $ - % X X . # . . ", " . . . $ . . . t @ $ $ r = f H T R E W Q ! ~ Q H ^ e / f n ( ) y _ ` > ' B k ] ] B ] C ] B C k V V 8 x 0 A [ { } ) O # . % . X X . ", " . . $ $ . . $ F v | .E ! ..~ X.o...O.o.X.~ O.o.o.o.o.+.o.m 3 ` < , @.#.k $.%.] ] ] %.%.] B C k V i 8 0 A [ &.D r O # . % X X . # ", " . . . . . . # . . # . X . r f E Q O.+.O.X.~ *.*.Q W &.*.*.=.~ =.X.=.&.-.;.U q 7 :.j ' #.$.>.%.,.] B ] P B ,.] N k V V 9 x 0 [ -.m & # t # . X X X . . . # . . . # . . ", " . $ # % . . . . s <.X.~ X.O.O.X.=.;.;.{ p ` m p 1.&.&.=.=.&.&.{ U 7 6 >.i 2.@.B B 3.,.,.,.$.L ,.%.%.%.%.P V i 8 Z 0 [ -.p = # . # X . . X O O ", " . . . O . # . % % % . . s | ~ ..Q X.X.=.&.W 4.W =.5.Y < < a 5.5.5.&.4.{ { U 1 , 6.7 %.L V k B j ,.,.$.B B ,.L %.7.2.,.P V 8.i 0 [ -.5.= O % . . % . % # . # . # . # . ", " . . . . . . . 9.F 0.q.w.~ Q e.4.e.Y ` v , 3 3 < < < ` r.{ 4.r.p t.p U p 6 V 6 0 B B k j 7.,.,.$.$.$.$.L 2.%.3.] B N I V 8 0 A y.Y = . % % . % . % % . . . . . . ", " . . . . % . X . . u.q.Q i.t.` D h e 4 4 : p.a.a.a.J u < a Y 4.5.` Y Y a a q 6 k 6 [ c 6.B B ,.%., ,.$.$.,.7.7.s.B 6 6 V P M i 8 0 U < = . % % # . % X . # . . . . . . ", " . . % . % . . . f H d.E R 3 : * * : ( f.g.f.g.f.h.p.j.J 3 u _ 2 a 1 a a < < 2 1 6.1 q k.B ,.#.,.J 3.j.l.$.,.,.,.B j >.6.6.B P V 0 c p h & . % % # % # . . . ", " . . . b z.^ | E e : ( g.x.g.c.v.f.x.g.x.g.x.f.( p.3.> J 3 _ < a < < 6 >.1 1 6 6.k B $.7.$.$.7.3.@.2.3.7.,.%.,.,.,.B k 6.V C 8 0 < J # % X . # X . % ", " . . . % . X / .Q R e b.g.v.v.v.v.n.v.v.v.v.x.x.x.g.m.: p.: 4 j J u ` _ 1 , , k.6 >.6., B 7.2.j.3.@.' @.3.j.,.j.7.%.3.%.$.6.2 i V i 8 6 y $ . X . # # % . % . % . . # . # ", " . # . # % t . % . t z.v q.w.e.h M.p.3.p.f.g.v.v.v.n.n.n.x.x.n.b.m.) a.p.3.y J j , u k.>.>.>.>.>.6.J ,.2.@.h.c.g.@.3.7.7.%.2.3.2.2.,.,.B 1 8 k k 1 j : $ X X . % % . % . . # . . ", " . . % % . % . % . . . % # . $ G | E e.g y 5 J 4 l.> @.f.m.b.x.x.x.N.n.N.x.B.b.( a.M.y , 3 3 3 >.>.>., j , >.k.,.' f.c.g.g.@.' 3.j.3.3.#.#.#.2.%.2.7.B k C z 6.J * % X X X % O % . % . # . . % % . % . % . . . . ", " . % % . % % . % % . % . % O % . X . @ / R E <.g v l.> 3 3 g.p.k.m ` > V.b.m.x.n.n.n.n.b.( p.l.e h _ _ 3 6 >., , k >.M ,.@.h.g.h.' ' 3.3.3.#.' @.@.@.#.' 3.3.C.3.,.B k C > & % X X X % % % . % % % . # . % % . % % . % % . % . % ", " % . % % . % % . % % . . % t b . . ^ <.E R ` ` e : > 3 ' m.k.5.! m p.v.k.l.b.x.f.n.n.( M.l.n Z.3 _ h , >.k , , , $.2.f.@.@.A.7.l.l.A.a.@.@.@.h.h.@.@.@.3.p.3.@.: B >., 5 # % X X % # % % . % % # % . % % . % % . % % . . ", " . . % . % . % . % . % X X . % . % % . . % X . $ ^ q.E t.g | ` > p.l.l.v.j.! &.q > n.v.J k.Z.M.a.b.m.M.y Z.Z.e 3 k.>., >.>.M B 3.@.@.@.2.> , > p.@.m.a.m.f.h.f.@.@.@.@.@.p.& a.C.J 1 , l.$ # % . X X # % . % % X % - . . % . % . % . % . % X X . % . % % . . . ", " % . % % X X X X % . % . % . % . # X d ^ R q.e.| g h 4 ( M.> V.g.S.U *.5.l.v.v.n.k.{ , m.m.M.J g g < _ 6 _ k.>., B ,.2.' #.2.j.l.l.j.p.m.f.f.m.f.f.f.h.@.@.@.' a.p.a.& a.J < e : $ . % X X % # % % X X . % . % % X X X X % . % . % . % ", " % % . % . % . X . % X X X % . % . . % . G <.<.| | D ` v M.m.M.y p.v.j.r.{ { < 3.c.h.2 d.:.l., k.3 m m q _ _ 6 >.j B ,.3.2.j.,.j.j.3.a.@.h.m.@.m.f.f.f.f.m.m.@.V.a.m.) $ ( O 4 < Z.& $ % . X % # % . . . . ", " . % X % . X % . % . X . % . % % . . F 0.| | | D v 3 n p.y 3 Z.p.n.x.D.{ ;.&.U a F.U U a k._ < < Y Y ` k.>., $.,.K ,.,.$.J ,.p.@.@.m.f.f.f.g.g.f.f.f.m.f.m.m.m.) ( ( $ O $ 4 | h $ # . % X . # % . . . . . ", " % . % . . % . % % . % % . % . X . % . X % ; # . $ n G.<.0.D G.v 3 4 n y h ` h l.p.m.a.>.r.{ { { U p p q w k.3 _ q < k._ >.Z.j $.$.Z.j Z.,.A.p.@.f.f.f.g.f.f.f.f.f.m.@.m.@.m.a.m.) $ $ $ $ / u./ % % % . . . . . . . . ", " % . % % % . % . % % . % . X X X X X X . # . . & / H.R T v e v D v 3 3 J 4 y e 3 _ J J k.1 7 2 a a 1 >., u 1 Y a _ _ , , > 3.' 3.' ' A.3.A.p.m.m.f.f.f.f.m.m.@.V.@.m.@.@.m.m.m.( $ @ X z.z.$ % . % % % % . . . . . . . . . . . . ", " X % % % % % % % . % % % X . % . X . X % . # . b J.<.| G.K.} e G.m 1.1.1.` y m.p.4 Z._ < < _ , 6 2 1 1 w < a Y 2 _ >._ J @.g.v.g.#.' ' ' p.' @.m.f.m.m.m.V.m.m.) a.a.a.a.a.V.m.m.( X $ $ . r . % % % % . . . . . . . . . . . . . ", " % % . % . % . % % % X X % X % . . b H.R 0.G.v } h h u.D R 1.W e.e L.g.a.a.l.l.3.3.l.$.>.1 2 q p p < , j.a.3.@.g.@.@.3.> $.l.3.' @.m.f.f.f.m.m.f.f.f.g.f.( V.a.p.a.V.( $ ( X X % % % % % % % . . . . . . . . . . . . . . . ", " % % . % % % % % . % % . % . % . % . X % . r ^ | H G.G.e v u.e y y G.t.d.1.g y p.a.h.a.@.@.l.j j $.j u 1 1 , l.3.@.@.p.@.f.2.3.3.3.l.j.p.@.m.m.m.m.f.f.f.m.m.f.f.f.f.m.m.p.p.p.) $ r % $ X % % % % % % % % % . . . . . . . . . . . ", " % % % % % % % % % % % % % % % . # . $ ^ | 0.G.G.h e e h h v v 3 g 1.W W 5.Y ` m r.Y ` 1 3 ,.2.J ,.,.3.@.h.h.a.5 l.@.a.l.J Z.J @.' a.@.@.f.f.m.m.m.m.m.m.@.m.m.f.f.f.) p.) ) $ @ % % % % % . . . . . . . . . . . . . . . . ", "X % % % % % % % . % % % % . % # # F G.H G.h v e G.g R R g G.D m e.5.1.d.1.5.1.5.U < $.2.' 3.j j.@.h.g.@.j.,.l.3.a.3.j.l.3.m.@.a.@.m.m.m.f.f.@.m.@.m.@.m.f.f.f.f.f.m.p.) ) $ X % % % % % % # % % % % % . % . . . . . . . ", " % % % % % % % % % % % % % % % . F H.H u.u.e e 0.R e.R m R g g g ` m t.5.1.1.5.Y m g , ,.$.j #.@.g.@.j.j , 4 $.l.j.j.l.3.' m.a.a.a.m.@.m.@.m.m.m.) a.a.m.m.f.V.f.g.m.) ) $ $ b % % % % % % % % % % . . . . . . . . . . . . . . . . . . ", " X % . % % . % % . % . X X . % . % . % ; F G.| | 0.G.` R R r.e.e.e.t.g 4 v D D D m r.Y r.6 k.2 >.Z.,.p.h.@.3.7.$.h 3 $.3 4 j.3.j.> 5 j.a.a.a.a.a.a.( a.p.p.a.p.a.m.@.m.p.f.x.m.* $ $ $ X % % % % # % % % % % . . . . . . . . ", " % . % % . % % % % % . X % % % % % % b / G.G.| | ` 0.r.r.d.1.1.E e.t.E ` h h D D t.{ ` Z.,.J j.@.@.h.' > , 3 _ >.3 j p.3.p.3.M.l.j.3.a.a.a.a.( a.a.) p.a.p.) ' a.m.@.V.m.f.( ( ( $ b b % % . % % % % % % % % . % . . . . . . . . . ", " % % % % . % % . % X X % % % % . f H.G.G.| m R m R r.e.r.e.e.t.e.g e 5 5 4 _ g _ l.h.m.@.h.f.' ,.k._ < ` _ , > l.a.3.: > 5 l.M.p.a.a.a.a.p.p.a.a.p.p.a.p.a.p.a.m.@.a.m.( ) $ $ r b b % % % % % % % % % % . . . . . . . ", "X % % % % . % X % . X % . # = ^ G.0.0.T .e.e.d.1.1.e.1.t.m t.g h e y Z.3 j l.j.a.@.j.,.J 6 ` _ _ k.3 3 Z.J J e Z.Z.4 > j.p.M.a.a.a.p.p.a.p.p.p.a.) ' p.p.' a.a.V.m.( r * $ b F b b % % % # % % % % % % % % . . ", " % . % X . % . % % % . % % % . % . . z.^ G.0.R t.E W Q *.*.*.*.*.=.W t.t.` G.h 3 4 5 J 3 ` w < w Y Y 2 _ 3 _ h , 3 3 _ w < _ , y j.p.a.p.a.p.p.p.p.p.p.) p.a.a.a.p.' a.a.V.m.m.a.n = # b z.b z.% % % % # % % % % % % . . . ", "% % % % % % . % X % . X % % $ r / H T q.e.E W E W Q *.X.X.P.O.*.1.m ` D D D h g Y 5.Y U Y Y 2 w _ k.< m ` g < m ` < D 3 y j.p.p.p.p.a.' a.p.p.p.a.p.V.p.V.a.p.a.p.@.p.a.f.* 5 = $ b % % b % % % # % % % % % % % % . . . . . . ", " % . % % . % % % . % % % % $ F H.<. .e.q.e.e.t.e.e.W Q =.X.X.*.1.m G.D h D ` r.5.2 D 2 ` < _ _ _ ` r.Y Y m Y Y ` _ 3 J l.3.p.M.p.p.p.p.p.' p.a.p.a.a.a.a.p.' a.a.' a.p.) * n s $ b % X X X X % # % % % % % . . X . . . . . . . . . . . . ", " % % % % % . % . % % X % . % % . # . X ^ H <.e.i.1.e.E W Q &.&.W &.*.&.*.W Y h e 3 g m ` h Z.2 ` 2 ` a Y Y Y r.1.5.m < _ h , Z.J l.p.p.p.p.p.p.p.p.p.a.p.) p.a.V.p.a.V.a.' a.' M.p.& n = $ b % % X % % % % % % % % % % % % % % . . . . . . . . . . . . ", " . % . % % % % X . % # r s H.<.q.t.i.Q W Q *.~ X.~ P.~ =.&.Q 1.m g ` R Y ` _ _ ` r.t.5.5.5.5.r.Y Y m m < , J > > 5 l.M.p.a.p.p.a.a.p.p.p.p.p.p.a.) a.a.p.a.m.@.a.p.' l.n ) # r b % % % % % X % % % % % % % % % % . . # . . . . . . . . . . . . . ", " % % . % % % % % % . % % % % % % . . z.^ T R q.e.1.1.e.e.1.&.W &.=.=.*.W 1.1.t.K.D ` _ e Z.` 5.Y r.r.1.5.r.Y m < < k.Z.> l.l.j.l.3.' p.p.p.M.p.p.p.p.p.p.p.p.p.a.p.p.p.p.a.a.p.p.3.y n ) $ # % % % % % % % X % % % % % % % X . . . . . . . . . . . ", " % % . % . % % % . % % % / | . .R e.e.e.e.1.1.W 4.*.=.X.=.*.4.R D g ` g D _ ` Y r.r.5.5.1.r.m ` D 3 Z.Z.J J > s.l.> J 4 l.p.p.a.p.M.A.M.p.p.p.p.p.p.p.p.a.' a.p.' p.l.4 5 $ @ X X % % % % % X % % % % % % % % . % . . . . . . . . . . . . ", " % % % % % % . % % % % . . = J.| T T R e.e.E 1.E W Q W 1.W &.W W 1.t.` g Y t.a ` m Y 5.r.r.r.m ` _ _ h J Z.Z.3 3 h 3 Z., h h Z.M.p.p.M.M.M.p.p.p.p.p.a.p.M.p.p.p.p.p.a.3.J 3 f ( $ X % % % % % % % X X % % % % % % % X . . . . . . . . ", " % . % . % % . % % % % % % t b / H.| T R .R e.e.1.1.E 1.e.1.1.e.Y ` T t.t.t.m t.t.m m Y Y m ` < _ h _ 3 3 3 3 _ _ < ` < ` _ D k.h y l.M.M.M.p.M.p.p.) p.p.* A.p.p.a.p.A.p.j.J 3 n $ r X % % % % % % X % % % % % % . % . # O . . . . . . . . . . . . . . . . . ", " % % % . % % % % % % % % . % b / H.H | | T R m T R R R m Y t.t.Y ` ` m p 1.e.1.t.t.5.1.Y ` < < _ 3 h _ D _ h < D _ _ < < m m g < D 3 Z.M.M.M.p.p.p.p.p.p.p.p.M.p.M.p.p.p.M.p.> 3 3 s $ $ % % % % % % % X % % % % % % . . . . . . ", " % . % . % % % . % % % % F / ^ ^ u.u.h H.D g g g g ` m ` D g m e.&.~ Q 1.p t.1.1.Y _ 3 h 3 3 k._ D < g _ < g < _ g < ` ` k.D _ h > M.j.l.) p.p.M.p.* p.p.p.p.p.M.A.p.p.j.J 3 e M.$ X % % % % % % % % . % % % % % . X . . . . . . . . . . . . ", "% % % . % % % . % % % % . % % % b G G / } } } u.h h G.D G.D ` | D D t.&.P.X.&.1.e.1.1.t.a g 3 3 h 3 Z.3 3 h _ h _ h _ < ` m m ` _ m g _ e y M.p.p.) V.) p.M.p.* p.* M.p.M.3.p.M.j.J 3 e * $ % % % % . % % % % % % % % % . . . . . . . . . . . . . ", " % . % % % . % % . % % . % % . % b / / / / } e u.h u.e 3 h h K.D ` e.=.I.O.*.1.1.1.e.Y g D D D h 3 h h _ h _ D < D g ` m m m q m Y r.< k.y l.M.) p.p.p.M.p.M.M.M.p.p.p.M.l.M.M.p.l.> e 3 s $ # % % % % % % % % % % % % % % . . # . . . . . . . . . . . . . ", " % % % . % % . % % % % # F / / } e } e } e e e e e e h m Q y.X.=.Q 1.5.e.t.` g _ h h _ g ` < g g _ h D _ h Y m Y Y Y r.Y Y _ h h y M.* p.p.p.A.M.p.M.p.M.M.M.* j.M.j.A.M.l.J e h s % % % % % % % . % % % % % . . . . . . . . . . . ", " % . % % % % % % % % . b / ^ ^ ^ } y f y y } Z.} y v R W Q =.&.1.t.e.1.t.Y g D D _ _ D ` m r.Y m m ` m m m m m Y U r.Y < _ _ k.h > j.* p.M.* M.M.p.p.M.M.M.M.M.l.M.j.M.l.l.> e h n $ % % % % % % % % % % % % % . . . . . . . . . . . . . ", " % % % . % . % % . % % % z./ } / f n f y } e Z.} 4 3 m W &.1.1.t.t.t.e.1.Y ` ` g < g g ` m r.r.r.Y Y m m Y Y r.Y ` m 2 m m ` Y g h l.M.M.M.M.) M.p.M.p.M.j.M.p.M.M.M.M.l.> l.J Z.h f # % % % % % X % % % % % % % % % . . . . . . . . ", " % . % % % % % % . % % X F / / f n n 4 e u.h } e h R 1.1.E W t.t.Y r.5.r.m g g < D ` m r.r.1.r.r.R m m m m m r.Y m m m r.5.1.1.Y D > M.j.M.p.M.M.) p.) M.n M.p.M.j.M.M.l.y > y J h G $ # % % % % % X % % % % % % % % . % # O . . . . . . . . . . . . . . . . . ", " % % % . % . % % . % . r z.G / G y } v u.v 4 e g R e.t.e.1.e.a m t.t.t.t.Y m m g g m r.r.r.r.m m m m g g < g < m Y r.r.r.r.r.5.1.r.h 5 M.* p.) A.M.p.p.M.l.M.p.M.M.M.l.> y y J y v / # % % % % X X % % % % % % % % % % . X # . . . . . ", " % . % % % % . % % % % X X r z.F 4 v v v h u.e e h R e.m T e.t.` t.m t.t.t.Y m m ` ` m m m m g ` g D < g _ D g < m m m 2 m q r.5.{ ! { g > M.p.p.* M.M.) M.M.M.M.p.M.M.l.y y Z.Z.> J h f $ % % % % X X % % . % % % % % . % . . # O . . . . . . . . . . . . . . ", " % % % . % % % . % % X r z.F v u.h G.h G.h 0.m T m t.t.g g t.t.t.t.5.5.R ` g _ D ` m ` < D g _ g g g ` ` ` R Y Y Y Y r.5.1.W 1.{ 1.h y l.n M.M.M.M.M.p.n M.M.M.* M.l.> Z.Z.y Z.> G./ % % % % X X % % % % % % % % % . X . . . . . . . . . ", " % . % % % % . % . % X X z.z.n ^ v u.G.D 0.m t.T R R m g g t.t.t.t.r.e.Y g _ g D g g g ` ` ` ` g ` m Y m Y r.r.Y Y 5.5.5.5.1.{ W W d.` Z.n l.n l.M.M.M.M.M.M.n M.S.n } Z.l.Z.Z.> u.u.= # % % % % X % % % % % % % % % % % . . . ", " % % % . % % . % % % % % X % r r z.f ^ v u.G.| ` T t.R g g T t.e.t.m t.t.t.m < D D < ` ` g < D g g g Y r.r.r.5.r.5.r.4.1.5.5.1.1.4.W W =.=.r.D y > l.f M.M.M.M.M.s S.n n n > Z.y Z.e D.e e = # % % % % % % % % % % % % % % . X . X $ . . . . . . ", " % . % % % % % % % % % % % . b z.r s / J.G.G.0.` | m R R ` g R t.t.t.t.t.e.m D h D ` ` Y m ` h h _ m 5.1.1.5.1.W 1.1.1.W 4.r.4.4.W &.W { *.=.1.g } > n > f M.s M.z.S.s y S.y y y Z.Z.Z.e 3 } # # # % . % X % % % % % % % % % % % X X . # . . ", " % % % . % % % % % % % X b z.s } ^ u.G.g | ` T m t.R R t.R m R E t.Y ` _ D Y r.r.r.R g < g Y 1.*.W { W W { W { W 5.1.1.4.W 4.&.4.W W &.d.< y l.y y y n M.M.n n M.f n 3 Z.J 3 , > k.} n r % % . % % % % % % % % % % % . . % . X X . ", " % . % % % % % % % % % % . % % % z.z.G / / u.0.| m R R t.e.m T t.t.R Y r.m g D ` r.1.{ 1.Y Y Y r.W =.=.=.*.&.&.&.W 1.1.W 4.{ &.&.W W W W &.&.W 1.g Z.y e y f l.n M.M.f S.n Z.T _ J 3 3 J h } s $ # # % % % % % % % % % % % % . % % X X . # ", " % % % . % % % % % % % % % X r z.F f 4 G.| | T m R t.t.R m R t.t.m R m ` ` 5.W W 1.e.r.r.1.W ;.P.;.*.=.&.W W 4.1.5.1.{ &.=.&.&.{ &.&.=.*.&.1.` e J } y > n n G M.n f > h r.m 3 3 _ _ 3 y = # % % % % % % % % % % % % . X X X . . . # . . . # . . ", " % . % % % % % % % % % % % % X z.r z.G u.H | m | R t.t.R t.t.e.e.R t.t.t.e.1.Q &.W 5.1.W &.&.=.;.O.;.;.=.&.{ W 5.1.4.W =.*.=.&.=.&.=.=.=.{ W r.m h Z.y y f n n M.n n > y g r.r._ k.< ` h } $ $ % % % % % % % % % % % % % % % % X . . X O O ", " % % % . % % % % % % % b z.r z.f G.| | | ` m R t.t.t.e.1.e.1.e.t.1.W *.=.W 4.W *.&.=.O.I.O.P.;.;.;.&.W W &.W &.&.=.=.{ &.=.=.&.{ *.&.W r.m h e Z.f n M.n f M.n f Z.g Y U ` 3 _ q 0.} $ % % % % % % % % % % % % % % . % . % # . # . # . # . ", " % . % % % % % % % % . b r r G u.0.| g | ` R t.e.e.e.1.1.1.W W W &.Q W *.*.;.=.;.=.X.+.I.O.P.;.X.;.&.{ &.=.P.;.;.;.;.;.;.-.;.=.&.=.1.1.1.r.` 3 e f l.f n n > M.y D m Y r.Y >._ ` g z.r % % % X % % % % % % % % % % % % % % . % % . . . . . . ", " % % % % % % % % % % X b z.s } u.0.0.0.D T R t.R t.1.W 1.W Q &.Q *.&.*.X.;.~ =.;.X.I.O.O.;.;.P.X.=.=.=.;.P.P.P.;.O.P.O.O.P.P.=.=.1.{ 5.1.r.` h Z.y f n > f y f Z.R r.r.r.a h 6 m 0.* % % % % . % % % % % % X % % % % % . # . % X . # . . . . . . ", " % . % . % % % % % % r F / J.J.G.G.g 0.` t.e.t.1.Q Q W 1.=.=.*.=.*.X.O.O.X.=.O.O.O.P.;.O.I.O.;.X.X.O.I.I.O.O.I.I.I.I.O.O.;.=.=.1.{ W 1.1.r.D } y l.n f y y y 3 d.1.r.U m _ < m G.z.X % % % % % % % % % % % % % % % % # % # . . . ", " % % % % % % % % % % % X b G / } } v 0.0.D | R e.1.1.W &.*.&.Q Q *.X.;.O.O.O.=.;.O.I.O.O.O.+.+.O.P.I.+.I.+.I.I.I.I.+.I.I.P.P.=.=.&.&.*.*.&.&.W ` Z.y f > y y y Z.D =.*.1.5.5.` 2 m u.r % % % % % % % % % % % % X % % % % X . % ", " % . % % % % % % % X z.G / / } u.G.D 0.` t.1.W W W &.Q Q 4.Q X.P.O.O.;.=.X.X.O.O.O.;.O.+.+.+.O.+.+.+.I.O.+.+.+.O.O.O.;.;.=.;.;.=.;.=.*.*.*.r.e Z.5 y y Z.e 3 t.;.=.W { 5.` a R } r X % % % % X % % % % % % % % % % % % . % # % . % . % . . # . # ", " % % % . % % % % % % % X b F G G f / G.h v D R e.1.i.1.&.Q 4.1.&.=.X.X.O.X.=.~ X.O.O.O.O.O.O.I.+.U.U.O.I.+.I.I.+.I.I.;.P.O.;.P.;.P.I.;.P.;.;.;.;.1.g e y y 4 4 e D W ;.;.*.&.1.Y Y d.f X % % % % % X % % % % % % X % % % % % % % % . % . . # . . ", " % % . % % % % % % % % % b z.F s f } u.v h | t.E 1.W 4.W 1.1.W *.X.X.X.=.=.*.=.X.O.;.O.+.+.+.+.U.U.+.O.I.+.U.+.I.O.;.;.O.I.O.P.P.;.O.P.;.O.O.O.O.*.W h e y 4 e e D W X.O.*.*.{ 5.r.e.n . % % % % % X % % % # % % % % % % % % O % . % . # . . % % . % . % . . . . ", " % % % % % % % % % z.z.z.z.f } } v G.e.1.e.1.Q Q 1.1.W &.*.&.=.=.*.Q =.O.O.;.O.O.Y.+.+.+.+.+.O.O.+.U.+.I.O.;.;.O.I.I.+.I.P.O.P.;.;.P.I.I.O.;.;.m h 4 e e 3 ` W ;.P.=.=.;.1.5.r.F . % % % X b X % % # % % % % % % % % % % % % % . % % % . # . % % . % % . % % . % . % O ", " % . % . % % % % % % % % b X z.G f } } h | t.E 1.W *.W 1.1.Q &.Q *.~ X.&.=.X.O.O.O.O.+.+.+.U.Y.+.+.+.+.+.+.I.;.*.=.=.+.I.+.U.+.P.;.=.=.=.=.O.+.+.O.O.&.m ` h y h r.&.P.;.;.P.;.&.1.r.= b % b % X % % % % % % % % % % % % % # % % . % % # . . . . . . ", " % % % % % % % % % X X b X r G F y u.g R R 1.i.Q W 1.1.W 1.Q =.X.P.&.~ X.I.+.P.O.O.+.Y.+.Y.+.+.+.+.+.+.I.O.=.*.*.=.I.I.+.+.+.O.;.X.*.&.&.;.I.I.I.O.o.~ d.` 4 h 1.*.X.;.P.O.P.;.{ E F % . X X X X % % # % % % % % % % % % % # % . % % X % - . . . . . . . . . . ", " % % % % % % % % % % X b b z.s s } 0.T R r.1.W W E 1.1.1.W =.X.O.X.X.X.O.I.+.O.O.+.U.+.U.+.+.+.+.+.+.O.;.;.=.=.;.O.O.+.+.U.I.I.O.;.=.*.*.*.O.O.I.+.I.I.=.1.3 3 W I.P.O.P.I.+.P.=.4.= # % b X % % % % % % % % % % % % % % # % % X X . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % X X r r z.s } g | m E Q 1.e.1.E 1.1.~ O.O.X.X.O.I.O.O.O.O.+.+.+.+.+.+.U.U.Y.O.;.;.=.X.X.O.O.I.I.I.+.+.+.U.+.O.;.;.*.;.;.P.I.U.U.+.X.~ g 3 &.U.O.P.O.I.I.I.=.Q = % % X b % % % % % % % % % % % % % . # % . . . . . . . . . . . . . ", "% % % % % % % % % % % % % . X z.z.r s u.0.g R d.W e.t.e.1.W ~ I.X.=.*.X.+.I.O.X.;.O.+.U.+.+.+.U.+.+.O.;.*.*.~ O.O.+.+.I.O.I.I.I.+.U.+.I.O.O.;.;.;.O.O.I.U.U.I.+.1.` Q U.I.O.O.O.I.I.P.*.= b % X X X X % % % # % % % % % % % % % % # % . . . . . . . . . . ", " % % % % % % % % % % % X X b r r s u.e | R e.E 1.e.e.1.&.X.~ ~ X.X.X.O.O.X.O.O.O.+.U.+.+.O.+.O.O.O.O.X.O.O.+.U.U.+.O.O.;.O.O.I.+.+.+.O.O.O.O.+.+.+.I.+.U.U.U.;.&.I.U.I.O.I.I.I.+.I.O.F t % % X X X X % % % % % % % % % % % . . . . . . . . . . . . . . . ", "% % % % % % % % % % % X X X b z.z.f v u.R e.e.1.E 1.1.Q Q &.&.X.I.+.X.O.X.X.O.O.I.O.+.O.+.O.O.;.O.O.O.+.+.U.U.U.U.I.o.P.o.;.;.I.I.+.+.+.I.+.+.+.U.+.+.O.U.U.U.+.+.U.+.U.I.I.O.U.+.+.+.^ % % % % % % % % % % % % % % % % % % % % . . . . . . . . . . ", " % % % % % % % % % % % . X b X r G f } R d.i.W 1.e.1.W ~ *.*.~ X.X.X.O.O.O.X.O.+.O.O.+.P.P.O.+.O.P.O.O.U.U.U.+.+.+.O.;.O.;.;.O.O.+.I.U.U.+.O.O.I.I.U.U.U.I.U.U.U.T.+.I.U.+.I.+.+.+.I.+.H # % X % % % % % % % % % % % % % % % . % % . . . . . . . . . . . . . . . . . . ", "% % % % % % % % % % % % X X b r z.} G.q.d.e.e.E e.e.Q W &.~ X.X.X.X.+.X.O.O.O.O.O.+.+.O.O.+.I.O.O.O.+.U.U.U.U.+.+.Y.O.;.o.P.O.+.I.+.U.I.+.I.+.+.U.U.+.U.U.U.U.U.U.U.U.+.U.U.U.I.I.I.U.~ r X b X % % X % % % % % % % % % % % % % % . . . . . ", " % % % % % % % % % % % % X b X r s v 0.e. .m R t.e.1.W *.&.*.~ X.O.I.O.O.X.X.X.X.O.O.;.+.+.+.I.O.P.+.U.U.U.+.U.U.+.O.+.O.O.O.+.+.+.+.U.U.U.+.+.+.U.U.U.U.U.U.U.U.U.U.U.U.+.+.+.U.I.I.U.+.^ X X % % % % % % % % % % % % % % % X % % . . . . . . . . . . . . . . . . ", "% % % % % % % % % % % X % X X r / H T R g | g R e.W W Q *.~ X.O.+.O.X.X.X.X.~ O.O.+.O.U.+.+.I.O.O.+.U.U.+.U.U.+.+.O.O.+.+.I.+.+.U.+.+.U.U.U.+.U.+.U.T.U.U.U.U.U.U.U.U.U.U.+.U.+.+.+.+.R.R @ X % % % % % % % % % % % % % % % % . . . . . . . . . . . ", "% % % % % % % % % % % X X X b F ^ 0.H h H.g m R 1.Q W W X.O.O.+.+.O.X.*.~ X.O.O.O.I.U.U.+.I.O.O.I.+.+.U.+.U.+.U.U.U.U.+.+.O.+.U.+.U.U.U.U.U.+.+.+.U.U.U.U.U.U.U.U.U.U.U.U.+.+.+.U.+.+.U.~ r X b . % % % % % % % % % % % % % % . % . . . ", " % % % % % % % % % % % . X X z.G / ^ u.} e | e.t.1.Q W Q X.+.+.O.O.O.~ W *.X.O.O.O.+.U.+.I.O.I.+.+.+.I.U.U.+.U.U.U.T.U.U.+.O.+.U.U.U.U.U.U.U.+.+.+.U.U.U.U.U.U.U.+.U.+.U.U.U.U.+.+.+.+.+.U.G.O X . b % % % % % % % % % % % X % % % . . . . . . . . ", "% % % % % % % % % % % % % . X b F s f f u.g e.d.1.E W W ~ X.O.+.+.O.X.Q Q ~ ..O.O.+.+.+.U.+.+.+.U.U.+.O.I.+.U.U.U.T.U.U.O.+.+.+.U.U.U.U.U.U.U.U.+.+.U.U.U.U.U.U.U.+.+.+.U.U.U.U.U.U.+.U.U.U.~ r t b % % % % % % % % % % % % % % % % . . . ", " % % % % % % % % % % % X X X b z.r G } T e.Q d.1.i.1.Q ~ P.+.U.+...*.Q X.X.O.+.U.+.+.U.+.+.+.+.+.I.O.+.O.+.U.+.U.+.+.+.O.+.+.U.U.U.U.+.U.U.I.+.U.+.U.U.U.U.U.U.U.U.+.I.+.U.U.U.U.U.U.+.U.I.U.H $ % % % % % % % % % % % % % % % . % ", "% % % % % % % % % % % % X X X X r f G. .W E e.1.1.Q ~ X.+.+.+.~ *.X.O.X.O.O.+.+.+.U.U.I.+.U.+.O.O.O.I.+.U.I.O.P.I.I.O.O.+.+.U.+.+.+.I.+.+.+.+.+.U.U.U.U.U.U.U.U.U.+.+.+.U.U.U.U.U.U.+.U.O.+.O./ . . % % % % % % % % % % % % % % . % % % % . ", " % % % % % % % % % % % % . % b X n H.| e.q.e.e.E W *.X.O.+.X.~ Q =.O.O.O.O.I.+.+.+.U.U.I.P.P.X.&.X.O.I.+.P.O.X.=.X.;.;.O.O.U.+.+.+.+.U.+.+.+.+.U.U.+.+.U.U.U.U.U.U.U.+.+.U.+.U.U.U.U.U.U.P.+.U.~ / # % . % b . % % % % % % % % % % . . . # . . . # . ", "% % % % % % % % % % % % % X b s / H.T e.R t.e.1.Q X.O.O.X.~ Q Q X.P.O.X.O.+.+.I.+.+.I.U.X.*.&.W =.O.O.O.*.=.=.W W 4.W O.o.O.O.O.+.+.U.U.U.+.+.I.+.+.+.+.U.U.U.U.U.U.+.U.+.+.U.+.U.U.U.I.U.O.O.T.d.G $ b % % % % % % % % % % . % % O O ", " % % % % % % % % % . % X X G ^ u.T R | m e.Q ~ O.O.+.X.*.*.X.O.+.X.O.+.+.U.I.+.I.X.&.t.g t.&.X.X.X.X.X.O.P.=.&.W *.X.X.o.O.+.+.+.+.U.U.+.+.+.+.+.+.+.U.U.U.U.U.U.+.U.+.U.U.+.U.U.+.I.U.+.+.T.U.R $ b % % % % % % % % % % % % % # . # . # . # . ", " % % . % % % % % % % X b G ^ u.H g | t.E ~ X.X...+.X.Q ~ O.+.+.+.I.+.+.+.O.I.X.W m a t.1.*.=.O.+.I.*.W t.` t.W O.X.O.O.O.+.U.U.U.+.+.U.+.U.+.U.+.+.+.U.U.U.U.U.U.U.U.U.U.U.U.U.+.U.+.U.O.O.T.E.G.. t % % % % % % % % % % % % . . X . . . . . . . . ", " % % . % % % % % % % % % . b z.z./ u.0.T t.E *.~ X.O.P.+.~ ~ X.X.O.+.+.+.O.+.I.O.X.*.t.a t.W =.X.O.X.X.` n * 4 t.*.=.O.O.O.+.U.U.U.+.+.+.U.U.U.U.U.U.+.U.U.U.U.U.U.U.U.U.U.U.U.U.+.U.+.I.U.U.I.+.T.U.Y./ . % % % % % % % % % . % % % % % . . . . . . ", " % % % % % % % % % % b z.z.f H.g R e.W ~ X.X.X.Y.O.X.=.X.O.X.O.O.+.O.+.O.X.~ 4.e.e.W =.O.+.&.D n g.v.* Y *.&.W X.X.O.+.+.+.O.+.+.I.+.T.T.T.U.U.+.I.U.U.U.U.U.U.U.U.U.U.U.U.U.+.U.U.I.U.U.+.+.U.T.Q F % % % . b % % % % % % % % % . . # . . ", " % . % . % % % % % % % . % X z.z.} u.| R E Q *.~ ~ X.+.X.X.~ X.O.O.+.+.O.O.+.+.~ W W W &.P.X.*.t.4 B.n.v.a.D ` e 4 D X.X...O.Y.O.O.O.O.+.U.U.T.T.U.U.U.+.U.U.U.U.U.+.U.U.U.U.U.U.+.U.+.U.O.U.U.+.+.U.+.T.<.r . b % % % % % % % % . % % % X . ", "% % % % % % % % % % % % % X b G ^ u.T t.e.Q X.X.X.O.O.X.~ ~ ~ O.+.+.O.O.+.+.I.*.1.W =.=.W m e * x.v.B.v.f.( g.g.4 t.X.X.X...X.X...O.O.+.U.U.U.U.U.U.U.I.+.U.U.U.+.+.+.U.U.U.+.U.+.+.+.U.U.U.I.+.U.+.+.T.X.F t b % % % % % % % % % % . % . # . # . # . # ", " % . % % % % % % % % . % X z.G ^ u.R R i.~ ~ X.O.O.O.X.Q *.O.+.+.U.+.O.I.+.X.&.1.Q &.D y L.x.g.x.g.x.f.g.n.v.3 ~ =.Q ~ *.Q ~ X.X.X.o.O.O.U.U.U.U.U.U.+.U.+.U.+.+.I.I.U.+.U.U.+.+.U.U.I.U.U.U.I.+.+.U.+.T.E r . b % % % % % % % . . % % X . # . ", " % % % . % % % % % % % X G f } 0.| i.&.~ ~ X.X.O.O.X.X.X.O.+.+.+.P.I.+.I.Q t.e.m 5 a.f.x.x.B.f.B.f.f.x.B.y W X.*.Q Q Q Q W i.*.X.~ O.O.+.I.+.T.U.U.I.U.T.U.+.I.O.+.+.+.U.+.+.U.I.+.O.I.U.+.+.+.+.I.+.T.+.0. . b . % % % % % % . . % . # O . . . % % . % . % . . . . ", " . % . % % % % % % % % X X G G u.R R Q ~ ~ X.X.O.O...O.X.X.+.+.+.+.X.U.e.m m 3 : & ( B.g.B.m.m.( ) * p.( p.h d.m h D e e 4 5 4 g W *.*.~ O.+.U.U.T.U.+.+.+.+.I.;.X.+.I.I.U.+.U.U.+.+.O.+.U.+.I.+.+.+.T.O.T.Y.H. . b % % % % % % % % # . . % % . % % . % % . % . % O O ", " % % . % % % % % X b b G / T .E Q ~ ~ X.O.O.X.O.+.X.O.+.+.+.O.X.m h D D M.m.m.f.( f.f.f.d f.V.* b.b.x.m.p.( x.x.x.W.v.n.( e E o.*.*.o.+.U.+.+.U.P.O.I.U.+.O.O.+.+.O.O.I.O.P.O.U.+.+.+.I.+.+.+.+.+.U.U.T.~ ^ % % . % % . % % . X . # O % . % % . % % . % % . . ", " . % % % % % % % . b z.z.^ E .W W Q ~ P.O.X.O.I.X.O.+.+.O.X.~ *.K.3 h 4 a.m.a.g.f.f.d x.x.x.f.b.B.b.B.x.x.m.B.x.v.x.d x.a.e D ` g ` m r.W ;.+.+.O.O.+.U.I.X.W &.O.O.I.O.O.O.X.O.O.+.+.+.+.+.U.U.U.T.+.R.T.i.n . % % % b . % . % . X . $ . . . . . % . % . % . % . % X X . % . % % . . . ", " % % % . % % % % % % . b z.G 0.Q.T d.i.~ X.X.X.X.O.O.~ O.+.O.O.+.X.e.h 5 * a.c.B.p.a.( f.g.x.x.B.b.d x.b.m.) ) ( m.f.x.f.x.f.d f.x.n.x.x.x.b.y m Q W W X.I.+.+.X.=.X.X.+.X.1.*.I.O.X.+.+.+.+.+.U.+.U.U.U.+.U.T.O.| r . % % % % % t X . . . . % . % % X X X X % . % . % . % . # . # ", "% % % % % % % % % % % % b b J.T .R W Q ~ X.~ X.O.O.X.X.O.X.~ X.X.e.e & m.g.x.f.3.5 p.f.B.x.n.v.x.x.x.b.b.) p.) f.B.v.x.x.f.m.m.b.g.v.v.x.v.v.a.e r.d.X.X.X.X.X.X.*.Q P.O.&.g ` e.W =.X.X.O.O.+.+.O.+.O.U.T.+.o.T.+.G.# . % . % % . % . % . . @ . . . . ", "% % % % % % % % % % % X X X H. .| q.! *.~ X.~ X.I.O.X.O.X...X.W g 4 a.g.g.f.g.f.) a.m.v.x.x.x.x.x.x.x.d g.x.B.f.f.x.x.x.x.x.m.( m.x.b.g.x.f.B.b.* h W W 1.` m 1.~ =.*.Q X.X.Q t.g D Y d.W Q ~ ~ O.O.+.U.O.U.T.O.U.U.~ G . b % . % % % . . . . . . ", " % . % % % % % % % % X X X G <.<.T W Q Q X.X.~ O.I.O.X.X.X.~ t.e M.L.f.f.f.f.f.f.f.f.x.x.x.x.x.x.x.x.g.m.m.m.b.B.x.x.x.x.x.x.b.f.d f.x.v.x.B.x.v.v.m.M.* ) ( !.* R O.X.*.Q ~ O.P.Q t.g t.e.t.e.E Q X.~ +.Y.+.T.U.+.+.T.Q G # . % . % . . X . . . . . . . . ", "% . % X X % % % % % . X b b / T . .Q *.*.~ &.~ I.O.O.O.+.i.g e * ( f.m.m.m.m.f.f.f.b.x.N.x.x.x.v.x.g.d B.f.B.f.b.x.x.x.n.x.n.v.x.x.x.v.n.N.x.m.m.x.n.n.v.v.v.n.v.5 R ~ X.&.E e.E E 1.Q E t.R R ` | t.Q Q X.I.+.U.+.O.U.T.<.= . # . % X X % . . . . . . . . . . . ", "% % % . % . % % . % . % X % X z.J.<. .d.W Q Q *.X.I.O.+.X.Q i.D n a.f.f.g.a.p.p.a.m.m.m.f.b.x.x.b.x.x.W.g.f.f.f.( m.m.x.x.x.x.x.n.x.x.x.x.N.f.x.v.x.x.x.n.v.n.n.v.n.n.W.y R Q Q W e.t.D D | W Q E t.| D v v t.Q Q Q X.O.O.O.+.U.<.r $ b % . . . . % . . . . . . . . . . . . . . . ", "% . % % % % % % % % % % X G T .E i.W Q *.~ X.O.O.O.*.t.4 * f.W.g.g.f.p.l.j.p.a.( m.b.f.f.f.f.x.g.x.B.f.g.( a.) m.b.x.n.x.x.x.v.x.x.v.x.x.x.x.x.x.x.x.x.x.x.v.W.x.n.f.n e.*.~ W R e : * M.g W Q E R 0.3 - y R Q ~ X.X.~ ~ T.+.G.O . % . % % . . @ . . . . . . . . . . . ", " % % . % . % % % X X } .q.i.! W Q ~ ~ O.U.O.W 0.4 b.W.v.n.v.f.m.p.j.p.a.m.f.f.f.b.( b.f.f.m.f.m.B.x.( ) ( m.x.n.x.x.x.x.x.x.x.x.x.n.x.b.b.f.x.n.v.n.n.n.n.f.n.n.x.e R d.E 1.g M.d n.d y R d.W e.T * W.W.n D e.! &.! *.E.~ J.; . b % % . . . . . . . . . . . . . . ", " % . % % % . X = H.E i.W ! Q ~ ~ +.U.Q D y * v.x.n.v.v.g.( a.a.a.a.m.f.f.x.f.m.m.m.m.m.( ( m.f.g.f.f.b.x.x.x.b.x.x.x.x.x.b.x.x.x.x.x.x.B.b.x.b.n.x.n.n.x.v.n.x.g.n e g E R 5 n.v.n.x.( y 0.e.E h f.n.d f.b.n 3 Y m h u.<.<./ . . . % @ . . . . . . . . . . . ", " % % % . % % . % ^ q.E i.Q ! *.o.O.U.E 5 W.v.v.n.W.v.x.x.f.a.a.a.a.m.f.m.f.f.b.B.f.f.L.a.) a.f.B.x.x.v.x.x.x.b.x.b.x.f.b.m.f.f.b.g.x.v.x.) ) m.x.v.b.x.n.x.n.n.n.n.v.B.p.n 4 * x.n.x.n.n.n.B.e .1.e B.n.n.n.n.n.V.h > v.( G.H / b . X . . . . . . . . . . . . . . . . . ", " % . % . % % % # G.E E E ! Q ~ O.+.e.5 W.v.n.N.f.x.v.x.v.v.B.p.l.a.a.a.m.m.B.f.f.c.f.m.p.p.a.f.x.g.x.v.x.x.b.x.x.f.f.x.f.f.m.b.B.b.x.x.x.m.m.m.b.x.x.x.n.n.x.n.n.v.n.n.n.x.b.f.n.x.n.n.d x.n.W.l.T | * n.x.b.v.n.v.f.W.n.n.W.r u.F b @ # @ $ . . . . . . . . . ", " % % % % . % G q.q.e.i.W ~ E.*.m * n.n.f.d v.x.v.d f.x.g.f.@.p.@.a.m.m.f.f.x.g.g.m.a.p.a.f.B.f.x.g.x.x.b.x.x.x.x.b.f.f.b.B.f.f.x.f.x.x.f.m.b.B.N.x.N.x.x.x.x.x.x.x.v.n.v.n.v.x.n.N.n.N.x.x.x.n.* e u.M.v.v.x.x.v.v.v.c.v.W.b.( f G r X @ % $ . . . . . . . . . . . . ", "# % % . % . % . b ^ q.t.e.Q ! *.X.d.) d v.B.f.v.x.d b.m.f.f.m.m.a.a.a.a.a.a.f.g.g.f.f.a.p.p.( f.f.x.f.x.f.f.f.x.f.b.g.x.d b.B.f.x.x.f.x.x.x.x.B.f.f.x.N.x.x.x.b.x.b.x.x.x.N.v.v.n.v.n.N.x.n.x.x.N.n.n.M.u.e ) n.v.m.g.v.c.x.x.x.x.b.V.) b.@ . O @ . . . . . . . . . . . ", " % . % % % % . F | q.R E Q 1.O.O.n v.x.x.x.x.x.x.f.f.m.b.f.( @.a.a.p.p.p.a.f.f.f.B.m.a.p.a.f.g.x.f.d f.x.b.f.x.f.x.x.g.g.f.x.d x.v.x.x.g.x.B.b.m.m.b.x.x.n.x.x.m.m.x.x.v.v.x.n.v.x.n.x.n.n.n.N.x.n.n.x.V.n M.f.n.x.g.g.x.g.x.x.v.x.N.b.b.~.N.. # $ @ d . . . . . . . . . . . . ", "# % % . % % % % # # ^ <.t.E E ~ ..e.y b.B.g.x.v.d b.m.x.x.b.m.f.g.f.a.a.3.3.a.@.m.B.f.m.f.a.a.f.g.x.f.f.f.x.x.g.x.f.f.f.x.f.f.f.f.f.g.x.x.g.x.x.f.m.) p.b.x.x.x.x.f.b.m.x.x.x.x.v.x.v.v.n.N.x.x.n.N.v.x.b.n.x.m.( x.v.x.d x.W.g.f.x.x.x.N.x.b.x.d d @ O . N. . . . ", " % X % . % % % F G.q.<.e.W ~ d.n b.) x.d g.B.m.f.f.f.x.m.d v.g.f.m.a.p.p.p.& m.f.m.m.@.@.m.g.x.g.f.x.f.f.f.f.f.f.f.f.f.m.b.( B.x.x.x.W.x.v.v.x.B.m.p.( x.x.n.v.x.x.b.B.x.x.v.v.v.v.x.n.v.n.n.x.v.x.n.x.v.x.v.N.v.x.x.g.v.x.x.g.g.x.x.f.b.x.x.N.d d @ d n. . . . . . . . ", " % X % . % % % . # ^ <.q.t.i.~ R p.( n m.W.x.x.( a.( f.x.x.x.x.x.m.a.a.h.a.3.3.p.h.g.g.a.p.p.m.f.f.f.f.x.f.x.B.b.B.f.B.f.B.m.B.f.f.g.x.g.x.g.v.x.v.v.f.B.b.x.x.v.x.v.x.g.f.x.v.v.v.v.v.x.v.n.x.n.x.N.x.n.x.x.v.n.x.x.x.n.x.x.W.x.x.g.x.g.x.x.x.x.x.x.x.x.N.n.n.n.v.n.v. . . . . . . ", " % X . % % % . = J.q.q.Q Q | M.B.x.m.x.x.v.d ( a.m.f.x.v.N.v.x.V.3.M.a.@.a.p.a.f.g.B.a.j.p.@.b.f.b.f.x.g.x.f.B.f.m.h.b.B.f.m.f.x.x.x.g.x.x.x.g.x.v.x.x.f.x.v.x.v.v.v.x.x.g.v.v.n.v.v.v.x.n.n.x.v.x.v.x.n.x.b.x.v.x.x.x.x.x.x.x.W.g.x.v.g.x.x.x.x.N.x.x.N.n.n.n.n.n.v. . . . . . . ", " % . X % . X % % % # F H E E t.G.* v.x.x.x.n.n.v.f.( ) m.g.x.n.x.x.x.a.M.3.p.a.a.@.B.f.h.m.a.M.p.m.m.m.f.f.m.x.B.f.f.m.f.B.m.f.f.b.B.g.x.g.x.g.g.B.f.m.f.g.x.x.v.v.x.x.x.v.x.v.x.v.x.v.v.x.v.n.x.n.x.n.x.n.x.x.x.v.f.x.x.v.x.v.x.x.x.x.W.g.v.x.f.f.x.x.x.N.x.N.n.n.n.n.n.v. . . . . . . . . . ", " % % % % . % . # v <.R | : ) c.n.x.N.x.v.x.v.x.f.f.x.v.b.x.x.x.m.p.p.p.a.m.m.a.f.g.g.m.p.3.@.a.@.m.f.f.f.f.f.f.f.m.L.m.@.( ( m.g.x.x.g.x.f.f.b.m.( ( m.g.x.x.x.x.x.v.v.x.x.x.x.x.x.x.v.x.v.x.n.x.x.x.x.x.x.x.x.x.x.x.x.v.x.x.x.x.x.x.v.x.x.x.f.f.x.x.x.x.n.n.n.n.n.n.N. . . . . . . . . ", " % % % % . F H q.G.: B.B.n.v.x.x.x.N.x.v.x.f.x.v.x.x.b.x.f.m.p.p.m.h.f.a.m.m.f.g.@.a.p.p.a.a.@.m.f.f.f.f.m.m.m.m.L.m.a.( f.B.g.d g.x.B.m.B.m.m.( ( g.b.x.x.x.x.x.v.x.x.x.x.x.x.x.x.x.n.x.n.x.n.x.n.x.x.x.f.x.x.x.x.x.x.x.x.x.x.x.x.v.x.x.f.x.g.x.g.x.n.N.n.n.n.n.x. . . . . . . . . . . "}; wdm-1.28/pixmaps/Earth.jpg 644 0 0 15534410221265060 151460ustar AlexeyVoinov 0 0ÿØÿàJFIFÿÛC     #!)!$%'('+.+&.#&'&ÿÛC   &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ÿÀà€"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ùjŠ(¦0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢”©?˵%0 )A*r8>´»ºü z`t£@E8éN* gæÇbF={Q`EHc¶‚sØ`súý)6Ñ·OñúSåaq”UÛ=6òñü«K;‹‰îˆã$ÿžŸäs¿aà^©x´‰é´‰ÿ¾XƒZªÈWG'Ez¾ð_\½“Wö6ˆ½dReÿú×EÀ î¸ñòù9†Ûÿ²5U¨·2<Šú":3®[]¾¾\H«Ûü*sð?@Fù®õ9¿Ù,«ü—üæ©aeÜ9Ñó…ôDÿôy8‚{ØûLô¬M[àÝ­¡ÄwWgo_ºjÖ oDйÑâTW©\|3·Sû«é·uãþX¬Ë¯‡7 ›­ï•Ï÷Z=¹üriÿg×ìèà(®•¼!¬y×}ï31úxóúeɤÞE##[1+×oÍŽ}«…¬·‹+™ÔU™-Ù÷‘ºg•#óÏÓüçˆYçgŸ§ùý+ GqÜe¤8`GÖ’¤Š(¤EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPRF0sŒÞ½ût¦(úsÀéNèyã'8ÿõSC@ 瞣½AwáÏ4™p{{ñþM<˜žsŸÇ<÷õãÿ­T€`MÜŒŒž2?/åFÌŒƒÓ>Ÿç5¡¦é—º„©¤$•Ý—Ó®}?¯KðÿÃ{4òæÖïR\üÂ}«ŸBzšì§„©S[XÍÍGsÊbµ’WÆ$‡¢"’Ï_ʺm/ÁZÕáVxVÍ Ýºmۿ޾м1áí5Uílí£Ü¸ ,>½MuvÖ:nåŠßÊù•›÷}ñ‚z}k²8ZTþ=L}«–Èðÿ ü3Ó73ßKs~y o$qç¿Ý9=«b}ÊÌ5ªøbØp¥-ö³×’sÿë¯m‡L‚¼îQ÷˜³`V>¯§h×¶ìLyLX2±ùHük¦”éAû±3œ®Ùæš‘dSlZis&ÓÏu<{WU“e½vZL³ÄÛC›Âû\b–çJ’þ5¹ÓåH$ÚÙ}‡sÓÚµ4? k—²ZOý¢RÝy’-» æ·©R)]»idJžT Sw$pàʵa±šÙZ8–?ö›…§káé`‘%••¿ÖsЇ[dÑãD’ñWqë/?μ÷WžV‹6ååZ•’EÞ³ï?ìÔX—s3³>}=+_[#"â2Œ~÷EƒëSÿÂAf’F·—v‘,‹ò³N>aý?ÓÙϱŸ´‰iã•¶¤Qü§´Œi’Ã$a|È Ýßø±\÷ˆübÚEÌ0+Å:λã•XmÙÓ;…TÒþ!iW2Ô-®mÛIY7'çÅh©Î×±œ«S½®mêu£ Ïåí~­¶¹½BÊÑ!Y­‚¼|çÊQ+ z­oÞK¦_ÙµÂHíl£.øZ ÒØÉ .—S¤gî™"óC~ïõ»Ì¿Cº·Ro`Ô¤þ{[V†äx[ɹ]ëù6Eq:Ï…ìþ> gaÄ‘á9þ^+¹»ÕM™âÓ|EÈ]¬ÐêŒpOð¿Z±©áÝ_m®µcŸp͵%—ŸGíVÒkßÐs4x½ßƒo3-¤‹4}}ÿJÀ»Ó¯- -Å´‘‘ßiÅ}©xWìPï³$DßsgÌ\­å† “²ÜÚÁsnÝC/̱®9à0õuކ‘¬úž*AAW©_øWK¿‰„0}’n çå\^­á›ë ÌTHž¨rùÿ ó+eµiëQ¼jÆF ¬¥Oµ%y5¹ QE€(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢€ ’{P=)p3Øãò§pç×üñJ@ Ÿ›­éÿë§b€·¡íëíþE;œŒçrñ×§çÓ¯çB#HÁTo'£¿·êkÑ<ðÚóR’9u0ÀzB­ûÆúŽÝMuÑÃÔ«ªûÈœÔw83M½Õ.R(Þw' ŒúŸÖ»Í+áÔv¶éw­KÏËCÇãÞ½z×B°ðޘ؎cŒ¯§Þ¼×Ä:Ä×Ŧ‘ãŽßqX÷?2vàÏã^ÞJ:îûœs«9iÿlÓôÈUlã1ìS†ÇÊ?ƠѡռUª‹[FyrwcîŪøwWñ•ɇL‚4޾d’>Jú ú?ÀÓü7¢yV÷{GÚz3AÅuâ+ÆŒ|ÉPæ2t? [è*÷;®µ)cÆÕlôö­í BHn÷šE®îg8bÎhíïžÅ–köÁ)j¬à!]]½¹Š?–&,W…ŸóÖ¼Zµåש´`™åþ5ƒW•š4VÖmÜÞžõ…olФ6ˆ$c·1;³Ö»oÚ\‹qtò!‰åd’ÞUéÜãÛÖ¹Ý")$–An’=Á\D±üʹæ´ö·‚Š<•ì’ ¯\WžüAÓM"i'“ˈd3,yÛüêðSQª›4ª¯|ñ YB¡@[˜óþzŠŽòInÄiØd·Ü~oÒ®ÝÄ#ÝS:®~hÉS·Ð¯ý+8ØJÜÛM„/Ý݃Ž;­}#vÐùº²qn,®4éäV!ƒ~ö}}ÿùTid pò6ìÄóüëY,ïc- Íb…wf9§¾UÏÕž$ÂÏ‘JˆÄ‰²#?….gk£äµ;=ÄzzF¶Z¬kä ¦2ËÐ{ÿŸÎ·5?øJ{?"X^v+÷@Üs^Ys°¤o"…W\ŽÞŸýj¯» qϰ¨tÔµ:㊩cÒá×|;’ÒÑ|èœqæ®êÅÕµ&Ædi6Ó€7)eäšáå-ýóÓüþtn–E*ÎôoóéZÆ &ŸZË­SCº›{hVq+|¥£B§ž(¸Ñ4{¸C麉°VÃ2,[—>ù湩’hdÚÊU‡b*¹ÔŹÂÌ:„9­}Q«V[juñx{ÅÚ5´—šf¦/b‹™-ã}Û‡²šv‹âäÕ.–Î{8–áøùTçÒ¹[?]غ´7DÊ3òõ_þ·J»ÿ ‹ä¾’ÎÖâåqûë~h³ëc®ÿj'O«k:n©GkwfÑJÝ üËPjöÐyM$GüØ_Z¹Oˆ^'> {wm& f‹Ÿ679o—§&Ÿá væ[_ìû„YØ:EoáÜžr}3ÅTV‰õ4庺(ßéšV¤vÍÙ®á£-r:¿‡¯4ö,P¼]œ+ÖuÏ ÜÛ$I?6Õ}°¡½¹¶_&u3Àÿ(tü*ƶ–!]­{•Ž'”GQŠ+¾Öü9epÌöŠ-f'>S7§Jã/ôû›6\!_CØþ5ó˜ŒJÍH©EW aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEª¹äð¾´ÀIèµ91ž=y?Ö—¯â#œã~”¹9Ý–ûÙw£ùú÷¦P›†8<Žœã¥hiUö«p±ZBÒd`¾>QÛ“Û§ùïsÃ~¸Ö%.ÝOÍ)þCñÍ{N‰ YéV;¤ ·¶™ãy=ÛßÓÞ½\. ÊÓ©·æaR·.‹s;ÀÞ ²Óã[«§Y.ü´+¸³z ëøŠôyµ=Ãvþn¡q¼Ê[nÌÍÿZÁ›R}Í/ZÉdÕï•…•¹á!@9ÃÚ¹[¯ ßx¢hïmÄÑÍqq&Ï8ž›±òŠõù"ôzDåÖNì³â?ˆê–Æ?5¹XÑÓåÉn¿•p6ë4ßhYTádXÉhÀ?ÃÎZÖ<5®h÷« ÛI |²Ç&ðÜàäöç±­Ë{i§¾žÚ…­”$ï•"g‘þ­Ðλ"£ûƒµMø|ö-ihÓ¤:GœZ$Y74ç ÑðY½€<×°@mcoµÝ"ÚÛî%|+HÞ›Ƽßá„`K(u+ͺ}þ]ô±ü°&>ò+p[Њô`á/ü}ÁLÜtêkå3µ…$›®ÌÐíˆ# žÂ¦Óí®.." ±‘Ö5Ï©éN>CqGX×z4ð·“$±î!†é÷mÝÁü{ÖEÖɬћˆÍ¸õúæ½7BðNë”»ŸM¶…cP­mÍÀ^s¸žI¬OÛÃg%ÄMmä!ÛûR¼´ñÓÔ)ÆO”ÏÐòmOJk`%¼ØO~ãëYuÙ£ùW±þñKµº6{­GâÏ Oa‹Ûxñ¼íþáô¯—}º?wùŸFrPAŠðMBŠ(¤EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEª9ïÓ"š*î8iãã'±äŸz8ÎqÆsž…†Hà};uýJ{ HùÇp~ŸŸá]O„|/6­ º¸&+5<³œ1ØžÕWÃÚ¨Æù.®s$r)È@ù¿kÏ›nW¹kmŠZÆ—™zòmûMÌ êÉ|Œ­WðÖ‰¡Apn|C¨ ÉQ·›b¯Ê~U*8ÿ€Õ-SÄZrhw×6·r&™1‹©7´—“‘œ*}z–4¿ ôKÈl ÕuZfÔ±8,Å·wÅ™ã%ƒÁÊ­Îü8Šê/cÓmãŠóûBkMBä­œ«g‘µÈ7*ç;±úb½µ3¡iº[Þ-“G!ƒäÏ’ägŸE&¼)µ+¨äcò¡ÝÁGÝ·=}«Öƒ”ncŠ›„# êw^¿¾´°º*Ng¹pMª8ò#QÝSœ·¾EjCã½nÑ ­­â[ rGŒü¸\6EyÌš­ÊEy˜ìa!„ü©œuÀàþ4Ûí[RÔ¤‘šVÄß}"]ŠßðÀý*”£QÞÇÖjn¤tºÖ¹m{»m6G·’MŠ÷3ƒÓ£míë]ÂÉ<=w;Cscýâclò&÷Ç †+ÎôÝëRliú*¶K}O@+Þ¾x>_¯Ú. Á1äG€þûóŸÂµ¯UR¥g£;pq«:œïc­Ô¼9¤êVΟn‚AŽ" @¯ñ ›èž+m.ÂÍ,<£ ¸Á]ä€Û±úW°x—ÆñÛLºfl5ké?†{ž•åúÖƒ¯ø—Q¸Õ¬à¸K§òʘ¤Jã íŒv®lçï=ÑŸ:Jž÷9mOFÔnµËm!õH´ «ˆÖî'»âYÊÎK?·Õ—¯øþø—Éë—·)ÿQÂ!Ž»¦æéÏZôo|#¾¼Ö%×üYɼy$·…„`}Ü/'pÇsŠõ{¯Å:ùcqVÆà0BôéšíxØÒ’³¹×JŸ¸’>.Ô~x‚Ç2ÜYyVêÛLÌß»>û½*«xOu—m#ÝË»jÇlYÿÚt¯¬uÿ§G®› Ü ¬fžþG”çûˆ¤á*ó/h¿­¡Ù§èöC »m¹“8çŒçŠí¥Œ…NÁ(Ìð›­.ÿIlÝY]XHÇj¼Ë³ê*;xí[ ³t§;²ƒËqþÎ>é¯M_ jÞ/´o-u‹RVWºŠX˜sØà.;Tÿ 5Ý>ÞK±ý™p¥vagy<²}X qþ5ÒªÓ½›W lCðÚÛÂR]E¥jZiºÔ5 –8flÔ0#äûþk×´ÿ…6Ú^¥ 5ijÁm†‡ÌQ³yþèæ^𖩦ëÖ­¥™…á¸'ÿX¾fHÛŽ>_¥{•ãÛHfŠ «”œyâ©ãå7‘ËÏAÑ…pâ§UK÷OB£Ëox­ªè7úLMqa#¹i }°+–ëÖ¼Å:ݦ¥âYžò"<›†A ‹³t]óý+èÝwâeyucr”LNß‘ã+“ >‹Þ¼âU×…¼Eyö­ µuY'1}™=½˜qž~µXYTÞqù“ʯ¡´š‡u ›=gKŠ(mö2‹}ØO0~†§ñ4v×{Y§”ҼŠã+þ5ÉéÚ¥æ™ðîh®bky~×Xùñãx$ï+Ÿ¼Þk–¸ñýÍÄ×3“3áYÕvð:(Çn+²+]^ÄÊ-˜ú•˜yÛ þÅe*Ä‚+¨ºŸí¬nÛ;}ð¿(“Þ³î-Öí7¶^ßíW7ªûðßó6„­¹E9Щ Œ}iµór‹‹³5 (¢¤Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ñ©2q’:œïÛüâ‘3ÆxÈê?úÔ¤óóc=G¾?LuªØ õ©ÆF?Ÿ¦+KFÓ¾Û.â6¿{ù½‡<Ô:e„×÷"Þêzàœ×¢éZ?ÙáQl<Ñ ~alôÇRk×Àa=£ö•†ªòh·*Eo&Åo/jª°Ž.ËŠ½¤C ަÒê7Ÿgž#¶7Tܽ?*µ¥ÊÒê~|±*YÙ|ÒÍ7(‡:’k;R†óSÕ-L('K–iD»ð„噿Úþ\WÑnq¦ä_¸T:ɸÓÆ8–m΋ó·9Ã9$7ç[Ú¥k¦ßÝMem ]JÉ"¨ÿ– Ãïù­„Lÿtı°²†k[ëèo>Á4çÍòŸj/?Å€0v3]ÓêÔ´['ÃÚtVv‘î?m“b‰H=€9 ßscŠÆ£ÙZãù‰¬ß\]¼—1Ü_J®9§Û«¼§ò¬k­ZïÄqϤékÇ*æóW¹ˆò#à,I×õöªë}o¨é«&©©ÞJÐâFƒËÿE`½fÁÀ'ukG£èšÜq¸½]^~3ÎöÖÿ þö3ÔýÚË•/‰9FçXÕ<;oáÛ{¸“¤yüÍóc uuúW´Ø¤0iZEŒq2C´HíÕˆOœW›x'ÀÚݯ‹­uýNÙ´ë["êï+}⇊ÙÀ«_ªþ3Ö+K;¤PGÆæôýjà|[â„›GžÔ¼çsKÙÀê¸9­ˆ7B4¶Û.cvd+´>¯èkÌõ§•1#Hãw«Ÿs_CˆÅºrj;Ÿ/Š­(Þ(Å»kq6èQà<0ÃcëR}š9# ân~6°Áýz­,JŽTäƒíÔ⩼‰ ›ã»^s«9­Ïï©èÿ î$±¹Ži "ðôÿ ôÏ­Ôš,ñÙóY~W|Ÿíc¿Jù÷Hc%²Kʽ·êzœ:忣§ÃöyÌWaŽ7/zô°—æK©ë`k$3μs®ëÖ¶sXJY,ß¼3FŸÅîCÓ­yÌQù+æ”LI÷{×°xÚæçP·‚K« }Q–6RŒ¥$bOnÿÃÅyÍíµaV²ÙH’4O ¬7«c?§Jú ÉÙ~25§>3#„EÜwq]Çü­ÄRÉbé¶Y¤·½fü0´±½ñ…´_(îÀo—ŸJúv .'Ž 1ÈÛ¾wïXÔÅ*²^ñÑÂÆ­å-ŽC¿gЯ ¼MV Ì-¸'ÙÎà ›Ò»M_IƒWƒÈ½wòX󻇡«²:îI.x+Ïùÿëþn ƒ“Û¯ùü?Ï~ âg6¥=Ïz4ãʶ+éºF›¦ÅåÙYÇ ÷Ú:ÕÈ£Ž$ QØ gÚ TËHªrqÒ™pî̘\ººðQñ¸zµ.}n.^]`gã>ÕÝÛ£íyŒgy8_ιßkiÚ%Ü:qFÔ#Œ}ž"Ù3qÐ{ñ^ñ;Ä—h1Ùë÷Écs,¤®—o#Í*ƒv;·_›ûÕÛ‡Â:Û»)Xú6ÛÄ:UÞ£-œWQæ5vï¿ÆxúW'âψÞ·Óf:n¯ews¡,ãp-ƒÊ©Ïá_%x¢ sD¹ŽÒêO³.<…‘–JçcŸï¨o˜+Òü%†4ÍWK—Åšå­½®aµò†<¤ð²'02“Éù³^ö}(ZWoÉÏ#Ö4]^k½0jsZÜ$RñElÞd[yå™ðÀÿ¼6ÖŸ†®´¹âòlvI êÄÈÏ•lò}¿*ÚÑ|Wá;í6 ¨®-­-n‘…¸¸&–1Á`§µÂj>,øa¤^C"ë‘7•9’ hdBŠøeçHã“Ås+Êë••ÛSCâφ®®<1î‹$Üi}«dLà>ö ãÍaG¦xgWµ±ñާ˜þ_¯z«REžÀœw¯ùéN,L³¨i%±ºFRÃøsÉZçJ‘×us¬°ÚD®…3–¿½eê–‹ÍÄ ÇG¼ÜÃÏiªÜtåјôSŽrsë‚Æ›_8lQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R¯¯§½0Ãג}ã?áÅ9C;\’Ü};vöÅ323Ü]çÿ=ë¶§,?¹åRF}k¯ EÖ¨£ÐSŸ"¹©àÝ„$½ºÈÄô>ŸAN×oQç}=Kà)Ï–¬ÇûÞº}rî+Mâ+4X`BÑ«ªçq<ã´{gÕõ1K}¡Ë\–ÇÝ>¸¯­‚Ii²<Õy7&:;;½FËìVj&³¶ÞÏ0Ê£ÈG$c–ÇjË·»½Ñ58®7ùžWdèøǥo]/ÚRáÃììÙ ŒH¢ ¡»’1žYzõÄPÍiye«µÝËEó+@¸€Â޼~ï¡´{IñæqÍmáRò0ùÂÈÛŸã\”çÚ ƒÄWú½ÜG£ØÙÍh¢gºvw;qÎì}ìúWï©kw q5Ì“Ëó9N08ŽÜÔºm«\ÜÅq 6îgirŒýãÜãû«P †Ñêzf«¤\ÁæxƒÅ6–ñ‡X⇠ægºª®W?íT÷^=ð­è·Ól´ynÄX)æ|“M *Ôc®k„µð6»sk%ÊéóÇ3•ã*8ëò“ž+KGÕfð¤0ÉcoÎï5äù¶öHáMc*p•Úwdü'´èú…汩­æ•ö8Z0óùÒÝ`I<÷5ÊxšßIÕ5Û„ÕâÌ0Ì…7¯ÞÛ÷WñÍr#Æ÷_m/n¨š¤Š±"FÙ1çßÖ¶´=PÖ5m5¥-wkö–ûD¿|döUçÊ‹¥y·dklA¼ˆ‰n$Ý²ÚØÁ ²*ýãüXœ×wâNÇÅ÷ð­Ó›+xÑ<¢w~ñ±Ûñ®ÛÅ—z~kæÍÚn'CmVÞzc銎çÃ/xšeÝÕ»K5·ïs˜œ6zWÇ(Ч˜ª•ãxÍ[çÜ÷S”ðœ©Ù¦z^…§]Ë´·%cƒnãñ¿#ø…ZÔu5ŠÙÛ1á瀣ޠ´º¸×lâ¼·v²G ·©ú×1¥Åm6µqm.é$‰Ÿ|Í& 6pÙ¯QSIrÛEÐónÛ¹oÆ·ê¶qÜ$HÏ3þíÊãGÌÆ¼ÓPšo3e¼ŸyŽ«°ñ¡ý£pθI¡,ŠŒ;‚9ô®BdûLü8P1—Tܾ•óXÖÕnWÐñ1Rçž…fQ:°DŒIßÞ¬ Bymݣكǿé]$zLsIqtòº¬.8È©jp®ÍïæÛÔ¶ášæ„”YÅ*n×g?ew$r…+°äæ»=WŽ;/³]aQ[výç+ÿÁÝôÅq"Ôm4}$Þ\AæÈß")b§qîH¯5ºñŽ­}å[j¼Öß5¬xŒ~b ÿWÔexJ•ŸµZ#\= Íó#ékúu³ÌÒj›Ï³¡“ìêæÜ>hÚ^Ÿí ñ]Bî 笠·‘.‰;ˆiwãÙ¬û¯¸þÍŸN3ÙÝiѰ´u‘H‰Ž=W.=˜šândýé™ËvË2ÆpûsÐ×Ò}CK\ï«CÛo¡ÓÍ­Íer Àžbyã5¿eñS[†É kyÕ‘‘ÄR ï’ô¯=]^u±ûŠ1w“´3õÏ^ª£ÏqpåžFo÷›°÷5ºÂQµš.e‡Ð¾ø‘áã§Å£â+­:áþY ù¥ã#§)Ë|Šõ/øÇVÕ4øo­4ø ¥èÅ´žoîØô$³ç¯ÊE|c¦^Í¥ßC} (–ß2¬œöXùŠï¾ ø•tߟôF¹šï>\k8„3çw'£é\X¬¾›ƒ”zO™-îZïÚ-¼Io¦xìÚØiÚ¤òÉg=¥Äžbà©++ uÜ W¦jºþ‘áï,ñ]G*…Ù£n27aÅ|Ûñ2;[H¸Ö§ÔöÕº5ìLÓñö_ºÑœضx¯³Ö/läg´º–}Ã1±šŠXXÖ„[–ЧS™]AxšæïVƒTÔuUmuY±gI.ÈÆÒûväîÆ?íWŸjÞÐì¬ô­oþåû]ËJòªFÒ42)\€ü7N„޾Ü×£*CxrÝIŒÍЪƒ“ïž:Чx³ÛH"º‚HfòÔáòÖϨ9¯UC–Ê.Ö)#©ñΫ¤¾£bþ¼¾šÚÚP.£Úѱ''©Ë0å­sæêyʤ“¨!sƒÐU@ʼn-[ƒRºñ¤=£]ßýÔK×?OjÑJÛ±ÛC¢Óü#ã½RÊãPÓôÛë¸tõÛ#«íÚœ•I‡~+Бܳ4ŒåÉÜI¯³Cñ֟๚ËÌ“S@$"r†Pv‰#Wêƒ+·½|•âmRmO[šêKh­¦ó0ñªðXuc»œ“×5…*Ê´¥µ(˜e²xý)7{TËl^=é$dîÆÃÁ?үŠê-…­äÒ´t*Z<ã"º5šóHÉå³³ ;¶ŸZu”‘Gy ͙ȥÓûÃ<ŠP³aâzSü[j>óŒü ÒÔBÖ¼¨ZŬÜG¥H±Amow·ÃÆÖì~ûw>ø®2]2it÷Õ­•Ùl¨­–€ž›‡¡ìk¦ð—Œµ«ôÝ.-ZKDµ¹ nìª|ß+¯ÍÆÒz××5ëM#Ææö+!Ô´¶hn.,Ô {¬A&=¿)cÁ¦¹žŒ4t)Œà”~û» ôéEÕ…·Ždr|úô§é·LÚt¨±n’9¤Û€Ø=ë¡3+3•ÔíÒs·îž†©1㎇œ ìu[QqFÞ›·ÁéŠädFIYOÊØú}­|Î? ì¥Ï™Ñ ó":(¢¼’Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( žªyëžÆ˜1Þž§tÈÿõÕG}]Ò,šÿP†Ý@;›µ}§ÚYhzÙc),ÉþÉn™¯/øy¥ˆ¤Žõóæ7+¸ñŽßá]·ˆ®!óÒ¼éfQ+ç§9¯§Âaý5}Þ§gÌÌMræ;›¨tÍåiVÛ» Àüj{K3O…`VT[¸.÷yæ'¿_—ßÍêçí÷¶pÊÐG±rîäþµ±¤éêš…´wóÀÖ³nw•XD³‘ }ñ–¯AÙ#.A<<·Þ+ûVšu `´lM{s'Ω±¼p¾*i<9 '’ÒøŠc»äE·Ä­– ó6zwÜÕ¿øgC‹QeÔõ¦ˆ0/5³~æÞ~Õ¬»¾}§¯«Ó´¿êv1y’iúŒSÜ<®²@­Àüò6>m¿Â8®j•¹M=ÁÒ|Eö«Ô¸–ÒÖòw[+?0—ò”ÿ¬8#+νzï‡þønÂÖ3ue9¼YÔ!cܰšÓÑ|1mjÑ^K os/l8Ä(±'j('¯®kVé$2ùËÉ.v§Ê>QüëÆ¯‹”Ÿ,^‡J‡VgÍ~™’ÙbU·vn®=x7Ä WJ7 ¥iú iâ'Ün‡2}+ß®4}^é#k‹›[8v—Üìwsíéë^?¯êŸ ¬¼KtÚÞµ©ëÓÙ°@!ˆ%ºÿ²„6N;Õ`æ¢Û³~„N,å|à‹ícV†c±Y>æw\ço×¶kÙuxOÁšbéöÛKqÊÖÖ®×{>õãÞ2ø·©_G&—á6д¯¸ CÌ«•ü y¤—.ñ£åÒNŒW¶SÚ»jP–%§WEÛüÂ>îǤüIñ݈㱼‚ Ḷcå«`£du#Ûµu >!xš÷RµÑµ¡%Äw<©™v–êp>`q^3a-¹¾†I¢YWpf^Ø÷ÅwžÕ!²ñ ñêrÀÐ`Ø#þô*ò|¢¿O–¹3,º•\3Œ#ï/…ögf»…D¤ôê{ö©â¨4>úÓJÔ!³¹—bijÈΰüCvÁÈ$Qð§áߌo.a½‰bƒE•Ç%ÖpqýÑ×w<çÀFØE*ÚOg~äâ`•Gɱîz¼ö3̰,óŒ3Måá&ÛמÌsÁ®l麃É!²Ó¼…|Ï,ÉÕIêsÒºw{8.ÿ°nî.>\‘§ÍŒmÝ“Áo›½ZH¾]WRÕ5´òZ* t;“`?Ä?‹ææ¼|f§,¨ÆO™mª%ÖžZ •‘•Ö"F`ö8&².5›Iï~λD(£÷nqÈ®®9¯:(b¸pø)BO[|þá7skÄ»“[Ô4è4Ë…kPÒIÜQU±#£yôùš¸[ts+àzµ¥K 0©ùÃ6Ù›—¥Y¸³û\0›;h®æž.‘oÜ÷³þzÕ=Þ;¹Uvîp®d^>e ž9íéV´dÞè±ç)žF òe‘Q‡!@ã5—â+o!äcÓÖ¬ØI¸»Ü76bjÌ‘y´LÙÛò•éYÖ¦«SqbŽŒâ詯!0LPŽ• |mH:rq{£¨(¢ŠÌŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( '¯>•Hµ{ÛØáÉ ~fçŒþ¾jŠñ‚'¯å]„lÙ`2„}÷ ´dgäçè`hûZªû-Å9YŽ›-¼²·Ì°ÆX§RGM VÓ5ŸˆîñX«ïå¶vƒÛð«“$x¿þG±Ó­à†q ;Ödœg{¼}Ås~¶Ñ¬µ?û`ÝßÄwŠÉ¡R¬mF”g!{æº~M&ÊÆFƒEt¿[q%µ¼¯ö@T£g*~›<-rà J›ønSœ»š3¸Ó`_íëë7‹U¾_³‹8'ó<ÃÒI΀x5å:ƒu]Ü.˜ÊÉnÙšbß,`ûޏ¢úúëQÕî5+Ó>¡:‘ö‡»ùC•ìÊ?‡Ž•ô7‡¤¶Ÿázéþ —ínÆHÙP³8Ç™Çs“W6èAY’)~'“økÁÓÝ늺+¥ñ¶‹Zˈă|çnOûÕ‰ô øjƒâ˜>Õ⬠Ólçqó“Ä“I÷xé±Mlxöo‡ž=›PñeÃÜËqfíæFÏ3n^¨s›ŒWšxªúûÅýî¿qmü9¿ñ}ýœ)*“³;Êrzg>Õ»Q§'°Dõ€ ìï4ûOx†Ú;„˜n³³nTqæ7ëòŸJúúx4ý:I¶I‘¯o`+Š]<éi^Ò‘—N‚[›‰.Dgf9ÜYˆÉÀ¦i:…Þ¬—Z~¡ÙÙÁµyER1“ž@N8þökæk9W››z~†ÈÄ×uŰ¾Ô´ø¾ÐÒ, WÌ®6•}ÓÇSVü{«j-?ö¥ÊÜ¢"«mP»qëŸâÛýÜz£cáCA¿Õïl¥ vÛ–àmaëìzsU´2ÎËÃ3]2Ë4VÒH×ï(²>VëWV4¥ Gï%^ú•_Pµðˆnà»ÄVîYâûØhÉ8ÇNƒµu/^Ñ­§Ðl…Ì“J‘çž8Ôýîy< áu­WÂW‚ÜjVw?jXY–]â<ŸâcÃӊåü-ªÉ¦¾ÓgäÓØ¶ß7<{ÿ…[³íýÚᣆ÷¯sÍeJ£Žè½ñûÃ^±»³™íneÕµG0Z½£ŽWå]ÀòìY²Ozùá¬ç†úKIcXî vYV.r§8ô¯±µÝ[LÔâ¯lw¬ÜSw%ÓŒž¨é¯|'s{4rhÒÚÜ$ÑùŠ‹w{ñ×ïq÷zÕ <9¨E§&¦Ö×QÛ,$º00‚&'È3ßң𿉥ðìò][iZUíË`¬š¨ŸËÇ÷Czv®¶Ûã/‹à†æ?ø–MÖ±Ib­î™àsÞ²R¨›Ù¯0Qk©ÊÊÂ×M“jQ]Ù=ÇšöÐ|»ˆãvâ¹éëY÷rZ=ÕÇØãxmÙ‹F®Ùe^ÊO­oiÑ>£qÿ ‡®]Pì·Ÿq³†ÚI‰q´)°ÈZô| “WÒ.¯[^[iâÝå[ÜCä™@\îO§jÒuáOYxœŠNÖè§¡§/?wŒz×qâ‡:§‡t;]fM_J½²»MëöiNA8*Êü«…YX¿‡­\'{ÈeûmBêÕQ"‘Q·€9ç×Ò­´WrÇöùá-Îq;—wqŸïV(‘~R8õÍw:m­ü^–kÉb]&âpŽ—¾VþP˜õÆ@Û[F~dHãc*̦mÞXã+Ö¥HÃ*8 m¤¯Þ?…k6„b‡Ïžp ÆíȤîÇ¥=m’[†6lÖ¢Ëîèpõ­PçF]ыΔùj¦NSaúÕ¬QKp‘\\­´L3æ2– økE´óÿHfYHÞ£náƒÈçó¬Èâå`€w})J#R6|5«.‰qy,¶ÑÞA4-nØ|2ç£‘éYÚ|mÔŸrQ›s´Îp 5Gf¬Ø½¢¥ÊÜÄòHÑ⯑Éü3Rž£54ý`YßZ\­´oöwæ,”(.㚤÷2Ç©Í)­˜;7”?„úr*{Ÿ–ÖÖqnðÃI y" 䜃޲å’Y%g‘Ù¤èI<ñTÛBÐÜ3C¤~\QÌU¶¼ ú0ÇC‘UÖãtí* žvtœÒ¹Q“îœàôüª]Ò+lÿ7)Íh¤E†k¶›£i׬}qéXÞY,o ´‡0Ÿ’QþÁï\Uõ»ÚÞMm ÃÄÅOá_?šÐå’ªºšS•ô ¢Š+Ä5 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ 23ÒŠU’;r3L °µÅÂ@\€×õükÔ,íVÖhåx‘qL1–5ÆøÕn56¸*Y-×*¹þ#À¯h°ð´±ißÚ—ndE¿åŸËüþµôXFgÔ¤õ±Ìê/h–Ri[^k™$fGàí3wýj…Þƒ ´ÑGx«âXÏ—µƒíÎÐyÈÝÀ©tÝ7OO}§P¿óæ¸&Ü…Éîk+ZÖ4ˆµ[›»8Ü];1ó¥b6ÝÆ¾+Òå'›ùKÞ"Ò<¸m–[;¿íÆy-¬n8ò†rqÏN95ZËHº´2j—Sy±Ì#’x#y8Ç*ߎ6Šè¼=ªY‹5“Y~ÛpB…!¾TÚ m\šå¼Câ}â+†²Ø˜ .#È?)ÿX¤ð‚ˆß©ÈÓ×4Æ—R·²Ôfû5íä#È’^QpÇä ¸ÚsùV4Úl¦fKv¹»U‰šëld ` dÛØ«ÞÒ5mQæÒMì°éÓÌYnÕD†FQÀ^wsWµMI¬tƒ¢µÊA$ª#0Zs~~ï˜üíUÀÆÕëSÎö,ÃÕu5²’ò-)ÔÇ4›"¹J¯”È áŽN1ƒÇZÀ·Ôg¶c‡kæ‚Ë»‘œuãúTZÃÍöù–WF16ܦ8ã ãò®¿ÃŸ]ðÝæ¡iû˘Àpvˆ9Èãø¨”ûŽÊ+S^ì½TKpš„ñùˆ©Ãà–cíÛŠ›Nñ Õž“qom+¤Òƒl¬APܳ~+òÖ-ì7š|eylöî0Í«±×#Ž#Šn›m%õì6ªè­+`3tÿëT]l_*:/øÆóÅ–zöŠî¾³Wçÿž¨OËŸuW= ÕÌJ Ï&Þ~]ÇõïUÝ”»8_áæ–a·pp?»Dm ìkÚ¨Fb0ÅÀ´€|Ê>™çò¯¥gRÒÕ¦°h×-„FŽHÿi›ÜäWÊ‘\<$ì`7*ï>xËPÒuXÐÉ+E+såÛÓªÿ³S^*µ'¬‡tî}Øö6¯#Ê`ŒJýdUºzÓf±†i¼ÉF¸ï\ö‡âí îÒÂ;­Jwr¡Q'eH~ƒŠêÇ=+äçÁÚFÉö2uý2ÚòÂMæXv¯ßö?íW;0ñ†¡á-nêÖ ÓôëˆBË¢®Aœ1wqœWÔÒÆ²ÆÑ¸Ê°ÁóOÄKoCæ¬i²C=œó*ɽÑPŒJ¡qü2‚w«·Ô¯+“=·<ÂóÅ:]þ¬|·ŸÈÀ†<àžGLzÖï†G†.Qÿµn.´ÒÃtW(|Õκ·Ö¼òòÇI¼žh4‰$cHÑ1ù„©ÕzãæÛïYjWVêѭîîű´ú×uLžã±ç<"½âϰ ¥–•àÈZMZ _A¹@Yò|æ?t"¹ù×"þÒµ7¸ÐZùmtæÝ$LâeðC2îñÔ׃i~6ÖtàÈ$Y‡ð‰îŸï}jKê-ª-Ì÷¯k­¶àª2‡®ª£B¬t¿ÌÓ’I¯wcÖôO¥§ˆ¢°Ò¼I¦\ÂÙGfË*91ò1øït_i—zïÙuÍ*Þ! ¢M$m†wÎüHO}«Â´ßØÜÍ%”7SÂdòældóÔ|µîžÑm#°kÝlÏ<Ÿ;í>~ß”»X+dý?1OçêÂŒäçiÆÇoei¦é:…¥·™7 4Ê«ˆA;AëÑ ñ_-xÓÁþÓõëåŸÄæH£Pb·³€Ï<äž< ükؼk¨Kâ½]|9¦O5¦›§‚ZHdò _àRæþ*m'áæ{áèã×ï5›Ë;a”Ó/ïG”ª ?3*äzðEsQ« ÎOVuÆ\û8x›ÃÚ~—}cbnÏ—xó2ÉäÈ0YWg(`¤÷lô­Û„ºâÈÍÓÛ¤ðy¸Y%R8ùrqø× é¿ ü'¯kQÍ£Ùê)¥‰?µ,þd UŽçWô\që]—ÄgÔô? Ik¤Ü³ªÈ7Ýê+ÈÑ6 Þ(úó]ËÍ5­AÅÅ^çÍÐø3nµa¤Þjö·WLÂDº%!ôÝ!ùT~-ð|:Kqcâ=3Y³ Io&Ù$8Ÿ,òç­C¬jºÃÓõ¹0ò;ûÝFJ¢‚ÆÔ$4w:H²ÀŠê!'…mÇñzWT¢¹·Üé4oø«û*?µ®™«£ÿÇ»j–‘ÜÉÇDi8QÇzÁ×å¿}Rõ=-ñóíâ#"œ|…AxÀaš£owg•Õ¼šlwÊŠå¤u1c9À Ÿz¯%ÕÜÖðÁ5IJA+3=p;VqŒc²ÜfýçüK5Ì’A¯ê©`î/^} tœ¥tßÄÏëþ¶´Öµ£u=¼Û,~T±ã£¬£®{î¯<ùGß-Âü´ÐËÎ9ãšnœ4ºØ k~úöÝ¢¾¹’ç-¹|ÇbÊOSœÕK ÿ°4¤YYÜy±íÅÌb]¾ëèj“ñ8¦Œ´KUf5 ù$Ý+>Ä\Ÿº£^¯ð6ÚÃ_×5-Q¸>ßf`†(' ¬AÜ£}õã;A¯$8í]€üOyàÿXëö1¬²Û1>[ð‚+)ß‘¨ˆú‡Ä®îô8¬®Êùk 9#“hñžx¯ ½Ð5+{˜´ý*×û^ Õy­®­ÌÃ8çû¸+Ò¾‡Ó>1øCÅžas×wÈȾT›%¹¯¨|yáx'{«‹{8–Y‚“…Æü7BG¯½r¯„䘭ˆžHK+É@ä—ÙO‘L‡–õ{ -G6ÕÛ‚þé¬Ö2-ûW«WÐZÏÁíh*êw" è`.ínêcwîÉØ·a\Çü þÔâ™§'J½Ë&Ø‹WÅ–?¦k£ÚÓ©¬]Ç~]Ï,½Ô'ºX•¦…„BAbFøÔvÐI0‘²B/.k¤ñnƒ¥h±ýšÎøÜÌ2T(]HþÄW/æH˜ ØÃdõ«]Øzºå ´6b  ß“ˆÝŒ°úÕ ó´Ê²»1ÀẨâJàüÎWžµ¥ Ù-’du» TlõÏúU­@±fíµ¡/áS÷k'Å[¦.™q.уHP3ù ÑÓ˜§i‘wuôô©5;t½µ”s³zB¾Ÿ…g‰¥í©8“iU WÆ=¢Š)QEQEQEQEQEQEQEQEQEQEQES“@9ãÛÞ›RE¹QN |˜õÏÒª;ƒ=káгýŒÉýüÞaø‘kÜßn¢²ª²‡¶ò8çÞ †×J´²ŠG®Uj‘¿*GRkCÅú¤šn¢X<«b&ʪ¿†ë_SìöŠèyüÜͳñ‡fÐí–ûP…’KÆ Üåsónbk |,ò[Çz‰&d³+,@ôù—'8¯Xø¾·¦oc§JȶÐ}²xåa‡^>SÜ^kçë™ïÚ;§•8“ ‘Ž+¢•G('-Íù{õVmVU‚/ÝÛF¹USÀäŽ¹ÇæjÌÚF³ij/lôû˜tëß’9š!óÇÆMa½ÌrÝyÉk 1nÝå®qôõ®šûÆ—W:Siî¾j¬›ãó>ì#nݪ¿äU¶ú—È¡>¯ÐþÀU¤½Žà¼W # `}>SX×1˜öùŒÈã†Vù[ }kKAÒuNI®t:[© dÜÑǹP±Ú¼cÞ¨êÚ}Æ—¯\éºÂŸ´ÚNÑÜ€Û¹Só`Ôó+Ø®R•œ/su² 4§&½‹QÔ´-/ÂÒh—·Ó¬öŒ¯e¬ÏopÌÌJò}ë’øgá+oëÓ¼÷ÑèÚ}¢ùòJò€UAû«ž§ë™ñ)‹ûRæ85íE¿úNÖo?æõ¬/{½®cGÅíc}ª\j‘êwSÇp Ä.W|œùY³Ž;V Ý´BkÀ4±1 ùîyü8¦´“F¿e—rFX1]¼ò?¡!q÷~÷z¿A¤Z‚Þ îãŒÝ¥º?ßy¶§åž•k_·Š Ù- ¹‚ám¿v²Æ»|ÑÏÏY°üÇ '—–ÚHè ý*î‰<1j›¸-®#o•þÕ¼*ŒýïƒÅèbi6w•Ä6–áåvûÛOËõ=…t:§†uŸE î¡-¢Í;2GS,æ21œ•$ƒš}Þ²4{VÓ´éäò.co2x¢ò¢”7Q·«…ã5̽ÝÕíÁóå/.àø¸È… ¾#Ùþý›T×mî5mNQ-‹‡ÌùËîÇ{ôë_YYê6w5­Âαü­‡ÎÓ5ùëk}q¥Ÿ—t22ü¦> úúà×qà‰úÖy¥A,òèhø¸µH÷ù©»æÆzµpã0žÛߋװÓk¦‡ÑV¿´MFò}%]bºF•]X7E8 SÛÅÿ躧…5MsìWrjªÜ²JCÊꀃx8éÐ×Ï7zÌ:_¶<+ûÔ¾º3@_† žŒ;|Þ¾•î>+ø³¥j.³¢éßm7‘CäÏ5›+,'x1ûã±Ú+šxYÒ”]%ê5=î|àÞ¸ÑõÛ;T¸›M½µš5.‘ï†=Ã#sämí¥dêZMÒ^K Vo333G-¼NÉ*ËþÍ{O…âñ¥þ†ñ]éKª¶³g(×j"Gß,¶î¸ÜHî;SîäS¦©Jñ>£¾ñÁÒÌ–ŠØé¬ù³µµ¶ÄŠÛ³¶Nvío@+Ì~2êú­Þn·š|z‰icfã; ¿]¼×'¢øÈÏì¯/¿×[[Êã'þzÉÞÃæÀ#ø«KÅI?ˆ.lõ6º¸ s'Ùmí¥bÒKÓ€íÀ;O­^‡$ÓzÊG™jiñjG£Ë=âF©—¸‰G›/}¨3òç’Iý*åüÃ}&µ£Ëc=äm$½³.Ç$ȹ\¾¿Jêô] _ÑüO¥ëšE…­¤w>˜&‘.ËÛ¾]ô*öˆ|Aç†î4Ûý9µ ÖCm{­²v ÷ßråqü+Þ·œå¬®½BçÊ;æaþ&oá©#ò6æY2GAÿ<Öç‰ôÉbÕkd{Øå推Hë€G­Ø‹ú…žÖPÎû’8Õ¼¸º|¡Þ®­ok„ÿ{‘ÇÞù¿ÏÖœí¨sü&¶<'á-gÅz¯öV—FóË.yDcçïzW X|=>Ñ5 SXÑÄ2‰|ˆ¢¶fdÉ;wFGßüyجt0«ÞWo¡ÑJ“ªôg"«¾mÇz|öåmeprFÚí‡Ã?Çiq-ýŸØî4–¦—Tžw£ñ®*ú‹ å´œí‘+dQCB»”`õ[Št§M'%¹[(ÉžmÄ÷Í“Ô×A‰=½Ì°8’9Yz2ðk¶ð'µO 5ÕÖ›46“yîÎeù‡Ý#wô®>‡ŸÖ­XKSæUe*Áƒª‡ÛcÁ«Œ¾ËØN(û£Á>/Ñ<[á» y.­ ½¸Amq³m ê˜?˜¬Oø×OÒ´ëyô[´¼»¹‘\np­‡Áã=kåŸêÚ&›ã+Iõv{Íg&RcûÊ{˜ýk¨ø©ñMñ~›ick¥[iëa/—‚F8ðxT kW 0Š5WTOb÷ˆ¾0x®)Ò„v± ï…d/zç9DZ¬oøZṵ́$wöÐ_IíŠâA¶E¨8ù[ñçSîŒàÈœ´æ«?ä×¢Ô"ôDò£×ì¼cá­NÕ`¾Ò,šsÐ]Dv¯û î?)ÇQŽZ¹X¬ô ûÇK]ÖîÙÝö‰Ȇ…0 ǹ®87°«—7òÞC NÛÞÚ²1çoe­"ÒSc[Ò“HºhážiFsçåY:€9ëïPižeÄÂiciímFùQGÌ±çŸæjö£¨ éP}–ÝV]ß¼R½‰ô;ªõ†˜éò^Ü\2†…ÆøóóŸîã²]‰¿sßlWF8ß0©#/òî\Õˆ‹b;.ß”ú©ª.Å”IŠ$!P·?JØ„Ã#5¹c<|6ì•<ŸÂ´%œ%ô^UÓ¡<ÛÒ«Ö®»óP¸ +*¾;OÙ×’:¢î‚Š(®1…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@løFÕ/[éµGÝù5ÖëƒW–Å´(,ÛÍ‘šÚø±qØóqøTN¬ o#Ì´¿ 6·u;iö¶¶Vб†?=ÅÓ`ð»y?0í^™àß„/†´éµï²^ȳ%·˜"N 8ëë^áï ɦ闖÷ÂÖÎÈF­Åžå‘H\9mÝ9éXš×Š|3¦ê¦jN@Û#$:tÆNHÕæTÄÔ«.XmätÅ(­I<âŸxRÒÚÆÊŬÅôê±Yžd àŸr[pï\OŽµß i÷w²Aw¦]¥ÝÄ“‹h¿zÌX½èÃ]lþÓ|A%ʧ‰Øo•®"XÙRHË ÆâE-ø=áÉôK ݺœ0§`¼äù·={ÔFTa>k»±Jò<“U²ñìÚmïŠå±kK[˜ ›–|E$nÊ6lÛòßJãuO ]¨j7v(ZRÍ>¼tˆ½Ž†½Nßã _ƒ®¼/{_\XÃöh®-Ô43¾zØû uÅx>«ªÏªêSj„M,­¸î5èÒs×/øvìlx«PЯ;­¬˜¤QÉe')íbq$Ï5¨\!’I<ÅòÓ'£& Ö—†¼1wâ&ºrD‚Ö?2Må·œa@ON:íµ¿‡÷Z?„¶,5ì×_vÔ$(fgÇ-Ÿº§øjïËîÜ/ºž)¶ùV±Ãµq„bwuääžj±'ï)ý+¨ƒÁÚ U½¸³œiÑ6nÝYUá@@9ÝŒg¶kwIðlj®ï$ÒÛìö‘+JÓmó#G#8Ë–“Ù¶ÇsϘ±_½ìjݥ䶓,–è±ÈªÊ[«6Fó®ËJøa¯ëv×w:4–Ú’ÚÎÖ1Ï`dUkÓ~üÔÅÇö–µx–±xŸÅˆ¾'‹ì÷s\»9§£s¸5YñoÂx‹S:•—‡b´ †%HJ>Õ U^µÚëÃi5÷“kô=Sá—Æñ¶¶7šVËÉîá¶EXâÄìÄä³Õ­ñ¡´{ É«Åö½?U´‰ÞòÈÜ»¶”uˆÇ5Àü2øYyáïÇgªZy÷:tÑN.$}žT#'bíÉu>§ð¯¡u;»]6ú6ž °Þ®Ç›Ê,Ž›@9ï^-wNS¥ùšGmOŒî|jú¯†$Ñ5µ7e\5»ùh’[ãœo;N~ír0µÅµÂÜ[³)FݯÊWÒ¾ƒðŸ|)ª^ë÷óëqO“4ii³†ÿX;ž€S¿á]ÛènTÔtÖ}í, -¡žE‹ûÛ„äׯô•ãkòžo ø£YÕ/Ï^ñ ZÛ̃mÕÔfàÆÉ÷02_z¹âýÁóOpú6¹q}-Ç”MÕ¾þù?’üUÓèîÇáMÑæ÷“*2g¸ü²ƒÂúíÖ…âÛϳÝX1{{k¶ß$}è˜ônyõ¯hñ!ÐüQ¦Þønöxc%—spBòaºnÀé^a4]ë\ñ=Î-¯í6AjÑù²7˜rª¾Å«UÒ¼QâkL³šùîW´‚HÞ…2éÐן*Ö|üßÒ.öÐúËHðhË£XYG’¦Ï/È÷¯>ñ§ƒ.%†8ííbxC· ã‚xëÅ-–»¯xNtojöË,6ÂHn?’T ԰Ȩ¯¼W&¿á9µ'YFޱ¼üª‘ƒ’s\´aZæNéõ 5Ôñ[;í/ÆwR5“é¶©¾2Ù8dãkpy¯H¼ÕµoAlÐ[D‚$Å……êÈ ¯0‘õ>Ót’Û²ˆâš^Y—<6;Wqqe \}¦e7öööçlm.ݲ…BÝžs‡­YÇ‘è·GnB”%)ïùþ¯á}.ÒÆ »m]â’HŹ–ä‡óøºz¼3â/cÓ5ëhg1\5õ¿ØØc»Ÿa¶ºKêwQ_Ý$’˜„vʬ]£*ýAëšã|UâmKÄ[ÜêÍÇó™´-QO¹ÓMÝQ^) QEQEQEQEQEQEQEQEQEQEQEW¤|'µ ¥sóecDB¿ÞÎy½z—ÃBð茿#<ýO°sþx¯K.ëÖvÓézÁÓõ…—ÊĨådËa˜^±iâ_ Úƒ¬€\K’® ˜è¤öö¯Õ&sq#ï³aݾ••<÷𽽤²HáÛ 7è+èªÐMÎX_séZÿ@‚ÂK)å¶t¸q#C´`9þ_•o麎‘uo‰•U—y+ê§Ž•óF©s¨êw‹§Ø<»tØ%[†v By|¯q¶¡›ÇWÑh¯¤iqµ¼_d $ì6Ì0w6Ò¾µçÏÌ·:cUÇ¡ÞüOñ¾“wr4Ë-fK>XÜ_5²îi]NŒ’WÚ¼ueµûLijE–7ÄØÜÙá¶âËu¬Ë‰eœ>Ëy$'÷’«6J¨è=zu®‹ÃŸð‘ľKYÚx×Ïó’TAùBd“€võ®¸ÓYlL›Ý–´ýG_–›´Ôþͬ{f´µÊ޼UÆsšî-õ-^óÂh“Áu=ìKå›D“-"}àŒÄ—FkŸÑìãK‰“N–ú8í!hï¤ΕNr¤g‚»x®çM²[N8šÖýã·mα® à)Éoã9ô¬§(ö2¹çZoÃù–Ó\I²IÔ¨‡º®cžqŽV×~ºi6—Z4&ê$·ó%—ÍÝ$ÌHc²ðÕëúLbòs¼‘Æ®Í Y`hÁèxÉæŸ­ÞÏíe¦Á…ó7«þ°c:`sÅcí¥'ÊkÍÊ®xÞá³¥èÇ[‡U‚ÓPRP–b±ÚÝY†wèz΃¦kçOóuýVêêÑY ÝÝÉ´Üħœ)ËÆO^óÛífÓÆñÜÊ,î¥8MòAû»A¿®g&½sÅ~ ³ÆÝFv¹Y "{¢ÿY·“ó'µ:Î\ÑIn–—gžÍâs.©¨Ù¬-Ý£´ðþÌ[Ìv®Éѱ÷Ži³xûSšítÍB[U±µ¶@Ö¶Ëå%ÜÀ)ùŠŸ»ŸojÁñ¯oªZ«Íqî#Þ .áWÿß?tWc-õÍÎ䉖æ@]'c·Ë«jéi̵#Ôo¼E©ØÏ¥ÝksÅy¦Û²HýÙXÙ Çq^Ÿv¹›ÿˆšý壇¼ ²mŽÖ&tDQÓåµR:v¡©É4·×^zÛ„Q»}Ð09ëYS-·’§r[îùÜíÞ­Ÿ§#•ª¥À >òÞæ¹Ögón^?2/3çäŽú֗èþݬ%ÏÏ<Ð/˜6ãvTä`×}%Ì’nù™Ûq#ôÚ½á…Å„Ý7öµ¬í l\gåÁÎáØúQ7£SÑŸâÄÚlŸÙJ··™¤•"—`:í$‡ø‡zôí⎡¡yòK$Oi…¹wm¥C.U¸ì{WÊÞ*·€ê—Ãsù§äŠ8¶y€c±ë].—¨êöÖlÖm5ÅËGLÖÛvH‡ø;ó\0tä“¶¥sµÔõˆþ%\ÅâýFkX-µ h¢C,Û•âB>eÎaø× ÿÂE£x“Ãþv£$if6­ä+!`¥¿±ÔW‚kv²Ë£FÒÜKijZN§æ# îâ¨ø?Y×´[émt­÷ºtØÜ­ó4€p1ïÒ±žáº¨ï©¿¨è6º—‰¤Õ4;'Gº—ìëD"”õÚ¼qž†·, ³ð—Úï/n.%šX¾ÎLŸ)‡o'ÉçŽ*Õšê·Ú}õ÷ÙìÎ_2>SÔr¹ëÏZçÊIp›yç®kåß Eö×WÒÝ4o6|«9îÖ¥w¥øvå.5;x-ÌQ¥`…øä/9-\U°ü‰SLÖ½ÛFGí'}¤Í ÇCƤŒ2ÛµO }ý+Î>ê^—p°^kV7 ¿ý& `àœçŠ£â½^Êù´ûo.7òáv¸o¿30$*8ùví õkÀZž—¡ëúV¡¯X5»3Ÿ'Ïm¢5ÌXÏãÒ»ágAÀŽngsß™=Ž‘jVZ‡“_Át©‰&`»~_áêk³ ÄÉ-Ä¿eùŽS¯B½ªÖ³w©x‡UPÔe’c#: \ð u?z´mí-î’ßK³h’ÖIK¬g .@ù“qÚN1éúÖñ…þç5Рš]¬ö«<¤EaùVOï¤ÜvÀŸ½î8¦E5æ•­-ÃE&˜ð;HZ<4@öìúR˜Í“I«Çu ¸+pÐ…Þq´žV‰%v‹t¬ªÇår@\ýÜ“À©sähŽc;Æ:=˽Ղ­³ bÙœ¼»qË6Xw¬] Â×zµìvP_Z[O/}¢]ØôöÍn³$êËæÅîÈÄëÒ©Å ,ŒÞk+7÷~PßQÞ»a‰ge¥Mµ¹q¨ØÏà=ŽÛ¦ž'ò^w+ÊnÁ ¹k‚Wj|¯»æ?R1GÛ%Ã+G½J•OºG¦: –‘\§¦ZøÃM·¹³žÆÞY¬#R×ñyI8;s&Õ'‘‘ÍIqñâ÷Uµ‹LÛi¦ÂwNŒ.\Ýßjòˆó¿b>7Œ}}©cirËŒN8¬}œ7°r#éß ë3Íöö¶Žt 2ÉKí=Î9ú ­³¥øPwwOi©Y3´6ò\$˜ççýšð½ƺö‹¦ÝXØÞ2Ginò+*ßWš íœgtdÛ Ù ¨ä°þ,çgÍ­^yÓHÎ#Ü%ǘ¿ÂëЭiÅj˳=7À×zfŸywe}q²ù>U.Á†÷èyœu­ÇÚ”m#HLÏ·f7N¼s^dð•õJZFqþSÞ&ÓWQ¼Q+Ä$I×wlT4+ Q­®gŠI¤ù~fÝ´}:WŽ/Žõ9Þ6óß~ÝÁcûŸ½sú¦½«]êŸl¹ŸcE‚ª˜eãÿ¯P°5%£–‚uD}âìáÉw7›0VÛFÿ›Ž½«Åÿ°"‡SG{6Euá™xü=x’Þ0Ö$29]bo˜¢ÿ«n{¯J¹ªx×˼‡ÌM6ÐàIÐq‚1ƒUNŒ¨i}ÉœùúãáhpƺµÅœWSlUT‘òÈéŒô5gÆ^ µñ^”¶–wÙÛ$.Œˆ$ õµrÞ ñ»júÉ>æL—ë]Ö‡®ÛInÂùPíÚ¿wð5ãVúÄ&å}N˜85kAªüµ³²û]߉®šù:9@‘ûçõ¬ý/Áv÷ú–«gu®$JÍ!Jî8Ç®N=Í}v-o‚»yr ûÊØaY×ÿem&âÎÛËDÙŽ=+8æíË6j©G¡ãïˆ<#á{U×4¸ÛQó6F‘ùm2¾Ü4{yïX°ücÔSO·²Óå’\ß Å–ÅçøAWù¹ÿdV|¿ µøHâºkx¯t¶}ç÷»8wwç5Þ^k~Õ,®¼/&‹mu`‘‡[Û š'\mV rú×¥SC9ûË«3…Õ|‘ÜÚð£yãýs3bÑȆ[VBª›XïÀ$šì¼7¥B‘ÍöKíâ€5­´°¾÷’<çy8ìÕOÂ×6ðøsOÓ4»uÓÚõ˜tÚò²H¸äõûÆ»Û u¶·ù{Wn3\U+ªžô4LnÏG¹å¾7ðUî“àäÓü;\Û¬žu÷™òÉ7<Ÿ”`ý+Ë4­ ]SIÚ³4i =ÚÇm'œŒ8ù¨VÏq•ô¾¿}µ¤é<þDeé>Eõ¯ Ôêi<¶º{ÂÁ'ÌämÁ œ Ú’ææ¾g ZTù¹äbøÚó@ðսކÚÍŽ¯§¢3ÁB“æ´ã¸ŽxÊJ‘Í,÷–vRØÛCñ±ùp-É<–í^ƒ¯ÁŒ"²ðÞ—-®§«[¦/u+¹TÉs.FÖù¶‚ÍŽµÅÜZ &óQŒFö–Ï)äœá@ W_½–”As5ÎÄÅÉû›ÊÙÞêMf©ûÅùö®qÒµ´[{ŸÍ3kk}k-ůe5Ž×hÛ?.쟑Oâ©4kû]:ök™4÷¾¹ ÚïÎ’2»–ÇFϽUR—Og—H ÎÌ®.$ùü³»tr*ðÀü§&®1åÑîs(òèÌÛ›yó.QàóV9£;‡Ìî·>µjk׳F•(.p‰,‘m ƒÑOã^‹kàëÃPx£\‰¼Ka-²‰Ò]©l­»…9ÃÍyuýÙ‚FHÅÊ*“å]C´ÇÏäöŸ,~)Ž¥)ÆÂOi*BmJ¬fù‘—kùÕQ”™_œó µ ÞkL³4DåwólÔ©¹9“·S÷¿•Kk¡š #¶Jc=º}k;\Óüͱ†ÃÆ?ˆVŒ1G;ãj+u ´c?Ò¬*5äþXŠ}¼*â"äŸl•¥)òI4T&éË™,2Á#$ˆTŽô)q·Ÿ\×U«Z@'p'UqÓÓ>õÍÞGÁ°äð«ü?Z÷iUæ=ª5•T27e(QV†¥uö˜nVw‡7ØÅgg§•H™”WJfíšx²âì[t.ÿ (ÅvÖýLjX¬š{þè*ù$Ç‚[Ëæ¼ÎܘåRNÝ­Îk^iYç6&p vÇ¥m¤Œ%Ðܾ˜]ZÈåþe#?÷ÍyÖ¬¸¾“޼ôÅu¢i 9âC¹•«“ÕGút¿ýUæf‹÷3J1³e:(¢¾`é (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€3^ÙðîÌÞø6<6ГI¸¿'¨¯ƒÁ8»W¸ü¼†/ ÝùÛ™RIÛü*@þµêeÒå¨ý +|&gˆÖ5“É·­¿ sü]xõÊ\g%CòµÔMh“Ö7^IKv“‚TñŽ>µÍÞÌ‹ Æï'qf^0céÅ}B0JkVRo57eëEÊm¼hÊ“ċѾZÒŽÑ/Y["µÜª6ó¢‘Ëg?ìÖ•.å!¦:¾•ÓctXÒç°µ¾õ+¼·VùâSwãU¦–=Á†29;A#Ò®éIÿJ›TŽá×È CÐKÛwû5Aä‰bA{då\çpo§¥fQ"[É>¡”­o¸G¿#jàw5^@©&Aë[ºx¿ñgˆaC$ÝyCµcVòãàv;j ÿRÚÖáZVߘ™‚¶Tg× qH m¥ÙUzµ7Ëa¿?)Và Ñ};6Mt\Å·?,‘°ÝŒcw&²Á!N3Ò¥èÀбƒ p÷1N°cÊ3¢ü¨Äð éÍzVxôí1æC`ŒöQÜ.å¹—?,c»qï\N‡k«OòÙKå€ùr}ÙpÊ1ó|§õBÎâ%–òYÄ9c²&ÛÉöíH–®]Ò¬,&k¥ÔîšÐÀà©ó/8n:qõªoq%¤’Ak+ÄQš)ÏÛ?B tZ,úå­õì¶wS³—ÊŽŠÝן@j½ö”·ÃqæÚÚÛ¤‘ÛBØ*fVÜÂfî}ý)™¹§Ca¤ÛE©èú|¦îР7RÈ$e˜Çž™P‰þðjço´‹›X^úMòÌólCîg,êÚšëoï´}BÆ×O¶²kyGÙd]9¶‰&Å“8ù·pOzÞÓmì4+Xæ¾ð÷üJ%°6óË$Íû©ÞA‰_BBž*y¹VÄžsušnÔµ¾…îVWÃ%<àÿZËžHä1|ÈÀ'ä’:ûžÕÙßi–v·†ÛOÕ0'ާ’Åä|.ôF‚_”_öyª–‹köÝ@èöò„±Ø’#K›‰Çñóç‘ÒµææËR–ÖEšÑV;¥%šHþöäøÕ‹©_Pc)þ˜o;îäc¿¥ÎÒ¤±e…‘|â«ù@vÎ1UÖÊ[Ù¥ðùÚ6| š®‚êU™™fc€pYyÿ=+fÆY$·{i¥u‹†›ï7cOÃ’ykÔ?d¹‘ˆI7îö'°&­Xèz­¤›e‚P’¨1ºÈ # w¢èl‘uËØÛl~[È«„ùFÜ}=M'Ú6¿Ú`dRÿ1‰yÁ>ƒÒŸ,zˆ¯°îÞzgŒfµ!ðÌÒÜ­µŠ³;QêHPwg=*œ£>R;MË*²fÃm\±öâº}ÃêO2¯–d‰wù–‘ãÿwo5g'†5=7s¨ÝòÜJwG¸uã®EuZ^¥§Ú2› éå-„T—$oÿe°2 ?t×is/tq·2c³o kÑÊ°Ï »›sÉì{dµè–7—1ÛÍ"öDü­ßÛêO¯.“¬i3®ÙMÄKµË¨óŽé““»#tP¤Ù´P]*yn-°7N£ñäâ+mx›Æ £*XêñÝ\FÖ’ìƒØ^¼vïí[·4Q´¶ ¸ÀEÎ+EƒR¸¹UŠÉ›¨\ž­ÇëY:¾µ{ _Gv—O%Œ …¢ÜÎƼùÒUeîþ&ÑvZžoñâ{Ûi,lVðHYI;£üÍѱU~Ûý›C‘$ˆ¤ÆL;Ž•ÏüNñHÔ^KtÀúbŒß R® £¾ÿqß–W§F³©$zçÃ(~ÐüÐfÚ+8ãIY‹ùÛ8öúW¤Í&dOîäûÿŸçTtÈ :h‘ JŒËX¾ê¨éŠ{Goª’¤–ä¡`HÆGäk–„9)Æ/¡ÉZ§´›‘½¦RÆKWdŽ'þòeqï^'­_^x6ãP±mMÔôˆ˜4çÈòË>]¡Ž8~µì7_ÙŽÏ{+ùQ¯ÊÎÝùü+ȵ KDñæ¡x‚g·HÛ'’Cd¯fïšõð±½ù•ârT[} £é×±\[ÂVI~×.ž¡†AÜTüÄ}kKVÕão ÚÜϦ­äS¬.ÌoÓÎ(®Ü°P ÈÝ6ó\¾»o“q›;˲uˆ2essÈÆÐj®›ö‹›;g?‘k<&3Nf “þÐù[*«ÓsŽ4ÔhÜÑ­íuKé®#NH]&Ž ?{0_™™W“즽Dø{6¤¶Ö©}ya¥ïf·ócUq¸6y4ÿƒÞ :DÚ¹`¦úN6{Âíò@G+Žäýk×5*ÊðKpûÔÈWÎAÈû¤wSô¯>½uÏËháá-Z8hz·„uvÑ´õ–ÿL[všâ9XlûG÷ÐíïòµÃ|Ið³¨ëÖZÍýî™g§êW ðUíw®FâqŸ›­z•µ¬úEÌ“´7ÎÉþ¹Xʘ¼žµçšÿˆµ_P²¿ÕmÚ姇ìºmÝ¢\C2–¼ù½øâ²Tå78Ê6hò¯ø?Vð­Ô-s`×Vò©].dŠP;½1\¤7 óã?/ʤu÷&½ÓÆpx«Ç‹o¨øBòÒt•[N{lmCƒ¹&$ä W˜k]¤¬–%Ä—0>ÙÌB2®N?(¬å´#¶†m¹7+Ååùt«ü²{u-õ­‹`t÷‘R;™âˆÝlFÛ¥Oâ÷¦YÁl''É{ŠÅ#ÜXŸV=? ŸdvÚ{K ê韺óÐ1g8ÊíÆ;õ¨‰ÇtÆÅ¥hÒé·¨[IÞ6Æ9r ÙéŒeWýë‹ñV“ ¿z’¹1¶ìð+¨ûuäñAÛK0Cº!ýÎI8üêkëïµY¤H$%™ÀtÉO8S]PĨ=66§ZPš}$L+SBÞSŽ+®›K³’Õ®a1gÏŽÅr³@aŸÊ'å'†׫‡Ä«²Üö©b#WD?p³»ßüþ­jéåM»[y¡HË=qÒ³¦·h­í¥dÄs/·\šKg|ü¿+¹XzQvv4jèÒBÝsë\¾«ÿ²~Ê»œMb­µƒ·ß½qÚ™&îO@@ÿ&¼üÓø0£»*QEòÇHQEQEQEQEQEQEQEQEQEQEQE«Œó^•ðâg>¿A×ÎçÕúÕæ©×¿NÕÜ|:œ¢j6ÊAßH1êÿ_êe®Õ’2­ðKvn‘âÜóDZYÇsý+6Iš1ü’‚ 2FÊUÈýjÕð–&ÊeO˜Ž fŸe¡-æ™ws¹åº_õñ7Í&}Zú†ÒG4IãÐ-çдÙí'Ž;ù¤“d’1ÃÕûcF_j¡mmn!‚D¶€yC~ñÏéPÛ^\[iÑÝ4»’ ‰l¬AV#ïc×µåªj¤—ëwm{apÑÆ¿,}Ï–³±¯©‰>§u%¤Ö{”Cq0™ÑTrÃ8>¿ÅPBb1H¬pÁ~Qýãšèï<1jºRê6úÊHÞO˜m¥Œ£ç?tsùUWÁ«§Ãkrš…½Ì7B4ýÜÃtlÈNHþïs£‘¶žkKÈî­ŸË–&Œ9ÁrÏ]Õ,oÚúÖé’rÛ·¯õéõ®«MÒt¿kV–:Mõ¼S-€í°ìG˜¸G¿÷«ŽÔ { FXBŒ»ó´ŽÎC°]2XuýV™Òí³,oÎðÁŽ[†Í*ßÚÿg=´–i9gwV|ƒ¿0aÉéÐñP@ ‚6[f½¶eß³yd¹\}ðG^{TÝìV‡Wªx{É·ÓîtkÇ¿·žÐI±ÿåžÜ+åOÞk"ãK¾kH£Š(î`ÜŽÓ¬a0_8ý½`G+Dãk²àÿ z~á{©cŽçA×-oì%ŒLÐL¥ ¸sïéíŒbµŸQš Á®"—j…hd”.ÑùÕ8üG¥XÝ-}q&çEˆ×O<þUµ%R÷µÈrV±^ ͬÌסž(åmò3?27ûCûÕÕÞi7Zm®ý<‰åHþq,¼0ö§]x›Ã¾bØ9ó„¿Ç }súÕKÍxèGWER6ÿWøóÅg7Y½WÈ~é‰o¦]Í{g{p×^m­Ä·tŽd?<{Oa…ö®»VÐÝ´Y­Yþ× a~yK £ë\Äþ)¹kH/4ø¥½Š-Þlò íõ^p~ž•Òx{ÅÖºœ3Ay ÆÊ¡¶;lÚŸ*ôoö«:ÞÖêVبrìy‹|8|MöÖ—n­}{nÆí¬Ì8ÎÃ^•à9"Ótk]bÒÒE¸¿!¸Úæ5S÷I+ž‚¤Ší4ÏÜi÷gŽ †g¶¹xüµßÞ?Þ®ƒZ»gÑþßhŒæ< ãUËc¡+ôë^.wõ™Ó§*+áwõG£‚”/(Ë©Úx–ýîDš=š•1ìØ‘6Âùä*ôÉÉ_Jãô/ßhóÚê·—dØÜ(†t1íÛ"»+•Ãëü{esaÔ7íwr螺Föúô¬ëû û–Ôm®ï4éãŠ)¾Ñm¦×e›pùÍÇ¥t`± ¥%t¬sT§ÊÍÿØÂC¡\Û‹#4Mû¶l+0÷úׂCàÛí#Q[mBí"û~3ºî’¿ïèÅ{G†üEjñù×K1XÓ`eÛæ c"­Ã{q¶¢AtñM»Ë”lá¸ëí]Ôq2 ù›‚‘å—^–ùϼ]Kì,Œ&X·Åƒ¹‹uÏlVF¹à8mìÍî™+IióÄ70`61ù׳Üé6Ú[DîÉ8ƒ¸$ƒøãÖ¦×ô–ºÓ‚Ã"ðõ¼ö·tº²Ç<·W¬${YT&Ïîôé^d—+jçFƒ«u³<,OFBÆ;²³ óžù¨¯+X vô<×kãÿ é¾Ô>Ë íÅÒ,!±"åÕKg“Ó>•æ7¬ï9s*t®6¤™“Œš‘’îˆGžãÚ› ÜÊ’®YpS ·ó¦œþwãÔÿŸÇüâ´t©6i üëÐ}+¢ŒÜ&¹M®é«¢lîSH’Ù•Þ9¼PìÈV 9ô¬Ù4¤’E–òá-±Ú^€ñÈ®æòPÖ‘ËwÉJ®Àî}ï~•pRê.!šÑøKdxÅ}¬2=JsrW*̲A3C ÁëùW/xÛ®doV=k²Ö'â†`îìk³zŠâd'{ryàד›Ë÷q^gU.ãh¢Šù³`¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(×UðúpšêÂr|øÝ:÷ÆGòÊŒgžŸZÓÐn¾É«Ù^?Ì"•Xçž7s]xIòUL‰Çš-­ÚO¶âEˆ,`;«w5¡eu.‡b/ Ûus»z†N0cùU­~ña†îØâki™=8Åg®±vöqŲool Ž~µõÚ´pDâãºY¯W—ÊYOÏ´ü«ï]EÍþ™£jÚ„VöÐ_XÜÂmû~ëp~¿Ã\|ÈcÕvÜÔ*ìÜtoîš–tróËqehk¸Úö)rm¿ÊÚÌl­ÏÝ4¾}6K˜îu-Qà†;„G·o3ˆ³÷Õ”»Ysi#¬)Ó{ÿUšÖX¤òÙà]¨k°ÔP¯pöÚ„ÓØM*…‘¼©w|ÛsÆ tB{™$½Ý;O÷Ÿºçø‡½WŠ&rX2)ÿhã?J‹8•¹ö¬¶4/¬¯§?É¡•d@².x#o>üÔ—/s †™z f0Â9 `$[øñÎ{Œöª÷QÃnZWX—jÆÝníUí®fµ•d‰ˆ#øO!¾£Þ¥ÒjßÚ:Æ…i«K§$q¬n×QíT‘‡Íóà'^†³ì%¾±µiWT–Çû¨Ô¾$=§Vׇ¼_¯i w6VÐÎ\5´Pù¢%#¸`r¹õªI« Rõ®õ= .­ã„É`‚“’$%GoÊz’uêZÛÉ=­¶µý§kv©åÜEføàØP2NÞ+kÃÉ«ÏjÖ·l–9€{…`…Jàå>?Þ5ÊZÞÃáë5¹ûz߇n%>\M)V¶s‚CpvÉÂr?»]$õ`–ñëpÉqºh7²²Œ?± íÎkžª”´Š õÎ¥«hš\RLÅ–%Dò|âFÈäžO>±õkÏê‰5·ÙþÉ)GU•¡ûëœc#ææŸ©]ë·"hº­…ý›«+ÜX®æLùhWž•Ͷ­rgh5].XU®u“Ëómç7Ækžœ.¯eq3¿ðî·<¾]ÞÕž7 þeÈÆæ;FrrqƒéÞ©êžñ–ÑÀt«…r®ÁáVvÆzœs^ÓáëE½¾Ÿ},1•Hã‹ÌIJïù¼²3òŸök¢š.šï¡óÿu Òì ¦ T±s‹Qå*1>tÐô‹†‡Ïº’{hB³|¼®qÅlhú­‚ȶ²Ë;póO»  Š ÃW²é: º†œN·¤Û›Èó‡\¨eì{×9'Ãf¶Ô>Ö°D"3gn×P0O#5§Ö£+©0ä{™-s‘æÝYÇoq•™66NsÜ?áTï®—V·ilÒKa n‡ËC‰jÛyä(Íz}½®˜týŠÐIjë°2¨ÛŸ@xãë^m­i¶7·— á© Kç0’;XЬŠC’xaùVtj©Iè)GCOñV»£«Gkw,–-»•ÊAã?7Ú¾DµmÞ\ÛCŽÀãùÕ+­#T´o¶y3ÚGV6ñÜúV=Ý•ªù&Òqpòî;Nëšô½”%ÐÈ?µ®}ç™e3IçÉ’ÝsZ6º¡ž&â‘È]Ê7 sX |²a¾Vû¾[cØîdeÜÊøÚ㨫å]‹±Ð&®chÄ;¥òÎñ¹6ôþ•×h¾9U³’ÊçJ}F؂ٙ†ôÏð€*+˜ðï‡ouy7FÊví;[«/¨_jôÝáÝ¢•–{InÙ¾eVcÏ•Ɉ(«L#Ðät(5‹;KE¿K+ëY#imw”Y7«Œ‘ô®‚óK¹KåÕïôûøcU•bMÂîBÞ¨H÷â½FðÆoxשiWëQ¶=Ÿ÷ÍQÖ4Hu%vyÞÙà›/ÉÛ×ëüYô¯:X˜Ê^îÆÜš=¦‰âˆ$’æ²Õ,ÜKòÜȱï) à1úV펞]b–Ó÷3,{ ÄÃkóÓ`'5ÆA=ÞÆšFº[©•’Yd@Ù™rC¦,ýj=.^Êi¦±fBá6ºÇµ7gå98n„z¸§IÉ5Ìirô:ýK ëóhÉp²ZM ž(¾]þIç>Nø‡qªXjš^·¡ÙË)OôKÇó c>ªy8þ÷ðæ³î}RHµ¨ÕŸX´ðYsÈDZ»6]3]ÓD÷‘ÄîH›zíÚX}«çð¯êxÉS–Ï_ó;ëZ­5(ž;u⸵¥êö­mvhZÚ媸ü°z÷¯\еó+yaâ{tË•{–k‹;hÔ¹p7îÏOjÍ7pxr£Ô|˜¦lÉh˲@GNqÒ¾¢¾ZiÅêy¬èÝØõO‰¾"°¿¹·Õô‹é5­ØÂöûY¡,É`=sJ‘~!éšÇØíõ;±¦È˜U–Äc•;Œc*ãåõÅx½®«|°›KF‘IVÿT¼µ²ÇvÓÚ›‹@YŒgŽHÚX»«™Ã•$º\±u9œ‘Úx¾IµOY®›f"ÒnÈŽU”³Þ„9ó_éë]÷ÃWOŽêú[ÝjÙn¯¤D1żÁÖ‚øëé^á=Z.c³û{Á_ËY—y‰HÝŽ‡¯µGâMPðî¼Ö–Íö׆4›Ì·Cò÷FGÃ[ÔŸ<,k\줗©ÞøÚ⨙¬üIöÃmµ<…RÃq8mÍÐq\†¹âæò„P*»3#‰FT6Þ1ž3ÿÖ¤ñ‡‰,o­mí´ÍöÑ`£ì̇ïêk—‡TY4¹4ËljâFÌ;£Ô÷ÃõfˆbyUŽLF"\ï—bMfúÓí‹ý²[Y¢€¥˜åÎæÿ¾ªÎ…âký<‹Ë9Ìwðä$ÝäSŒ«x}k™¾º’VEÞzpLfªù¥xf®y×”š{œ¶o^§¬[øš÷ÄúÆu lá‚x|›…ó@iÓvï—vpÊ9Ñjòhš]½­Å•õ®­‘ÜÛY*ùqMϘŠ’>nzô¯1ðd¶´]_%¸™JIúÄ?=ÔbºMný¼_¬YEku<¯D§b€·Žv×5Jï]5GU*®1zêr~)ñN¡â Nk‹ÿ–)pž\mØr:þµ±I¥C4V›AaÄj@^ b»»øE,ô{Èbµï|à‹ ûÇ'%sžØÁ®u­7[ê#P¹vŽ(¼Èa2Œ(ß÷ãÎÕì+7 •W<·Btî¹îp©¢àÄÊ<Õm»xüjMbD³¶kHŠ™NŽà:u­å¶·‚ ®âLCÏ÷«„¼–=CRùäx¡û›Û¡ÅwåÔ}­Nil‡B>Ö~H—PÖ.µ·YÓÊùÖûتWlV!·e¶«TMÙâ»Wi]s /N½~„Vr,ÒÇ)‘“vãq>¦­ê›Û§œ.ݪËçåcŒÕ5žx”¢³*“¸ƒëëYš­†éæE°n †%~î*»’Üõ­»M^êH¾Á3Z¼2üŒÓD2£Ÿâ#­CugäI%´ÐˆÝ'ίôn„Õ¼Å\¯º Y%”KÙ¾Ùùÿö©-ešÞ9<´B%]„²ƒÁãÙ¥¶»º±•J…`þ\ƒ!ˆèH¨o.幺šî\&rÎ6€2}ªtˆv:ŒúMü¾Ž!ÓÞ8ØÌÛÙÆpÀƒëLÔåŽ÷þ&0[]Åy+™býÔŒÄÿ«Àý+xÁ ¹=³ü5~ËU¿±1½µÔ°yYòÊcå?þ±O@±>›|4멃Û}¢9Q¢–)3ñؘTðj–Ó5´6ÿh·ÜÊ#¹‰sÓ r Ë“Îk%¤q™fÌI÷7ÍüG<ž=ê&ÊY[iQü]Z¬i[O{§Mtö²É–2· þzT–·ò\Ç2]Ü/–ì&rß34¸ê}ù>•›…O™æ0}Ø*:c¥)²ŠúVRñâ2’7—»鎸ªŠ;Ý/V³¿Ži8VtjO´–`9Ç ôæµ#ÕSíD-¨µÄ*íöh›;ÊT*íÇ¥pö×6–­ucqöIY_÷1ª´mØcqݸՉ¼Es Ý±³4*Žmï` ÁNqÒ³;ô3=§ÀúÍì¡n"¾•"-óG*’ÛwZìÿ´ÖÑ–=BTò$ÈÂǸ/ûÄr+Ê<9ãÿ:ÉzÞe¬«;¤lÛü¼p8öÀæºÇ¿Óµ])nãÔVâÑ3nûÊ ùw/Qï^UJ-Êíhmòõ$Ö®­í/m³ËùwÍVŒêÄœ×Ó¯·J»cáM.;åÕ´¸Ò\¾øãû²©œ•9®WRžé®.‘nRymQÆøYAëó|§¡®³Ãþ ±kX`»¼|º€6åÇåEHN0\€¦¯©ãÿ/µhõ) ½WŽÍO—oå¾Q±Ø‘üUæÎâIdئ?›rý+Ý~:ÛÄÚ^ñüÜmFV»ã=;ÿ:ð6r’ñ¸Ÿºkס.jqv"Ú²ÂÝÝè%Ýò庥X·ž7ùŒŸx“Ð{š¢Û]”Cu¯^øUá‹+ÛºÕìÒkvaå´˜ËéÍkR|rb7¼ñEžbòŠ7–al1Èþ"Gõ¯hÐnígÓãxs7÷º¯û5Â\ØÛéñ¶Ø¼ÈÇ!Wæ<¯›á©,õ+ÛNé&6ØÞßÚ9ÛòŸ½õ¯¼=ºr4ƒäÐõ­VÎ+ëeV!drOþ½`C ÜØ]²ÜÈÜUØxéÍ[Ó. û0ŽÕÝbTÛ|Ÿ”vÏøÕèîå¥+&åÝéœq^;æ…ÑÕ£Ôó­sG—SÝKüo×}¼‡l>ò¯O©xzMioÕÖÙlÕz%ïÌY:vÀ¯LuŠê))_tg1ÚV°/[2¶ Èп›î ô«¢‹®Y+’áÔ¿¥Gi4ãí/cws¸9ko”'w>µ[GÕ!°ÕïRÅ–Kf˜æ9AÜ}ïb+;P—K°´ó´61I?úÓîe@9l¥qQëm…äþ%Ž a³ÔvCr’.\8ádúz×™¡VTzQ÷£·ùxiÛÙÉèÎþ㺥¸Õl®CX2Ileù£YTáÿÙùøjæâð%¹‡\žþâÇX“PVešÔI¾Ø¿ñmSýî£Ò®5x-|«Ý²|ò¡—jôéW/´›‡µí®^áâ—{¼G,ÃG|Üð1Yåù²Ä§ö|‰Äáy4zžg7ÂOOŠG±ÕÔêkÌ+"ìŽe=SwðµyÚ\iú›A}jÖÓÂøkvF\sÏZúOQÔ,w[hzâ©¶&2͉˜q¿ Wï^5ãûIF±,/ªÝjV–R1¶’vû–þÝ[k dשK§ïmäxxÌ„y¢Š1ÛÝX^[jškˆU¶îÙÉŽ½›Eñ=—Ùd²™„L¨‹Õg™†æ‘ÛëÛ5àϯÝIG+œªmEeè 6Û_Ô`žs2Ç÷s[S”&Úš<ª§Fç¥x“YÓ%ŒÛ]é2Ë3|ŽÛ— éÇUÁ®#P°²½·–ûFÓžÞ80³À»å G~õY5Qp$IúÀ9*29©Þíü{ÊÐy1žzö§ZPùLgZRz£î LZ%Ê(MTØ]Âîà·_ò+Bõe32‰3æ|¹gáª(â”Û˜#~óÊ\œ¸ü+‚SqcލÑÐïಖÖmwγȿ17ÊSÀÅnë¤YI=¬°O Ϙérv• q´qŒq\Ö™b÷7¾U¨bdoÝ$€l?Òñ½ÎšNŸy(iŽ%xvîU$qóu-\ò·8ÃL Ž!q+2ÏÌñ®YyÇJݼQh7-ªò¬Ëe0m»=ñf¸Ô¹‘?|UGʵtRMuj°¥¨Oµ\(T÷èšëÃB¤çh—MJO•LVZ6˜žS#Nd”©àíÀ?^µÀêò@‘[[C»Èì_ŒŸjÚø¡¨¥Æ¾¶±6ï² I6ýÕ“¸_§JæôÓ MÜ ¨è¿Nkëpô•((-Ï^%N “Úé®cy䉜+l8lÐ,î ˆHW÷rõÉäVô×0Éx±ÅòÛn # õíÖ Ö.­“ÜO'ŽÕßÊÙÈë2n”&:VoáS^9’áØã“P×Èc*{JògTUQEÆ0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¥O½ïüþ´”Á´Ð‚¯¾Ç¬F¥öÅ:ùmøôïëšîµÆ&T™—‚œ7±¯(Ù$\ÀŠöÝâÛXÑcyv¤¦Âv«aÖ¾-«znŽZѳLå--Jôk‘a}÷ÕKc{ã n1U56¼…d´Õ#ýáÇ—3}î=¾Enk”Ýl´Ù+ö°yïÿ׬Ù4íZŤ¶’&š8ó¾ÞpYqýåí^½ÌÕŽvXÿŽ9rË‘†ëTÈE?8a[7–Éöuž2À;7îþðˆ{Ÿñ²~Ÿ…e%ch‘qWìµ›Û[6°%g²vÞÖÒ®W>ÝÇáT¤Tf-Ø+ÑŽi²#ÄådR…{7›,˜ÈÒ¶Õ]ÙÎïT;PÆÅ¸eíýêfvš•6¶Ww¡£pˆ÷(_›å- ¥cVùì;ÓÌÈp+³©ç’~µ2ÙKpÅ$rì\.Þ;–Å€TR¥˜)ùOLÐÐewGó.*y-%·9vº1òäWÈ?CPÊ‚6Ø$£)©·q‘n'æÇÝëW-o¥¶VòŸÔƒ×‚*›Í»ñ¥+(%Càçkt5)´›»ƒy+NÐIJ·Š1‚ñP<Žÿ3»1àåŽzS6<ðO8é –v:ðäQ¨ŽDóÈ¥£îŠÛw:зžH•ßO‘]J¼7cÔvÝùVV9ë׎;ô 5 ]Á££Òµ¤vH›Y‹fC¸[oLõ¯`ð©}§Z­’£Ãµøe]¡xÝï×Ö¼ŽH„˜˜KÜ0=+²ðþ·©kfÓ^g£dT°_–9PqɂБæ‡+%÷GµGtºÍŸïH‘×÷o,ûÀŽœ×r‹áÍ^M’Ïyb#ó„ãËmʧk¡↺[ãKµ“ìñí‹ËÌ-1¼¼ð¬-SBºÓ¼Ao«=ë[[‰<ÄþÌoß°ÞÇ÷ªO÷XŽ5æBÑm' ¼?ãng’å·­¢?—òù›¡%7àõÊÿtÿµ]Õž¬5(ŽÕÙ:îm«ÆãÏBª1ÙiÚ•”Oe¥l·Ú9hB`»Hç®áQÍø{F–úd‰HRËŽU<Ï@;dúW_g7dµ6ãèwP\KµžDEg^Ÿ{4^*_«C<yÕ²d5y—…üZúü~Kÿ£^µü_¥z®©IGuö‰ñµw,{× \4àõÜÞŒåðîò•XâÇÌ‘’>QX×—Úmµ¼ßÙˆ­¤]’ ]ã•wi¨jÑ¿—s£¯ÙþƒúqéUu-*ÓXµòÚØ¯|ÉbÍQ ¶¼ÛÈ|¿Êp:lº=¶ù´=[Îw¬wÅŸM˜ú­tÖRÞO̶ßfd_øø‚Mñã?ÞãLV'Š<&L¶ŸÙò¬rÂ6Ÿ+7·J_ Üj-©ÿbßyVêðí!8Üs÷‡oJó3<š†*œ«Qvžç] eJrQž¨·âÿéþ%ÑäÒï‹´ÞrϰoÜ=~µVûÃPMáý?Kš´&1Ê­²Gä¯CøVå™SnÍóÄR2+ÀsV]Y@8çu~oý¡‹¤•.m"}'ÕéK[nyOˆ¼ßbhÑ6§v$ÛUmæÁ팑/á·çs[Omq$7<ðÑÈ»YO½{Ö°<¸yYQcRXôãÚ¼õü9sªI+Êžã3/–áÈFÜ÷î ¯»É³,F63[u>3:Êéay]'«èp(v†ÎjÓ¾å8à{Óo,®l¦h'LØÝÏÌE4õë^å½íO–h|W Ôr„ݱ·aº~5©k%ååóÝÙ…I¶üþXÛOzÉÝÿµ¥O-­âÍmeî;ƒÖ“唬ö%ítkh6×ÚÇk$°ÎÒq¹¿ýuWÄsOu²tD¸U ûß2ñþ5Øßyw:|:w•å¾%‹-††AÔƒëY>%ò¯Þ­Ãÿ|»6?šxoÃÒ¶ž p\ÛƒijÎB"|Ñòä±ëÞ¶uÍZêËD7^ZÅÁ^ “Óž¼â³­ËZjH®›Ì-–sŒÖw5•šÑt¨W Òyî[æ`yÂæº²øÉU7æêÆÇIwrÌXå÷1f«syj-~hv„.Wq-Ôâ¬èqòTón»R*K š…èKuòm-²¾g¨ÝüÍ}\V‡´Þ¥;šä¢Äi÷™ÏµGªíâ`§q?yñÔÖÆJ[Ÿ-v@:qüÿJ嵩ÚI<¾ËYâjûN]Bó3 É&Š(¯:BŠ(¤EPEPEPEPEPEPEPEPEPEPEPEP“ç§äMwßµ&+q¤†aýì8þðûÃòæ¸b0×8çÖ®éwÒX_Á{ùàŒãõÿ< îÂWöU"qæG°m^é÷áå‹í1¯ÌD¹¨ÏçNmvØË罡ž3Æí›öÆzçÔV͵µ®½¦Gqo&Ó4aÔÿw5,þ ›Èó¬åŠ)üœs^µôîp8Î~O ÙMmý¥¢¬WÃsƲmWNé×!«›×´+6hg‚ÎâÎ[’q ©`½ù^¿•l^èºÇ„\ɶki×t–êäîÿ=Ehi÷ú^µd¶wR%µÔ< xÃo#×¾jyºî‹ÕZöÁVF“÷m»j"Ž úûTnÎÄGpÅ6}ÝË]¦¡ifÚ”–wV-tªÛG”ÿn>A¬wzä`cÚ«+¿ ­cYó•c¥—OÓ.mUüÿ"í$˜í¿z$äå÷g•6óÂZŒv’][þýc]̉ó²¯ÔqÞ¹è'xæYØs•m§ó­uF`»®å`$ó>l}ÿ_z4jfH’ÆÅd“Ù—m>0ÛÔózéo¼Yu¬A¦²©-ºàcŒŒ‚Æ ¸ðÝÊ[Åuo4SZLÛaXíŒíëý ÍÜØ«HYËSÕ?»HLUGðþ•fk+ĺ6ÓÛ¹®MF~mÿZ×ñEëßë·#‡¸}Ž­¸0ŒÇ^[®Ïÿª½Ùjõ>v[²\ã¯éVáÄ»WÆ1UÎЩ†ãø¿ÏçW´‹y/%‘"s…,õâ¹õ“3fׇovOŸ+æ64o˜ۿç[>(±º:=¼‚+V{Ý~÷gÞ {­;ÃÞ kÅ·’þ)RIXJàü¿/÷1ë]_‰"HîÒÔ®^BF¿usŽO~µôh¹ST¦tÓ¡)Aó!©ùÖ6ò]^#Áæ|±‡2çÞ¸ëxÍÌí,ÿu[|›¾]ÕÞø¾Ùtûë©5kÛ©¤È òÿ?jáLŽ,Ý rç’ÝkÔÃaÙ߇§ìãæ%ÄÒÏtþCùhßt+`(­;8ã†-²n¯ÝÝòù‡×FÇdqï-¦ãWãfžMÒýÅ\ ®äº›>Å]Brc.ÿ$j>TÝÒ¹9äi%g=[Ú¶uû­äD™ç°ëXGŠð3ZüÒT—Czq²¸QEáš…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ëÎ?pã“ÆG^”Ú‘:ã¦NqÏL.i­ÆzG¿=µÃé31+Ñäwþ!^Ûcª£"¬­¶2~RM|Ÿks-Ìw±Ib}ËÛ¿ï×-õM;‡]Îçk§÷Hë_C„ª«C–[£’¬y_26ujÊ—Óµu\¤ùr2ohÁèyíëH¾Ñõ{SscåÃ2Ìqå8òúv*­Ø±Ô-^Úñ<Ëu»iO¥WûEÆ“abâ> ’`>~VÇèk¿Ùÿ.Œ…#¢º·ðŽ‚–ñêÖbÞè/úà¿»gçŒq\–ã?HÖ¦‚("þÉ22™-¾m¿í=¾”ÝGQ—Ä-ݽÅÏÙ`yr©<´?µæWÅn¢k{Ÿ4£moâÉÇ·×Òœihî8ê{è~*±Pì×`G´OïxÁÎÞ#U4 â[xô?ZE{iamuï|À>é`yÅyG‡|W«ØÊ±Yj1YoùkètñÞ¶£øŸ«XÂ- ²±T¼Æ»š?ø9ÇÒ±têEY3C¿Ö~ZKrX§ kŸ³gç¹àW”ø‡Àz•¥åÄ–¶2›xsÅ Ù'^Àõ¯eðOÅí/U1Á¨²Yêÿ,¤Såäz?^Ú¯OÓ5M^_™ ÜíÿUp¸p1Ôz×#¯V—Ç¢Õ›Üøv{S yœìé—R‡>•‘:$r_Þ.åÚÙ+Î9ô¯¶¯¼¤ÞOu$¶©3ÈÛŸÌPÀŸ§o¼£âgÃûVá­¬âˆù?¹*˜ Aù™ŽsÒµ†*We ;Åj|î¸Ü»ŽÕþõméú%ýÜ+9_²Û¾Išc´Hʃ÷ˆbžŸ)ÁÍEâQma …­„÷\Ú£DÁŽ#|“—Lò3žx®¤®+˜z²Ëo8±’&8ԇ˖ ÈbÀ|Ùª±Åyp²K2Á÷eþþ÷ÿ^ˆàY¦Œ(P$o/o÷XסøcÀ÷k©yhá<–.#Èo˜¤ñƒƒEû±ìyËÙ8Xz³L28?­ÝÀ›ÌqÅÇ–ü3sÓÕø“ÃW: /ö›Êñ|¥ÄÛâu%°ù¨Àé\‘·“‚ÉÏLcÒŽUÐ9ˆ²ë÷IZ‘.î#£YXFÜ”þË¥XE6Œ=ºÍ©Yˆñ•]cR®Kàö÷¢Ï ÏFð;š?Äk½ÕÔ?eŽî8›Ë¹qÐxÏqÅ')Ã[hG[<Ü* ŸgMÜœU‹heš9<µ Æ…ÙÃc€+¢øá“áz}5ÜÀBÈ[ûÛAÏN‡us¶î¨xMìz–túÖ±jZ­™Gyð‡Y0êK¤L±½¼ß&ɸù™Al}+ßu‹k—ÓÕ¬.‘£]Ì ·ÊÝqŸzù7Jž}?VŽX?ÖG ÇQ»ÿÖ+éí?U7ž°¼±vo8¶ÒÙŒ¼9õ®N0zTH2v÷¥-ÍEÏ$¨Âæ®Øj7WÏ e‘·`œÕ6‡Þ\Øõ¦cj€úÿá¼|Gáû{©°Å#Øð†ùTŠÕñ•g.¹¦ê^oïí·âƒæ{Õ俳&£ö•õ„Š3åä>{¹¯dº¹Žòs$[L̪¼}kóÞ)­õZRŒ_ÅúžÆWMÎ¥ú!’έ(^ßβ|O|¶z|’ÊÅ]¿'RM^˜Ç¹nvð+ξ"krIr,"Àª*ܱ5ùÎY„ž"º²º[žÖcІƒwסç:ƒù“I6rY¾õUW•·&xåˆ5bñI…õõ¤€ð7ÿU~¥M$’GåóŸ3nDJ»x=(o¼Å{þ´×}®yÏùÿëUù4ð‘Á;H¾TÝváyÁâ½_aÌ®`Ý·3Žñ:Ø5íþðŽŸáÈu[¥Y/çŒIæ3gËSÓ«Ç'X>[åWø¸^¯M¸ñž•á;}Îx®äˆIä³28ØýìgŒö^´Rþk#« Ë)jŽóOUû4“&ö*ÁIÝÎ Tñm­­¬’Þá×Y~_”Ÿ¥iB ¼6‘ljbLÉ´|ÅyÝìkâÖý:ªÇ̈0ûµèQWªzÓ÷`x¿Š¤–þró˾8•ÙŽ7“Çô®9¬Ò_ýZ4ºs¸V¶¹<±B±º§ï™¶úî¨õÏÙòY²Hp?/ç_@•‘Œ[FE¨óæUO”g ;T·“}žUs€sÇ­L‘}š6gå›§ûµÎke䨇åα¯YQ¦ç.†ÑÙBæO6Bç5 8³` Ü/ÝÅ6¾2¤ÝI9>§PQE˜‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ”c’œ¹è;ñÇ&˜ÐòGn@õéß©ÿ$×Cá u´»²’;y¾öGCýêç#¯©‡ùíAÏA´wà_óô®š5ó¢eecÜô«è~Ý‹€|¯Òµ5 …&¹¶ŠP‰%T7_n⼯Ú·Ú-¤’~ú0v–èÃÿ­]އ¯Íd<‰¦ó­Y¾h›ïGÛrú¯µ}\dªEN´dÚ³Áqh€3Ë,¶5pp=Záuk9¬¯ÛnäÈܤÿtŒÿ…zôÚD½§Ÿ§ÉA ¾Ý>aÏZâüGá N$K™W÷`„q¸HËŸîã¨öªS‹Ðp÷NGm‚9¢ ¼½iÑcÙK:&I%yQMš# ›Y‘€oáÀÿ= 5XÇ'™íeîŸçüÿ*½™¡ÑÍá·Xèhò¬ŠÈZxÙŽc*=³ÐÖï…µ]KH·‡Ízæ3luYÝý¤8hÏé\†‹5úÜI˜•·®Ù"?¼^ã·ZÖñT‘oo6-u?)Hሤrõ"B1×iÅD ¥¹ì}àŸéPÚÇ¢Ü^Nª7MA±*¨?wÍ7ç^…=¾Ÿ­Xy­ÝZÉÿ} WÄ6¶ú§ØŽ§bîâM˼àxuÛï^Ùð#ÇöQ]iÒùVöo'šæKŸž"F2¡¾òÿ*òq8¯RžæÐ›Z=f]I¿‘`1šÕ¿u¹pÑoQ\ßüa¯•K«4¹/0ÄÑ„I#ž+¯¸¶ƒQµ‡PÒïUör²LŠ”Ït-ã’h—þ›<ãÕkÍ…YEÞ,ÙǹÀi>ð‡®cÒ^iÕП÷ ѽ8¬ßˆz•œpÜOaå!’Dàí^ÙWS­x†ÂÚå¢yvÇkŒÂ}ÅrºÌk¨ÙæÌbž[­ÛÑÈ×£‡RºœÎz¯¢8[).um6ínwÝ—u¬J‰óƒøǽr—ž°Ò-Ω¨5½íÃ3"ÈèëìC^—¢é²i°\\'Í ýáU”Õ¨Úßéã_Õ-6Åeãµ^KN_ÔzW\ªò=[?µ¶¾e™-¬~Ño´î[oŒ®yÆG¨íT.ím„*ZÓî›k w§Ã’>¹®ûÄWú®·tÒ›Ÿ)C3¤[Oî½1Æð®ëì®û<é ÛŒª—®+µ'%¨E™& c(hçD#/Êó]—ÃMRÕµÛ]7T¼{k¸ó—®Å˜ #g¨ô®r=BßGfïê¯Ãàôç¯áT9O:4pb??û'’?•L£¥‹Üú¿ão‚×Ä^“Xµ}÷Öpï%{ó6xô¯”#}²°_•°ËÆkëÙïV¹Ö|/qg>ɾȨw¾KI¸±'èkÅþ4x6/ x¿ŠéÞgEtN@úWŸ…›…GBOm%ª¹ç·¾JaÐÊ.³— ‚ç^»ðêòãRðDñ¤¬ßbæEµqýî:׋ÉóËŽT9¯gø,­wx‰½,eDY\tÎÝÿk?¥uÖø[3ìw¾ЮEf¾‹iÛÊËêÜ×üVÒm!¼¶º±¸ûC\³ðž£Ò½ÞÊ÷íºÙ-%v³ƒ÷mr>ì„uükŽñ¦…iÏڃİD7?™€ß5ÁBmTw)ÚÚÚN¡:«ˆ6E»g˜ß*äŠí¼5e¡Ø]ÚÙǧ\]êpn$ Ã'û‹éV¼G©[:ÛÁåªÅo'ï!Nr? §§ëM¦÷ém失WfÜgø¿*õÖÆ|ìÒñÖ“ayk4Ö6iö˜Ã*ô`=«ÉpSåeÅ{þŒa—NVÑž]à"üÛ@¯ñš$zÌËQ†ÀU?w“ب3gá.¡qcâ¨~Î’?ˆªûÿöõ—®‘8G—„rµó—ÁøÝ³ya@Ç©ÿõWÐ~"¼‚ áæ²$6Ëå¦=5ùWËÛâ9ÙI/6ÿÈú¬¾*•(¶í{·èŒoêÙvÅ‘”Kü ‘ƼËW“íWÆúáâ–GÎÛhú¯ûGÐgµjø«PûlÏ$r³»aV";V²lgfM¸\uûÕžS…xzîϔαÿY®ÒÙhd)LËouùŸëPJ²Î{Öµë¤q³DdrQj“D V ­¿¡¯©¡{ÛCç\Šê7|ÛS&žMJÑVÇ žNx¬_TX•¢·68`k×§IÔ|¥Ó„ªÊÑ/^ßý’0Ÿß;|¾œgôûÿ j0Ûÿh\]Ásww&âæ]Å?x}k˜ÒnäŠôÜ4iqò‘‰zr1Zó^\)·È„`HåÞGN„à×·FŠ„UVd¬·=ÿᆽ#ØÅ¥ê;¿´-£ÌmÃyŠ¿Ö§øƒp’³R„[îÂŒ…äW˜x_X—KÖmîgR¾X ¿xzîüypîUùäžØ®6wëø×;¡Ë]Iu7¿56Ö O©(íóÎMWºfqæ°1ªýÅqV5dU¿;ú·ùÍcêwI—r1Ò½#8Ä¥©Þ4jÙs¸÷ÅsnKÇŠšöáç|3p8ªäc§O_ZùŒÃígË‘Ûd!ÆxéEW”PQEQEQEQEQEQEQEQEQEQEQEQEQEQESÓœ¦3Í2ž½ryõ'Òª;Î0>˜çüzÒ¶Nsß$ç?ç­éß8=Æúݨ^»”Óž˜ç×ò悉!–H¥IcyA_Ãüýk¶ÓnãÕ,üÌír)ö®Ž3Æqéíÿê«Z}üÖBx†•ìG¥zX,_±•¥ð³æ^g¨è:ÍæŠßu¦ˆðU[ñÎ+¹Òõˆ/¢òî&I:£ãržÕçVZê+qnw1À+¿ÛÖ¬‹k©<¹ÖM—+ò²ýÑ*þ|5}+Œf®ŽMsÀhªÒX~ý73(Çùô¯8½±šÞI3¨ŠÛ·Ê¿tf½cþ"¸†ám5_'->fÆOÅ Üm}Q¨‘óÊÏ¥L\“å‘|Ç“Á$Ö— =´Ï ñ¶å–<®Óê+ÐõuŸÇþƒP¶HVÑ·-ͤQbG‰¹ó}×>+ƒ»Neˆ… QúçØt×OðïV¸Ðuˆu›c¿Êa͸yø½1»Žh©k­ÑWêsvö…{#Ûy¶íþ®Hþ_÷OcÒ¬Ykͧê }ki³qÝ$r|«»=FÐ1^‘ñgÁÂò[}{IdŠÖÿ&KvM…dÆß¯8®WáôZÜD×*’\ÌÒ#ÛÜt]«ý?*˜ÔR‡2cݾxÜ]éðÙ^'–%]ß,ABÃøO÷«Õæ1MÊû•¸}+î5] K±Xôed¸F‘Z-«´{vÆ{WMðÇ]šm+f¡½Ý¥(ÍŒóØcé^+{ÖŠ±µ)ý’_øBîê¹°o6Xw“'ü¶_˜OnµÊxv{§Õ|‹«IÌ|~^`Rþ\ÉÎkÚ–E–©ëÞ¼XŸ[Òü{n’£ÿcͼË*/Ê9ãžjðÕ¥8ÊùV é³¾“ykmB.[ï —H¸[ÿM ÆùåDe*­´È¥_ºXd‹ìñó‘òùÝÛ­ydž仱ñ%Æ›5ûÈë)‘žN:1øUBð~Z‹šÍiz|Ä—‹†ØV_³‡Ÿä;¸ÀùOZàõ&Âúkˆ êVlVEê }y¯Føý¡íKEfµ“r-Äà‹„ãæ ýàk¦Õ´?ÅZ<Š¢i¡HëÁYtÇ(ÚOf.NˆùóÃWFk³¡ê7m W÷"oïqÐ çµëÓîäÍÚRGB­òöäW¤j Š_Ø´n»3!6Ò9«7½gøÇÂ÷“]ÛH°BÙ* ß!¾\©oÊ»ý¤^Äu;oÙŸP6RIlgÚÞD<Õã áö©û× |oðÊêÞóá´·ºcn­Vý+Àü ÞøŽÂÛM¹Ÿd.Lo/ÌÛˆ?Þ¯­oc[''7“·×#ýkÆÆ~çˆè‡¼š>l2Ã'ü³’B­î8#=ÇnõÐ|;Ö‰c«ÀÑ;\³*ÇЈñ»wó¢6ÚçW»…®YÛ\Çóü\ä·øUíCìVZ½ÅªIj.lFàæ¡ÿ–Mެ=:öÚRÐårÝçƒõÛMDµ´¸¹F‘Ôgåùԟᕊ|ëç»m‹+Éh‘Ÿ`LýÞz61šò¡qwrZÚ)ç…VMñ¾Ò<±ÏašõÞÿ`ڛĄ‚0 ÆÁµ;ð®iRTå̃™ÚǛƑ[êÃʶûdLÌeËpÞá⺨Ì:¼›R 5KvɉƒmÇNA«0ÙZß^*µ¯–<Âò36Ъ8ÀûÇšéüíJ…¡²‚+0~yWÊ d'øÖµœík Ó¹B ÎHRÛl*pÓmÛÉä׋xÝ#oÝÇo'˜¨ÁX¯¯q^Ë%ýä¶/!ÁŽøš,ïÎxÆz× ¡èpKªÈÓéí²•Ài•·LwuoÇÈÄGJU&váh:ÕQØü#ðÈ·ò¼àb`¿i¹m£÷h žõsÆ~"7Ú­ïÙßu«6#wå­lÝ^[h^¼Ñ⯥`.[œ»höí¯9½}ÎÌÇ׿ɝ‡«F3—=Me-_—da™æ<òö4Ÿ»Y‰”°mÙùi'•þfÛß 5Ú@]ñßmn.Ùùvò+zPNi96Vf ?!¿—ùNæý,Jý݇øýçúY¹¸·XË<‹ÿy…púÅÿÚæÂ|¨8Ö¾“EvÐ×AÕ–»š—ˆÌдPDn¬ßçé\éÜÄ»dóɦæ§·Æw#1šöaíS¥ JÑAÒBO”p[Ò·,bIã™6$SGåøÛ޵–Œ! XwLmSøÖû2É5Ô±T™ö¢ëÍtÅXSeÝGkµ²¸Û&Ö žøÏ­z?‰õ÷ùÿåµ+³+SòúTú¥ábÈ­Ço~k'¾r1^>cŒ·î¡ó:©ÂÁÐã'ô¤¥ïÛ§ZJùã`¢Š(QEQEQEQEQEQEQEQEQEQEQEQEQEQESÓ°Éôÿ>Ý)”ôÇ#ò´Öå!qœÕ½³ŸÏñ¤8<ôÈïý?*'¾÷ùô¥\îdãœvéüÿ:c‘Œ@pçÚ•‡$|ăŽ9íÍáFO{öéíý(ãŽ1ß§çø^Òu)ôÛŸ6&[ï/@Ãé^‹¥ê¢êÝ'‡d‘÷—q_lW–r:g‘íüªö‘©Üiw^lD•þ1ýážõë`±ÎŸ¹?‡ò1©Nú£Ô&¿±šD†òÕZÝ›jJ¹¹õ¨õ)ìc’]>V–ÖA‰Páöú+*+«Mb-Áv·ññ‚ õ¡ÌÖ£xœ½cò}³Õ„VíG+m˜1 ÷0ýxªöŒLþbHbnÆßyISùWIk5¾¤!Šò%V“îË/Žœt5fßHò~S*¼lŒ„¨ÚTwcÔ|?ªéþ+Ð×@¼I¦VÊÇ8P>A÷ÿw§5â>0Ñõ/kÒ³;ƒm²ö'Šìü3<¾ÕVi"y6ª¼…ÁšÝø»–­áKmfÚP³—]¬«Øç ×$W³–Ïó*2îs^ X5Ë/iwn»c ¹GԵ랞ÏF³{+«i ”¶Zxù^{Ž˜ü«Æ¼ÃI³†KÛ•ó<Í#É8ë^“¥ëo+BÑðÏò³7(Wºž˜oCYbi¹.^†—+=Y5›I£ó!ºŽd^ #†¬bÊ-^ÏË?ÄŒ¼:ç4›]?I·Ij‹æ#r>µ¹ÜQvŸº”ìW\¨Ïjó=—³~é§76ᦢ$ØÏ¹&ERÁ¾]ßJà|[¥2ë¾fží©hæÇË‘Øñ^±q,«#2¾>`Ë\¼ú}¥ÔËn<ØgÉ™w8ôîÖ´*Ù¶LÑÀÅ~Óªhž*[‹ ñ¶²Û7gŒé]/†Æ©¡\KÔë¨YÌCo¿€¸ѸªÚÕî“Z~þ<Ÿ¸Ñ}¦?Åòõ…dÜkpB·1=ºÙÈûdx÷49™zÆßt8J§M æåêuÇÃú/ˆïTÚ^:Hö%)$|uNø«šÏÃß¶èï¦Z4[%,e7[™“á\~›¯½•Õ¼óÀ­Þ¶™eSdztþUé>.ŠX•åG^9>õÏVéÛ‘èT' nUð/Ã+–÷Z$óMpAžægåˆ9Âà .k¤ÖmÚæÐØÄÓǮו@'•McªÇ:«‰C]ÊÙùO4³ßZ¢üòs^|G;ËsnhØùÛâÃÙ¿µ¦Ô4ÛYnT*Ûxé\­ç‹õ"ŒØ©¼€ƒÁç¾MqºÆ«©# ùîœûê>UÏ+ÅwFƒ¶¦\ÇM«k'FÔ6]+Éyä³YEoóFÌG˹sŸÎ¬Zë¨× .mÚIáŒ5ÔÉÞGlÞxSAhþÝúEÊ«¬n²8ÉéŽÜ}*MrÙmu±´û0ÌÌÙ!އ¿5ÁŠ£J«½Eð“WWMªnÉõêI«­ÅÝì·{â_4’Ã#'X7ð‚rÇ%¿½Ö½#E±MJ5[¨6Ãå1WRÜŸcšâ¼sáöŽÎìÛ±¶·þ6‘³žHþUãO.œæœç”á'iô9Å’8·Jîî-î+‘Ô|G¨Iq"Á!Š ß(*3ïS:${­ìƒ\¢tšSò(õÇrLÁ\÷+Ò½œ6Y:ÏS¶†7nzޏ»¸ŸdÎøèYª¹Æ:fƒš|Q<§»›Ò½5´HôKb5àr~•©,k•Ñ ncfù¿ïš±§ø{\–8nímO–ü¤‹"ëÅoxcDò®Ú{°®ÈÛFjÒ‰H[mÝåûIÔŒV<vã—Ö“5òŽ6Áó~>•ÕÝÜ.U~êí ßÄk›¿¿ŽÍIVß+{óõ­Sf7&½Ô"ÓíÙb`Ò79a»æ®VÔä–FÃnfïÜÑ«ê¯4¤+o-œrkŽ~f9õÿ òq¸åM:tß½ùéõc[',{š_¡#¸ç¥ ÏQ÷³ž;Pz3Ž2+曾§H”QE"BŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ž¤u-Çç®?Ïô¦R† ç¯Öš'#¨Àþ,àcÔ~”‡,2z2Jãõý)™#Ó#¡©ão'oýG=¿/~ÔÆ/÷ˆÂüÄàŒtçËŠOö°|œŸÿ_§¥ž70sÈãßüð(ùI€ދq@ë·¶9ÿ<Ð@$€CuàŽŸ—çøRmàŽ}x·ùÿëR·*FìøtöüÏ4bÆî{9xX©\c=;ÿŸÎ½Ãú¶ŸªÚù3:ÇqŒìo_Q^fpOrOqߥ:7hØ4G~`ßçüó^–*>ëÖ&3¦¥êz<¶³YÌ$Q¸}ì+îíÚº›QnïTʪ–Ò®ØÛw qÓÿ׊àôE,keªç».;ûÖÞÉl¦ßaæ Ù¿óþ?G Ƭy¢Î9Å­ÞêVd¼w¶ƒÍWi=‰þïµiXùWÚ|ÚÝ»yM‰¢i(­×­rú&¨û£;° ÆÑÀúé,äŽÚîÞþÎâSùl¿&HåݨšiX˜Œ¼Ñ´ï°,—Q43®T¶î0¥.š-¬­áòÒ¹Ãÿ«uÿ€ûV–¡$µ¯Ú-Ý’ y¸úÕ]=m?"öƹܽáY¦ÚÔÑNƒ¨–·Œy¾`~…—WßÖ¶c·háueÿG—ïÅ÷ü뇲ûEµº*Ä¢%“cÙeÏ¥všMç µ›å—o Ÿ¼qV…µ‰¤eܧ¨ECö5¹ò L%ÊHpÕš¶³ÙMà,—.̳¼V½ß“mr–Eé$k¹ÕO­pÞ(×-@Ác,¬Ñr_ùükJQ”´¤ƒÇ7Msnßðvš'Ûº}á½öñƒ^?äë0Þ\/)tÌÍ$Q¶Ðù98;׬Xê×W²2J`$Ø jÈÔ¥‡íR;Īcoœí®êk“Ý3çîr+ªNE SªyÊß2¿¶+J~òÙ"ŽÞ9&U#rò»OµAö™î¤i-cŽÒ0Á’ad§J–è'íŽç•pÑ›ü1[X\¨Õ³ñψtõó1ÂϵKFqÿŽÖ†§ñþæ³Lñª·ñ˜ÿÄÿž+†žv°Û%µÝÎçË >ß/žÕz5”Jâ$º—?0»‹ùÔ:PnöÔ Òk7nÖóÉgå·;·„-ŸÇÚ–ëÌÓCC|¿Ùóe™^xC«ŸgRi¿ðš¼ñìoiò®zº‘×ð®rÿP¾’f–ÚÍ,Ÿ¹ œm4Ò}¬UI¥¾UûTzžqärŸœ¾!¸âYå‘“µŸcþqY’¼v˜Œr™ A9äsüëSSÑídÓc½ŠYþØ #«"ÙÉÜHéZlŠ"›U¸i¼È¾ÊÏÎçD ~=jþƒ¦Þjzœv°’y>LFpŽyÚx\w®nÐÏiu¾ä†Lm.˜'šõÏ„ú]ß.¥q=½ä±/~U÷?SYÔŸ³ƒ‘J:¯†ü6¾Ó$Ô.Ýâ_³à|ÀŒ÷»\ _o¾¹»ùmØlqùñþEz§‹5†×l—,²I¹v(Ôò­_YÓ´xÑ£ˆæ6Ü.ÏÓ¶kÉ÷ª+¾§•Ž“”Õ8’êþ(‹O³¸¿´K¢¶ØNNÀÙôÇÒ¸ [Ç—wϸÙÂ1ÓÍ&P¨RqMÕü]w«\ÉäØÛ–vÊùŠ]²{ã§J奷»,ï,L»›æÊ÷Ïé^…8rÅw;p´=œ=õ¨·ú…Ý󖹟Øp?*§R¿†Óø!id Þ¸æ¯VÎíFï÷F±«îËájç”Ⱦ@THÎÞžüÖþcKçHªÉ»„?(.;}h ‘›™«á…žÊ ²WwÞ9o@jê24¾{7Ý…øWÜß{®~µ‡âZ;K}‰&Ù@éMÙjÌ~&[×uˆ¡M¢E/oJóíKQyݰǓÏj¯}w-Ì…³=ª Æ0O<Œóïôÿ ðñY‡ü»¥÷p§mÆàž{“ÞŽ3‘×µÇLñŽ˜£<sQ^ ¸Ç'?þªC×·áAú’LÑHL(¢ŠQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE àqÁõ¤¢˜'$0{óO×·øÒñœ1àv>Ýr3ÇOéQ½¿“¯RqŒã©üøS¸Ã•äðÃ9ç9¥G9…ãëߨíú÷£×¨sÓ§?ç‡qç$Ï#ê?/Òädòù=úô àu=z~?áKÜO\7¨)2Nã±éúñ@ƒyÇíÏñâ¯Øj×VD$r€Œ©< AÜF3óc®~‡­!È7v={~ÑJ´è»Á’Òg¨xZA¬É¶Îê?µ§+mŽ~™ë]­ƒ\Z0·¼…¡“¸‘OZùþ'’)D‘³Fé’¤ §wù=«Ð4/Š:ÝŠ¥¾³ëVCƒÒ®üô—¯jŠž“V9gG±íz1W‘ÙdÝÐ}ÞÝ)ɦÞD|ãbnŒ£5ÍxsÅ^×,ï²nûZÞ8Ã7´™®¿NÖ¯´™£‚O64'€Ë˜Èéô®†ÛÖ}m"œñ2ì}ÏÈÛ2½9왩›È-ÙbŠXYyWæÛï[7úΟ;,-fWÉcý;T‚lBÏ¿)è~t”¥¥Ðhy¡®^O(–æí˜/Wåæ³þÙ+¯˜'ÞËüLÜæ½BßÀ:& Ó^Mu(¤g*ŠI=8Ígë> ›MËkb—ÑÓÁ*3Üézw²+8í ’G*̹þ&þïãVn5[»»Íʼn”¨–Q†ÖG ³²¤úBB¬9ùAeîí­}ÀÚt3=äEªÊOÜd(þNU¡å9©¢–[;äT)xã7c®EbI?2ý©{d+&0G¦+Ø.õFYÎçCdßån<}À¬‰"´†f˜øe”·ñ!Üïž•”+¾¨O1‹M·šEò—ÎÓåÇÁüéÓè¶ÑƦYvÉÆï9vÏêQØi—™ô©íŸ'\n϶jÿƒd•KÙÅ1Œc«dûÕýb=t 3ÌDQÛ8kWŠáwpcb*a4LªÂýêðÞhù½lk>ñ Qîß¡áü½„çðæ¹øt;Tù/5å#þYVñ’}DUœ¸—rÝÎüŠŠRì¸Ñ» {×LÞšê5]:Æáq’ùýjåŸÃòÒy—²:¦s…`pi:‘KV8Åœ'–áˆUþdìßçüö®›ÂÚôúeʯÙÄŠÄ ™yÿõWP¿¬î7W òí_çMoèv·0Þ >u“w·BEfêÁè6™±yf×Ðý²Gó üî«Ïõ¿ êÚÄèÌÑFXd0éô¯L†ÓìžYžvº#î&Ì/óì;ÕCY“OÜûVe%¯ÎÜúzÖ“Ù ‘_žÚœ®…eskrše¾“öHÝvÉ"úgï]Uï€ÖíÚö ˜Š•o= ðÌ?‰¨²MM¥þÕ×­âÒô´“~'âR ¾õÌxËÆ—ZÎí7Jßof[”·ûì?ª¼ç/uú‰Ë—¡æšÕ­°ÔÞÞÆ_´Gaæ'Ýo§µmA¤¼Ç”;öñ%®FkgBÐ- ù®¬ÚI ¼üÇð®žM>A ¬â h¾ê.?, ~µÒä‘\×8è¼&ÖÀ¼·(7'ÌTóޯŦI»ýb¤kò§\(ÿ8ªZ߉ô-/){û¥fãp`;sÙzû׬x¯VÕ7#MäÛž<˜ŽÑOS\•±´éhÝØãMÈÜñ.µ¤Ïmer²òŸ(îçë\TÓË;ù’–nsÏ~½ê2¹8<“Ó×§·^•0±>Ÿ¯ ©[M‘Ó(Žíœǧ·ôãÿ­M'¯#ŸjBI9<š+Ϲ¥ÂŠ( AER¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ÊÊ:vÿ?…vÚ éÇ9¦Ž½qNÏsÏ|vÿ=*ÇŒîòôÏýè<}áœz‘œ{~õ p$qœ®:ñßùP¹äuÁì=¿QÅ1‡ `ã+Ï=LÆ‚<€Lœq×óúÐ0$ßôã¯ÿ«š: zíq‘Ö™`wã¡ßäÒŽ[+OSþsÒ“®Hï×{ô¥Á,Aç'~ø‡J`HóÇž3Óéþpk¡Ó|iâ d³]FG¶NMó¢óØŸýjæÀÏT“ü þŸ§¿çFyëƒÐ³þÏMáZtõ‹%Å=ÏIÒ>$\Etä"kvbL{·>Ç­z>‡âý?S‡u£ºãªíû§ðÿ?•|ÞXsŽÜã¨ÿëóëéÖ¬Aq=¼‹,3 µÖ²vå;ŽíÕj?¥µÄ{ËqÓkn?‡é^¡|Sñ.žR;“k©B§¥Ü ¶=œ`ô¯A±øŸàÍU!—WkË ‚¸1}›ÌsèÊrïšÝb(ÌŸg8tÆ¥y©‘i ¨ošBø$_JØû>¿²DŽú4¸—‘7”zãt_xJ{¿³Xß#$‡†iL?£ë]õ©,?q¦4¹ þ—»#ùS©/åZ 1îjY[Ý «:Æ7(Jýæîj÷ö|ï& * éŽMWÓ–tXãh<®?‰‰ÛùõíZ öÄyA—¦îíÏ¥pÊNæü¥i´ô¶ÊÙ#ø™E6=2Àýã9)û¿ËëWò6à¾õ†Ûëþî)s0±JÿLŠôaäû½ ûÕƒÿVmsÜP+ʜɗÏç[×—–°7’y?Ý\îÿ<Ôk·A—ûB§Rògmk M-„ÈŽõþõ²DŠÿ¬oßHÒÍo?ð…¿Ý+BâîÙÎØ‹K»µOÍUn/Z8Y–7…äÉŒ:Ò)Ø’ï0žKÌÓ²6Gÿ¯8—unö×m:ZE,[¾_´Üˆ’1èz殾§iåãû^&þ•BÓüóùck  i’=õý¤³»áŒ³|©øï VñVzÿ_‘ÞÔ‡Rñ’Cj.üÓŒ4:\{ÏôÑ¿ ¬¹'Ô¬Õ¯4Ï%›©ââæS,§é¿¥Vˆú»Íšµ„#îÅm,ŸøâíÿÇ«˜Öþ)苸éêÏëp©þ@“Uí©CFÐù%#U´Ío^˜K«jÇîT¯R?AO¹´ðî‰m‹ûä…Uw2–ùßéßò康ŽüA¨4›.¾Ëgä·M£§÷º×-,#o‘Ëg©l1ïþ{V53ÇH+þ=Ï]Ô~)iÖ¨ÑèºcKü"Y_`?×½yþ»â½g[r·w…-Ù¹‚#µ;~ð*Á°8 r3Ž{ÿú©¡@zr9ÿ=ëÍ©Œ«>¶ô75èxϩ摎Oÿ_s’Ý7ØOùâ˜éÛœtÏ¿× àu8>ÿÎ…+€Nr=óëÚÀƒÔŽG®qߎ8æœÙÉSžü~©ÿnT esþ—z2œòvú9ÿ?΋€æo¼sêzúÿúýM<ätëÓÔq׿?…G¹y%˜þ‡ßóïK½=I˜ÿ=ǸæÀ—ýÞGQ‘Ô ã>Ý?úÔ§øyã=¿—=:ãéPQŽXàúúßç·zrÊ3ÔÃÛÿÕþ@¡H¢]Ø8RzŽ˜þ]‰Ü}jÅ­õÝ£æÒêâÙÆè¦òúºxÿõzÕ1(Û€ÄztõúûQæ‚s–éÏÓ·OÃÛó¨Í®¡¡ØiØsø3µê‡C7o;Šu„¹7qžUô-³~±Îú÷è[fýcôï"B¨òŸÑ%©óKêOè$&<á¼zã÷+Bðš¥UÑÚŠk˜õâ<ݼî)ÖäÝÆyV«Ð¶ÍúÇ;èÞC¡m›õŽwм©®W:2µ€ªY zÕN^›1›¦ò›Ñ)┢öi•+©ù)†ñã%õáǛ·Å:Â\›¸Ï*ŽºÙ¿Xç}ûÈt-³~±Îú÷‘;PµGN+ŠJ)WÕ»4â·%´TÛ?ºN}Q·6ãn -µ¥i# ¤ät8óvó¸§XK“wåUo¡m›õŽwм‡BÛ7ëï ?yšèqæíçqN°—&î3ʪÏBÛ7ëï ?y…¶oÖ9ß@~ò-4!ÐãÍÛÎâa.MÜg•Už…¶oÖ9ß@~ò l߬s¾€ýäZhC¡Ç›·Å:Â\›¸Ï*«= l߬s¾€ýä:Ù¿Xç}ûȴЇC7o;Šu„¹7qžUVzÙ¿Xç}ûÈt-³~±Îú÷‘i¡‡nÞwë rnã<ª¬ô-³~±Îú÷è[fýcôï"ÓB<ݼî)ÖäÝÆyUYè[fýcôï!жÍúÇ;èÞE¦„:y»yÜS¬%É»Œòª³Ð¶ÍúÇ;èÞC¡m›õŽwм‹Mt8óvó¸§XK“wåUg¡m›õŽwм‡BÛ7ëï ?yšèqæíçqN°—&î3ʪÏBÛ7ëï ?y…¶oÖ9ß@~ò-4!ÐãÍÛÎâa.MÜg•Už…¶oÖ9ß@~ò l߬s¾€ýäZhC¡Ç›·Å:Â\›¸Ï*«= l߬s¾€ýä:Ù¿Xç}ûȴЇC7o;Šu„¹7qžUVzÙ¿Xç}ûÈt-³~±Îú÷‘i¡‡nÞwë rnã<ª¬ô-³~±Îú÷è[fýcôï"ÓB<ݼî)ÖäÝÆyUYè[fýcôï!жÍúÇ;èÞE¦„:y»yÜS¬%É»Œòª³Ð¶ÍúÇ;èÞC¡m›õŽwм‹Mt8óvó¸§XK“wåUg¡m›õŽwм‡BÛ7ëï ?yšèqæíçqN°—&î3ʪÏBÛ7ëï ?y…¶oÖ9ß@~ò-4!ÐãÍÛÎâa.MÜg•Už…¶oÖ9ß@~ò l߬s¾€ýäZhC¡Ç›·Å:Â\›¸Ï*«= l߬s¾€ýä:Ù¿Xç}ûȴЇC7o;Šu„¹7qžUVzÙ¿Xç}ûÈt-³~±Îú÷‘i¡‡nÞwë rnã<ª¬ô-³~±Îú÷è[fýcôï"ÓB<ݼî)ÖäÝÆyUYè[fýcôï!жÍúÇ;èÞE¦„:y»yÜS¬%É»Œòª³Ð¶ÍúÇ;èÞC¡m›õŽwм‹Mt8óvó¸§XK“wåUg¡m›õŽwм‡BÛ7ëï ?yšèqæíçqN°—&î3ʪÏBÛ7ëï ?y…¶oÖ9ß@~ò-4!ÐãÍÛÎâa.MÜg•Už…¶oÖ9ß@~ò l߬s¾€ýäZhC¡Ç›·Å:Â\›¸Ï*«= l߬s¾€ýä:Ù¿Xç}ûȴЇC7o;Šu„¹7qžUVzÙ¿Xç}ûÈt-³~±Îú÷‘i¡‡nÞwë rnã<ª¬ô-³~±Îú÷è[fýcôï"ÓB<ݼî)ÖäÝÆyUYè[fýcôï!жÍúÇ;èÞE¦„:y»yÜS¬%É»Œòª³Ð¶ÍúÇ;èÞC¡m›õŽwм‹Mt8óvó¸§XK“wåUg¡m›õŽwм‡BÛ7ëï ?yšèqæíçqN°—&î3ʪÏBÛ7ëï ?y…¶oÖ9ß@~ò-4!ÐãÍÛÎâa.MÜg•Už…¶oÖ9ß@~ò l߬s¾€ýäZhC¡Ç›·Å:Â\›¸Ï*«= l߬s¾€ýä:Ù¿Xç}ûȴЇC7o;Šu„¹7qžUVzÙ¿Xç}ûÈt-³~±Îú÷‘i¡‡nÞwë rnã<ª¬ô-³~±Îú÷è[fýcôï"ÓB<ݼî)ÖäÝÆyUYè[fýcôï!жÍúÇ;èÞE¦„:y»yÜS¬%É»Œòª³Ð¶ÍúÇ;èÞE'¾iÒÔ‹º¥M“ òï6¬œ`uǯÆ<Õ?œ*×ÚO°F ŒEPÖ´›í¤…¹“™[_)ž‘Îxm¬Ö¡×ØA\ÏÁÏó{[ûK~×bÓEYüÿ7µ¿´·ív-4gGêϼ鶴X‡­ë>†¤!– ¤!"B‚$!"B‚$|æ_bV]ɉ—›a–ÒTãŽ(%)‰$î }qå3lY.[Ö« º®‚®lKË«i‰uðËOÊP?ýD¦*6©ß—µë4§u>ìzZX+iºŽàŽÀ[e'õœ%PEmuK•~›ÚKrF‚·nÚšr9¹ˤø^ ƒûq_¯Vš½VÚM"V“kË«ä) §²‘" W®Ë¡Æ(r-Ó™^âáücê‘»÷qG\qÕ•¸µ-G‰QÉ‚-ÆìÔ ÖèZÅÏ}Vjm¯å2f–¦¼ˆÈ@òÔÔ©`{ÆœW…JDz>‚/¡pc iwŽ?ðâEÎsÔ¨âDŒíµxÝ–Ë©vÞ¹jôµ$ä Yµ¶“ãàùc"°6?+W ­ Õæd.IQ¸¦q€‡1à[{;ü$*'ë –NžÖ9¶.ŠuFÛ˜?)žé—¼·þH ‚/_í+®Û»)©¨ÛU¹ ´©âä«Á{>½'Àpc3<[ÕÚÕ»REJƒV¦N#ä½*ò›_‹ ï±ÚYËó¢-©;ÞA›ŽDa*˜hf’;ww‹ñ¿þß:Cö«rÿt‘P9D„!HBD„!HBD„!HBD„!HBD„!HBD„#­V™t©¹ÂpangöROô °¹^µ¥Ä»0Šgk\•Êî»Ù´¡Qÿª™î™áÝ )p#igwHñÄ‹®ú…*ýaúB*ïIHH¶°•K« ™™†G䃸Ÿ‚):颔T9›M€¾²º/ñçšÃJ×þwj=wVXù"^.[ÕÉ^ž˜vVEöRØuÒ¬…’‘“Ä’‘²j76¦km>Ø‘©OËç3•Ç™}ID»ç›H P<'Áˆc`eÜív¾ÁÞT6ámÑ–G>Ìf«ÛiÈ «‹§:ïxVj×;T‹jjqMÔ‘L¥¥—Ô”Ó„Ç* çÇRŸwÙ䔿3vÓÒŒ¢\©Ù IR@R³€Iòc*lA“é¨`IÚ±¬Âä¦Ñh»œ@$²ù­ÊÂT¤RFAqŒróµ()Š­ÁN•y?)¥> ÓãHÞ"käkÜl«c‰ò0{–zˆ·®‹váÛø·!PSc+C¥J@í)â<±÷®W(Ô6Põf«%Nmò…̾–Â`*;áÎ3GJú—¼Óô´4MòíYF¹?~Y’4Ö*SW=)s†^)R\ÁÁÁxq=Q—øZ—ðJ*Æ¥&)Ël8™¢òCExP^qƒÛ#ÂÅ#mv}˹Ôõ7O»§¹ÍßHJóŒª`ÿÝë­‡š˜a°êiÄ…!hPRTâ ÉÿÂAI!’?ÆÒ=¡~áÒµJü–³¤[a”53VšJ•.ËÙB‘•:áü–Ò7žß><–VDÂ÷›½†ÎñÉ[¬"”5XÕMa­ÎU™Êí:QÒÛÓ“3&RCkóP€SŸZ±‚q˜Ò«_úwqÌËN;;@­JáìKMÚ’w‚$)$vç¬ȯv"ö€ã =·û+Va1¼–6`\;6ýÿ…èd"4Ò-KnãÐÙ[ú¸RÒ˜—w»‹iÀRÚQI)­€qÚqÛ|_𛍔«J•W—¥ü(‚ûrë™Sròìà©!{;Ýp¤gþPÀñ&j±kZ.ã°qPéè](sœlÖí;lÕÇ„PýW±õ6ƹÙa¤ÏVæ^`<ÄÝQÔlï#!;•‘åÈ9‹Sɾ©wUô–›3{ÉÏËV·Z_v²¦žq QR‚€9#¬ñÆzãØ'|„‡¶ÖïºÆ¦š8šÇé_ºÊG„#q\ÖíºÚW]­Óé¡ LÌ%²¿Ùäù"Iph¹QÒã`.²Ð*WV4ÖeðËw­+'œ™ ‚|jÀ®£P•¤ÌU&H•—aO­Àr6¢|Â15Âà¬ÚlàBíB(}¹rjf»[ô‘T©´ª”ê¦ê niA–I+Ø  ´ìør<·rà¸h6óz¹X¦¡{f_K{~‚r|‘ª ŽušdX-õ4¦9°nVR¦ÓµSNj¨’•¼èʘqA(Bæ ”xµŒ˜Ü£s\×l7QÜÇ3S…’«Üš‡c[“*•­Ýt™)„îS+™Iq>4Œ‘åµî›nè—\Å»]§Õ[l€á•}.Ãh”ù`Òl ôÆà.F¥˜„#ç70Ĥ«³SO6à  ­ÇPJP2I'€2X/¤#\¥_–MTÌŠeÝBœîV‹óÄûk曵`÷©ÉÎíñÖ êU]¬¦G»èóµÃS)*p“±ùÛ;³é·5Ÿ6ì–ÙÕ.=I°mÊÁÕ»º#8Ó)ÛGíò|¸–BnR~I™Ù–f¥_@q§™XZIÞ• Äч±xZF²Ú€ºo[FÖ!7ÉK¦8¤í%©‰”¥ÅÐŒíâÖµuƺ¦ûŽÞºé¬ v¦SÎ8ƒßáÄ4…ítÐu¯e´B?.- 6§ZP„‚¥)GÄ“=OX´¶œùbjü¡p ÜÒ]Áì%.jð4oPŒ©xZ·[n¹m\Tʸgè”™KŠo<6€9Xü\·­ŸlÍ7+q]jCm©ÙÖÙR“œm¢ |.6¦‰½¬³ðVáÔ{ ß“•›¬Ýôi6gKòÅsI%æÔ2• J’GXŒÅ·^¢Ü´¦ê¶ýVN©"á!/ʺA#ˆÈàGXâ!pRÄ,”#]º¯›6Õp5q\ÔªcÅ;A—æR— {B3´G‡ѵµCO.ŠŠi´Ê=<¼ìK"e!ÕãŽÊ ò\&‰Ú·Bêñ yª8U¯´Ÿ`\Œyª8U¯´Ÿ`ˆüÓ=×xµNòR{Ìðz¹ŸƒŸæö·ö–ý®Å¦Š³ø9þokioÚìZhQú³ï;ê)ˆzÑî³èjB‰j B‚$!"B¦êÞ¤ÚÚcl.¹sN†ÁÊe¥[ÁzixùO_„ðf³×UÃEµ¨S5ˆ¥/N§K'i×ßV;ë$õ’O¦š¹®^«¦zŸhN.ϰ%IDõjaE·fGæäoêiQü£ÃOÕÒ«¨N±|ê«ïS­Vª±*æË“xÜ¿‚z”ò†ýá#¨CßS¹Ýe§’Ô•6TÉS¥S±/,žÄ§¬ö¨äž³YZÝN£H¹G±¥W&Ò÷?V}#»f1ùªØ þjNOY1¤­JZÊÖ¢¥’IÉ&8„!A„!A„!A„!A;ÒAÞM®š§dsmQ®Ù×e€%'Ot³ŽÀ’‘û$Dk"º6-–ÍËßV’Û<7Ishxù§GñŸN–(]¹‚'zÈJ<¯û5 ʨ̸Iñ^1 |ù‚/d$gdçåÓ3%6ÄÓ+KŒ¸•xˆÝˆñæ‡_®ÐŸç蕚1ÜçnRelŸ:H‰"Üå¬Ô=„±{MÎ6ŸÈži¹ŒøÔ´•zà‹ÓèE  rÕ¿åR”VmªH*kœ—Yòí(z£}¡òß·Ù»©)ÚdæÛÔ ˆ"·ˆÊëFçÒ“5Q«RÉâ&©ëV=Ümô®P:5RÇsê!¼ÿyR˜ÿý`ŠO„k´»îȪðeáoÎgô—ìTg™˜—}l¾Ó‰<…‚𾄠‰B„ ‰B„ ‰Ö©Íwœ×æ3‚$\Hñ¨lll±r’ž2:CUPC‹.­¦öP’IË€ÃÀ"=a"äm±ðRèU;4‡ŠªöRVÐÔö¦]¦©ki‡FòÒœF ˜ë )X¸ŽØ·¸,iÍO«2볓íÈÐeÖO{.­·UÚTSŒõ÷ǬF¡cZí\Ôªm¹Ü“²tf=>úÛRvIX'òŽä 𳼫“+oé]›M‘Re%æÐÓ,0Ù!CJ:†áäT6ˆ½úÜ€ÊÿuÖ͉DüE¬SK®ã¾Á@VÝÑ#ciÝÁIœXC«ªä²A"aA!-·»¨+¾9ã€"gÑ»uý1ЪÍï[IMÑp·Ý.•Žý½½Ì5äÚÚ#´žÈ„¹>ØuQÕö'ktù†­ú.ÌÔÊl¥/(ŵ¿ŽT2|ÄéËíU.F‘C–—~aEFqÖÚl«8ïPnÑòD˜¡’ž™Ó»\„Xwv*ÓÅUXÊvj‰¦ç¿´ŸŽÀ¡;ѯꎫ|K©Šl…®vr{›ç ÉHÈÊ”r7žü/]“T¥T'-äO±S,OIi†¤›an«p ì ç;·“àã¿%šk–.ƒ×/ʼ³ˆ¨UœzyHZÙB2†“Ž;Õ´z"=¤Ïê&¾P„ì”ȧR]r©6ãÍ(%Ç­¤ç#­eLÆ&¬0DÖëÉþæVc{ÅLîv£©£ûSž¢ÞV‰E³„úÚœ‘¢6åNi ÉJ AêRÖ1ž bÒF4âä§?UÔ;¡+?<ò“/!'β̪3„©n¥9'¯;ã½ËJ[‘»çjnÊÍ.Sa ™¦ÐKhR #ÈÎþ øãánêŘå™N¤QôªÜœ¯±*Û;©I›TÂÒIæÐ€¬«$«‰ëd3=ò`Ù ‚uw[5ŒE¢ž6BuwàÝ}ääµ.ªMJr„´iôIÂóß s¸ÒƒŒdíäÊï6·øn¼®/|Ý6J&‘a4ùtÿŽVµÖw’&6•š£ÙÓ×ÕݧV•³?),·åZ¦ÓÜÒRs¶FJJ¸lƒûû"¶é.£©ºõB–¨HL™ YÇ*µiA.¼޵l§Ëº’ÌŽ˜l&çáÅ`Úàd–¬Úàh··YàcËSOîŠe•ªS÷Å¢ÅW2¦UÙ£)•œ,@#g8jà ‘¬ÌÚum=ëM KŸ¤&ò^Ã]ˆ¶ÊërÕy .¥ÛrU 矞x8XžDûêRÜNÎBös‘Å#=Q3òž©Ohܧ]qÉfêÏ·&WÔÞÊ Á´UåÌi¥ÇP¿®´JY:+d=EYO9;=BÙa„õ’ö| NOg\ZZ%.BLjŸM’—lnfM„²ÐQÞ¢”'pÉɉ0ó.}Ö²‹‰T“a=úGâWv(G(‹Önà¬×”yEêŒð§KàîL³g#ö•²O–/¹¸ó³^lºõvαU¦ÎüÝJzF †Éii*%=ðÜ28‚!ˆ±Î,°¸çì¼Âdc€›8‹º¾ejHÙ×mnFY(YHþÑÌek>(“åŠcÊêæ—¬_5iÉRm­šd¡Nþt£å‘Ûß)C͹Q·ýÁLE¾Žë©¾¶ÃJM&H‰¹Œ`¬l“ÖRœÆý¡špVné+ÿS¤X§1 B©úwóD¥NŒœ`ïÙ$¨«zºÁòM*·5 ÐnoཋF…®{œ ˆ°·eûT›§ZnÔ‡&© ?¬L¦©ÄÍ9»i—Ý%ÃljJˆëÙŠ½zh^©[Ϲ5/Fj禣<Üå-ÐâŠAýËÏhÛ÷-jmÉ'uü4ºTÍB‡1&ÚšB¡"âO~žôá9ãß œoªiG)*ݱdIYìSå&•/´Ü´ÂX[%*QV9°@Z'ÇVsM¡#È‘‡V Fµ?9aÑH õuµ{CYo{nUù:Äëòit%ÚlâË(gzBUò…81èd›ÂbQ™€… :ÚW²xŒŒàÅ0Ñ ¸/½Afó¼©3´{f^gºš”¨ MO¯;Ci('y$ Ã9Ⱥ‘&Š'G¤¡â32YnÏß5óšXnY× Í²‚yÇ>J7q;ÆáãŠy¨T›2¥x¦zô×6k2‰t®aŠ]%-¾æäÐTŸáœcŒI<µ+•º5H2²OÌQ›Qªs{A* ¡· x œù@ˆ'’ÍÏoÊÌÎ0ö™ÍÞÌÎÛmË¥ñ,ÞÈÀÙXÙo$«)Üw‘ˆ×PtäÑ#Pí7?%²•¼ÜZaÚÏ` ~ä­{[³©Òï?b¾òhêm¦Ã3s¨˜yo¥¤(¥8À9%&èrÔéýU¥YR« S²³TöæÕ;ÃB” Hð$ï9<*êèº'fT嚺*·MÚZqRó­¬SåuG ‡ NÈ%$ü®¾†ƒ¨w%J{TÕ1¨TYÇ盬jÒ®8¦Üy´ÿÓ£wx”©)#ó³Ô"P×»Ïá]9 S-Ý'Ÿ´-Ù·Ü{™)dΩ¤€ƒ” ¢€\ÉÊ{ãÁG¸ik²ñ¤6ͺûò¦T&uþ¯<ÄÓnIR©®·4ô¾æžR”” c ”•Ûös&µ×ª:¥­U Z+MͽX«¢J”OÓd²‚“ù(Vv‹1.èbÓNG—eèܻɮמq‰p–Ï:“ža¡Œg½%×è½Ô‹®Ÿ1H•’eÄÓ%fPPûëqÅ ïJ¬g’Ü#ÖµbçÝ]8B±jCFêŸÎkí'Ø#×#FêŸÎkí'Ø"#ÿ4ÏuÞ-S£ü”žó<®gàçù½­ý¥¿k±i¢¬þ›ÚßÚ[ö»š~¬ûÎúŠb´{¬ú„"Z‚„ ‰F£«ºBÓK"rè®»ø¶FļºT“/v[G„ãyꞨ"Å리[šOjš­]}Ñ>øR)ôæÕøÙ§úP22®¯ ?\“˪'Q5Ob¯uO$9E·—‘/"Ç8ò?%ioоRŽýÿ›®í¨;QV¬êmÔnZ Ú·)ïbQNËËlÿÛOä$üµeG;ó Öªu ÕVf«U›vnveÂãÏ:¬©j=f¾÷5v­rV«V§››x÷ËWޤ¤ ÉHàÜ#šl„íJq’®Ì¾áÂ[m%DÄÙbòn¹jÌ¢jà›jÊ·ó)Ì{Vâ8½Ý*™|O°mR)ée¨6Œ]AP‹‹Jäë§rM„Ô&æçë*˜a¦´LTœ5KÚð‡Éþ±ËIÿÈxS¦¼÷Û‰VCªµÍ‚¤‹sòjµ'%Öª4Ôăÿ“´­¤ÅtÔÍ6¸¬9òÕN\¹,¯ìæ[B¿Ú.pžTḣ¹¸_gdu†jN=8»†¥¥ÂމAHBD„!HBD„!HBD„!HBD„!HBD„!MÑØ•œ›”P\¬Ûì(u¶áIõë¶y A¿iäw ïrJÚª<‘æ ŒÄ¶´j̱֢ܧ6çÜ_ú‰E-ÈòÖ¹4ìµ}M¬Ž·¥Ùpÿ™32«õ²U@»pÉNc©êk#?À”Ä"²ÔîYú¤Àn‘lM޲e]B½NcÕ57— m²Ÿ„´þŸ0:ûž ¶¿Ô…ECŽsWºÜå±eM("»jVé¤þTºÛ™Hñä ù„K¶>¼é=à¦Ú¥^2 L¬àKN“,é=€9£û$Ç–p‚/eÒ¤©!IPP;ÁqŽcË]$×MCÓi¶…*²ôí-$Ó'V§X)ìH'(>ãØôBµrÛÕ›dÔèÊT¼ô¾Êg¤?Œ—YæIß…>‘R$!"B‚$!"B‚!Þ0còÛm¶m @£4¶%››®<€§Ÿpd7ž¡ÙÚÍNqEOM»ŽÄœI$“’ašóÊg˜é<öŸ¶A}ÛÂi¨c »;W*ZÔrT¢|&>ŒLÌ0°¦^q²:Ò¢#åð€Eв-X…¸[WkÉ}2Õ5í¶­ÁÓÅ>8Ù®Z%.å¢=M©K·1,úÞ3ŒõˆŠbHÓùÇ&hÅ·TTY^ÈÏgTQâ4¼Áú$ÏËãxllg<ÁaÚÕKUvmë=C**m¥m4£ÖƒÂ5Xœùe0Ûz‰*êRœ•G·|A‘÷œ ±õ¸t3¿kš/í_¬ˆE;˜6„"ÙFHBEö”•™›x3*øx%´•Ts1*¹rPò‡g$xñÂ$:=ñ+'cÉÙv¥%ªuR¤èj§Xw yÀ¥Aü„v‘¼Æò§R­ù•HJ±Ý áo½¼¬õœpE§B3TtHÔ&´Ã{‚ÛÜR{{ bl²û BŠI_ˆBD„#)mÐ*÷Eú<‹³o¬ðBw =B0’FÆÒ÷›ÚW­iq³EÊÅÂ'Ëc“ô«AÞw;r£Š¥$qßQÈO˜Ä¥mPôîÑ6í¤ËÓHá9=ø×sÚ Î?wÊVòÊŽF¦Cݨoµ×EEÉlF®ÇCDwªŸD³.êØJ©6Í^u àã2kR?‹õÆÕOÐÍS¢Õu¤ž·æYoE/1h¦îúÓù ºÜº{@öœÆ&b£P˜Ï?;0à=Jp‘æŠòÇàöÝÞ+¥ƒ$úÙ-ìPd¿'[ðŸúɪo=<71ÙèóZFç®ûi'¯açìLLÆb9å6*ïÿ ƹ*Íœƒ¡‰ä¨eݪ£äÝ”ýïr:èeuì\47€¼?ÿœLUZÝ&”ÞÝF¥+*?ý×BIñ¸Ò«Z½kÉe}ÕQXý6SçV=@Äê\[¨õwwÿÈ·ïe«“X¯”·»H_öµÖ;£—c,¹Ošð6ñê1ZkzËïUnÖÝB½Š–­­©¤Rér²€î qEÕAꎵ-e½ž“%qÎ…p2Œ)¦üéy㦤8Û½n€öÞÿ#eÌV·“¬Õ ‘ǺÀ|ÅþKGªÛõÊS|åF“9*Ø8Ûq¢çáÈŸíîJzÉp¼—ê’²”ÀáÊœ¨N/ÆBvŒHtŽD$µõ,Ú³½2ÒJPÇJȾL7Ó"ýßÒ¹™LeßøÁ¼ÜøOaÎȪƗp*§rVçR1Þ !¬úŒmR\’tr]Ä­tÊ”Î?%ÙõàøñˆÍk^qB=2G%ýG LŸã¾ôd$¹:èÔ£{ ±ä]ß§VâÏ­PEåì#ÔÁ z<> Ò?_ïÑï¨sãlŸë^YFñ¡úQÓ]F¦Ü’O8%Ðàny”ϰ£ß¤Ž½ÛÇ„ôU: £©9E>6‰þ±Þ•Ñ'–HKzwm8mÓÛ_´"Ýi“²ÕtµBMÔ»/2Ò]ii9 J†AóìGŸ')O’fFFY™YVi–P†Ò77;#ïHBD„!HBD„!HBD„!H¯õ~2ÔÝI÷J]¦PS²Û÷“gpÚí ß»õOlXçTÌ“ï$eM¶¥Ú@ÌP Vš›ªÛKiµ)Jrh¸ñϬÇ9ÊIŠžö:ý‚ˬäÅ8´õV»˜5{MõþÂß1rWÒÙ[²MÍXÔ)TV'êO)TÙy´í´Ë@ãœ(;ЉÜqÝ!r”¶­åØìÎ d›íM6‰gše(^rœ¼`pðÜô®r†Ö—[ʦÎË|/La°¾p–À!]„r\Cü¢oºsòÆ|L§àz`PayÝ72Gv„îßãí»š((¹¦mp³G·‚Ñ‚Ã-F"&–á¬7q=ÝŸéL«óܨ­yBT©5—Ÿ)êJQ9õ,XrÔz­©;'F¬7Ln™*}e´¬ºâ°v;àq€Aêë#‘u3'![Õë‘¢Êê--Á½2Àí-ÏQHÀ“Ôb/×z„åi„'oaêå@¸â‰Ü”`gÀ3êˆ"Jjx)ë9ÇY ªÒÅYUS]#t˜Á¨{“³or‘m=y¸ªÖcë[õ·ÖÃçºjr””¼†Òx$«½Bã’I;ÆèâÎÖË–©ZmBªõRUšD±LËi NÚ¶BÆ7‚ ²AõÄÕpÈQ4ÿF…¯I—i-wpJ02úÖ6J±ÖNJ‰Š¹§4/ܤhi$s’”ôû‰Þ”óD+ð¯a>XØøäŽ&Hãªç^Ì–˜å†\.Y¤‰­¹°Ô.s·oÛ%q/»ÂFÖ”G8ƒ3<òIf]* ëQü”³:¡ªõZv^ÄŸ©KɯaçdCRÒÍ«óC®ü£àÎ|«ký÷2à¸fØ<ë³Ï@;Ûa'€ìί¶6Í3¡ký£gÉQ¨¶üŒ¼’u)LÜžIYÚ$’’I9ë'ÕŠ™kÞçú\Ø6º´ë #GÆGès¤KÅÀ¿`#W³ãذ‡ZoûN`ÌÕ&_˜D³ÜÔí>y´•$ƒ‚6Àȃû;@øö-VæÕbú¤ËÑ5Û›nQ·ƒÜõ6d¤…l”ïIÁÆx(Ä™£še¥4ÅãaÉíªb]M·8©Ç\Ê C VÊwîoV52ŽÝ†Ýbœš—Â2rÎ)™y… mÜ<#ÇdJšS3Y´¹(Ë?>§X~à¨8¹}­Å¶¼AImDx˜ÓA]+c–YìàËë¶²B‘‰á°¾X ¦» –Õs`qýþËzÕ½n“·$ž]1öX—J‹iueåŽ)e•Î;½Y‹'5;S’Ô½B}7UZlæZbrL4Ó½cd ãŠ>=K”¿¹L¥U%ÚM± _’–XÊT¤©)BˆíÚY_ŒDÉÊj«&mùZ2Ô…).wdÁý H{2U»Å§¾ˆÖM);6ö -´®†—G“ƯTnúýBѸÃK©Ê1Ý Ì¡!òA@nÈÚŒŒöoøëΧU­Ùê‹4zªiíR˜B!¤¬¾êˆï;à@À9òFÜ©ÎM]·~¨Í¡MQä¥W'*µ Ë9 Y²”$Û'Y¦'î'$)ép"já©í8¥É sdgÀ >hÙW<â)‹ˆ{γ}vuÿv-TT´Æ¢¦¬00X \\ìÕ³`ù«OÉúã¸+ZHÕáxO)ÕÎ)Ù¦¶›J9©dîNäÇeJÏb„CWÖ²_¢½I§Ð*ûµÙ̬’%Û!’§6 RI=±2jk’¶ÞHXôLsï0ÔŒ»)=òX@J=ƒ Æ|'°ÄÉæ”›×”»õ’ºe­*TÙÆSΑͶ<{Ö¯Ýó¹óWGKŽ‹ÝbväOÏâ£S280ék%`.y³n ;@·nÏ‚°ú³tOÛ”ÚM"F¨–*3Š ruÆÁæÐ€6œ)ÁÉìáœDjëý}S5© fv~m-âQ’ ¼âJO|BRüuœ€3¸Çï• Ú>®Ï´ï{&O• þVý²<¥^¨“ù!éäµ—¥’uY™dü9^m3³)=øB·´Þz€Iœ£éĸ…T¯°c–ßû[jŒ] tMtŽFàvëõ³WzÇh•Ýx·iN^×ìüçÁÓë Qin4“0öÿí8dmp8ÆOXRöÖë²~èU»m793QÁ&E–æñ׌žQל̵ÁY\³„.‘'ÌI€~K«i`v¢3ú ÆÝÈÖÒ’ èü¥t¡Ukë\ÜìÁYjJž8gªT{}lÏ…¯-Ž=Z޲{I;W•%˜t,¨|mt’ ëÍ`fÎÜÔ9WÖ»þÖ›(ªÔª”éö±·#S–NNwŒ‚žuîð³ZaÈÝÚ_%zÍsr-­¥÷P$ì¶´(¥Xð2àqŒuz³£sõõÌוlMT˜üI˜ž•BÔœ¸-iÆ7ž5ÎPy*\Ý“m™Z{»So4ÂB¤§ä¤»çÊmç[‡SÉ3$çØ/}{òµs.Åj¢§|<Ù;HÔÏ·¹kú—®5tU¥¨v¼¤ÈŸ IJKˇ§xQIÈBHßÀœoÎ#Y­^ÉnL°.#V¢;2’¹nyæ&sÈ;9H;ÆãÃ<#OÑvõJå¼ëz‹gQ¥Ÿsž\’ŸuæQ•¤:7lï†î¢B¿mí~»iLÊT-š{¯0µ)§—P—vGP㘅$5rÅ¥é™h6høöVÔQC6£ ‚»ÏÄŒûö)'“ž§Lj-¦ÍM¦›«RCS*la.%`ì/G½P#†ï©7&«¤ö¥ËX¿W/!9QœBÜÙx:ÒvNSåN/tJmC³+†)Êë33Ó\Ó)m`«e%GŠq¸c¢†fÆÖÇ+ÆŸyÖ¹:ŠwJ÷Ë …ö¨|v-¦„LPÇ‘º§ó…ZûIöõÈÇ‘º§ó…ZûIöˆÿÍ3Ýw‹Tèÿ%'¼Ï«™ø9þokioÚìZh«?ƒŸæö·ö–ý®Å¦…«>󾢘‡­ë>†¤!– ¤j:Ã{ÈéÖœÖ.Ùà•÷?ô쓎yõw­£Ê¢3Ø2z£nŠUËÆó ûEÓ)I… XõbƒRra¼ŸýÏWŠÝÁPE¥Z©>·î;­Õ½30£ß&\«*ÇfÚ·~ÊqÀƇ+–¦jÕ—ç9¶w!†ú›m# OØ"D·ÉÁ¬ÔêOnï[HõÄI‡'‰Ô3qÍÊ-@ÙÊGi)ñö—aÒ—Ý_òaÍn+ vjz„!%_tHBDïL¿úI¿ÛÈÑ#xÓu†ä'œQÂR OE~)®˜ü¸ƒ(Ô‹Îý« j\…bàœÎô´…¼QžÓÁ#Çîœò5½ëÔÕãU“·e•‚¦ÿ¨™Ça„'øŠ:nGÄÝsÈOpÕÇì¹JÎ_ÎíTÑ÷göû¨öµ­“K*EŒÓC©É¥•ŸáN1ç1‚‘«êû4e(Vj 'ªd²‚Sã(‡ŒÅè°ù-i¬¦ß~Œí~iümUÞu9ÿúÀóƒ-2O¥Ê"R›#-%.„´ÃImÄÄ_Ó`Ô4ß‚1|γó\½_(1*¿[1¶CPý…—Ÿ–W$]U¸œDÍÀì¼Â÷©SosÏãö‘Ÿ„Nvg#=<¦4…ÜuJµz`| %Ù>$§*ÿ4Y¨â,ö*boµi®‘é­®ð%—G—Zx:©pãŸÄ¼Ÿ\nÍ6ÛHm´¡#€HÀÌ‚.aA„!A„!A„!AѬR)ÕvÛn£/Ï%³”µ'ÈDc>%[?Fÿ=Ïz4½Óè´í#ìTˆÛN[鸃ÜÐö a„kß­Ÿ£žç½‰VÏÑ¿ÏsÞŒ4ª?HÞ>Už…/ëvè󭆯|J¶~þ{žô>%[?Fÿ=ÏzU¤o*hRþ·n:Øa÷Ä«gèßç¹ïCâU³ôoóÜ÷¡¥QúFñò¦…/ëvè󭆯|J¶~þ{žô>%[?Fÿ=ÏzU¤o*hRþ·n:ØHFAâ"¨êÞ„ß•ɺ…ŒÌµ^™0²±$·’Û­dä§¿!*¨ƒŸX߉VÏÑ¿Ïsއīgèßç¹ïDjšgÔ€$¦ßì|ªmdtd˜¥p¾ßDyÕ?¥i浡ÐÄžœók–üã)lxw¯®$‹#“f¹Y–¯ë qª’eðeè²j=΀8%jÀÝú©=§„O­Ÿ£žç½‰VÏÑ¿ÏsÞˆôøciߦț|ô•I«ÆVÎnIl´GkºåQn§Â•$„2©å¢M–Û!-ä8 yb¥P­«›T/ÊÔ…¶™g¥èÁa¹…l¡åm„p =ñÝÞõq‰÷[ôîùªTfÁ§É5"Ë;ŒÄéŒWÊP Î7$}¹8è‚- fuëÒM‰‹‚zmn8¦fVR†°S”ý£åˆÎ¢šª±ÓLÍ@X þæöû)Äiè°öAÍÉÒq°¿pµý—Qt‘¯µ|%m5GÚG0ª”üûk #ØÂ” ?`öƒi-#K-çeØ|Ôk3ÊTj+Nò†p”É@ÉÀð’|?Ä«gèßç¹ïCâU³ôoóÜ÷¢u%¤›ŒkÿcåUµØƒkHçev¯õúÕjÖݾÅ95jÒÚ­Ò&Ÿ/¥¤Ì!·X$’RBÈÎ Üc·##ʧo&Þ~Öœv\6Bª5&[i´À«eAkÆî9ñ±_­Ÿ£žç½‰VÏÑ¿ÏsÞˆî¯p;@yéR›Úļ’6Æ’=ž–¢´Òº¥œŸ…n›Ú¥ai!,0âĤ°%[?Fÿ=Ïz3’•òLÙœÁv‹HùV¸«£ŠÀ×›8Üú"çÿ¿bØa÷Ä«gèßç¹ïCâU³ôoóÜ÷¢^•GéÇÊ hRþ·n:€ußFï¹›’¡Y²˜—ªÉT^vMO¥·³½_,„‘œAÎþgLµ­-u¤K|N²jÍ2£ßµð³l°¢xäm€bØüJ¶~þ{žô>%[?Fÿ=Ïz*ß„µä/“ˆÿÕ]ÇŽº6ÎmBìÅÊ´¹<Ü=~R½«•3'(A– Óâ€Àqcâ’®µqÌÓªöKw•ŒåQÖä_d¥É%ìá¶ÖBA‚pHÝÃ> FCâU³ôoóÜ÷¡ñ*Ùú7ùî{Ñ1´Îl\Ⱥ9i*¯u[8œÊí!®ú#Ϊ<®šëm­r™ê}©4äÒAm¹Ê}E´m§‡Ê  vŒ†Œjž 8ܽÿPfÙ¡•‡&åå¦Äìážà%<:ÊŽ:“Æ,?Ä«gèßç¹ïCâU³ôoóÜ÷¢,xXcƒ¹°m³Ò6ý´TÙ±“+ „_m˜/ûé]t¦ìš|†—LÙ6¬»ÉdÉ.^QöBˆâ£Ääñ;ÉÉ;â¢Öô—[ê5”ɦÎBÊðÛÎM°H'åmmðÝœqðEÇø•lýü÷=è|J¶~þ{žôm¨¡5 ¸Õø•i¥Ä›K¢ŽWX›þ·}W‡Jµ¢—D’”£ºÝbyrªLÛ¬L´Ãm• @¸ µ€8“¸çn‰“œÜ:k¦•Õ)È7EJaÉ…K¥ô+;)Ùe²°vxíçvÜI¿­Ÿ£žç½‰VÏÑ¿ÏsÞ…= ©ËŒlÿì|«ÊœE•Mke‘Ä7ýGUJƉêÍÛtÓ$ë´&äè}ξj -\ÙP粕’N3ÀEÊi´4Òi ChHJR‘€à`>%[?Fÿ=Ïz­Ÿ£žç½))ŸI7½ãåZë«"®—šG_Ýu ò‰ÑûºµpLÜvcLT8‘ÝR<–Ö¤¨„@ˆ ðÏV‡iÛzïG¦ …—VL¡'2îUÐÔ¶O€°0zðwŨø•lýü÷=è|J¶~þ{žôE“ 8¸° í³ˆÿÕL‡104HM……Ø ¿û({Kô"¬»¡›ËSêS“Œ)+“£È#Œ(|’³¶G挌’¨ÚyEéÕfô¦IÔ-—y¤†]^Â_AÁÀQÜÝœ ç|o­Ÿ£žç½‰VÏÑ¿ÏsÞ‰Œ˜yžmº>ñò¨­¯ ¨ó´‡ú:«wmkÅŒôÔ­*Щ°ÜÒöŸi‰ÙnmdnÈQQ >¾7K;H5áºr÷¨&Û§•…¹##:§¦Ÿ=‹t”笂O`bsø•lýü÷=è|J¶~þ{žôhng9€ÛeÜH %øÀ,-l…·ÚC ö%¥ëÍóŸ Ri6=3íË/œXri´$–Áç6¸«9ÏVcHäÉ¥·ÅPk7…ÿOfEã-ÌSÙna· Õ—d„à$¯”bkø•lýü÷=èûÈÚ´Ææåd9·š9B¹åœV#{(Ü*9òÁsþÇPîôTW×´ÒŠf¼è‹ÿÄ “™ÓY¨Bh©Ç‘º§ó…ZûIöõÈÇ‘º§ó…ZûIöˆÿÍ3Ýw‹Tèÿ%'¼Ï«™ø9þokioÚìZh«?ƒŸæö·ö–ý®Å¦…«>󾢘‡­ë>†¤!– ¬5ñqÓí >«sU³'M•\ÛðU²7$xTp„ˆòÒå¸*U4Vnº›ÉURæ›qK=ikkixìI8Hð$ˆ¶¿„6óuš N)ïýaá7:”üʆÒ| ^OþÔR«ši¹Š—5/-*.Î8§v|§'ËX¸BDŒ·V˜¢V¥ªRÇ¿e`‘Ú:Äc¡½‘¥®gŽáí6![{f³)]£³Q“p-'xëIë2qYtÒôšµja.9Ny_Žk³õ‡†,….~R§$Üä“èy—”©'1òœg~6­l;Ø÷¯·r{€\ÚA´}ÇríBŠUÑ$lRŸiå~¡´6Òˆß׳ìcµR©ðv‰ÕЕl©÷Ccn#NjdŽÿ'4|Õ(ß¡‡½Ê¥Î:§æÞyG%Å•)”!sÂËáÝ!G¨„ ‰B„ ‰B„XžO<—î+ôK×®¾~ƒn+ lâfm?¨“ò8ùãP•—i\—e{^7T_ä0Œ„ÎR¸$xI.‹ò9¦HsmKžMJ`a_Ê,¥„žÅ¹¹Kñ ‹1aÙvÅDnkQ婲ˆù´÷îÎZŽõ &6"ÆÛ”%¹Ln™A¥IÓ$ÛC2Ì¥´ Œ”!HBD1Ä~V¤¤eF5+‡Q­ZÔÔõ^E·Â¶y…M 9ŸwycÂà6¬ƒIضøF»l]Ô˧W"KhÛâ•ÕP$úY÷U6énuÚZ]S2ó qXÙRÀɃ¿ñÇÀìBÂ6¬ü!,W†a ù×aÇXBæŽqæ ²ô ®þa˜Ö¾1¿ýÕs¥Õ«RÔZÝ6‚Ôš&jµ”K±. ÎT@Éìó ½Ñ*PÌ3 ãæ=X¦a˜B™†a"f„~q-4§Á#& µ~ó Æ ©Y™“Z1.ÚÛq;H;G8ðÆ=ë±æZS®J¶” ¢IÜ# 6­œÛ–Û˜f#Ý3Ô¦o«’¯N¦Ê$ÉÒ€ôÐ' qDá#È ‰ 2ë,™†a ùצYqÆ“´ £ˆÔ .Ø»ù†cSøÕ3ýÍ¿9Ž>5ÌÿsoÎcu«g2õ¶æKã\Ï÷6üæ5êþ«1F®ÒisRmíOͶÁ;Dl( ¯\z$i^œ5©;0Ì!­i˜f‚&a˜G^ze¬…«ŠŽÊG†<$r½“`»†cV¨\“²Sk–vI’¤!DÆ»wꤵ¯Ir£Sa¦ÛH;#'*=‚0ç[{-¼Ãíu%挟×&.k:›_˜“î3>Ï>†s’”(÷„øÓƒåŒôlZS0Ì|ßu 2§\8JFIr§sLH¿Í¹ONʆÒ\ÆÒzÁÒ5»VÆFçì[>a˜Ó¾9¤®I´¤ ’^áêžœê ¥ëVªÉÓ¥‡1LØKÓ si%Åg »>hñ²µÆÁzè^Ár·|Ã0„lZ“0Ì!LÃ0ŒäÃr²êyÓ„Þ3¹^€I°_lÃ1©Oݳ2S*—~˜±ÚïÛÂ:3š‚ܤºß˜“i¶Ð2¥)üê]"<Öþ‹&K{Ì3Ž—ÞÌ_t™º¬”¯5&ÌÒ¥šsoh:RQ†á<ñ·FÐn.´cb™†cV¨]*ié–e›aNË,¡Ö]^Ê÷u§ó‡‹‚1ßæÿ¸5çTi5ƒbVöÒÊápõ˜f#šÖ¤;K§;:üƒ[ §?)[ãbÓ[¥›ÎÍ’¸Yh3Ýi[`çaIYI¬ùc6J×þ„¾?ĶLÃ0„lZ“0Ì!LÃ0ŒEVªóäȰ‡ÔÂJ*VŸ{c½¬+8ãt†ÍY|Ã1 ›îsèö‰Q†ºuŠJÙ“3U„JË#HR••x‡\jQ@­æŽP.B•óƒN“ÝÕ[ÞŠkïѾ ¥?ÿЩÒC³ ý&Éù(ìÏ<1ÔFðn.£ceÉ#uOç µö“ìë‘#uOç µö“ìÿšgºï©±þJOyžW3ðsüÞÖþÒߵشÑV?Ííoí-û]‹M ?V}ç}E1Z=Ö} HB4Ípº>&i%Ïr%ÎméJ{άãñÊ ÿI‰j ó÷”UènÝsºîVJSÔiôõg)Ùoñi)ðm¯ËäwæV¦é,²O|úËË9Þq¸g×"B‚$!"Fß§¬Ý«PŠžpáÖ³ÃÂ<1¨B4TSÇSŠQpTšJ¹i%Blà­õ§'W§5?"ê]eÔäìŽäV3½æ­YðÓÅNÓ]Wã[üßÖcisòµ)§džKÌ:¤©'Œ|·Â$Ã¥¶Ö‡ì{×Ú° z,Vž6¸î]¨yCO¬i ¬s³y#Ä"Bˆ§”kN*‡ èÎÂ^ øÈŒ06â_5*Á8T¶îñP\!úâørB‚$!"B‚$!"Gb%7QžbBBYÙ™©…†Ùe¤•-j'8˜îÚvífë¸%(4 gªki¦Æ|dž 8’wôC“W'Ê—H7Vª%Š¥Ôê?4S”KgŠÏ ¸ŸÝZ_&^K”Ûn^ZèÔIF§ë„‡%äB™“ë]K_¨xxŦJB@àr!HBD„!Hà˜äÇN®·[¥Í8ÃjqÔ´¢”§‰8à<1á6 Ð.l¢Íxºªi•¦Y¶ËÊn»sMw»‰âà þ1ß Ïß,û.ܵ¨ÒôÚ]2Y!¤·ÖØS¯+­kQÞ¢Nýñ³~ÛèÖ©;ž¢BL„‚äRÃêØ,¨ëNzñ‘ÕÄÄÑDÔšq/|‰‰ÛeKq”m¡¨ôsà-‘ \©‰ÄÙ»¥Ê´å¥hÔÝ·Ô´õSbžÃl $¼úÎ2ü Þ4–ÔE•§Ô›x·ØgjiÁÿqõwÎ+ø‰òb"ªS‡R¹C2ß6µPl¦„‚Çö“®|œŽÐA?¸"ÀÊ-cK5„ÆÇDv.cƒ˜â6­+ç0ài…¸$f1 +½m'y9q^ÁýcµYpá™d:)t-jq# Qïdn¢WØÙJ†;‹¯¤üÛRrOM:B[ej'¨˜¬ú ,õÿÊ>«wNm9+Dmn7à<æRäNÑò“ùD\© i¼ê’æË³CšFýøâ}^Øøò8¶UEÒVë-ìÎW¦:²Fþoä¶½þ!7ÔÔ˥Š-½ohg ‡ûÇî·7ÏU&œIÜÊy–ÿhî?×Í@½”àuEED×yW”°Y‚ÿÛ¨ã”e}›{OßK LMm% ³ÄÿA壒e®«oFéÓ)¬©U‚®=ÿÈÀ|¦! qqËóWíû M¤=4Û쟒’vœW‘ ù¢âÊK³)(̬³im–P–ÛBx% `ä6•¶eÔ ×^KÅõ„!”$„!H×®§Âæ%¤v°’yÇ<ðÆÃRoºg§&Ü¥ó øºý@ùâ%dš ¶jm Eò_%Ã…KSï¶•­g=ðÎPˆ7•uÀ)ÖôµG~håAŽ{bk.a—ß¹þe ·Ât¹åj‹ §]ŒÔLÃi^{TÄy¶|ñ•eäºÒ\O$Ý`‘î‹i©NW&èQ?ª­Ç׈խy¾z”Úv²[;úz¢š´h=t8yÓŒ/Ý÷&š©Q•ÙÉ,•'Æ7d`9U¶è¸µwÒÁôùާ¼¨>xÛž!m© Þ1èTɶ¹AÎÑVvZ©Ë¼ÀR8“ãÂHòÆT2úVXbPúÊÓB‹uB„bë¶±#$9ÉÇà86;La$‚6Ü­‘Æé¢ÕÅVyj{¸$ÔÊqÌîi=dƳQim‰9L÷2NT³Åå~qðvùÔçPÛj”smÿÔ>÷•Ö3ù£×íÒ5 ò¦Ùô'gç]G;²y–³½jÿh¥ž¡Ò;DmþêâºjFÄÍ'lÛŸ°û¦¦ß”»&й¹·©•$ó,çy=§Á–†iSWîýF¿štÛ»·#&îGw,ÄÑóÜ3-ӊη]J¾/ny6›e…“>´Ÿ’žÆÜHãÀu‘s%˜bVY©if[e†Ûm¤%(H¸:¢Æ–˜F.vªªÚ³)³v/ÓhCm¥¶Ò”! ¥#À±æ&*ô1än©üáV¾Ò}‚=r1än©üáV¾Ò}‚"?óL÷]âÕ:?ÉIï3Áêæ~›ÚßÚ[ö»š*Ïàçù½­ý¥¿k±i¡Gêϼ都!ëGºÏ¡©wðŠÜæCM(Ö£aêÍCq ñe‘’?mŸ$Z(óß—%Κç(MK»R¶äƒl‘Å<éêü½úf%¨*½UJ{°¶Œì´cÈ7úóHåj+YRŽI91Ä!A„!A7=4¾&íYàÓÅOS]?k?'õ“d#EM4u1˜¥I¤«šŽa4&Î ÞÑêruiçd_K̸2 Oª0:­I5‹&y” )֑η»­;ý‘ØW•FÕž eEÙEŸÆ°Nâ;Ga‹mWéw532¡Ä©=ûd÷Éð6Ä0¹ðІÌÍmàýŠúîÓãÔ®§“Ñy#îM;Ž "FÖ ú-Eʵ=’ºsêÚP@þÅG¨ø"9£QÖGY–3¨ü»—Ékèe¡ÐJ,GϽ!D¥ !A„#=aÚ5ëâç”·-ÉÎOÌ«’„õ­gòR:Ìc(ÔÙêÅZV•L–rfvmÔ²Ã(RÖ£€zmɳGi:Qf·/Í4ýÁ8€ºœè*Wm'© à_¸"ürwÑ Ihygf~¿2ص§yíCš€|§‰‰j‚$!"B‚$!\F©—”­¥"…ÌÌw!u -<¤m$¨~IÆ:óò2U s-?'/6ÁâÛí…¤ùèÅí.Ë685×"ê3³oÛ^á·Øž¯KJ¿< ƒŽ*]µƒ¼ãdø±+ëS)MH"‹e°kµçFÌ¥>A!a êS…=ꓼäøñ°±,p­¡fÛ ñÏÁŒçý1˜§SiÔÖ¹ªt„¬›˜Ã)ly€¯›qÔN¥·`7hÖ´í±±¬õ1Q}3UÊ‹êªÌ áo¯òAë Êzã| chZ ¹ºBðŸ|KIºùü„’<}P&Âè&Á`ª3äüé;›ÒA¿ÉÊ!-J¤ÊS$Ж”a 4‘Ô”¤êUy7I¹|ò‚­^sH+–£4¢Ñ<Îå)Díú¢ÚÅŒM³UTîÒyHBµiHBD„!_×Ä´£¯«‚LjAÕ›B¸¨—–{IÜ?¯ž2×kç˜bI¾}{üCþcÎ…¸µ§ä“„þÈÜ=B+ªåô¬­¨a»t³\ÕgÛ§LN<¬6ÃjZˆf žKtç/ o¸o‰Äí³KmM°¢29çI¼H óˆÚ9G\é¡iüÃ)^œïý‘¼ÿHÛy%Zê¶ôfœüÃeµ…ª¢þFü/äà óÆTbþ’½ֳT¹GáÕ¥¦”âÎTO€DõYµkµé°jÁ;”‰VöÈ< ìŒbBwœž$ö˜ë:úžÛy_*aÒ³û#‡¬ú£¡qU¥Pç*œ%†T¿.7E²é¹tpA Ïb€õU+Ô]{ ÙL’¹nêB©´wΟ0TOºŠÊ$n9w@Ce”Àlœ`yˆ‘ÅÚþ¡]üâJÑ.;ŠUg­Å¥‘á ~ôMzÀÇâ©ó@pRÛ'ÆÃäfŒ ²)4ª}«ì‡v¨«YÊìÅv¬O#ú™ÒשêVWO¨¼Ö3Á*ÂÇ­F&x®ާ ½vã¾fe ò©*ö¦,|_Fnй‰EžBBŒÖµŠºfŒµ!À“ß»ø´ùxú³šÎÜßSIòñW¬ú£'v΃Wir‰DV?[ˆÏ<`Râ°T³•ê=¤ñŠZÙ¯!.‡§´`žÝj<ås&‡`¾Â\Ùzlìû#yþ‘»rOµÍ³£µ¾ÞÄåXª£1‘¿ñ˜ØÀç1êú^¿õ¢ƒcJ©JiɦÙwgòPÓŠò$4]fZ–—j]„ÚiHà”€<Ñ:‰–ŽùªìFM)l;Ò:Õ)”ÉÈ?2¯ûh$xOW®;1­ß©LËSš=üÙPýQÿ>Èß<œÜeÊ-<\ì¡«[ <ÛIQÊ•—Wã;‡õóÇZµQnJšžtá 4¥Ÿ ŽK¡n­Äü’{ßÙ‡¨DcÊ6â{ Ùt/eÙ³³ŒþHÞ¤sí:o ©pÆ\V'’5)˧W®;òq%mÓ›,K¨ûΓ’+yõb3÷ìÒW7'NÚÂF^wÀVcU••8­ÊY*> Å!=äÑ‹¥Â©­qí×öuŒ¿ëˆ¡Zu Š—²¤4B?hîªò )Ù ’üšAçj3=Ç*¥ üÓ}òÈð?r4îTÕ÷¤ÉÐ%ISÓ*ÉBx’w${bÎé%°‹7M¨6ÚR䜚øëu]ó‡øÊ¢VÏCHö¨x¼ž˜`ì[T!³T˧[’EJ‘7 ¾²¤x‰ž ûEõ18ü›ƒe]i=JIÁ‰ò «Þ_à=E˜ l´ûôøBþW¯k͘“=åqƒÉg–°•îˆWS&M¯«t J›eçëHP TçÏs#qˆÃ”?º­Ægœ©•”Ÿßý"¦–]B½­ƒJ­bHRB’Adׯ££U¿Œ:[nÕJöÜrE ºsÅÆûÅÿ™&3•Ú£tÙqÎL¸vYhqQÿhé#XÍ7KŽdN{ô5®+u3&/.ŽvqíÍ7ýO‚5 ¬ð–C²l?ÏL:ë&â1'³¶?5j‚äTë|ï;Txbeìÿbä'ÃÚz£E¼.ju¯Fr£>èJR;ÄgzÏ`Š ª·Hý·ÃùÏ-‹¦¢¡dlÓvÌóþ2ÏnKë|ÝtûN„íJuiÊFo8+=ž(‡ô¦Ã¯ëåÞ»¢éSòÖt£ØÀ%&u@ÿdßbå(x†ü‘ðÓËFäå z.©U[ò6d‹»/ºœŽ|üÃ^Õu .¥—O¢Òei4™6däe 0ÃIÂP‘À±¢£æ†“¶ª¼F¿žvƒ? úS¤¥)²ôù f¥e%›KL²ÒBPÚ0àŽÄ#˜±U)B†<Õ?œ*×ÚO°G®F<Õ?œ*×ÚO°DGþižë¼Z§Gù)=æx=\ÏÁÏó{[ûK~×bÓEYüÿ7µ¿´·ív-4(ýY÷õÄ=h÷Yô5~\Z[mN-A(H%DðG’z…_]Ëz\÷2‰? Tuõ!NäNz_Ê*âø­¢ue+Øu×eYà㿊Aþ%ˆò½ü"I„½YZ½ƒÙÔÖ„!HBD„!HBD„!HÈÐ+U*òg)³+eÁÇr‡aqŽ„bö6F–¸\œr>7°ØŽÕ>YÚ£G®0)×mʾàØQPËN´aoý*…Um=‡PÚT¨W­úD;]¡~×­Å%¶& ò£‹.œ'dsÁe£Í‡ºÙ´ì+­”0×Ä)ñVidñø‡÷ú³7-1(ú˜šaÆIÂâJHòùDÖ«ªÃ¾XL½Å)Ü3˜Â^àR| ú0’Ï¡£9mO±V–#)FÐK˜ñü“ê‰PãLGVÓ»öaØ ÔrzG4ÉDñ3;¿ö·oíuÂ;5 ÚtÊ¥§å–y!ÿÏTg#G®ÎsõY·’®õ¡Ì7ã;þQ®MýªeEò_%óçBÜZÇÉ'½ý‘¸z„G<¡n1CÓÙ¤¥Í—f¿ûñÄÆø„àEw×çf/=L ØR %S-°¬~NÑJò'’+ ÿÉ æ¤¢%Mmu[ú=+Q™ofr¸ò§Ý$oØ;›Âý虣­L’—§Se©ò†åå™C- pJRÌ#³ƒRæÉ¹HBêñ!A޵Ri2T÷æ•Á´<'«×¹^µ¥Äµüç?Wšu'½a<Ë´w¿š: XJp8 ÑÖZŠ[h)[K^^_Œî¬Ÿ,u+íÓé“3®œ!†”³ŸŽnIKÝ|×[!Œ¶_eëW?~kÄ“QR™m—1ù)ÎÓŠò'>h¹²’ìÊJ3+.€Û,¶–Û@à”€<Â*‡$zK—N¯\wäâvÚ¦ Ë˨þ™ÒrG‰Þ‹iÔìÐŒÍUI§!)KÎo¹è够ÆL(6ƒ¯ÿžÍÆ“w͇«{CbE­¢;Vx>ÌaY'7ïÔ³¡‹œ˜wkXµ¬JAï[±äãëÌDü¦nAI±Ì›kójÁïÙ󈓽” œž³úõiÍHåB³š;rHšH˜ÇÓ}ûž Gš)éG;(Wõ‡™€«É¢Õ6ŽÑ$žobrm¾îšÈßÎ;ß`øBvG’3º¬Ç;i­Üd°òëÙþ±µ¡)B”¤`ÀÅÞ2ýÕkT™ÆI—R‡Œ d^ÊÛÆGræ u¥iïQ¥´þÕ5)ÏÈQ‘Zò’\kV›ýãÍç Œástrï}ŠìØËµEÚø¢ò”œ¦’™ùY†@í)!Áþ“ª* Iÿ€yH[• vPìóHYýWÁÿQ‹}#ô¢rUìИ„Ë‹Km©Åœ% ’{~£}N÷Ä$þ2`†“åãêÌn–A bÑ FYjÓ&æÕ4ëÓJã4ñ>$'«Ù掅j Ý:•3:ê°†RÏGéŻ̓¹¤„yxŸY1òˆ¸E"Ær] óGgª8ÿHæL²æ»"Ñ %ÙBër?¤;rê­É~Î'm¹iuÓ:r¢*ç§Ósž}œWd/ ÀˆTšwP5ªß±¥”TË“Hií“ò[iÕyš&ŠåEºm&jyÓ„°Ò—æò7£»rjuËΧm(îIeÿuÓ•‘âHÇïÄL1šrid§ãsqŽÕli¶m†PÓiBG€0}!è—(„ ‰G1ˆ»çþ·æŸ ÂÊy¶ÿi[¿çÉHðÆ—ÅœQ™6KA­Ï÷mJzp¥Ç9–¿dq>a뎊œ9Îèø=†‹L6Œ«œ­çÕýýYMÓŸž+ÙRZ)GíÂ8÷Èd“¼®ú(›WìFÖ„‘ÔŽT”öTžvHpÏ?Ö6ÆÀñì,]8­œ†-Å&_¾f‘øê´ßsK(üË[ÔG€­XýȲqÖÓ³B0ÕÃUJd”¹!Få",׺wâiÕ„$e 2îï“ìWž%8×u&šj¶UJY Úu sÍöí#¾|cËê™§‚•E/7;\¢êL×tSÙw9%8>1­@”øBÒŸ—* í&øëÚS*2î0®);CË·ZJT`ˆã‹ôuô9³]>J72)ÚkS¥N•)Ù ‚»¯ÊZ\€?x+ÏÕZ¤ü‹‹˜}iUf`pâ%<œ}Q¢Zò‰¶çš¦sI.gmílÖ<#«1ú­U˜§HÌT§ÞVÃ`­Å¨ä¨ÿRblø‰”߇o‚¬§Â[‹³·‡³<ý‰s\ [Õ‹ûH'yï–®ÁÚb´-ë—”Eô½µ½!hSÜÄäÒFìqæ›Îâ³Öz†óÔ‡G¹9Aê§H©éfAc»çÉiù ê.+‡”îuìënhÛ’výI¹:|›a ¶‘¼ö©G­Dï$ï&-púli¿j¦Åq>tóQþó_kn‰J·(r”J$“RTù6Ãl2ØÀHÒx’w’I1‘„"ÝP Ž`!HBD1än©üáV¾Ò}‚=r1än©üáV¾Ò}‚"?óL÷]âÕ:?ÉIï3Áêæ~›ÚßÚ[ö»š*Ïàçù½­ý¥¿k±i¡Gêϼ都!ëGºÏ¡ª±þK‡àý%¥[ͯÕêi+N~SL¤¨ÿMÅ ¨÷NÂ~KiA¿×˜´Ÿ„R´'µNÚ·’¼·N¦™…ŽÅ<áÏùZIòÅUqEn)gò‰1-A_˜BD„!HBD„!HBD„!HBDŒ­â­Q\ ¦ÔcÉ ÊO“„b¡I$n‹ÅÇzÙÒBí(ÜAîRD¾©®v]2·EF¬Èݵ³²±íÈüw6—V–TÔåB„òÿ!Äí6¯ÛÔ"»ªaf¸ gºu~Æãä­ºò¢Aj–¶AþÃ_î,~jR“Ò™‰Ú¥ÝòH<6@*ó­±¥ôÊ$ºœ/ªf|ŒsªH€EzmkmAm­HPÞ NºÜÔ{ªŒ´P\ãïjdíîð¼yâ·Ãq9Y£÷Ì+|+Á¡:jm˜%ÖøåY‹òº¬G9¹•*S;åï›W‹³ÉGMõJƒw2†X©pT»ªÜ£ú§¯Û+Nï eå& Ó|ÜËxË/yNzÁëܶÞJS5NZ‚“¼$(xŒstØõF/1P-nÃýþÎ/‚RÖÄ*©H!Ûûÿn®$"¾éö­T(Ï5Kº ædÇ{Ý~1¿hõÄù!7-=&ÔÜ£Èy‡R… äc» Ä`®f”GáÚ¾yQLúwh½}¡Dõ¡!AÇÉÉÎOP‚(·_ï[ÄìâøÉF‘¼®a}ëcÆ7ª2\Ÿ¬õYšgO“›F*³ ÏT–G|§Üïˆ?²0ŸÝ:¯¦Wµ×©šÑ3JM·#?ÝÎJ²ò–·–茄õðÌNQŽÒtÚ|ʧ·E±°ÜóíQθ]2Öõ»30úÓÍɰf\IàµpmU{#ÉrÕzßÓfêÕ&ök ¦§8H€_öi>$àãµF5ýAÓ òû¼%‘W›¥KÚÆ}¹‰Æ}juÖw#8á»\N­¥(BP„„¥ Üy^é5žÅ•LŒ²&·Ú¿f8ŽLqÔÔ«Í *lÄÑÿ¶‚G«×ÖÙ ´’r¢ ªñž¡ë›P&²Ü¥5 Ÿ^Òü üõF ^8·÷À8V"šòhäº<&Ÿÿ™íþñ_ºŒërr/M:¬!–ÊÔO`ˆw’Í5ËÇ\ë·´ÚJؤ4¤²Oyâ@ó /Î#5ÊâøÄ}´9²ì×x7ïÇ_ô÷’¬m½š˜l¦v´âª/“Ç ÜØþ“å1· eîòµcZÑ…0‹uB„ ‰B‘«_óG¹åiÈV0æUàHÿŸdm1]sýÕ]y*ÊÎ×ÿÊ âópÛ5e…ÁÎÏ|µð]2èqŸ7%G½ñ ÃÕ¯(kˆR,W™Bö]š;#äçúFþ„àD©m;¨:×A±åÖ¥0äÒ{dü–ÁÚpùš)(Ç;0]s„çöV'’•ªm}¤óí”ÎU3Q™Èß—0P<ˆõį9vZ——n]”4Ò‘Á)GÒ:€,MÍ×ÎaÔ1.ãî!´•(øˆ¢bes \ß.eÕ:¯;½gÕ¶¢OZs þ6ma°<Oûyb=ucžRAï[±äãëÌQbÓúAƒ³îº\šì2ßüø.½ËTE*…9PZ°iJíÆèйÐ×X¼.@œIPl÷ªZ”vÜ#ÄïÇr‘¸~ ³Ä‹kóJÞêóÏ'SâvŽÐ©Ž7±6ûÙ7‘¿w¾ ø@!?»p˜ýò´ã’úB1ؤHü<€ë+m\’“åÜ"åsê¾QJ¥+Oʯ ¤©=©1°s‘†º›ýDžl2TKþ±ßç7GQè<…ô*AÎFšˆ9B%ruJUa­ËeiXPê(VD\JlÒ'©ÒÓ­Q0ÊIŠlU~•î›Q’Ó„yÇüE€ÐšŸÂú?kΕm+àô4£áoñgý1}„É¥—3ŽE¡5Öíù<Ûտ唝ÅH´\XíYÞú|ñ¾>âeo8p„$©G°…ççW8óónþmò¼v$pr<Ñæ->„a™ý—˜1’Rü¼OñuÊVB{ã’w“ÚbÔ]Ô=p Ù )J–\Ògò[O|éþ¯4LUÊŠ)Ô‰©çËJ_ª4žEÔE׵濧¶™D÷ªé;K#Âýø¯Âcç%.=Šß“š„0v«dËm²Êi ¡!)HàÜ~áé—´ÝMœ<Ä) ¦Û_ìùöFˆ§ƒŽ­ÁòT{ßÙ‡«’»êI¸*å,ÿÒ±ŽÞÿ¨ù£„LjTs“?¶]öIÍ@Ðvýξ >åp ]–©T/M+ÏäùÄM–mCi赇›(œ¨ Ôf²7í;‚|HØH­Wœªõ\íû-¢¥Ë*i˜Ùêi=û§øB¢ñ´Úi 6„!!)H€^áQhB í\Ö7?9PZ6û„!j™!A4 OžK“òT½®ñ°fñ ãÔž7â@<"¸jF£U¨Oíe/½Í5û ÿ€<ñS‹ÏÍ㟀Wx1– ¿ôøCî¾â²§ò–JŒÄ1ÊR¶ù”’·¤Š–üÊÇxåJQÂDKŠt%$“€b%ÓyÔ^TJq<í>Œ¥O»Ù†°U”zâ“ g==ò].3 ‚šÃ·R¶Ú]lµféíÙh ÈI¡·Hü§HËŠò¬¨ùce„#±_?:Ò„#^¹ëj—pRi¨ÔŸ âò• ¢¼ä£¨¥RÐ&*Žõ=MÎTFõš«r­½O§ÌÝxžîžÎ÷Z3Ã×âŠ|Gl@±§Ú~ÿÁ_aXS¦p{ǰ}Ïw²åt*2tÉîjšç<—]%kÎýŸÕ<1×\ÃiPJ–£ÀÆ5;þð´èꚘRKêšoiÁ¼~RZHê1“ŠÂýf©¥5>éBÉaÅëYïNxøâÈЪ,UèÒuIc–f™K¨> Çݰe¸­0” #ì\l±ón²î‹թpa"B‚$!CGBàžÚ,Ôá Û;?´w\bç´¸ö,˜Â÷¥h75DMVçßò[ÿ¦döÿª1!xLu”²”4Ù9V ‹ñ«‡«Ûjœê$©ïͺ¬!–ÊÏG4ÆG“šú=8Š0ÁöP®±ïW X²k$LM6Âö%$åjò''ÉbFU‰)&$¥›Kl0ÚZi`%)Ì"¥òD¤9tëÁ|Í ­š[E–FîyÒrG‰_Ä"ÝÇUI7 ‰¯›™ÎHB)CHBD„!]*ìêiÔ‰©Åì›%>p¼D@§i*$©Yug´ž¯lnú¥;†$©HV0æÛž§þ}‘»1Ï>·±€£¸ 7æÄs8ÅEåПuØ`4¶‹Löø Cî¾uª‚)Ô©™×ËJYòйQ—qjeË~Î#m(îIe‘ÿuÕ‘á ýøër€¯Š]˜¹d/McÀ?ø"näµj›OE¨¬<ÞÄåA¡5‘ƒ´îôƒâFÀòDŒ;ƒ!Q¹A5œ" Q„#ã;0ܤ›ÓNœ6Ò Ô|f/I\®dM‚޵£ÏÜ…´œ· ×­³ÿ%>hÕ’½”˜âjqÉ€ãÎÿi6òžYð¸yÉóFç©¢•AœžZ±Í4Hñõz㈩œÍ)9•ôz:aO°ßÍEµi_ýGåAµSøÙ&¦R¹8s-wîgÇ‚<±wÒR¨ªœ‡( ¨×®‹þmYP§Ê-C‰$-Â?È<¦-duô‘sQ® ºc4ÎrB‰*"„5­“){34Òè^|)${޲]ÊAŸå -†©3ÀpSŒ¨ã´=†4ú{üä›JÏãqQ¡PïîÕô ó”­þìÔ±zšÇuÙÓÈÆJR<†7>FÕ.ìÒ%H©Y]:¢ó8ìIÂÇúŒku¶ÄÍ&j\ŒóŒ©>¨êr&Ÿæª… GƒŒÍ!?Ä•ãp9nKUw)!³Zõ9j]@ÈÛ.4ƒ‡fÔOˆï>¡,E,¹°{Ö€ly8úó>§Ô¹û™É;MS™ÛPêÛ;ñþ˜ÒÒ¼'yÉë1 ©Óœ°jãóSð>n™¤í:ÿ}Ÿ/ ò¯|g*U Ó'ÏPÿœDïÉ~Ôø¥¢ô9WZØœžo»æ·o+w¾øBv’+ Å*­E×k~Ík.J™¤‰Œu4ŽýÓü ÅêBÚ„$%)Hpy„C¡'µs˜õG9RZ6 Kõë– )t)Éâ@-6v?hîO¬ˆÈĬÕnFB–•ì™—Š×û)ÿ“ꉕ³s9ù_‡ÓôŠ–GØOÈk+@ZÈm¤(’¬V{J¸z½±Ñ­TO¥LÎ8p–[*óý—¹×ïçW«£ë\û’ÖDÂ[$T|\¤p±ÿä”72¾— æ`sò]îET5×/ÛžþœFÚeSÜRª?¤pí8G„$ûñm"$ä‰Dn‹¡5áê‰vyãÚ¥¬€…)‰n>CX_-™åòR„lZ’„`/ú—Áv¬ãéVq<Ó}»JÝê>H…ÝVÇ6ÏèÐ3ûJÞ òFõª•;Xb”ÚbAfo°n<ª#•>§§V{õ¨©^3^7UÎNZ6 \x/¡rr›§#[µðãñXA¬¢jN͕쫛(GŒîŒÇ!;iLZ«Öi¬?Y›æeÔ¡¿˜k##ÀVT?pD7®•)º½V™gÒR§§&ßCHm~hv,ì!¿\ºF»w\&œN§#º*Ó=ë-$gc?”¨âï¸þ æéôö»ª­3¹†FýœþR¼ÖêÿwD¬¬ßuTæ2'çÁÎ3ŶÏgQ#Ä7E.'‰¶Xï´åÜ;ü6®ƒÂPá#Æ®ÁŸyÿ_}kÕA$—é²sù—ÿ¨Nídº®¶Ò4už¿h•Ï#lÑ×=6¡µŒ6Þw¨ÿ´~nzü•¿Ir~q`%#½Nw¨öFƒ¥%_/Ujê~NÍ‘{e÷SÞ—ÈßÌ5áá•uÚDsô4²b\êhþÿÚê± È°¨tZnóý¿»Ú'¦õ­oº¾6Ýiy‹>Qîõ)3ËIþ͈å+È7ä‹‘[¢ÊÍZSTYv˜—Tš¥Ùi´„¡±³„€àìx£¹H§HR)rÔºd£R’R­†˜a¤ì¡´€ŽÜvŒŒ›Rùä•2I/:ã¯j©¶ÓÊm÷¥Ö Oaê#qŒñstcï©?€µ:¥*Ëj™.#³eÁ´<ÛXòGÛœÝ:¬)KObúÕ„еã·_î´ ú‡Äíh ÜÀ”0‰¶Öñ£WxçùJ¢î ã")&²IwM ¹¤Žù¥`øÿˆ´úpühÒ{z®¥í¼©D²ùÎþq¿Å¨Ÿ )Ï–:죜ƒG%Ârš—™©Ò«uc˜àG1z¹”„!HBD1än©üáV¾Ò}‚=r1än©üáV¾Ò}‚"?óL÷]âÕ:?ÉIï3Áêæ~›ÚßÚ[ö»O(z¿ÀzyÔBöšCí!]‹q%´úÔ"üÿ7µ¿´·ív&.Rv•ZùÑ+’Ù¡ìšŒÓ ­„ŽqMº‡v2w­œÛáGêϼ都!ëGºÏ¡«Ë%ÚO„Ÿþy£åÚÝ.§E©¿K¬HÌÈÎË(¡Ùy†ÊƒØAŽ”KPR„!A„!A„!A„!A„r'dŧäï¥&Ljä­K„æ‘´ËkNö<7u(Ä}ÉON…ãy*±Pcœ¥R \R2—ž?!'À>QòvÅÔIHèòGËyyÊŽaÝ]×ÿ#àß¹ÿµÒàTíÝ"A¯³«³M;C ŒÄŒ™NeÑ&œ|˜ìËÊàçòYk ‚èæÄ ‚ùÊKã"2Œ0Œá–·cÓºër–ݽ3UœZR–PJA?)]B+I|Ï `¹:‚¤ž{ëUÿ•Õh9Q’¢K9—‚R”ñÚQáì‹[§ÔÕQìz%-DíKH´Ú²rr3÷C¨3Ú½®N\u¥Ò(Ï —TGzã¹ï=¾!| ý1É\(á¸|p köesɦòR„tËJàñŒEnæ·è‹Ø«Uå$•Œá×1º2 ¦d¤Ÿœ˜VËL ­gÀb±L¦sR5Öl8diî*µYÇ e<ÛGÁò<&!ÔT9’2& nù>–•²Dù¤6k~d«DÚÒãiq)P Ií1uÛ’ƒB V*Ò²D¡Ï/»c#2óRÒÎL< †šAZÔxIŠ»q.kS5ª‰iIþ«þDº1Í´O„lŒ~¼*j]ÙÜï´¥%#eòÈlÖüÉØ£aÖßa·ÙX[n$- # ÇÒ8H )¸˜˜ $hú§;”IR¬—ιàHÜ?¯š7ˆ†¯Ÿ¯ÔgR [l‰Vwù e,UâÓóphçý*ç§çjt»¯ã°,ržç[¼Ž@ì^¬Fƒ®u§)¶SÍ2\™;œLnxЏéµ©T±2v´‚Fpc”Šf¶@çl]ÄÔît%ŒÛe½rLµkhÅ0Í4[žª©UFÿÆc`Ü õÄ·‘Škì2–›y!)³%5údÿ‹á0 h|ÿ…ÌžL<›éü¿•f!”ÉLþ˜‡qÌþ˜yÌ:ý¿£çü'ø»ÿýŸ/åY¨Edî9¯Óâ1¯_Õg-šµ _ÉBrw˜õ˜è{ƒZÍg¿øXÉÉ£K&¡Ýü«y†ù#IÔ\ÓŒÕu­SuÉ•Ì +òIÙlå+÷¢Qº*)¤Ð''É´ÑØð¨îO¬ˆ»ç4cÓ~­W\ç5¥/7½Í‚‹¯ZŸw\• „+-³‰VO¨ŸõF o:î8CM!D•]_\=^Øè×*§Rfgpl«Ëˆà§™ÓHOiû¯§ÓS¶@ðQeÛ.½D×–ÆÒåÕ4„Ìc©¤÷Οá/CHCM¥¶Ò„”¤ppR¹PWZ¾®kúmH–OqJ¨õ¸³´²‹õâ¹Ü·r!xra[Ç€ÌjŽõ€Þåo’Ô´¦B-a³À-¯ýʽåsßóh*K¸%V®µ¬í8G„‘ûÑmb7äÓi7FhTכ؜˜g»f÷`óŽ÷Ø>’”þìIô8™ ÀÊfy{ËŠD'­sª]äÛxbU ð*$ÿQdW|Zäu.,á·åÚq'·IÿLUã—躳 ë“z=7^Gìº)^êKUiîU-gZlP ¢gØèRA ðŽ)ZJTI õÇ æ7‡Åô©i„±–Õ"r\ºiõ5¦Û‹} Õ)-™u°£…-•¤uŒ`p#ÅìSç¨fdLH/šP;@g›¸¯9 Ýr§°3E@y Ž®QFÚ¸šŽIÊ^LnVšY~:_MOc…^Wº† nȰ#wù?é?.*?ø•Wê> ÍÆ¯sÝòtóÜÂ*WÃl3ßl«µXáâã3õªìê±?U©L4Fô.eDy‰#Õ‰J¼Ô”»ŒÈÊS²ãˆÞê“Ù·ÔóœíJ`‚¼ä4`;χÅu~¬Å"’üü€KI$xž¡™ùùY ULM<†Z@ÉRŒD³Ž×õŠù•²í&ÕÌ©Yyò6Ãcå:³ÔPë$¼Å=%<•ój÷æ¯ëjb©ÍÜ~g솥 r@µfo}O¨jUY¢© BÔÜ‘PÜäÒ‡û 9ñ©=‘rc^Ó»F“cY´ë^ŠÙL¤“[;jó«;Ôµ~²ŽLl1ô(£°4v/•Ï+¦y{»R5ËÆä”·! ßuÕæwK°øÏå+ÁíóÇ­ÐÍ„KK·ÝUIžöZY;É'vÑÇW·Ù\5g©}Ñ*™±1Z›ÏÂ3‰VK@ÿÙAêýbB"ºßü‹mZ‚Ü™³.)Ú+ŠÞ™i´÷C#Àåã*‚*+œï>Jº¿o)ÅÊÑå«Òéàí:a*$~ÂöUŸ"‚ܸ-éƒ/^¡Ô©nƒ™¹U´Ìb¡A„!A„!A„#”%KPBT¥òcˆ”ù,Z)¼5¢-0ØrJžMBd¸¥¢ Añ¬ x‰ˆx…k(id©“c?°û¬˜Òç…s4&ÂnÃÓ:U!M>ãBbyXßÏ,eCÉò|‘»7ðŒ¡ˆü¼~Nª¯š®wÏ)»œI?ÒG&ƒCGbê!Ž£°†€Š®]6õ¥9QªK3²3³¶ ¼Ã|BÚ“Ê&Ÿ"Êå-¶‹“²—2Ið'ýân‚b›Ãiã'¿³÷Z¥© ÚTÇw]TKRž¹º´ÚÝ”6~¿й}^W^µ]lÚ–Œ“‹l¯g¼Ï6ÊzÖµpŒ¥™¤º™¬5dÕîÇfèt7Rœ|}äö!'‡Œî‹k¦úkiý4»nšÜ²p9׈˯Õ+‰³r_°á®ÍéÉòÌÕTõFMCbêhÆŸS4ÚÈ•·éÿŒwûI§ÏÊyÒ;åx»<ºÂô†´4X(iB2Eë¥Ã-D¡IËN9ÍËÎÌaågB0¢Ÿ)""îKuÛ^‘-sWn ÃõÚµD­ÎtÌ$~,$ãd«ÕåÝlP®ÊJ©W 9©ùE­…äžÔ¨R| ƉOÐ /’n‹6´þ‰uÊ”ù"LÊ”!(BBR‘€#õ\¡77]jœÛRé‰×Ža¥8¯н\¼hì̼©ú‹i™˜x¼èãŽ8¼gÕ^è¢ËÜ4)š<Ûó,12\\ºÂW€AÀ$Ȉ&y.i´ËÊyù»kQÉ&y>äUb4¬sEìÑâ®ðœN:8èÝÄØ*+¬_”©“ –¨!ǃga ç£7ÈJÝ\äíͨi*S® |¢”:†áäxÝ%M0#û‡ür}È•´òϢؖ¤­µ@mÔHË©%Õm-JRЉQÀÉɆ† 2Mïuî-Œº½ k-†„[*$„!_9–’ü»¬,—RAì#O\ªÈÐ*“õ”³°¥6v»Rq!û»“µƒtW&«'ëù—TêÒÌÚR€Trp6øªÄðþ™¢/k]]àø¨Ãôͯ{|”;ñÞÜúI¿á?í|w·>“oøOûD™ÑSL?OpÿŽO¹tTÓÓÜ?ã“îEOøÓQWŸåîýæ£C{[ŸI·ü'ý£H—•F§ë­»m˨½O3 [äpæ[ïÜó€G”E‚試§¸Ç'ܯK´BÈÓ«…êí5'—2ûso‡H'g =è‰tX#i¥^ê#Ê7V@bµ”˜”€uG0„t –HõâÚ¼möæhû±!•0•’~Syê;îÏ1$B5Ífac¶º ß‚FaQ†/ ºë”{ŠBbUùul-·Pâ<`ÆzRô L‰ä ö,¶ì´-‹®XKÜt9’0•<Ð+Gì¨wÉòmg“˜O)J•Mj•µÀJOdH•Ç7?&Øóv›.¶›•ÒFÐۨū‚èÊ*2Äx\? Òþ•ô¢6©®IvÒ†Ìã_a#‡8–—ì:rE‘*ï5¦‘úÒI?ùˆˆy0ÿÔ§ŽY3µž+kt¿¤%}(޳×E  vêrû»Ÿdm òF¦í¯êªÇêJ!>ÕÈÉrG±“¾z广{Be°–cÖò`ö½xîY·þ,ñQŒþ¡[r “8]#©)ÿxÕªº¸ÒÜÔjzæYÙ@ÁZ”{G\Yê7&m!§©+zƒ5RZx*ryÕyÂJR|¢${bδítlÛ¶Ý*—»R²¨BÕãP>SaäÜ 7yº­¨å}KÅ£*oihÆ­êŒÛsWvÖ¢ ru>¤þ£;Ž|*Ù8¶ºU§¶šÛÂmIlmáS3N§æV?)jëð€:„n‹øiãº,\ÅETµ.ÒܤkwÝÕ/mS¶€C³®ƒÌ¶¥¤~ºÉÜ”ŽÓ$F®‰Ûw„ë“uÚåÌúÜQ%)žJPŸÁU ÜÍuÛ—ò³¢4í“J}`vgüf¢Úö¥P©®Ì8Šó3µÙ¬‰™ô’RÂOä5áê*ê‡lik¼í䤟„Pq¿äñ.JZ`NLÅÅþ9>ä%/?÷î/ñÉ÷#œ““†_Äòº¸9X B1ýØ=ƒ° J·Òä.m¾Ók[aRÔÖH\äÚ-Ë5œ+µG€OYðd‹É¦¶MO­[jÞ–æ¥XqÅoq÷ïœYëQÇ“pùi•léÕ½ð%±$XeN^uÅm:úÏå-XÀÜ:€ª:*:Héc `\µ}tµ²™$7ºB‰JB‚,}ÇNE^P¥¹™¹g$õm$ŒÅ-—«ÊQ¦^—©>%Ô I â‹ÅÝÙÉÃOnZôÝf õqͼ·–†fÒ”(’vFÁÀÉŠ\[ éåºíkÝt87Õú¯{[î ƒxÛçÿ¸·æ?í]é\”n¿N¸(³h\ԛͼ’3´((P‹+ÑGKÿOqŽO¹ÉGKÁÏ?qŽO¹ÔÜœèÒ ãumYÊÑW‰ì>Õ6Ð*Rõš$…^PíKÎË70ÑýU¤(zŒh5ŠœÝEŠÝjj¯\‘‘§N»$Ã4¤[æ‡|ó»·Œƒ¸Çln–mNÖ¶d-ês³ÊHµÍ2©……/g$€H8Î8p:5;Ö©O¿;7NZœ™PSèD˨mÕv© PI>Mýq{W Ó0n²<2ÉsTA#Œ€Û°€o~ËçÅiÓÕºŒýnRPÎ\³L³FeçUG— ­o»’ ‰Þ”ŽÆsÙ‹ jãzãfBµ6òÜ£ Î6T?·uÒQµÅA´žÒcq§Ò)Ôùé¹Ù9`Óó°ú‚‰ §epì#R²-Ê…Zf«3-8&æ¶yåµQ˜h/e!)ïP°‘€:„GmÌp:æúÅÈìÏ^Ïš”ìFžF‹,,,l ¿ohÛòÉlpŽB[m(HÂRóº9‹eF†<Õ?œ*×ÚO°G®F<Õ?œ*×ÚO°DGþižë¼Z§Gù)=æx=\ÏÁÏó{[ûK~×bÓEYüÿ7µ¿´·ív-09…«>󾢘‡­ë>†¤!– ¤1A𜔕œaLNK32Ò†‡[ Icï"î] Ò;…kr¥aÒêþS’­™u[)ßÝ{‘Þ“Oí+Ô•H N<Ž%GX±‚*i^ä>“´ªþGæ·;!œøÔ•ôÆ•Rä_©Ì™*͵6”üœÌ:Ú•ä-‘ë@1 A›.JZÕ'ŽnÝ”Ï÷zƒ_ù)1­T´ Xéå}ѧõ…lq,¡/&Á9òG©x†ly.î—jSYÛÓû¤cÿâ_?øÆ:f˼eœ-ÌZuæV“‚•ÓItǯ;ûaxøí»p42í¦Ú”Xþ‘ÑT¬ÒN,òO…G²% Œ<Ñò2²ÿÝÙþ^9w<Çèþ¦Ve_&YãâAc;–_û»?À!ܲÿÝÙþ^:÷ç÷Gý‰_“ÅVîµfªÕz‹Q˜~e´Kíµ(¥àghŒàø#Ó>å—þîÏðý¶ÛmŒ!´$~¨ÄE¬£Š²A0»NÑóY5ŦáSWî½t˜k›nظB•€1&SëÄp-.PÕä«n“7.•«º§€<8Úá:Q%ðÈ5²‚ÌÌóÚª5“õZZ\»néiIÊÚ”ÕãÆp"gÓÓ«)MÌËRJ Œìžüjö»@;“ä)B.£¦Š1fKY$ À„#zñ!A„!ˆB˜„!HBD„!HBD„!LGŽa\bŽa\bÌ ‹ˆG0‚.!¸„s"âÌ ‹ˆG0‚.!¸„s"âÌ ‹ˆG0‚.!¸„s"âÌ ‹ˆG0‚.!¸„s"âÌ ‹ˆG0‚.!¸„s"âÌ ‹ˆG0‚.!¸„s"B„ ‰B†<Õ?œ*×ÚO°G®F<Õ?œ*×ÚO°DGþižë¼Z§Gù)=æx=n:E®·f˜Ðž¤ÛK%¹¶êÖ”¨«ÇÊIÆ2xvÆè9_êxÄ?ö÷!ôÑÅrEÅõês†ÞàWƒšÀ`¶´Z†²/±sÓT;d½ ~ä:`ê‡l—¡oÜ„#·nÞwïXK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä:`ê‡l—¡oÜ„!ÐãÍÛÎâa.MÜg•:`ê‡l—¡o܇LPí’ô-û„:y»yÜS¬%É»Œò§LPí’ô-û郪²^…¿r‡C7o;Šu„¹7qžT郪²^…¿r0uC¶KзîBèqæíçqN°—&î3Ê0uC¶KзîC¦¨vÉzýÈB<ݼî)ÖäÝÆyS¦¨vÉzýÈtÁÕÙ/Bß¹C¡Ç›·Å:Â\›¸Ï*tÁÕÙ/Bß¹˜:¡Û%è[÷!t8óvó¸§XK“wåN˜:¡Û%è[÷!ÓT;d½ ~ä!‡nÞwë rnã<©ÓT;d½ ~ä@—%UÊÝvn¬ëIisNm© 9 „#8é£ÚB÷Ù¬“âNK\µ’ÊÍX ßSZ<̯ÿÙwdm-1.28/pixmaps/Stars.jpg 644 0 0 10335210221265060 151670ustar AlexeyVoinov 0 0ÿØÿàJFIFÿÛC     #!)!$%'('+.+&.#&'&ÿÛC   &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ÿÀÜ|"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ù¿ƒìE) cíœÐ¨H>”à <Ô­GqqÞ—ž™§2üÇëJ«´š!°þJù?9祻cŒÐHmžh ëȧgž(I?•&&¯§µIÛrþ"š#špàâ©ôCÁ eOéNV9Éî)zt¤‚ô5v2¾ƒú ÑšiËvÐ{Š´ÅqÊFp£žù§dŠbœò8&¥è:R Ürr2E8צ/'­<ž´ÕÑ-< À¤*zŠP aƒNÁì1ƒÍhEÄ…)Î}*u8Ï¥ 094»HÕ«¢/q9õ©ŒÓ7t©9àƒÖ›?°ÀïRŸÊ™\zTª 8Æ}ëDdÇ zÓ€¡WåǽLÆZ®^¦mDö§±Í=ƒÉ«‰esÅZ³ìUXò¼ {úS–,þ5pB0séS¤‚§–Îâr($$ä<¢­Ò´Ä9Ç4ç·ÈéI®ÂR3‘œ¥9­÷(#¹Î*ôpUȬÙG ØÔ¸Ü|ÆR@q·¥4ÁÇ#œÖÚZ6ì ZkJ™ ×Ú¦O@S0¡ƒv*õµ¿ÎéޯǧKÆÞ;äUûKqëYóØrÕhD¶!íò·¥T‡I–i¶¢Þ˜®ßOÓwÛà©ÏÒw3i±ù6ñ(“ÞG5Ç[ɶ¬Ò7kœ-ö…ul…å…Ñ{–RdËmŒä~5ß4Ú…Å¥ÁºÊ’cj‘ŒVÍ“‡eÇãZЩ)FóV&ªP—*w9¡nGQÏcI$ f¶–Ôg Q]Zäà [õ&æ*À åjD·$í ‘ô­8lË0««h£/5¬#r%;¶–mŒ:ÔòÛHÇé]¦#É^qQ]G†å@â·ZÎZœ×ÙþcƒŸPi²BÛNåÀ+qíÈö¦©ÜÆ*9u©{sŸ¹„“ÏéUæ@‘\V”‹—ü*Îиô¬­vkfI–6ŸZ®U·àœÕÖLäƒQíÐúÐÑ­Ù_`Ï^~*óâ©N+)Š’ú …ÁŸJ°ËÞ¡s޹塼]ˆå@ r)„dŒŠ—tçéLe'½Cw5LÀÅDÔö98ÇJ@=xõKNãx ÙêqLeÁ§±QžÿJRZ²ÐÀ€‚i˜§ZóÀã­7/»Gz™n22H$U<äþ‰qÁ4£§Ni)ç¹íJ)¤œŒþ”àÜt4½A=7ÏLt7ÈW'Ú˜¦­ZÈ#(899ïIè´6¦“–¥„Ò¯Ôܬy«”8Pt •éï^Ê>"é-ðÃþuÒ£K¦ ¦p@’Nzu¯»qæ¶Õ=N3XÓ“{¸šTà“‰Xƒœ@œšSž_ŠxÀâ·M³Ì{‘±#Šf¦jB¹9o½9@Ç,*¯¨Š äàäzŠ,p€à ÔJsóU«k™ Þ/ïi$gгe«Ôˆ“¸dÓ—$œô¦îãÔzš0EÎ}è3@Àdá©ßÂ>”ÑŸAŠ“ŽäP j€Ozr‚:мߥ;·=ª’¹-ŽÆp@ãà¼Ò(ÇCùÓùïUbXåèiÚA‘Ÿ¥.Üô­v2lNOn´åõ§ téAP6˜®y>Õ °¡Fj@œrqƒš,m§.ŒžG¥H£p朱°ä*’hž` OoÄS•2v€jESÇlÔª¸o¶‰”˜Ô@#¥+jTÍ5ÔGNõRZr"\0Å*/¬¤`žiTÒ„R¸#ÏÏ]£ö dAf²÷lp*;]÷TBê̓ÎIÅxÕ³.dùt;©ày]êeh2ˆ31”è­QÏ5¡,LTµ28¹¾õ¢Äv2peˆãD¶'häqX×ȧ?JÛ˜‡Ò³¤‡~jë…DÌ9ḻòÏ~3Íf]ôcjè®#UŒÖ-Ô%¾P;Ö—¹HÄ–SŽÔº“rHÀ\íïëF9çšnIù~õHíÚµH@¤g÷©:‘ÅF?*•xõõ¦µfmŠç>•&AIÍJÈ#ƒïWe'a¦3“OP;Ži ÿÀ¾”õÇ"©“{‚(ÝS¨NGJ@ ÔËž)‘qÈ8@Þ¬*uÏ\Tq€yïÚ§E-ØÕ¥r.FŠ@é‘Sdt© LWx©Ñ(Æ+U[#œzÐé’A«0=éìƒ#Š« s=Óäý4ŒŠ½$|tÔ>_œÏÖ‘I‘*·pjå¼E†HÅ2É G¾*ìx 7¥4Kb#Tˆ>aV˜.3ŒfˆÓç(«ÑêMoXcò­{xIm?•U´‹s¯»Vý¼áväœsQ9(™êImØ8­%µRË’})ö–¬c´a¶et88Î qΪ‰NÞ×tº]•¼iö‹¥éÐôA¦–`è¹ÉÏJÖ–Ù!Š&˜ÏJñ±xÕËváðüòÕ Kù#\Z[¢GزóTïæcçI!eþèã£ç@Ñ…C´Žƒ$n$VVQÇ_zùÉVr–›ŸI ,’ºEM2ÃÎÛ+díã×Ú¡+¼7é¥[Gº«ml¯&µÍÊXiÒÜXð§n{q^9³pu´³©o7qlõæ³£ b9›ÙÊ0’osè{ 7e™K—óŽâO8©Ú(Wak?ÃÚôž›ªÀ0A¿žœR__38;Cès^DêJ/—°B”ÜÇ4fÎÌ©8Å[h¢%P óÅR†DÀfúÕ·"‚ƒö²ö²NèÚ¥;è‘B(öKqÜ«®ȞȪ³m×[aíÌË÷½i³Ùf_º ãô8,J¶§‰‰¡yèpgLf`ÅxôÅJÚr¤ J€} v‰¦(9aYÚ­º¬ló]ÿ[ó8¥B]Ž x%qŒsФÅA9\c¥lj!Q¯zÄw̼ƒŒ×m·Õœõ!av3zãÞšñž;TÙ8ÝÓµ6Ràæ½:uSg,éXË™KHéTž59$V«ÄdoãUÞ:W¡Nw9dŒ;Ä$+.hÉã ®Šò,•:u®›™¦d\! £*î_JÓ¹L“øUVbiÜÚ,Ìš^¦™ÐœóJ5¡£‘êiËëLÈô§”àÓDÜ×µ*çò¨êE zUZìCÕ³ìiÛ¶ðyÍD98õäý*ìŠK¥H1ŽùÍ"€9È d·ZW3‘.~j‘I$qÅB­ƒÏ52µh–šÉ\~é¥N‡Ö› ãu©Ð)Æ+E-€g#S*7õ¦¢þ}©ã à“škQD>oJµ5¡ cг#å'š´fË(2œðzb“ËÚ3Žõ%º z“V6¸=k[ègr°^?~ÞO(^9Á«  œPµÜM”Ý>QU]Nü`àÖºÇÇ8ÅA-°';?Z§SÛ³*‚pÔï$îÇèjxbù°EfÝ‘Oac±“š½{º)ãŽEÐûBäuÍtZVšóã úQ:‘‚»1Õ»4ÛWicc-ƒë]™Ñ„££nÒ›k¡Ë×IõºK+YÍl׋‰Æ¯²ÏBŽsègXY¼c;r3ÜV¼V{ÈùpsÏi'Ó¢VI¥©Æ\:¾—j…£`Ä®W5áÔÇÎü¶=8e“jì–ŸjeŸt°µ­e&Pã3À³5q®¼ÀïÁ謼ùH'+\ÿW”ß”ƒ¥&Fh-ór0(à{“@óžG\Ò Ä$“Á§ŒžôÒ3÷¸úR¡ÆyÎ: d<`/¸ ri» §˜S¹#@ÜIÈéKƒ·¥&6“[š44ºeì·×­Úmâ ç<äÒ“²7¡EÖ—*fû'µ¥)yÁãÞ“°Å4`ôeèO¥Žâ01CÆ hÑWÐÉt§}))zQ°…UÉÎsíRî*0Z·iã3Öš•€zuçŽ)Wæ8èi„œŽ)ù¿4ïÌ ‘x䑎•*®FGõLŽ™éRÇ•>•¢L‰ã ’)ë÷4É–û¹  ôÕîg¹$}ö«PœŒ®ƒ'­XQÆáÐV±fm í‘¯5*ÇÈÆH¨£“=i1€G-T•ŒÚ` ÜMMÈuéL#N©‘ &<ô§{ÊX„ààrE\Ž=øâªC<+FØcÚ©Jæn#ã‹?)b¦H±ÅK yê:÷«‹8wªMÌóö ‚xÍl5®ŸQLòv›w”¶ýðI54q`¤sØÖ‚Àà “Ò¦†Ì·Þ法EHêO¦Y4Ù÷Ž:u®Žæú- 4ŠØ+Ý'¢¦ðžœf¹X‹*Œ˜ž•Wâ.ý‘¨…Žq2Ê»‹“šñ±<õvzI„ÀEÇÚ1ëã+ÃF™X“Æ«\j··??žØôW+ Üœb¯Cs±H=+Ëö1ލíöŽö6­n'‘É21¦¡½–e0/Žx¬û{œJ0ØSÚ­Ì<ÁÇZ\©2Ô¹£¹2—•G=ºSeŽe¾ÔË;¡ l'׫W7»…`On+m_CTº™òOå)GûÕƒªÞ„rKg?¥h_³0gc󎘮bêC#6ò3U:nãxŽUdVšûtÁC3V•’DÏzŹˆÜ _j’ <ô®¹$•¬s©^W4x¤†Á+±øq®]Á¬2ÊH…X±$âw3¼õ®›Áñ¦w_m¦¼ìU%R›æ;h¾J¨õ—¼˜Lä<ýjÁž—ç\ŸÎ¨ØMUÀÝŠ¶ßexÛ<èExñ£¤Z¬Ûz:u©yTŒÏ8®ž$X£)ÂŒäôkÄVIÚ=k¢KÄp§ªâ¼ÜLf¥s ÓºÑÓ^5¬ÞÀÕ£4W¶Žç—.¡ µÔ|®Ý—kåHGÈ?­”oÕû6ÓR0om ávžâ¨ˆFüIìvÚ¶šÒ2°ÀöN „¹eÆ zTñðtõ<•Ióè?JI&°ŠDa#éÆ 5ª,bK}çj5·h—Ë@ ã¥h*WäWS¦3ºR=&ÕZ[BñÍÃ2q¶¢7rÇÞ<œW1¤jÍMîJŸá&º ™Ræ?>!…ôä8¸NÒZ²¨§NéêYƒSa2 }½5µ­aÇQN'žj®¹©H¤9A#©Ü昦žÏ#š± »Ç¦;S‘¾c‘Iƒ×µ z«v!½Iѱ“ê(VùþaÚ£äsÅJsÖ­KA6N€ð@?ýj·(`*œdžsŒv«qc ãƒT›µÑ”‘z2 ÁíÒ§Uç=j¼%AÆ>•~mªw3&´MÒªã­ji¥HùS¯j§haÜš¾ƒË$™˜öí\•$i ¬wNÊ0*T7­An…Û®H­hmóÈÁ¬¥QCBmq-‡«Ñ!$uö¨¡ƒk3Z–vû†OÕçÕÅ$k<Ûµ‹ŽœÕÈíÎrx©b@u«‘Æ©v!@îMqË‘×K)1–¶Äœ¨õ™RÚ ˆv»wôª—ºí½¢•ˆï“ûÙé\åΨ÷’1’Lç½pΤª»ô=Ê?fµêì°* #Ö²o¥?”ò}j[— ½rÝ€¬ó¾Vù¿*!5s·Ù؆&bÙ?0ïíV£–5 dsÖ[e g˜ªòÂTgpÍo~c;ršK:´xªWW!CÓŠªŽÈp[M’šMªÛA<œÑÆ.ì‰y"¿Ú"už¹ªÐLð¤dçÖ´O{bÒA'˜äŽEe\͆ÞëŽz×U ‘~ê9ªÁîÍs)‘F㜎•ÊaF9ÍP¶¹V9Ý‘W̱¼XÏã^•9Øò§ LÛø<À]x`?:Å‘YŽÂ¿0æº Y 'vÍg])3†Ú}+_hJ‰RhÀùŠsм—»ˆ ÆMF¶ÛÁíÞªËFùô©º.-¥c GRT«+{D»–=ñ³nB;×-¥1uÃpAï]–UNGЊóêÍ^Ç]$Ö¦ÌfÍkÙ)0«JÀ‰Ú8”ðsZúmÒ¨ÆAük’£êwAs"sÇ"¸8»¤j†ònäè cÉ*º’HZ&Œ³Ù$à á¯8êtRR„Õµ7õ¦a6ä'cèkí°ùˆïÍl[7›jÖ¥ƒ8é“X×YŒ¶þy®:VZ#¦¥í¨Q†Ìžzƒ[¢þæ;=»ö·Ö¹«YÔK’Üg¥h4/Ýɪ«%ut“ä'”æM¬Ø¸­ÍPŠC<ŸjçÕŸØõÍO 1)ÿZ‡÷ª¹a8ØÊ-­ÏQ´Õ-î`À”7J‚Kh‹yÛ½ÅyغžÑüؤ8‡C]>‰â®PEq€Xc¯J󧆕?z; F;£¡Žell•ô=*HË#0Æxê·Ùš+-¼›‘°@ÎsV5&—hd^OQ]8f£+£ ðŒã©‰y#ÁÒM½Ï5Ëxžä\@üDZïZÚÝÈ`qœÚ¹[«³çë_Yƒ¤•¤·>_+·’¿Él`òkæ=¹ÏZéµ ˆ¹ q\ÕìÊÇÒ¾Š-Øñ­gc.ãŒæ¨6Üœsõ«W2Œ9ªM ÁãI›Åu (ô{[Èõ庙ØIlªÁ¡$žk לj³+ô9Ú«»IÈ£e«:e.m•ˆ éQ9!Žß^E<{Te˜|ÄŸZ‘­†çâ“9è@¦¾T“Öˆ˜N*zÜÐx#<ŸZ@óÎiqúQ¸w#4Ю)8#ÒrN 4œôüérF ”"†‚ã¿„|ÒÀûP¼ç<ŸZq^Öšm¢7b¯'kpHœ7Biªê™F3Üž”X–Çü§ ÅX‹î­@ƒŽMXˆ{qUm,"ä\·~߃ïïYˆXr?:ѵå2zS)5°­sJ`½ŒóùÖl8ã§JÑŠ#°Jâ©Q å¡§lùºZÖ¡ŸœV]¢‚~•³lBð1^]zú4¨¾¥ÁE 9â§µ•Õ°@ãÖ™æÆ‘ngûÖ«ªI‘ O½yr››³=ZXW¿C¦½Ô ´O5ØnÇ@kšÔüE,ìB¹TÆ0+”¾Ô¤‘þy‰üj™œ»d9ÅTpýYêBÑVFãÝ3ýæ<Ò«³)*vãÖ±Vp­–cM—PiÈÛÆ+©RºÐn¢F°ºT”‡lƒÜÓ¤¼µ <²L€òb˜Þtù ;T¦i-28,} 5B2Ø…ˆk¡Ð\j‡pQòޏ5Iõ)öñ‚z×5q~['q$T–²¼›@lû×\0¾íÙÍR»½‘ÒÂï#Žùô­#o51œbªX)HÒFQ•Å[[·Îи}â+–¬:#XNÚ¶Os9·ÞR3ÎSYq¡Ê’xè\›« Þ¹ªóÆ[Ú²§îH*ËYhÛ##Ú®Û\ ŒÔSǃôïUÑöJ2xÍzJ¢KCËjìØ•¾R3U› #$Óä`b-Uí iˆ$í¥ ¼ËQrXˆðª×0\ ~µ=Èà“éU‹íaÇJî\i\—Kr®wõ· ÀšæYÙ[(*·i+3XÖ]N˜Y+3¤`á9È5¡iqåá»W*÷)ƒæËU´½p 4r&‘JI# ¿Ôâ…ŽM¸ëÍT‹R‘TåIäÖIPçxaгkå0ÚÇÖ®Œ,Ä«´îwZô:9'rüÍô£[‹Z¾½·‚Íc·ˆ?rkŸ‚Hì¢-k9fpAöÏj—L†[k‹¶` ÀÂûWðÑSr#®¥G4¬1äX®°8æµìpǸk“¿žFlç‘ÏY/$d Îq]Â¹ØÆ5¹SG^º¼M”všX¯  ÀNÙ=±\T“€ü?C×5f®ˆàzf´úª‰œk\ìF ’ÆcÝÊñÖ‹;“†W<æÚï?BzЗ럽ôæ¡Ðèjê­ÏQÓuÀöŒ…›zò‡éV4¿]_ßÅjóRàé^§ÞŸ$°b ox?2úk§ù„##ëXû tâäÑ2«*DÙñ{.$P~^q\6¨YIäô¯JÔÒëwhÙZEê¹æ¸nÕâ N+ÞËçu>g Bm½Ž*ù¾fÃkå˜d“Ú¶u†>¹æ°/æä׸y«R„Ï–ãÒ«;|½ji€ädóéUvð¼Ö ÚGJWÎ3Н0%†*lñÎO=G)éŸzÎNå¥bÐÔ$Œž†¥ÈäŠnF@5P„©È8¤ 6ü½i_ž­ ¡HèC¸Ÿuyêi…[#Š{78ÓIçîþ´Ú÷¸4ªA#<Š`É8Ó‡\µ›‡;`áyúSsA`;Ráüi­BÃÕC¸Àt4/ÝJZv „-ƒÓž”s‚:Ž´{QÏ®;U\ÜS7S›ÀÇzˆõ5-'}?wJòF9§ªÇ=…jUÁp¤œPq»<Ó”nF-Ç=éà’§åÏ\SHLˆ7piìæŸÀã­#Þ´ h1yõ§úP«N*2:Õ4;€BHÍ?aÎ1Òœ¼(óÅN©»¯QÞšŠ"ö Tôf%åzt§… §ý©ì"$\þ=jtèj@žÖ¤AÏ gp³$ˆÀç ö­WŠ<ǽ_‚-Äf2MaRIE±¥©~Ê0\v½iÓ5“i ,ƒƒƒ[¶Qùì+ůVÇ¥F—3/ØÙî=½X»žÎÎ"MÂFEr¾,Õã·’8m¥`à|Û[ÆÏ¨Í ù‰èrÕÃ3ªùž‡¯T µÜìu]m^MÑÉòŽÀÖ5Ψ³ä‘Ís<™iùÛšé…+ÛBùw/ÜÞy¤ª9Áü)‹$‘ç8’ÌU÷äàT¿ji##Ùn£c˜zóä¹i$ÆxÑ褱–€aáqó9Ç’¦é4ãЪî5 Ó8½Wp•Æ9í\ýÈæº_H¿jpŸw'ù×3vÞké!ð\ùu£3å$Þ —‚:Õ‡ùŽGZ«0!¹9ÍbΈ²÷„(üjNí¤Ôî¸úÔnŸÅY´kb¹'=©Œ{*cƒÏJk¯ldŠÄ¤Dø Ö£Rr3Í:@xâš î9 ‹Ùǽ`µÓ1ûøÔ [±«äopNÛ,7~cŒ(#5»ö¯.È(þ#È®2ÊRLu­;‹¶•ˆŒü v¬§¬’*Z+š’0ä‚+>c–-œsÒ³ÞîUÀ-BÎÎNîF;Wlc†lšI3ÐñéU¥`H8éÚ¥]¬8Ùbr1](çlŽ>\úÕõiU;t ç®=*üvÁÿõTÔ]qØ¿n2«Ûn\ªåO5 ü>•#IÚ±H¶ôkÉ'qÉ5§æÎ'|òótÈŒ’™å Ø÷©ï$ Ç< t®ŠpS‘ËV«‚2¯¤rXäæ²î¹è­;‚sÆ­g̓^‚µ¬yjïVf²KvÍ@ÅN{š»0ã#…ªNÕUŽ[<֕;j·‘ìkІºœ{2·-÷jÜ žÝé^õ‚äò*Ýì\]‹ðºãޤu«V…ÆI¬ûE>„ж]”`w¬9Ës|'ŽOJTRGP3>£“O\’÷®ˆ¦‘ÊÝÙ$d®px©Pî<ÔjAmƒ·Z|QÙÜ1õ­9ìG-Øüì_—ŒÕ?ç|þ•^U$àt© ›ÐqEîƒfk$Šƒ4ñ.áœdUbaÁ<š’ äŽz‚¦Ú}M«FÛhÍŒk:öDç kcFh®-dƒÈqXšˆpì6€ œÖØi]´qâàâÓèQ–_”Õe÷©æ#±Æ;U)°rk¹»hŽ$ˆä9?xãÒ«HT7âžÌWš„¶êÆV5HBbIàŽ3Q·#ä¥%ºùÑÉîEË!|ädsíL`sOÝi¹ÿëÖm–˜ÑÀÇzB3Æ:ÓÇ>œtÍ0¶Z‚– 2¤Ž1Šf;}*BA\úTdÜS°Ö„C9ÆiÌ9§äãŠP¼qÉ÷¤;UÇ^”mù²ãéÞ‘zìh{qUqÇNôò0p:T€ 40îzšihg±AãÇzËÇ­8($äâšåIïÅ6‚ဠϥ4ëN b›P;›©¢9Ò§¿7Ö£ÉàF³fü«úž1ëK”]¹bàŒôü(›Œddç¥mËc¢¬éÊÜ‘°dÇõ {Œ÷¦¨½jUUêO «Jú³•±B d~u* F{óMNõ ÇeqÏjÃyØe•óÜsM7ŒG'¯Aé]1î†þÑÌÐrG_J­;«‚k9¦rq»qô¡$uaNJ§‡¶¨¬% ùavääc½: ÁÝÒ¦Žbn½ªwš(âûÔKŸk&ŒýÓÈ>ÜR]M!P…ˆïOwÚ7Un$Þ¿tšÒ1z] ­.U•‰<“Š`.¹Áâ‘ØçbšÛ«²(✵&ŽáƒdôÅ)›w5)î&œ¨sƒÀëZ¥Ë©›w'FÇQV£a…檬lp@&¬Å¸ž}*g$÷‰§m¸œ©êkFÊ»Ÿô¬›u3ÍZi™ zW•Us;#¾–¬³u|껕Ҳe™ Ÿ­M¸ŽzÔ ógž)Ó§ÊUJ—G$ã>”äc»9ù{Usé×Þœ²l^y®ŽS.bææûË£µïfÉûúU$œÝ‡¥YY_nx¥KŽ€še‡"ã‚O¥Q•˜“Í$’üýy_§ã–¥9½ÕÉaÆ+NÎÜ¾Ò õõª1FP幫¶×{ÀõKÛÝ.“ÔêlE´+O(Ï ­Huí>Ѭ™ôúןÏx|Îzz"uvßÎñÅyÒÁª‹ßgSÅ(h‘ëVþW‰-]­í£K”äì9zÖeÖ”Ñâ6¬Oëriר۰8Æ»]ÚæD¸€IGËÀ¯6q–§'Ù5‚S?S–ŠÕcb9¨® ¬U:µ¡|Uä‚qÕjœsà˜ä^½j¤Ç(¦¬Ì)m‹9ÊqŽÂ«µªô Šì Òüä.¹À™}iäœc¯J†%?tòëRqw9Ù-@ê¹Å@b Æ2AéZRîÉŸʢ*r8è]˜¢¤`F9ü)ÈrŒxT’¯SÜS",zƒŠÈcÑw0-Á©]03‘B2¤ $䀣5¥ï¡$D îÇ'½LbŒ U"8ÑqÉ©âÃàã­ 7DÜXmƒƒ’:f¡°àçƒÞ´cd ·4”À;u§ò ×½-«TäsJçžõ* ÿ60j~Þçð –ÄÀä kW¯9§GÞœµv²Œ{Ò*à稧*àüÜÐy9)n"3ËqNsòÓÊçæ#hô¥Tâ•®‰t+ÿêM¦jq®UUœg#  ŠÊÉ'qéíSÞ^\ÞÜ<×s<Ó8ǘí’xÇ'éQdúVnÞñµN^g˰¨IÈ©¼u¨RÇÔV—IÄ»çÛ¥Oa‚ãP§'ʬ¦2*/¥Á–í”ç8­»6ŽL’€šÉ³#xpjƵp"µñõ~[Ú¸+Ô¿ºŽÌ,w05kÁqtòà“jÉ’R:`T÷vqÆ*ƒùŒÝ+JJÊçTä;Í$ÓëN\¸¸5 nE]·Q·§&µÐÉI’D‹½Iµ~T¯*O¾*´Ió{qšÑƒJÁÈÖ:Kd^i’…V!XŽ˜©§2(ãÕ ‹ïèzu¨Œ[ÕŒVƒÁÁÏ\R uo»Ö›µ²3V 5³Ž‡+©©Nk3»îŠì;FIÎkg‚pG4ñ õ##ҥɥ¡JÏs,ý³R e`“ïZ/8Z"‹Ÿš“«¦¦œŠú’ÜìU c¯á÷1Ïzžöô¹Æpµ@¶æÏnÔB-êÉ©%²ݦ¶GñíNr:¦¡rs×"ºbs±À€z)²8¦³飂r Y#•|Æ®*Y%Ø¡sQ»€¼|§¶*cœ“š•¹[ '99«Q:ªóÖ³S%²:f¬4ª J©+·†RGZ­$¡OŸZo›…8àÕI%''9¨Œ]ÁÉX’fcóƒœuÅMivóùU— óŽ=©±’A+ÐÖŽ¹[S¤±¹S*ÝÁÅz•¨¬±‹yeÌg= y»¼eNy'Šé´{‚Ò¤lä9&¼Ì]us» U%c©¸šD¿xœ†Ži“É6òÄ·¢óŠ¡ª\$Wˆ‘6åëžõZ{‘'ÞÊçÒ¹=5™¬ªèîtÚ^§,r'ç=ÔúV¥ýšÜÃö¾ÏÉ_L×%¥N##hÉÝiRCw§8íe5ÏU{)sD×ã…™ÅêÆ#Àâ³§‚äu®£T…Xœ÷¬£b×îQ•ãvxnZØÄi˜HUÇè›æzÞ­Ëj»³jj[í úVÉ¡\‘Îqš– l†?JH[ã4Årã2‘Žã¥Ia6ž=¥W8ÈëR íÇ|Uß±œ™´qÜŒÓÒÄ^äMמ”!r@ç½9†OˆÊ †\œ÷¤Æ·*äzÒn>½:Tc€2ià‚GF¤«“^I©•Áý*JŸ”ƤR·¥&Éh· dîö«q  >õB#ƒÇNÕ£j@ žsÚ¡¶Ö„—mƒçv8ejòÎûœõ5½T‡qààõ¬¢Ž:“\OY\õh'X¡"qÒ£ò»ãš¾"ÀÒùjz ÚöB’(¬ ž•f |žx&ͼšrn'#8©æ¸ì‰v* &õŒ!lz°£w^qÚ¥ì=Þƒ4)»w>õBC†ãµ_™€ÅVe*bÙlƒš§1Ú…AŒ÷©Sž•¤¥dBÅŒ‘ëëOŒ}E9#à“N ·œV^Ñ-Í£:š@Ý9©$Ýè1Uep:õö¬ÛæØèŒm©gͧ5Vêvô…ùªå²$y¨Ë‚HÅ8ÜSTsÛö%Æä±±ã Ú§·ž8¦W’4”)à8õI€ÎwSŒ‘¸“N× Qmñ+c…?ìô¥6ð¹ßqþè¬ÿ5Ó¡§ ˜óžO­W+3¾·'0FÌ2p=3V„qEØß†+9¦#ϵFÓÊNqNÍ m×™¾R5»¤æŽ Ms–Äà1ë[ºC°$ž:\õ¯Êѵ&nkùW1ºd¡j ±É»‘Vo$g€‚è{U(›åUÈ®%~S­¸êZYEºïñô­ß ßþõ’Gáï\ýÌ[£À=³V4 ‰¾Lr£žô:j¤0öܬè..C;cò¬Ë™W€;Ó&gSœäÔRц/5Õò«5ÝȦê9¨äcŒJá%½M4ÆÊ¹cÍWPn੹yëëNω–P7ƒÖ­Êú¬5HPx¨&‘ùMHç皪íóùT×S±^L޼Ô;Øu4ÒH8<kry®”úœÍ“Ç0ÏSRïܤ橴҆9Æxë[«#&NÍš…Ø“œŒ{PúTgŸ—¨«nìWÙ8éîiŒ{c4‡ œžABìHôëQ}JØÆFrµ1·lè=êFPzšf %{ ‹krÐЧt5,hÒEcЦ™ÛúÒoe!”•`xÅ&ЏéÒFG]¬8 ñLQòóÔÒ»Hí¹‰bO4c¶)ØWIèFÉïJƆ?6)AL“RÇqBðyÕÈcŽiËÇÒšXçsëÍHhÅn«õ§¢‚ ü…1T€YzúT‹ ‘zka=Æ)0íê)äþi̦޾µB¹UÀÉ9£Òœq´iqÏ~ãµ&)¸äN^;çÞŽ¬IãŽ)ÛBÔc.£ çš“§N¾†¢emÇœÔȸîQþú‘XzS`Ž{S‚©ã<ú .j<°x$Œ€jïR©éŽ=©]ÞÃ,BÜÓØõ­k5{øTgšÈŒŽ æ¬»ÊØŠ2qê+*­¥d˧å©n÷QÞ<¸†¹ªH ¸ç4=» %Î ç=”y>â¹Vˆô6Ð{¡áGnsO‰FܑЗgÌNhd1Ï4Ü„Ò!p„¼ÓK(ùx¹¥*‹üUZvÃñS¥ËI¤N$ˆ T‚P½95AX–ÈïVc9lô¦ìl–I ŽÕX±`ûÔÎÊãQ’:}hM[Qò€y©Óå#w§j®tT€ü½yé·u¡¢‹[Æ2“lã9ZI‘F3ïQVë&µÔÑI-‰Ìªç–Æ;TrTàŒT'æ¦4¤qO}„ÝÈe79ªÒ9z´ìŒæªÌ«žsõ­2di.æ¤.dµ^xìãÙöéVf› §Ö³gØŠIy_B*÷$Õ¤1I àñ@$ƒëM<àîÎ=é}1úÑ`z’),À}ÜsHçiâšXýìk>yïE„´wŠF óŸJÜ0ÀÕ‹H÷°çÖªÚÙÇÇJ‚@Tu­ ÔUi9öªå†0kH=’ ÞIÆqŠ‘9Ài¨‡=[ŽÄb›’bÄÆ0­{€¼þU–3ü85=»°8 šÆJèÑ;3¨Y̰ªŽàU« O8…%y5“e;oE8aé]>Œ§;ŠÈéŠóªû±:¢“wcþÅ»s‚«˜ü¡µxïÅiÝ’€àÌ•,zô­(EØó«NíØir[=…H%ìÛU|ÐNÜn¥ vÊ×o'S™H‘ð>ôɾo›Ò˜Øû¹^œ 2 äš@»‰Õ1YŽÂœ“œS9, íRùaA99ý)(^ y¯=ih·)I ‚9Ï™\€rZ±eÀƒMêÞâ“î‡bRÁx›“»­5øäóOE$ëS{ƒˆ¬nœÓ¶ü½Z@8 çµJT€3Ö©.ä-ÈäÆ:R"¤žµ.ß—~4Š0 õÏzNȤì0q×½<áAåh*ÆzzÓ[êvóùéWìHï#Õ1šU½:Õð1Üp=+ž~î‡|jäÊ7JëÆD§*sÚ•¤Ãc=« ÊEi²€ BÑçïpjîÕÆX~5VwRH^›*âÁƒS\8ûVq™Ô€ 6I‡ÌÜV\®æéÅ-<ÝȨüï˜úb “ãõ¨Y›Öºb“"÷,=Á9¤3¶Þ¦©‚K|Ý*]¡×‚EidKmìH%,ܜ՘ÛåªqÆOÊÈïVí<zÊi=Šˆörõ÷銅›Œö¦ÊÇj p3ŸÀÔÅX.=›#Š@ðqŠnðyÇáC0ÇSUk“b9Aç˜2Fp8¥Ž¹ät¨wŸNµK@h$'Ö¢=*G# Å#­Q-‘îSð}Í)&˜Åzu5I ˜‘X‘ɨÏSÍ'dóFy÷ª°¹…E$“šµ(7òíQ[ÆY±Û­Y cv¨›è$ºË)v¨›;°GZ{£àR¬ek ³cb·ÜC¯AÔž1RÌv _~¾µ³¯ñÞ¤„, îÉ¡¦=øÔÇz&ZHÔ!ùÌ8Jµnàä -ŒËVEK k¿Ñ‘†O W aù£Šî­“§DÁ<×%^I#¡NÐlŽàg$þU›pÎ*åéÈ“žµFRršì£ +3ÇK²œƒh,HÕf+‚zô©fœc"«±ðOºd—) ’ ÀŒš—%†1Í1H<‚)ã#¥s5¥‘ÕX}¹*r~”]ícòšhl3QÊv±=ñøQʘܬW¹bˆ1Üvª¶âz‚:U›‰ ðj8ÈäûVÑŽvîÆ <äñ޵p@©ü¦œ1­Hæ°ÖPziB¸?¥(S“·å÷§dõ=©«‡5ÈHçt ‚“ŸZwRM ;üêX“ç=EJ>^G9ô¢’W¹ëN˜{éZ8Ù\W¾ƒ_$g5*RNïPIƒœæ¢Nú0üóÛ¦*UË ÀsQ\ƒ‘а0ÇCH¦"¨ÏÌjCÆ6ŒÓJ‘: ¥tfÇ@'­)Îìç4„ŒŽiìØ#smJw%€ ƒ‚sM§µ9°~í5¸y¡¾Â®ï˜v¤N†ž@#ZLœæ‡¨Ó{Ô£ `ôÎhn™ÇÀþ4Ð4?9ç=i§Ž½é8Èæž@Ûž‡42FNÀeȦ’E/à}© Ž2Üb˜Üž=)ò0`}j&'<~•#[”>mÝ€ô¥ YºT›w0NGSRàdb³JÆÍ‘…çŽ)àÜq‘JËÏZR„ž*˜\EëƒÁõ©â^Ç·­3¿Ä9§#yïÞ•†™v·8ëïSmœžIªØŸCV"vÈœ×<ã}Íã;¯'ŽžÕç¸ã(㚯tËœþ•ŠÎ…2'ÜÞ¿3§µ=C¿úSg°=:ÑËdh¦U‘ÛqÀõ¨ä—äw§brA>Bž’¹jC^S“Q³oöaP òx©‚ 5½­°+îÇ¥W;V¢,¿Ä¸=ˆæœ$ ˜Òi‚ve¿<´(Æ9õ¨]˜œƒÅWYHç9©w^ }j9Ks¸à÷¦îõ<Ó Çzaqê1CAÍqû—qÎzÒdœóô¦;‚0)c=jÔl+Ž=ëQ3qNãqÉ=)Œ^xúÓ°›#i÷¦y¤ñJÊ Í'•œcŽkDg&(<àÓÌ`ô⮚_˜žOÊ=*ˆb4YÆã@ˆn* Œ`JR¤ â¦NÚW%·ÂÔ®@ü¸î{Õ@\ƒ€iÁ_€Ç†ëQbÛÒÃ÷)?/QëNG8ÇZ!„“œ·MŒŸ­8¤·fö+Ço#È­_û2B›N2})%S•ä VsÁcÍ_2z´Ñ.Ü®æcúTct`)«o€Í(`ä|£=(zhN¥í´·q¢óÈǸ¯AºO6%P0TcŠãü5m²ú9Fµv^yë^}DåPÒm(Y™2[È„år=ÍW‘r3ÒµnḠ¡*ž0A]°½µ<¹Zú³dµ˜?Zµ:pG5Y–ºš$HXÍJX\{T% ò)²Rj,h§ebfd{ScÓ g;©²(PÔ—+„ª ÈéQ61òÓƒçŠk/š¶…q8==}éÝÔ£ ¦Ÿ½Upå #i‡å]§¿z’™ 8éO †•iB-Þç¥=cíŠArxÆÕ$tíW-âÓJ¼–æâAzû¼ž´+”þ}©1×'Ú‡ ˆ9Å5dn˜^)WvqM%rxïQ%uq­Èцâ)C.j„6HâœKg+#VKÇSÍ.xȨU›<þU*üǽ;¡PÄïã¥$`ž†œ¥è †q޽i±¤(bÄd`T¨Äƒô¦FO>Æ¥B7t¬¥ªØ´N„ìÉ=y¦0a­9zþÕsÍsIYpWCÕyâ‡\ò´‘ãnyÍ,…TMJwZš4FÊ ’GáY×ÍŸJ¾ÒaqŠ¥;`ñõ¤˜í¥ÊM¥X1ßó©ëSFW8nkFØ‘µ.3œTrÛ2sZ$®Ü* 6í ““R¤ÍZ3ŒEM:<ýÜd×€OÔR.1¸zU]Ø‚¼¨GJ®zàñWdäæ¡m¹ùÇÊzš¸í¨\¯ºœŒG'§´Q$7â™·åÀ«Ðžaû·Ø>•Sü9#Þ¥D8èx”¬‡f‹ Ì€qÖ“u8©ëK呯 2>a“ÐTŠ8Í9+·êFˆàíI2Š:R¹ 9月s†´ÕÍHÊØ#Šjª‘žâ‹˜nÎO½ s·%³Ò‘ˆÈP>ÿzU®Â±(V-ÐzÒòyÍ ';};ÓþAÓ8ëODfÆr2)äaE<|ÝúÓvàžhi\I´FF߯†ù@ïš•”dî×Pµ'™qÏZ3Ï×µ< “ÇäT$;!H#'w)yÅ?ëúPc“ŠN7b5#zŸnÔ½8§û¨"€òE+48±£<Ž)Ê?¥4›Ó<óO<‚© Nâ©ÁäHÄÒ˜OÏÎhæ?ZbC‰pj:W\sž´ÐݳM/÷‡SFN}Ç¥"ðÌi 1c¸£ ˜àÄ·>”ªvŸÂš˜PFzw¥¹¦‰xôe'$`ÓnÄõª½ñšVíš@>n çÒ¦ Y½îkÐjxÁ©â^â–%c<Õ…S§zN]Ih¢cÔHc@;S»qÅA#dãŠÎí!Ž¡Tž¤ÕWBæŸ,¼ŽEDîJš¸ß¨ìT”zÒÃ'&ŒåêU°ÀÅm¥ÄÉãá>•ZdÜçéV]qŒzÔNWiúÔ ±Y@B`ýjGrFìb¡r3žÔŒä`uªHÌ\“óÅ>'õI´ÉhØ“÷‘ƒ…ª„‡i Žiöò0NGZ–UY8šÒ:îgÔ¨ çw¢B}©H*pzS\Ȥö±I_qŽHçð¦ŸSÇ¥8ô÷¦àýGZVú ÇŽ™õ¨˜ƒÇO­8ç¨=iJŒ9'­€Ì8ö¤Ùíš~2GÉúÓ¶þ;XMØ`E“NÂçn0)àdrsŠ>\g¬;±»w¥<‘ÄÒã=Ö“§YØõàgð¥>ý=©ÛØRŽŸ4+#åÈëMÈ<‘Í8äžN4Œ~)ÞÀ´Ôša$ž¢¥+•Ü8¦ ¹Éô©eëI“íCs‚z˜¥ N*w„¹1óR¶6ã85]†~^•.èi\{æ†úR(ÚÐ~´¶ n)eÀÓCcšŒ¡åºsÖ´dóG7q rŃgŽôÍãy*3O~†¢*¼c ÷©v4è?wŽpjA÷z“Q/:”týªâ&`zñÓŠqëÇJ`=ià€95LÏ©)éßÒ¤UÇN¾¦®Ç§ÊKŒGLsMû3 Ý0*ÈÈÆk;[SО¤uh„),( IÆ8õ¤}Ä‚OËüèà#ëUÐæ{Ø~N8#ÜÔŠT/99éL\…ÁÆi}3R݉±"ð9?Jƒ>ÞõŒ€;S&7ì+6ÇäJ¤”‘Á«ÉÏZ@Tœ÷Å=W,06ŸZɽ ŠÔ’ißZ©÷˜úzTó)=úÓbAƒ“Ȭ.™ÙìBØPzÕIC3ÔUé–´ p)¬ jB‡zÓQ ’¬œdT«9 r=ª×’ ^FÑWbI›ÇzaFÎ *+o¦È`GqV„ÙÀ#>ô·ËÚ89ëV# F §M–!n”Ù%g#ŠLŽGéOpWßéQ2ó»5 >ƒD˜ô4€yô¤ëõ§ç‚=è² Æ”cÖœz‚Ò 7_Æ“ÜaŸJB_zR@8õ¦·¥AHQÀœ¦™œÍ*#µ @Üœô5…'–?Z@Ýÿ ˜!(XÈ£gcÞ©ŠÌ„çŽÕpG5(×>â¢ÒÆ`žœS¾aÅFGåCt<Ôj1¿(=A'Ҙ˹ºb•—æëÞ†n1švê aÏ»Ôlî•/ðÓHR:óI«šd} ã­ÜF8¤|ÂøãÖvW*²öÜ8÷¤zfž‡#9<ûPØÇÔBä,§u*œOLõ¥‰9¥ÁÏMÌҪÁ{»N[Ž~”æëK1LÎ`#…ƒ¾O9§²ÔRVg»ü&ðï‡u;+í«¸‘ö ¤sÜšóÙÛÚê³Eo>è£vDô#5“o®ÜÅ•Pùr2=è{±y¼M’s•#µ'>hí±õØŒ] ´¹"õ±šr[‘ÒŽ Å=€V#=i„ÓŠW]–jÌUÃu Rõ8¦‚3O\+dŒÔîI2/šž 0jr2)ë“€;Ô=†‹Hã$Õ”EÚoZ©9ÁíV ùhA<ç–ŠÌÞ R½ÇúìÇjUçõ¨Pdç‘S ¤çƒÒ±ZÖЊä|¬N9ª2[ ñVerçÛÒ¢p¡zc½EWåñ‘Í#ít"£‘þrEFp$ž‚¶Žˆ™ÈÇcÏjh<¶=iª¸ç­ ž¹­T´3iŽcòƒœÓ8#Ò•¸LT#$š¥v¶sžŸ­LT’3×Ö LêsÚ­&XŠbæà -*#qÏçOE]ݪG*0F)ÙØ—a2aj@H<õ*¹o›=½ªE}Çó4›iéœ÷ª’  šV*ØÔî`8ã=ªV¬»Ž•$uG"'Çô©-Æ>‚ªÖԛܿoŽZ¥w Ý8”[åsÉÏÃ1q° w¨ ëæå³€*É ÛS—!p8õ¨%"A€*่nÌÍÝÏÍÞ—Ë'‘Ò§ÜÏ­N# ¹8´i_A-Ê"94íž¼jÔõŠHã#–ÿõÒW¸î,@w'Þº?F²³˜ã Ê95jp¡H8Ï"º_ Ä¢ ¥o—wR±.vLŽà0ä÷¨BÄ{×Jm-LüÍîz t¬{›a ýìúÖ‘iìpKršÄŒ)Î{Šs@…I'ŸAO¨Pù¸â´[X’9"qQœ8µNNNOLS@Æ=(è` ÔÊÅF¤óœgµJ¬0äÒ¸òß/#éM,‚{P ‚qQÈv‘Z_AYõ,+¨ëùTŒ…”äóTÃg'ØV…ž'qqÎÜÑÍbáIÍòÇr“ ÈäûS<¬Ý_­t:߇õ2ÞÞæöŠ;Z"{Ö ðISoV*Ði¢ìûQqÍI€01ژ˖  QÐÄaƒÉ¥þ  #Ï­!€k&ô£Žù§àQŽþ´˜>• 5¾b;cµ# ôÈ©~\dÒ`úSµÆ™HP:š™ÔqQ²ç¨ü¨ð"šÉK Œ ðW ñM|ôÏnxõ§q$5‰õì=j6cÔŽ½© qÜô>”œ±$t&³l« #w§OqÚž…À b‘·mèõª¾aœmÀŠn}( ŽA¦ç'-ŽÂ7Þàäg­4ŽIzSÂä•<Þ¤QŽF1YÚåó…*¤zt§* ¸Ï4æ÷¤Z§®„±Jž9­Jˆ8çëHyl/Z]®z-et+)ßM5”ŒŠ"nç=é­æ&žP¿B¼gjÀ“cŒúU@ß7ÔÊ}H>ÔÓÝóv%ûß…))»½8§+!$Î+=Ý»Œ Kg5*õÁ¤cšUÇ\ÑkjJó$Ý”TðŸn•\9©£pœã=«ji]içŸzŽfÎGjdnyç½2v r+’wgmžã7.î”nˆ^}ª¬ŽAÈØå%²8$ÔnŽ«X¶F;µZä ƒŸéS‡Âäöªw2Nzõ©ê4®T`}hBGð‚ =€¤8UÇs[ÝÛ@°ÀœØÁɪîNG=) ³UÅ2[Cd/»À =hPK ŒÕˆãOå[ÝF&.ãP|¼Ê¬B¸^ T·\нÇ^Õw@¡Üíz„»³tô©.-òš…³ÌzÖwBq%°*hÎzqU»È SÆqÆ}è•ÉKRI:Ô9%ñš{·ËÍ5FF@æ¡]ØÇSæ|§9§ Ú¸=éåvõæ˜Y‡$ SZ¢29 €zqšz’HÚyjºà‘דS Ú[´¬ÑM‘Ý;/@9¨w=…:q“’F*H€GJÒ/—b¸Ñ9nÔÙâ*â 8íÞ›åŽã“V·»3z9Í/–XJ²búSÐ2ô\ý*öd]Ƨ!sÏ­ud2¥¤q‚NHÅdiöísy„Àêx®âÃO”£H"¨ä‘XÕœbÁÅËDPX‰a8êe^£‰2ÙÀãšÜ¹¸xˆ¤$ûâ²/îe¸oÞ0ÀôtœšÔ挗$·B)Ä.Ð{Ô¬ª9ê*,.sÏJéHÉ1¯ÀÅ0‚Fæœ8g"”€·J\£"Èô¦¶A⌞8Ͻ)i'­- ¬z“HNXŸ_ZUQ€O¥‚9üj–Âb 8wOºkYVaŸ•ƒ)È<ý*’úçŠs88=°¬mJnœ”–çcâ__xŠÒÒßP(E¢M«ŠåÉ#*1üê¸$±©×æ÷ÀÅ8÷7ÄW•}f3‚Çû¾ôÂ84öS´ w ¡È qM¶Ž4† ž3C¨QÈÍHS1zS\ôÏ_åRÖƒjÄ]:Œ}h 7¹Å/RIéÒ“€Ü“I¢.( °ãÒœ áA8Î?„&ÄuÚ:uïQ6G$€ëR1b2zS ü¤žií°/0ÎF  ŒñÒ›9ÇÞœAÝÉê)$ËMßÈ Ò¤Ty©FsK—¸î4‚>ð¤n€v4æÏóMbxî3R ÷"”m¤Q‘œb¦lAÀîñ©KRÝ„ãÓ‘éNP{Œw¤#>ôòÁ‡z,ISÍ<(QI×94¤<úSµØžƒ£\6vž”õã§t¹Â…=ý+E„-î;naÚ£ÇÖ¥éÀäw4ÆÀ8ÍU’DÊFHØ@ç¤RAš€»¥Jõ‚gS¹¹¥\õÏ5¶_#šN~lsÒ“d–:Ó” ½*>@ÇcRÇΉ[a$…U©#â…Lòb¥sËST‡Ã“ÝqדM»e+ØŸj‘S(p*„żÂ;+šR;iGB3ψÓa9R TB[ßÚ¥™‚DFFï­eÍÐìQ¹Zy0vôU›szdÎÍ’M5‘î*ÔU®WK¨ç&¢•˜gë¥9¤À¹¨9ç,4âKC\9 dR¨ÈçÖ¦E÷ÏJÕ3ˆˆq¸sŠŒ’¹'½XQ·ŽþÔ‡ž´î:hWF‘×b>½jATnrE9ˆ?&x¬“mÙ"+u%±V9€qLEÛ´úš°S9oʶòìŠq¨l«TÈ„/qÏ¢û²Þ¬`±”÷ЛëqÛž¸ö¥Ø@§§ÞÉî)[¥;j&Ȥb¥µˆ;ä¶ëQ»g•nÆ&r¨›4I´EΧC¶P^0Ò7BjÌ—Ò–!NÔ' ïYðÆÄ…þr4]¤žÕÏìÕî ¬­¡Zìýà…gʃ­iM2*”Öl¹ÜqÓµuÓ½Ž9»²¬Ão¥Wb§JžRý¡Éþ讂±–™È<Ô­œ*&éIÜcO-ÇJiÁ'åýiÝ:w¤ ·b¦À®”çié1µvsš²ó@ NÒNsž=) aH#¯sH• š¢dûÃ&ž±ÉÎNxÅ@4gæ¡JŤoiÖ²j ¶%Æ0½ÛéV5çJœ%ì@컀u#¡£ÂZÒh÷‘Þ´q»ÅÈ ¹Ít>=ñt^,¹[ÁÅ" ŒFÞµ£iÇsÜŽŒðü×Ôáå‘J1`~÷J¬ä’sùÓä–`FÒ:JóƒžhÜùú›‰·*qƒÒœËÈ84ŽX0)ëœg }9£cœ`ëÒœÀc†}iHÉçô¦²ÐƆdgr>´§N:Rùqß4×`z—±JÄmr)êßw<æ‘Ü­'FñI6 xÀ'ØÓIä†ëRƒPäÈäS¸‡0P9&™ô§G#¦ çûԲÓTSš“ê9¦²úΆ¬ŠÀd3ô¤g=½)@$áŽ)þ^¥¸\o¸âœ@-€y¤\w)FX’ªŠ"LŒŒÆ3ùБ‚”HèqZ$Co áÒ—}á“B}ÑO<ò(3ÜÃ>¢“-È8¡x<}éHÈ#ÜW*W;Â2B\TÑ·\Ôc‘À©£_—œQkî lzTêW½ªÜF•2/@8¨zŽ*챓À©£\ðzÕtVGëSBpØþu”ž†‘-D…A äc¥Tš%fÏô«ý"㸨6ŽýMpNM6zT¢¬Shü´fÇjÌg$’F8­ké¦ÊÈ“ÓiÓgR\¥wûÙ<úP¿)Éã4­Ï1Q°9œÖÂbHIcLËàfžÃ= ,IµKÕihCtµ b´ÀA$ôö§Xg´Ú3OQêäüÞ•::¸À5]7`ãÍ ®¬ ~šè‚ýI¤b8SùÔ Éëô¥’@9¦ýÐE‹±,p,  zÓ²§ƒŠ€’9ô “-œ•¬S"ãŽÕÎ;Ò¦ãØcµ #œH¤púûÕÝØÊZ–ò¥^ryU·îçëZ0+lïÒ¥ë EŒ¸O- ª€‘š@@­k¨Œ«Ð Î0*¶y´"’3¨õ±d(!nÞ5*W9>õR%ÜqZ6©Îz„§¡Ÿ2¸û£4ª¼äŒѼ€(wH°=iǸn&H'Ž1Ö¢/žjs䎔ÅBA9Á&¬‘ѦìsÏJê4ÛVŽÝ]—æn•ÍÛmÃg<Ž wV'µŠhð00G¥sÕž£•6ãtVu(š‰ç(é‘VnŽ g]w8=³zÎé\†I2zòJNârzw¨Ÿràž½)Q˜6C`ƒÁúWRZ'ïj>æÝ£ËgŒU6ÉÆ8­¨Ãß–0÷éšÊ¿¶’Ò]’žO¥8MlÍåk­ŠÍŸZ¸êsC’#éQ±Æ;ЦÚ2B½×¯JsÆO Ó`àƒéÔSKä`ìi\,HíÉç½W•Žx©ÈúR Ýp0h»†}áÏQI¸Š^iÍ+˜…öŒ“Þ¤I ;ˆÃÖ£ ^E/ùx¡£TìK¼¼›º`t§,Œ0A ŒÔ*Ëïõ¥Ps¸r:U$Kœ›º$,Xþ!Ëg½ IàŸzoN3ÒŽ¿(àõÍRÐÎNä¹ÜE?Óš€éŠwÐô­ ¬M» n) `óÇÖ¢RIÜÜÒ³ŽHýh”’Bå‰çšhSŽG4ÂI$ç”å~1ÔÖi݇(ïºG4Ö hbGSMàóM¢’z÷Í(üÇõ¦íœÓ•0x9©Ô¹Æ9¥ã‘Š\ã¥!¢€qNÀ!#o41Ç4õ àÓ\†$bžâÀúÒºñÁâ„àûb‘Ž8Ѱ\ðÍ8r¼qG|Û­žƒœTÜM‚ð9§sœñŠE##4£–8éš´ì!7t©Ct¦É5"ƒŽh½Å¹‚9mÄð; ~Il®1Q޵"œ W-ÎÂMØè:úT±‘·8üê!òð:z7;{zеz2uôö«òxU^CƒÖ­ÄNáY_v4Z†<ôÕ¥¶Üi¶¸?tŒÕ™gòP'Êxük†¬Úg}\ÄMò¦;TO¼&š÷Øö©Ë)<©ÇlVr=8Óå} fç·¥gLÜäU‰Û­UjÖ Á&ˆ›%³G\ž´3ZfOA[ØÉÈy`ôÉÍ=ßäÀ­CÐŽsJ~f犭ŒïqçŽséJ¹¯n”uoQÒœäóõ«H‚æ›$]C%ÜBxU†ô‡¥YÖÞÊãQ¸žÂßìÖò11û;FzVthNrx3N 2sP ù®mí_³öc|¶l¤T[KsÒ®FÜ(õª ã¯q9š°Ð7dzRŒtn)ÃnüätíNP¬Ø#&´³"ãáA¸mçëVŒ#ïc§Z „ iîNxèhR³Ô„&\Z°Œð*šŒ75:ð3œU·¡ž©–¢”’W¨g„åMC™;ôíS6HÆ7³)‘Ç ½iÛ&#µR…2G£Ä|•¤š±‹S›ØV:aÛŽ+_Pÿ_­cÁ̘4àôÔñI¦˜û‡¨ÛÞ¯–-ܾga ç=È?…Fäç‘Ó­I»ãAPÈÃ’ÔU½d4žxïO!{äÔGŽ ’07tÇjSü'½0•çÖœ¼gŒg½4®NAéÞÈ#ÚűK˜É=E<·ÿ®›Ôú{Ñk€‡jLžØÅ8ã<œç¥+&G›) g§NÔå$ç°íŠo Þø¥1ÓT‰­Euýiû€î*.Ù´ÜÄçó¦‚ÄÙÏ>´Óœõ¨ÏNý{S²{fª÷‡noË­DYrpNiI9Îp**XàsY·gb¬JÌÁ¡_œÔG¦ÓH¸'çô£Þ‰ ¹§FÇ­BÃæê3Þ¦LÔÓwÔ$Þ S÷ŒgµCŒž{SÙ¹¦Éhp'4òÀœcTd ©Å8 ÇŽ;ФúHO£Æ{ÓŽ qÐR¹Å;ìS‚ÝxÅ0ëøÒ…äóŠ,~àšol¨äõ¡c'‘No‘RÄ4 7CNùã4í¾ôŒ„ Š« ÜV#ƒøT2Há±vRFžjMƒÒ„ôv1>†ŒàqÁ¦·lFC3Šå; AÈæž§åÆ:‰sœŽ@⥌`6yÎ ']ÙÉqRÄÄcœU·åú‘V"á†yæ¦Z- †æ­¦äË t¨.™äc¸÷ãôbê@<{U;Çh×jœÿ:òç)6{8{$5å»s“Ud”tÉÍ0±<Õyæª RÉLNj'×ð¨ä›ê "7wZèIíÜq^æ—oB>”›¸àä÷ ¹4Ì„?xûv¤ÝøRëë@ù¦…¨‹Å·=*xÔí ½A· xãbeQž„PÝÁy@;nþ´ÐÝ›¡ïQÌ0r)s:V‹bdÉ‚Œä1ÅkjvV ƒŠtâŒù‰iÈv·Jj6ß›9ÍJ»\ ¦„Mç{ ËTA ájXƒóg4¬‰ÑÉÀ>õaœduªÊ’˜3Ò¯A“ËÂï ¥¦Ãß8©pBt§J ®{ƒÀÆÊv¹Úœ*Žjõ¹Ú0OáTboŸ¡l6n©µµÔuÉÜ›zãµQŽ­’1è ^efpW§²©ê9Åv¹6±œÁƒ‘J«;rkBXÎsƒY÷ KOíW KèUr2rqíëLQž£­9â?—­EÈaÎ~•²Ñ*E¤~ïZØÑ/f¶v“×8°£sÔŠ³ÃÄásï\µauc²NV]Ò/Åò”¡fP1ÜW7â­8Ú\1ܬ¬x+\펭r%k;€;k¬×ä Lrá£ô¬(S•:ÞLËË*w‰ÆÊ¿1úÔ 2qWg gŽ{Õ&oœý+ײG“ HÊ“ÂÓ œà¨æ¦BqÈ?/–N§s[ÀmÜN É T›~löõ¦A>†©­ ½†¹ùqÒ¡Éñ#«múnÒy¬ØÒ¹Á<ÚŒgæ(Ó¾èÇJ¦W'4î ç4€M$})ÃXçR ãÔRdzÐF2zô©¸ÐÓ1Ž”Ìž þtòG'Ô÷¦7 sJãNõ4ÝÇv=)…ø}(úãë@šæM7h-éßš$8ïŸZ3¸¦i>ãÔƒÆ;Ð'@ÉÆ{õ¥sÔŽô*ZºR3“×Ôà23ǽw3lUlƒë@#­5~óS¢—…R¹;’ 9ëO ƒ¸~5 ‘éOf#Ó½4×Q5bMÄýÐ)§$óÛ­1\ô”ð8ÏçOm‰`@ÇNôçš^©óU«ôVbÌ àxéKÓƒÖ”I"Fñ£0S÷†zÔ`ƒÉ?™£Ôº瑊ˆùG4·w§°ÜŠJã¶i§e ‚Ï^•9Sü# qÅ1c¸©·2€œ}*­tD™Ì8ëŽE"‘éJ~è9¤Ã{W#;‡«dñÅH¹õ¨SƒÏ_Z™~µ:ô*ÄŠ9Éâ§Fù…WfÕˆ@d{æ¥§Ô ÑʱÄN9¬Û™V9ñŠºÙòv¯Íõ¤HÌ‘‚OJóæýãÖ¢Ò˜TŽsP1>µ~ìsž*“.vœý*“Ð×™4D@ÎMF~b{ʤ“õ¦`ž¼ Ñ26˜µ+ô¤ cÇ¥ZW$b’N8« ¼)‰SœVSäb A×4’åT9úT­ò¨ÛÆ)6gw¦jvwcZ•619=)6ó*Ãm^j–$ƒùVÉ܆º b\u4* #þ4)|ãŠz­ó Ñ4·0{Šž94h;’ô¥ˆp*@¸9={ IÝ, ¾{T›î”؉ÜÓϵY@3Fâl–Lx-Â¥ŒŒjUN3ІnDxù‰8Æ;R…ÑŠ—ÊÉëI´îãSLw¸Ý˜ûÕˆÉ'$JB22½;ÔÖê1íéRô! ˜fÆ0h™pvŽ*Hb+!'œÑ:>G“c±]ÐëY·J£9ý+FàƒšÍºûÜó[ÀŸ;b¡Á9ÛùúTò ÎO~• %rzÝ5ÔÍî(Ø1–äö¥À= ¨Àù¿[µÆümöæ³”c#X²î™jﱉàŠéoîìÄÜ•O”Ö} x&‹ÙK"ü¡/y3 “m8²«²´„d`Z¨ñÇ=3Áõ#tÃðÊX˜°¿)Ï5Òe}x$c¡©Ü”0Æ:b’HZ"¥¾é銓k0àp(±¼i»jWU §#éQ6?¥\x™pŸÒš-‰ çî2j¯b}„›)l$y¥2¿Zi ±Çt©ÜŒmåP £“Œô5îg+Ga¸ÐO~EJG<)­Éù¸F)=ˆ¸ÊBN¤ÓØð1MÈ<Í-.;Œ`@¦®z“R08¦…Í6‚ã óQ³òp¸§¸¨Ž2jH°=EHŸšõ¨‰©ž#vHÅ+ƒB3;TTd0À_”ƒÖžNzqŸÎšBŽ2hÐC‰$œÆ€OÖ›·°=iHž=(ÛV1è>o˜T…ˆ8‘6Ž3ÏjsdzUèõ2b1ÀùG4ˆÇwõƒq8§/<´ŸlO¼®i0:¯_zæ;%FI"»6äE/¨È¦~TÉN Ñt‰2WïséHNªò¶@äõ©äg𤦞ƒåCÚS»€E,lxx÷ )ì2{fž«Ý¸5Vî¸à9©W%€þP‚3S#JÚ- àò)Ë Ç^æ£9Ž:ša5£•‘ \ÀA“ƒùR‘³ž¿Jk9þT¡‡­r>Çp¾ç¿jrçœSAœÓÔeG®j/mqÈNqœTñõÆîi0sRÆ£·Z™1¦[¶l6Ò3V„RÄp*½¿ËŒõÏ4ûÆ$ã8^µÅU\ôh= 2~òFb23Ò£:T…¶±ÇsL“ž*"¬tµr›ãvq߀ ÁÈö©ä@y^=sUÛ!±[Å\VhBÜuÿëP 9$çµ+/?…"œJ´M‹*ª£'4»c=úÔÙ~ ~5eÛórsÖ“Ñ’?œàÇ­5Ù€89úTÛ—Ÿ¥D@#?•W"{^ƒ!W–@ˆ2Ç-ýœöRnax\ •u*qëƒW´'–FÞXdT˜8ÚIÀÞµ~"^j޶eÔä‚y£S|$#ð¦´;(¼;¨Þ¨äÄl§9â¥VV㸨‹°b˜¤ƒ¸UÚç›+·çŽ˜ô§¹Éâ¡ÈÜ2GáS)€5¢µŒK¶Ê$’OLv«J¹~T€ãtÍ]e$ yÍEÃbì`ycŒûÔÁx"¡…°ƒ·µXB0y¬Ü®Hݼf˜èHÈã59åN)‡¦=³R›¹NÖlxô©â àÍB\­>ó{U\‹q¡S¸ô4—J¤lõAÇZÏ\Ô™ÔoÇz9L´GCÖ‚i dqÏ­ßÞ“I€Ælžx‘˜g8>”æ9à¶ö¤*÷=é%`dNÎ{T8<€ Î*à ¸ËsÒ˜T®{žœT=YiÙ2TóÞ…Ü0H8ô§€3þÐëFííÀãµK]ŠNã“1HGëÎ1R•À'?…"®&š@7a#äq c9¥èÙ”xÍ?Q? ^¤8ëJ¹û¹Ï¡¥]Äc€ ‘ŒÐ›JÈ‹iv9AÁéÈç·‘úÔ£‘î*ÕÌÛªñÍ4q×ò§3¼)¹ùA#­wÓƒÔ“íÒ›ŒœgçÆE4©' ñCc¶¡…ééNQ€Iè{SA°{Ó³I$ŠF@Ü3õ§1‚j¿î§«ƒÉéëTÛD«úSãlœt÷¨Ôdã<k>ÒFGãîƒE’ÁNzÓ ƒ<Ôa²)­Ö“vަAûÇóNÆduˆÅ”GaJ¼žk³©¡@бA€{T±Œ †ÅbQךyÇN=j(Ø´Û àÔŒJÈTt¦LÒ1-[œ±â¥º p;m¦Às·éS\Æ¡ ¸®)ÉÜô(ÆêÆ^Ó»84ÙˆšYIÙÖ«r{ÕE\Ýû ÄžÇò¦4yéN=(ÉÇZ»ò‘ÌW;•±‚iäö©$Q¼TnpHÅTeq9“¼qÅXVÜ0;€= UÚäó—9¤Vãq=:T“¶£•<ôªbð˜ŒlsŸòjÈv|9Ü:“šÇóÖ­«¶#ç°¡½µbä–Þjî\;UF†E'åëWàQ¸ûÓŸï‘X©4CI™a~oqSÄ£w¿\S%%\ã×Òœ¼¨cÔžµÕu¹Rô µ¥LŒ.N=k6Ðaˆ€*í¹;ºÖ.z‰–ÈÇj± ’¹Á¨Ç#­XŒœŽzŠŽdÉG;Ôl@üjOàÏ¥W K­V ŽUbØ"­*mm#І/¼*V‘·b—0FÁù¿*{ÃäëU¦vÎ}ª(å|ŽzšÒ3W#õïôª’¶s‘ŒUù[å#²®d`‡Px­UK½Ègp¤ûЬNTSQÍ<Œ94Äsævûµ·:°Ë1(3ªZéaEŠXŽk—‰˜¶sÝk¦¼‘£†5^cínì=ØÜ‚l‘»±âªº7Ý$=ªbÌÂLžÙªÅئ»9ö8/¨ céNV@qœûç¥DÌwž D¬Ï3)'ãŠÕìtBnêÆÎšå¦T‘ˆ‹8iè+£‹ÄÒÛ:ÛÂïöXþéã/èMrk+¬>H?/Z¯<Î0Æj½³Z£Ý¡©…V‡Sµ—ÄBî Ô\+qàm>µ™§ëÚ†u>Ê䬘ûÑŸ½‘\õ¼ŽÊà±8ëM3H`ÚNFG$sÒª´¥4§"«fuj+½ÐýFëíw2ÜHKK+bÇ9$泉Ü@èÝÍ1IíÎFÞõ•Õˆ¡®[¤xUfæù™dásÏZnçÖ¢Ø<šS#*)¦…Q^ć“Ûð¦È£ôç½G.¬IçÚšìw0<à->dƒ˜”íÎqŒ÷ëIžqŠVÎn: ‹Þ‡;…ÂA» éQw}î{ƒM™Êç)$ƒžJŠÅJì®aÌ2Üž1Û¹§'ÊÀô⫇a&ÜñCJêÅAã4)r±§}‰Ý‡RGZDÛÔ=ê%g%FóÃùRHÌ$ 7sZ{E'±Z–2=A¦«nl)ëU‘ŽÎµ"» @½ë7=l'tX¡?7¨¥C€EVV;ÿ ”¨$ÖÔŸBe+“1‘øæ•r$õn}ªìÁÁ˜¤;wÝŽƒµ4+-ŒŽ£4¬‹ÛF…È0ž#¡cÏå@l€|£‚V… Y‚ªœ}è#p;N = &v j~Lq‘È­ai¦¯?´U55/Øü³ž¡½zVL¤‚‚œwѽp@IÀÿ"¥êi [tI1 X–g=3¸ü¾ÜÓ@\‘ÑÇLŒƒOP%dœðsH¤‚|µ$‘‚vÕ!5mGB¬çk6ÎrzsMYφM00‘ÝÎ1N,Yƒ Å~¸ JïQ1€H!FsƒÁ¥Bä\àŽN:þ4û€F2x-ÎM2Gefl• Ó+—]Fgr€\ƒž„sõÍ.åÚ|¶;ÁÇN´†RXmôÆ1HÒŸ»€¤Š,EÒØ…ÝÃe@ù‰(P­ êã8¨†çõ'«S‰ÆÖŸR;UX/`Á$—×½*dºÛðqé@ç Ç´:–ܤp2I<ÑkóÉ$3Ð`Òy{TÔž­Ò¤Â·–Up£€3“ÜÓT€‚¹9v©!&)P0¡ÕW» õ§*oSÔ?}§<¿ýzljòmedCƒííOÉW]ÛÁ_örÕ(¶i±ˆP~làƒARÛ°qÈ¥[+û¢BF_’T~ŸJÚ';HêÝ@ïš®W±›•Š¥ÊîçRª,¬ÆF<]ÄýY«ðXK;åFN÷É­tèÕ‹c“œsß§ZÑRfR®‘,»P0'w WŽ?úõn;¿:¨ ~Q‘Î>§¥n,ó!NO%M^´Ò%Ÿ Œ•ù¹Sì}kEMEjs¼EÙÎE§»)b,÷Û?•]¶Ó$’T‹sÇÐWkg¡A‘³°Ó>Þ•£ÐË;O¸â¥É-ŒªNÛœ¥—†åxÁŸ1Î[¨­(ôHHó b£ï0äûVÛÊäÛ$ÔWsŒÀàòm³)TÓW©Eb‚5U*AêÄg(›Wƒž1ŠšyV6wê™$í÷?ýj§3™%bX1Ö§—©Ë)7±®²K~n1*³LAÇÝö«"'ó˜óǽTt·V!ŽN}ècP–÷<ï…$: áIýsLmüªFyУaù±´ñƒÒœY€È'‘ß?§µ`}5ŸA‘‘¸ÝŒóÅ+Ý1“Óo§¿½5w| ¶?)TùF2?‹7a £œÉëžâž›60@<Ò7”†ÝŒzíMŒ‚Tï÷qŒÕ&1ã :íã# âž€¶[„žý0(%›l€a°3À¥~pH'°¾¿J-q½ˆÓiT€K1õíHË—89î?¢@»zž2O»TÁš7Ü«óG÷XœñŠV°µdNàt\àrO9ÿ ES¸’»PõÛÛŠ’Çp^§'ü¨HJ*\HÁTœry"ÞÚxö ²¾Ñß­!S¼!f9*v7Z|€.ÕÎý§Î T…XëÈFr: ±V¹]PJÀ ÚÝòyïF91VônEKb5ŽO!%*Ûs€H☫!*€ÝIçÿ­NˆAœß)Ï})͆Uõàò}éØwî5T%[i'*dC´€§9AíÏZA T 9 ¶1åÍhAlÊÀ’dÄ`òãïëW6L´W*vWÁË08ÀÍZ†ÑÐïäH޽+b×G–w8™¤lpä×_¦øi!x¦¾ÚŒ:D?tÆ:'9»Däìtin<ÇeËcŒ’EjáÀ„;ã$·éäËÚ‘!Ü 8úS¢°/(ó¤)fõ­c¹ÏU=‘ÏVåBm x ÔçVlô{‰ Ç9mÃ]Dv±ãje‡ñ÷©æUe9 {Ð r‘Š¥m[2­ô[HU^góX{qZ1Çò¢T#©ý±:…ÇÓ­#ªr£åVàŸJÁ |«b»”òú9äŽ T¸g.LynI­Ä› goëPÌ;"Êž™Ç_Ê¢Ö9jY¢Š#¡U‘CÔw"–M™8bêç¦}?*˜+mË}üà“óÒ¡–2‘ÊÇŸLjYŠI¤ÞP…@Á8éJ©pê"ãqèݪÜÊùØÊøøxÍC,,Wæ!¾nM&ìdÕÙNG²)ll^¹ªÒm þ±¿Zgo1Õ“%þqU®¢&^™ã®:Ö2’fÐ}4²I< {ïDùˆ$r œñéNl7Ì#ˆéž? b«`¨`¹»šÌú”™&æ+&༌Œœc$fŸ4ÊDaW'9÷ªàH àžõ eþ=íÎî¾”2lHXtéÊ…↠dE( åR{óØSyÎìåÝÇjhvCÑŽ±ä)Ú1Œsúþ4åW’#2eQƒ–/jhGÚy±œæ” žªxÍ&6ºVW‰U ¸ Ÿ¼GÖ•‚70<`÷Å4® UPÏž=xãúÔœRˆWŽ¡¹=ê®­¨µD)ÎÞpÙÜG¦)ç# gö:qO–6*œïa¸‚sž;Ócr¦—ú·À›e« îcX¢!¥ûÞQ'=qÇçZñøf{h|û½È£,HÏÍÒ³ô™Úòݾoœz‘^­¯xÛK¼ð¦ÖQÃ-¾wJ'×5ÁZu#+E… ¦œ¦Ïtgº“…ûÌÜuéùRω/;³ÎyÎQWoá)~#’<žzÕ8—jœœ>Ü(ÝŒ é^„5Há’åØ÷±°ž"ÊÀäì=}©cR`w߸ŒcŽ£=éAER›Ëu-†ëŽqRæ#¡VVÎ~QØwýkedä›ë¹T€èÜ.:Œu¡)Èa‡“­>ÝX!ÎÖòÈ)õ=méºaiÃ…aÆqÁÏ_´ŒÉ•E ʶ6²»£“…ÈÏéùfºÝÃ’^¸|2Fœ³7ëüªö¤Ä–t@ÈVõ®¦P.ØÀEŸçÞº”9QĦêJÍ“ÙÚXéVÁ!@Ò7Ì\š«I7Ÿ'2*Ž™'š|¹÷g Žj©.Cd¾¸ÔNŠõl’HŸz  ƒ€:ü¼þU˹™NÙK( p00_ÄþU^9ÜÈ$Ãlž{ö¦‚ü Ý´‘ÛŠ‘žVP²ÌäÆ6(-œ´Âý„;8faÉî×ÒžB—Ü ¨ÆÁœõ¨<‘ò¯=:óO( Ïp t§ËpM½ÄUbçæCÉÊ¥B0r <“×ô¦26mœŒ.sŸð«¶®íЀr3Ž£ŒÖ±M“)(õ VÍEG*pŽþ´¾sÍ)a‚äpÛ9Z·¤†uÚIéÜ€äõdYË2Q‰Ì^§ØÖžÃ›R=ºZIèbæáwçpe¶þ°¦‚¬Œ£¡à—õçü+¢þȹuf@@=÷pÏõ¨æÓ‹ƒˆ‰-…Ë€íÐ}jÕ{eÜÄ1²íR‘I*§¡Î1OŽ&iìb …õo¥k‹óÒgG°xÇãZ6ºq.¤©‘ 0>î?ýUªNö!ÔJ/¹ON´–XJ.<²A1ªî±×ó5ÖéöQ[mÀÉêzGJ³§éf$VUQÆí sÉþU|[0íelžÆ·Š±½=YåìPAõ«¶Ñ•<|ÇçÞ¤²°,ŠYÔ"r¬z“W$O ó3ž¸§KËÊîFUFô=W§AP2`1À!¸ÆsZC*© XîÕi`RêøÆÃ£½(¢ê«Ä ÊÌN ñƒßÚ ”Œ€åÚqI'úV‹ÀÛ@KŽx=x¦K ¨MÊrùàT6yónäìàÚGÍÕO*â±`q$b Š= ®]I$䎽«RÎÙw© ¸‘Aâ¹æÊ»z!›n~è®ã^¶UѬ'€‹{úW‘¶2ÜÓV‚]\¼K”´yÎÒxÎÕÊŽ›“IîpˆO@sT5[ptvÇzÕ‚"y|{zÓÌesÎ{ÔäÕˆq3-­ædÞ z`V¬va»jÓ±° …~U_Sž+tgÖ8€èOZ攺!¸¨êsš”rÎ#Ê÷>ÕËê7ñn˜QÁ~8«!ñL!¼»_TOCÅy›§8ci'¯j#÷1ö|Îå­KRXœð ž7+k7 €`czVL“Lí•~CaUFw}Fj°–$á® B(Ϙ­½œQèÑÃÅ+³î9lpzqN²œg§^Ÿ•#+Ä0ùq銌N@'o'=«ÔЖ»#~09ëï@fdJ.zMÚɤXŽäíÏËÁê>¸®ƒMÒT€–RßxƒÀî¿Øéu¤<ìÏ üéúVÞÍGRa/hì™Çi: åÆÔkRáñ¹‚ãiÏ×_§x*è¦fhàœ“ŠêìØ"ˆz`U™æpŸ.i)>‡zÃQJówg4<3adŒ^F‘,GÖ –ÊÊ"Ë9Âà“Úµ/$‘˜sXóÝÃîϯµuE´yUÔ´*4„p#/n€Ô)l³6cÚY¾Pç'Þ¬42y‹œœôgò©ííš'Á6p2 úÕó#…E±‰§ù¥cš7óžßçÑi\c¢ž™ç5{Mqp‰æ ÁïŽk±ÒtðÁv€ËØÐŽÚtÔÁ:A (Æ*œÚ~ùvœªŽ¸«Ô¿°˜Åæò6Öµ¤¼QHù¸éCÜèœTQÁNB¾Ø±Jk¨c¿ô9vêÝrª¡Èõ«"ÅÖ\pGÔù’zœrW(…ÝÉõ)Ú§ŽsŠ´"+ÓŸjt Ž)Ü×Ùݾ΄x*=)E©Æí¬Ã3үآ”(58€ÆH8a×ÕË)Ùœ2†¦µ“(Ç »²3ɧo CsèGjº¶¹R< šÒԷ˸ëX¹\žV2(²0GOÖ®ÛÚ‡åW…]¶²•³…“·Ú;·•wJéî*—‰“vAÝÉñÞ³P¨ÉqÆ1ȧ2`dsÍPž<äªî8­¢Ï&­Û¹¾À0Á¡¨üÏŸ/’’^)ê™]¤ã¾(Ž8”¶œ_z««™%+hoi`3(N+м-óUsõ¯:Óç ¥yÜOjëü7xcQœàŸÊ­3¶”í¹îvÐ5š\äu®'ÅñCÉ|g“SXø…"ˆG¼8ëXúÞ ³36ÝêÞüÔÓ¦Ô›léqæÜàoã1\–sК¿k,3ÆÑ1€*¦¬7î1Û¸¬¼h%VnÞüÑ8_cޤZz3Ûºǯ £ì;‡nÕñnªM²óÅji.A@žÀÓ³±pš}I-$Xå ¿ËÞ· ‰$ÚÍÀ#Ëâ=¹ÏZ»§jBFùzrkž¤æu!}޲+DgBFJчIÈÜŠIÏjƳ֬Ð1ÀúÕ‰ü^°ÆÂη÷ÜñøW/,™1¢îuVÚ|P(–êUþ"éYߌ,4èŒZb,Òôó@~•ÁêšÍåë4·33zsÒ¹GU´·ÞÒI’£¦yªP¶å:m+½»šê2™%•åäœgqÓ+ÔïD!Õåþ/º:Œÿ‡çTõ?4ˆÉo Éäààuý3\†£}<‘É'˜ 98P3Œc?®GáV¤¢ŽIÁnË×ú™f|—_Z¹¶3!ã£d’MGu1mŽÙœ ¼cÏúUBI7ùã >ßÖ³”ÑÓKå°§#Xß3üñì1PJæ6ÎÛòç9Í5ˆ-… ŽNHÉ#×ùÓÞMùr¡Jÿ:zþ—1Ö½ÝÕ,©Á Ï!IãØÒæ6$´Œž@`)²en~ñÈÛüè "u“ÔrMl*Ã,2c,ÊÿõêdÝ 8Á uõ«‰muw+6É$våÇMÇ=sù×E¥xzF*óe9ÉÈý+d’Ôà©^ Ù3 ÊÝä*Þa$™äV]]»JèË–êúkM*ÚÛ<ÍÎH­?28å Æ'Š®sŽUîíÐÌÓü1m"FÎyVàu⥠•Hgeb8#QîÈöšè‹ŽØBG\p)†&Ú¤ Üzš¾Ö° òݪÔúsÃ,Û]¿…«e$–*Y„»PŸâ­<’X0È$óŠY¢+#H'¦1ŠqŽ‚Gu›¹Tµ4â+°œŽ2i@ŽùïU­7mÚÜ’kCk…jÊúž­:—F|ƒœ1ïT%䜜ŠÛš ˸‡¡ª—I÷sòQÆ*Ôµ"¤t3­cÌ <ãiô­ šÜÜ[€ÈË}*¢Ä@'¨#Òºk3¿OòÐäãÎ(›wÐä]Ž:ݤŠ\,s×5¹g~#ˆKœ;™éYºŠÛéÎdš`_’#Ö,zˆ“.N2zŠèËŒù^§ Ãª”Có~t×ÖC ¥ÂýkƒMTK9Cü95RëZXÃ1o˜uÎy­®nñ:huº•ô™>\œúÖT×4{]@qÔŽâ¸é¼L|ÄRÿxœÍ2M}ƒ(rG#ùÒºLÊu$õgW±›;¸rzûV€’ˆ"¿vá޸صѱYH}ªÌæï¹ƒÛyÆGåÖžŒˆÏ—¡×BÛ#>ƒµ\Ž€OAÁ-ÅpÍâƒòÄÛOóY—> ¼a™§‘Ó§üÃ>Õ6FßXQèzT×öYYnpì+Pñuº9Kh c«±À¯>¼Ô‹ƒ2À=\õÏN+&ûP} « 2q€:aX»!¼Dä­c¯¿ñ=ÍÎWÍ䌃®~ïS2É#î.À­bý®BÊUH ›wCþWí,dbHÅp¹Î~¦¹¦õÐp¦ßÆhIs$€† C1]Áy_¥TŠUß弟»|Ü3Žs“qÛÖ IÈ,ÌÌAuŽ9èzU}ì3* U$àsŒÖ74„9V…€ä6ðOLñ“ϵ0’ ¡[åb>\СLxgFæÿ#ùÒ6 e@]¼ðÆG¿ÿ®¬jobí°Žp»Jf áûGnjnZµ›Eß§`:ÓÀ‹h߸69šG]Ð$’RjäòŸcVOCÓ #2±^=ªâÜ"€…ŽÅéÏ9¬XçÜØ(ê :)w>œœZ´Ï—”ZÕ›K;Í󣹫k:”ó»ð¬$¶ìs€zÕûpÌBîV röéW}Eª4–]Ï€ÀdÚ9ç­kY2Ù Á9l÷ô¬(ŽÉ#ÀmØÎ1[6ŽX«I’‡¢zPØ{DŽÿHx‰ "¯–>鮪óBMCO76¡Lˆ:W ´W¶B°`ÙàWu¢Þ›0ã”nt§­O5Ô¬Ü;FIx#R€O9Áâº]âòicb,O5ŠmäIÁéÅhØé»;EÇ tÏZщ—§zXáÎjÕµ©ó‚õ¬œŽøJÌΞ-¯·w^•tŒoºã®ÖM26…‡ ßtã½s×¶Þ[2c,§)ÂGb\Ñ1-dgAÎÜR꘲„ˆ³æ°8ö¤¹Ý$çãšÀ¼\3JÄúuÅtÅ]ÜóÝ9Ý™2Ì÷2ÎNyÉ<𝙽”›XrØ5v[QÌ/­aê—©–8i ÀÇ&ºŒ¬—ÄK:Âæ8§Gä—úó\Þ©|ÞI(Í»f ×ÐÓ/.¦’&eŒ 3ÎïñíXòÃ6à "äõ#½bætBš½Ñ+¿#œç!ÆG~jY$ãå!£'%AÏn†¨gnT¹n?ýu w1ºb ‚ëÇõ‹™Ö––,yÒd*Hs€P!Î*S{0•Tă‚q’¾õžß(n™œá÷üi˜f,ªÄ‡ëRª1¥m¸º³¢ùrþõOu'åô¨ÊbgYwt'kãγ¢%…VRG;ŸgÊ:ƛ̻öd·å³“×úÕ{^ä{4Iq9(aã£d’)]Ë$F2¥þïÎy?…FþpØ`àqLÜv”!KnÎvûôÍg)_b£Ö¤rÊw ÍÓ½p;P6·Þp 7'‘´úúR¼†BÉ.Ýìqœ·¦È¹\:îëšÏ›BØ­´Hê až\Žæ¥‰”È‘†>XÎÐãn=j<>äp¥qÇY²‰r{Tpj /bD‹|-•žß^sL7U0I=sQ¬Œ®;IéÐ~•3‘„Ê < É=ª6!»±YÜ€áãÝœ)Gù4ÇYf.¼¹Î æ•VRãhÏÊOCÏó¡ó…À*p Ÿ_óŠ4)"%<’§îäà5¶NÄ,=qOl£ž’IU¦ ‘»=2i…ÎÂ(ç‘Ê *ަ­ÛvHãÃÓÝÜ|ƒ¥OW'qü…Qósše›PåFÐGR:ûUèGÉæ0,Àäíã&¨ÂÁmsÓŒv«Ð±81¡ xÏ^g;‘zÜ´Œ¥GËž@8VÕ­´„ïgÜ{qYÖpËç€ò·'ð®¢Ê7Ú²¶(ã,)ÜÆÜÆŽŒÍfªÈ͸Ÿºz êžãí6Êç—ÛÎ+·K}Á•·¶:ZꘀmRƒššG]8ÝX‰‰‘¾\ûsQº 195¼g,O*ý½‹:òÃ$úâ©´mc>Þ"Ý»³Þ¶¡µY BAW#“Ž•j:…¤•c¸\ýà9©”¦r>`~^‡·zHñ–êì [ ñ¥{×p|d± x ýßþ½?ví˕ےÊY³Æúõ¦T¨'‚}Zt€¬a_ç౺ w©½Ø[A¦@Dˆ[qìG­,lÌÞX\îŽ}ªÁd9QøSpA *ä ¾´ùšØV¸ö~f$ å$Œî÷4ŒìWæaÇ,3€=©Ð‚Ë´”ù¹Nøõ¦´™%@\wí»5WRBåÔigY“¨Àœûæ—~Y9ïC¡ ¿ã{–&T&¿:†RL‰s#¹™ŸZvYbÛ/ÔqÉæœ¬pÊù”ðÝûÿõ©ªÌ_ ÀèOõ¨êÐx9 Bdm1MFfvXò2xÏ#þº"`ˆYoR8#8 ûÓó“òËd`ÓëCkbì¬2H±µT¨9Æàs×üŠlîË&Ä`Œp€óHÛK0ãïdßÔPL«|Ç=wõ¡ '±è&æ¸8õ©ÕɈ€¸=óéVÖ4ŽD*›@éÈíõ«mY7FŽÎÃpàjW>VQI±&]ŠFHþFµ­ÃlAä Á*vúö©- Yä1ä/tÎ+jÂÂFŽaXËt95|ÈÁ•,<Ýá¤mŒÃ ®‡O'c™òqÓÈ´ÜšYaLç9qǯò©N­£ZæÝŒgî¨êj¢a [%b€¢Ž+bÛí¦?¼qÕ»Wþ7Óa !ŽFnŠ×9{ã]FV+¦ œ(äÿ^)$åÐÙ>SÔ§¾·²B÷WH™þnkÿÇq@¬š|&Gï¹ãòæW”÷ Ò3ù™?1/ƒŽ?úõ. F|â8ʘôÿ$VÊŸsHÆOc»½ñn©{ˆ¥¼`§ª¨Ú£üæ²[P y%ÁÆzõÎ+Ž›UtHÊmóŒÓ>ž•q©»’|Æ*8¯N8´QŠ:éÂQե߈V ÑÄ7ÆOjçnõWšC,Ó0™ÚOlðk¯[æ7£‘·$Ž2?ÏãU&ºa)òÉ|®8ò?W2G[RšìhÏ«Ë4ª‘¤7ÞÆ¬Ù.7ÙL’3×óôÇó¨ÙIcóg#ž¤v+IUBT§ù©•WÐÑRQC]÷²e³Œcý‘“ùÒÆøØsŒêýx }ÐàžëÎF?úÔ¥Ëˉ ©\@é€qþ~•—5ͬ":†%˜c=Ÿ§ó¦Ÿ”‚ʲG##üö¦Æó|À©ÿ?ÒŸº6$ÿ70ÏAâ„õëQ70È$3ǧ8þ´ø“® „ÈÀ=})ð˜ØJ<¥260I?R? `B B¸,¡€ÏLó×éΕķŒÁ¹Ê“Ó¦:ŸÒ»e•ÇN{û:y;XwÁÎqÒ…l‘ ÎrH©lú ËÉ\‘O©‡•€Ä dc“ÿê© ]Ê_¡yõ§¦ÖØÅc IÁ4®9A IÝÓ9Å"ËŽ ¶Oº{Óò8*29äSA$*)ÀÎyëÓüA§p{ åv)ÈÚ”wô¤“+'Ȫ:`õ0ÜÇiR9۞Ѕl¸=Æqí@‰"*tÍ´gïg4ÉÀ$óÆïJX¼£>YÎЧ~u(yÜÍþð¡n2EŠM™Â¯Æ;Ôq³ÏÎ2þµ*>å\€OÝ#ïI –!ppYq““éC${‘“&ÜgjÖ“ç™v·^8ò)¦HÕ¸B@lîý½)ƒ6ÿ,{Á?Ò¦×/F˜æ( ‘„“éHèÌs)\w¦©ä:$6¶0pqÍ"°wÍ‹¹ëy¬Þnã’xâ®5ÎjÒNŠƒøA9¯8}RPTã猪öÝU%»|²3îaóÄã9Æ8¤ Þ‡ƒõ)=Yê-â½:ÖØÇmùH\Œ~5‘{â»É·y3yj{/`Iãô®Y6mv2žÎCÀšgo˜³À'pã8=Z¸Áu4X8õ:ÖfÈÍpÜäuëQËzÍÉç“·–µsÏ$r HaÈÜqØÓ¤”+åmS¸ò8'¸«º[G ’_wÈAÈß<þ) ø ÄJç$ÝûW;,®7”|ŒñHò1}Àœ(ç=‡ÿ¯\æ‹›rêLå’-Ù§?N*‹ÝI,›‰ÛœÊxÏù¨«Äopwc‚ >3ÁP`ŒýßËéQÎÍ•$¶,4ò;*¶Ð8$d¶ÓëïÐqÒ¡wg 4„ï®yüÍ7{d°|ã7~{f€ ³l!•NFxãþª\Ƽ£°à"ü«’sÏZHÃË"Dc’IÆsßõ5 ¾lÛ?þµ"Ȫà ÈÉ“Cer«ÜMç eYHë“éñüéCW’À)àóíHJ° –%qÆxcŸð¢F;Pp­ F5YÖDtùNxö©2¤ÉæTpÍ9¡>PfÀrOáy?áŠlhŽ2W#ñÏcJ÷ {»‹ÊJF‘ŒT¡ËmP£ÜœŽßZ€œ²‚2TqŽ;Ó·6íÏ““ÎÓÅ!¦HË&Ii0¬¤œƒÁÆ1A“ç}™~œ°=ÃùÓ™FqÕÎ7`õ¥=766߇øæ€²[ ëgÚ—3¼ûõéRHSÈPcIù.‡ëP– U·’ØÊŒ}iPÎq’-Ž>”˜âÇÊYˆb Ó+ƒÔŠab7I8ÆzœSÃo·?½×#¯¥@îcÙÔIúÿQB»V+oÊñ–-â>´0R/ ãç'§'üi˜(CnVs»¥ •†Tîä~y¢ÌQóò²¶ò@@vã¿=*TX%•@ë’O4ÐyÜ¥†{S™Ð€{±\[1±©'’_›vìR¾Xwd¤äÓpûBnsǽ:_4V~Ž­B*Â"¢±ÜÙ_Nôñ¤•ËödøSHW tÈ=)ÿ"¤{¿÷iˆiFǦyÀ9ð§`^Y˜sòÿAŠb±]ˆî'‘Ÿ^”敦CˆÇñýEzô!vÚ<²œ¯SOUB°”µT€y#­4ÆìÅŠ““AW³-o%?6sœT óoSÈU$~bŠ)¦Ìâ©,±n$ðzš™|´ v‚N3Eı€ûKrJÔYå`^h¢‘qÕnÀ°Ï àÈÔ›@¸˜À@Àžh¢¨{"XÕ^åQ†WfpiʈP¶ÞU°ãŒÑECBë¾3ùšlÌÊ÷!N·¹¢Š¸™¶6n FxŽOzH€lgÒŠ*KdEˆ„c‚ƒŽiàœ°ìGõãEúbGæÔÈybTøf¡bwm9¢Šd=w/NŠ‘.ÑÒܑ߸¨ÝXœúQE ¾£B)XÉy¹üE7ʹàœ~¿ýsEѤV¥€ £õÈPG>Ãüi–ò;Œ¹ÏÎ?@h¢³Üc;"åNp?`öºÑEX4¬8¨¾õéRIØqÀ÷ÅPg-˹Ï!@­7{4E[*äqî(¢†hµA 2LbœÃ qòçŠ(©[‘=’ÅCFOSNU Ñ‘Ôç>ôQWÔÁ+[Hì2ÀàHÙ€Üå‡<õæŠ*Öʼn•SËE)\Ô¯ò„ ÀÚ(¢®;KKŸÿÙwdm-1.28/pixmaps/gnuLogo.xpm 644 0 0 64215010221265060 155350ustar AlexeyVoinov 0 0/* XPM */ static char *gnuLogo_xpm[] = { /* columns rows colors chars-per-pixel */ "400 260 226 2", " c #040402020404", ". c #090914141414", "X c #171704040505", "o c #181817171515", "O c #282805050505", "+ c #272719190f0f", "@ c #373705050404", "# c #36361a1a0d0d", "$ c #272726261010", "% c #282832321b1b", "& c #393927271a1a", "* c #383835351111", "= c #282827272727", "- c #282838383c3c", "; c #383837373636", ": c #4d4d05050404", "> c #4e4e19190505", ", c #474726261010", "< c #464638380c0c", "1 c #575728280c0c", "2 c #585837370b0b", "3 c #46462c2c2727", "4 c #484838383030", "5 c #575739392a2a", "6 c #6d6d09090404", "7 c #6c6c18180404", "8 c #66662b2b0c0c", "9 c #676738381414", "0 c #7a7a28280606", "q c #767636361717", "w c #494947470e0e", "e c #595948480b0b", "r c #585858580a0a", "t c #484846463232", "y c #595946463535", "u c #555557573030", "i c #696947471b1b", "p c #686855551e1e", "a c #787856561818", "s c #797947472727", "d c #666666660c0c", "f c #797967671414", "g c #777776760707", "h c #676764643a3a", "j c #757569693030", "k c #777778782727", "l c #484847474848", "z c #58584a4a4747", "x c #585858585555", "c c #54545e5e7474", "v c #6b6b4e4e4242", "b c #686859595454", "n c #75755b5b5757", "m c #696963635a5a", "M c #777768685f5f", "N c #686868686868", "B c #777776766363", "V c #797978787979", "C c #87870a0a0404", "Z c #8d8d19190404", "A c #8e8e28280404", "S c #888838381212", "D c #989839390808", "F c #a9a91b1b0404", "G c #abab29290404", "H c #acac39390707", "J c #888858581919", "K c #939345451313", "L c #89894a4a2e2e", "P c #8b8b54543636", "I c #97974a4a2a2a", "U c #979756562525", "Y c #989857573d3d", "T c #88886b6b0a0a", "R c #878776760e0e", "E c #999967670909", "W c #999978780a0a", "Q c #89896b6b2929", "! c #878775752c2c", "~ c #999968683131", "^ c #989878783030", "/ c #a9a94a4a1717", "( c #a7a757571010", ") c #b7b747470a0a", "_ c #b8b859591212", "` c #a8a858583535", "' c #b9b95a5a3434", "] c #aeae67670e0e", "[ c #acac77770909", "{ c #a9a965653131", "} c #baba68683232", "| c #b0b074743535", " . c #989867675050", ".. c #888877776e6e", "X. c #969679796868", "o. c #a7a767674d4d", "O. c #b6b668684a4a", "+. c #b9b978785656", "@. c #c3c32e2e0404", "#. c #c8c83a3a0404", "$. c #e0e03c3c0404", "%. c #c8c84a4a0707", "&. c #c7c757570f0f", "*. c #d9d94a4a0606", "=. c #d9d959591212", "-. c #cccc5b5b2929", ";. c #c5c578781111", ":. c #d9d965651a1a", ">. c #dada77770404", ",. c #c7c765652525", "<. c #eaea5a5a0d0d", "1. c #fafa4d4d0606", "2. c #fbfb56560505", "3. c #e9e966660b0b", "4. c #e9e977770808", "5. c #f8f867670808", "6. c #fbfb79790a0a", "7. c #cccc67674242", "8. c #dbdb7d7d4f4f", "9. c #8f8f89890e0e", "0. c #848484841010", "q. c #929294940d0d", "w. c #9e9e99990c0c", "e. c #8c8c8a8a3f3f", "r. c #919192923939", "t. c #a1a18b8b0e0e", "y. c #afaf88880a0a", "u. c #bfbf8c8c0d0d", "i. c #b0b097970e0e", "p. c #a5a589893b3b", "a. c #adad93933939", "s. c #a1a1a5a50a0a", "d. c #aeaeabab0808", "f. c #b0b0b4b40c0c", "g. c #9c9c9e9e4848", "h. c #8c8c96967979", "j. c #9e9e86867878", "k. c #a6a689895252", "l. c #bfbf99994c4c", "z. c #b0b087877171", "x. c #afafa8a84a4a", "c. c #b2b2b5b54141", "v. c #cfcf89890c0c", "b. c #c1c197970707", "n. c #d7d795950c0c", "m. c #c0c09a9a3030", "M. c #c4c4a6a60b0b", "N. c #c3c3baba1b1b", "B. c #d8d8a8a80d0d", "V. c #d9d9b7b71515", "C. c #c2c2aaaa3030", "Z. c #e9e988880707", "A. c #ebeb98980a0a", "S. c #fbfb88880a0a", "D. c #fbfb99990a0a", "F. c #eaeaa6a60a0a", "G. c #e9e9baba1717", "H. c #fbfba8a80808", "J. c #fbfbb9b90a0a", "K. c #dcdc97975f5f", "L. c #c4c48b8b7575", "P. c #c0c0a6a65757", "I. c #d1d1aaaa4444", "U. c #d7d7b9b94040", "Y. c #d7d7b7b77c7c", "T. c #fbfb8b8b5353", "R. c #e7e7b9b94747", "E. c #f6f6a6a65d5d", "W. c #c3c3c5c50808", "Q. c #d5d5d9d90a0a", "!. c #c4c4c7c73131", "~. c #dadac9c92424", "^. c #d8d8d5d52f2f", "/. c #dfdfe6e60707", "(. c #e9e9c6c61414", "). c #e9e9d7d71111", "_. c #fbfbc8c80505", "`. c #fcfcd8d80707", "'. c #ececc8c83939", "]. c #fbfbe8e80707", "[. c #fbfbf9f90606", "{. c #e4e4e9e92626", "}. c #f4f4f8f82121", "|. c #ccccc4c45858", " X c #dcdcd8d87c7c", ".X c #e8e8c6c65c5c", "XX c #e4e4e6e64141", "oX c #f4f4f6f64646", "OX c #848484848181", "+X c #8e8e8a8a8787", "@X c #9f9f93938585", "#X c Gray58", "$X c #9d9d9c9c9c9c", "%X c #9f9fa5a58b8b", "&X c #aeaea8a88a8a", "*X c #a4a4a4a4a5a5", "=X c #afafaaaaa8a8", "-X c #b3b3b5b5b1b1", ";X c #bdbdc5c5adad", ":X c #c8c8b6b68c8c", ">X c #c5c5b6b6a8a8", ",X c #c0c0bbbbbaba", ".6.D.H._._._._.`._.(._.G.B.f * X X . . . ; eXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpXo o $X-Xo X 9 [ D.H.S.6.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.1.2.2.2.2.2.2.2.1.1.2.5.S.H.J._._._.`._._._._.m.p X X X X X X X O X + # # , 1 1 2 9 9 9 9 2 2 1 < < , * * & & # # # @ @ @ @ @ @ O O X X X #XdXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXl o N ,X; . + E v.F.Z.5.3.2.2.1.1.2.1.2.2.2.2.2.2.2.2.1.2.1.1.2.2.2.1.2.2.2.2.1.1.2.1.3.5.D.J._._.`._._._._._.U.W & . o . . X X o = e p j ! e.a.P.I.I.U.U.U.G.R.G.G.R.R.U.G.U.U.N.C.N.N.C.C.m.m.a.m.| | ~ P i 5 3 # o o X X . ; pXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX$X . l wXc . O 2 >.S.6.3.2.2.1.2.2.1.1.2.1.2.2.2.2.2.2.2.2.2.2.2.1.1.2.1.2.2.2.2.1.1.2.2.1.2.6.S.J.J._._._._.J.J.(.b.e X . o = o o X X X O # 2 i E W b.B.G._._.`.J._.J.J.J.J.J.J.J.H.H.D.D.D.S.S.5.5.5.5.5.5.5.5.2.2.2.2.2.2.2.1.5.<.2.5.2.2.2.2.2.1.1.*.#.@.@.F Z C 6 : @ @ X X $XfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXeX. ; -XV # p 4.Z.5.<.2.2.1.1.1.1.2.2.2.2.2.1.2.2.2.2.1.2.1.1.2.2.2.2.2.2.2.1.2.1.1.1.2.2.3.3.D.J._._._._._._.(.B.p O . = l x ; o . o 3 j k.P.Y.R..X'.'._._._._._._.J.J.H.A.D.A.Z.>.4.:.>.:.3.:.3.3.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.<.2.<.2.2.2.2.2.2.2.2.2.<.1.<.1.=.-.-.' L 7 O X x pXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXl o #X*Xo X q { 5.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.2.2.2.2.2.2.2.2.<.4.D.J._._._.J._._.G.Q # $ l $X#Xl . X & T M._._._._._._.J.J.J.H.E.D.D.S.5.5.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.1.2.1.<.:.7.} ~ Y v 3 . X X X . . . X . . X ; qXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX$X x $X; . . X X K } 5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.3.S.H.J._._._._._.G.^ , . = V wXwXx X . o o o o o o o . . . . # p i.|.(.~.`.(.`._._.J.J.H.4.Z.3.3.5.<.5.5.2.2.2.2.2.2.2.2.2.2.1.1.2.1.2.1.5.2.5.2.2.2.<.2.1.2.1.1.1.1.2.1.2.2.1.1.1.1.1.1.1.1.#.F 6 : @ @ X . . . . . X o o = = = = % = ; % ; ; l c N B V OXV OXOXOXV OXOXOXOXOXOXOXOX+X+XOXOXOXOXOXOX+X+X#X$X*X-XqXwXeXyXpXpXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXpXo = +XN X O > ( >.1.1.2.1.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.<.2.2.2.2.2.2.2.5.D.H._._._._._._.p.2 o OXsXeXx o ; ; ; = = o . o o o = = o . . X O a y.J.`.J.J.J.J.H.D.D.S.6.5.2.<.2.2.2.1.1.2.1.1.2.2.2.2.2.1.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.<.2.2.2.:.<.7.` s 1 o . . o = ; l B V OXOX+X*X-XwXqXwXwXeXwXeXeXeXeXrXpXdXfXfXdXdXfXdXdXfXfXdXdXdXdXdXdXfXfXfXfXfXdXdXdXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXm . N V o X 1 _ :.1.1.2.2.2.5.<.2.<.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.<.2.5.2.2.2.1.1.<.<.S.H._._._._._._.a.2 . l -XqXl ; l x ; = o X . X . + - ; = . . + 4 ^ I.'.'._._.J.J.D.Z.6.5.3.<.<.<.5.5.<.2.2.2.2.2.1.1.2.1.1.2.1.2.2.2.2.1.2.2.1.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.<.1.<.<.2.$.@.Z 6 : O O X o o = ; l N V OX@X-XqXpXdXdXdXdXdXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX,X l *X- @ 0 <.<.2.1.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.6.H.J._._.`._.J.a.e ; c ; . X o V c ; = o . . X o - 4 . X X O & 9 T n.J._.J.J.H.T.S.5.5.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.1.2.2.1.2.2.2.1.2.2.2.1.2.2.<.2.2.1.1.1.2.2.1.=.=.O.` s 1 o . . = ; N N $X,XwXeXeXyXdXfXdXdXdXfXfXdXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX; = +XB X : q <.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.2.2.4.D._._.(._._._.a.2 . . x B z - o o X . . = ; $ X X * i ^ I.R.J.J.H.H.4.4.5.3.2.2.2.2.2.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.<.<.2.2.2.2.1.1.1.1.#.A : @ O O . . o - c V $XwXsXdXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX$X . x #Xo : I 1.2.2.2.2.2.2.1.2.1.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.1.1.2.2.2.1.2.2.2.2.5.S.J.J._.)._.J.m.e c N l ; o . . . + ; = X X # a [ D.H.H.D.6.5.5.2.5.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.2.1.<.<.,.' L i + o . X o ; b V *XqXpXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpXo = #Xl 7 I 2.2.2.2.2.2.2.1.2.1.2.1.2.1.2.2.2.2.1.2.1.2.2.2.2.1.2.2.2.2.2.2.2.2.1.2.1.2.1.2.2.2.2.2.5.S.J._.(._._._.a.2 . x N l % o X . = = = X X , Q m.I.H.Z.4.3.<.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.2.1.1.1.$.@.C : O O . % t m #X-XeXsXdXdXdXfXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXc o N V . X 0 _ 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.1.1.2.2.2.2.5.6._._._._._._.p.2 . o N l = o . . + - . X > J S.S.5.5.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.<.2.2.2.1.2.1.1.1.1.1.<.2.2.2.2.1.1.2.1.2.<.<.,.-.` K & + X o = x OX$XeXpXaXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfX-XX ; $X= X A ' 2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.<.S.J._._._._._.a.2 ; l ; = o . o o o o X < E v.Z.4.2.<.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.<.2.5.2.<.<.<.2.2.2.2.2.1.2.2.<.2.2.2.2.1.1.2.2.*.#.A 6 : @ . . ; x #X,XpXpXdXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXl o +Xc X A _ 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.2.2.5.6._._._._.J._.p.1 = - = o o . . o o . X O A ( 5.5.2.<.<.5.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.1.1.2.1.2.2.2.2.2.2.2.2.2.1.1.2.:.<.o.` 5 , X o ; N $X,XdXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX$X x OXo X X S -.1.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.2.2.2.5.6.J._._._._.J.^ , X o o . . X . X . X @ 2 ( -.<.<.5.2.5.2.1.1.2.2.2.2.2.2.2.<.2.2.2.2.2.2.1.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.$.G 6 : @ X O X X X o l $XeXdXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdX= o V t X O A ,.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.<.S.J._._._._.J.W & X O 0 ) <.2.2.1.1.2.2.2.<.2.2.2.2.2.1.1.1.1.1.1.2.1.2.1.2.2.2.2.2.2.1.1.1.1.2.2.3.:.,.,.s 2 O X X & V -XpXdXfXfXfXdXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXOX . ; N . X O H ,.2.1.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.5.6._._._._._.F.Q # @ > D ,.2.2.1.1.1.1.2.2.<.<.2.2.1.2.1.1.1.1.1.1.1.1.1.1.5.2.2.2.2.1.2.2.2.2.2.1.%.F 6 : O X X X . X X o z +XqXdXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXsXo o N ; X O D :.1.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.1.1.2.2.2.2.<.6._._._._.J.B.a + X O 7 H *.<.2.2.2.2.2.2.1.1.2.1.2.1.2.1.2.2.2.2.2.2.2.<.2.<.2.2.2.2.2.2.=.=.` L 3 X % x *XeXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX#X l m . X + H ,.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.5.6.J._._._._.n.i O . X # G ' 5.<.2.5.2.2.1.2.2.1.2.1.2.1.2.2.2.2.2.2.2.2.<.2.5.2.2.2.2.2.2.$.F C @ @ X . - V ;XyXaXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX= o B = X O D -.1.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.1.2.2.2.2.2.<.6._._._._.R.u.< O O > #.3.1.2.2.2.<.<.2.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.2.2.<.<.' ` L > . l OXqXsXfXdXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfX$X l x o X O A -.1.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.<.6._._.J._.G.[ , X O 1 %.<.2.2.2.2.<.3.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.<.2.#.@.6 : O @ X . X . x %XrXdXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX; o N ; X A ' 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.5.6.J._._._.I.J + @ 8 *.:.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.<.<.:.' / s 8 : O . X = b $XrXdXfXfXfXfXfXfXfXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX,X ; N o X X 0 _ 2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.<.6.J._._._.u.i X X @ > %.<.2.1.1.1.1.2.2.2.2.2.1.1.1.1.1.1.*.*.G G A 6 @ @ X X . . & n 1XpXfXdXfXfXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXl = x - 7 ` 2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.5.6.J._._.J.p.1 X O S ( :.:.<.<.<.<.:.=.&.-.{ ` J S 5 , + O X o x =XaXaXfXfXfXdXfXfXdXdXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXwX = x X 7 K <.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.<.6._._._.J.Q , X . X X : 7 A H #.#.#.#.G A Z Z > > : @ O O X X z $XpXaXaXaXaXaXfXfXfXfXfXfXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXm . ; ; : S *.2.2.2.1.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.2.2.S.J._._.F.a # . X o o + X o X X - V wXpXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpXo = c o : 0 *.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.5.6.J._.J.B.i O . . X X o N ,XyXfXfXfXfXfXfXfXdXdXfXfXdXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXV X x l O > K } 2.2.2.2.1.2.2.1.2.2.2.2.2.2.1.1.2.2.2.1.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.3.S._._.(.b.; X ; $XeXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXsX$ = B o X O @ S ` 2.2.2.2.1.1.2.2.2.2.2.2.1.2.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.<.S.J._.V.y.* x -XeXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX#X l l X X > L 2.2.2.2.2.<.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.2.2.3.S.J._.V.W $ l ,XdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfX= . x o X X @ 8 *.2.<.<.<.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.3.S.J._.B.T o ; *XyXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX=X ; l . . + H =.<.<.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.1.2.2.2.2.2.2.2.3.S._._.m.a X % $XpXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXl . N = X X C H <.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.6.S._._.b.e . +XpXdXfXfXdXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX,X ; c o O , ) :.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.3.D._.J.t.2 X . m wXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXx . x = X O A %.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.2.2.3.D._.J.t.< l -XfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXrXo = l . : s <.<.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.6.D.J.V.a # ; $XsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXV X l ; O > G <.2.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.1.2.2.2.1.4.D.G.F.p + . V rXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXsX= $ x o X : s <.<.2.1.2.2.2.2.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.1.2.2.1.2.2.4.D.G.M.2 O ; wXsXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX*X - l @ > @.<.1.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.4.D.G.v.< X . N pXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX; . l o 7 I =.<.2.2.2.2.2.2.2.2.1.2.2.1.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.1.2.2.2.4.D.F.y.& X . % -XfXfXfXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXrX = l : 7 %.=.5.<.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.2.1.2.1.4.D.B.W # N rXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXV ; % X 8 L =.<.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.1.2.2.2.4.D.B.E + X = $XdXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX= . 4 . X X X @ 1 #.<.1.2.2.2.2.1.2.2.1.2.2.1.2.2.1.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.4.S.n.J X l qXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXqX X % l : s &.<.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.5.S.a.2 X o V sXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXN . ; = O > G =.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.2.1.2.5.6.p.e X ; $XpXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXo o ; o X X 6 K &.<.2.2.2.2.2.2.2.2.1.1.2.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.5.6.^ , X . x wXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXqX = ; X X @ 7 H -.2.2.<.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.5.6.Q , V sXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXN - o X X > s *.<.5.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.5.5.Q # . #XdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX= o ; X X X @ : @.*.<.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.2.2.1.2.2.2.2.1.3.6.a # $ *XsXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX-X = % > q =.<.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.1.3.3.p + - ,XdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXx . = o @ > #.=.2.2.2.2.2.2.2.1.2.1.2.2.2.2.2.2.2.2.2.2.2.1.3.<.i O ; qXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXo o ; . > K <.<.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.<.<.2 O l eXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX-X o = : 1 #.=.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.2.2.2.2.2.<.=.2 O N sXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXN . % = , L <.3.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.<.*.2 X . X . OXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX% . = X O , #.<.2.2.2.1.<.2.2.2.1.2.2.2.2.2.2.2.1.2.<.*.2 O . $XdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXeX o o 7 U =.<.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.*.9 @ = =XdXaXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX$X = o X @ 7 %.=.5.2.2.2.2.1.2.2.2.2.1.2.2.2.1.2.<.<.i @ X ; qXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXx . = o X X 8 K <.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.<.<.i # X ; qXfXfXfXdXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXo X = X X X @ 7 *.<.1.1.2.2.2.2.2.2.1.2.1.2.2.1.<.2.J > X l eXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX,X . = > L :.3.1.2.2.2.2.2.2.2.2.2.1.2.2.2./ 7 X X l wXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXOX o o @ 1 #.=.2.1.2.2.2.2.2.2.1.2.2.2.2.2.-.A O O . X l wXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX; . = X X 7 I <.:.2.2.1.1.2.1.2.2.2.2.2.2.=.) O X x eXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpXX o = X X : 7 ) <.2.2.1.1.2.2.<.2.2.1.2.2.=.&.# X B pXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX-X o = X X 1 L =.<.2.2.1.1.2.<.2.1.2.1.<.=.8 O X V dXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXN o o X X @ > #.*.2.2.1.2.<.1.2.2.2.2.<.<.s @ X X X o OXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsX= . = > s *.=.2.2.2.1.2.2.1.2.2.<.%.C o V dXfXdXfXdXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXeX . = . @ : H =.2.1.2.2.2.2.2.2.<.2.=.A X . +XdXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX#X + . : 9 %.=.2.2.1.2.2.2.2.2.2.$.> O +XdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXl = o O : A &.2.2.2.2.2.2.2.2.2.1.i : X #XpXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsX. . % @ 5 ) -.2.2.2.2.2.2.2.2.&.A O X OXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXqX o o X O Z ) 2.2.2.2.2.2.1.2.,./ > X . x dXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXV = o . O , / _ <.<.1.2.2.2.2.<.D 6 X X ; eXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfX; o = . O O 7 D <.3.2.2.2.1.<.5.,.H # X o -XfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpXX o o O , D _ <.<.2.2.1.2.2.*.S 6 . V fXdXfXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX$X . o o X X 6 A #.<.2.2.2.2.<.<.} K + 4 pXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXN X o . 7 L -.,.1.1.1.1.2.2.) Z X X o wXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX; . = X X O > A / 1.2.1.1.2.2.,.) 2 + +XsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpX. X o X X @ 1 ) _ :.3.2.<.2.2.*.@.7 @ x pXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX-X . o X X O O 6 A %.:.2.2.1.1.<.<.I 7 X . o -XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXOX $ . X 1 q &.:.2.2.1.1.1.$.A 6 X +XdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfX; o X O : Z H 1.2.2.1.2.2.-.D & X . . X l eXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXo . o X + 0 / *.<.<.2.<.5.$.F @ O X . -XaXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXeX o o . . X : 6 G *.2.<.<.<.<.<.P 9 + X x pXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX+X o . O * D ' <.<.2.2.1.1.#.C O X qXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXc o . X O : Z #.*.2.2.1.1.:.-.s # x pXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX= o . > 2 / ` <.<.2.1.1.1.@.C X O X -XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXrX o o X X O 6 0 #.*.1.2.1.2.=.*.s 1 . X X ; rXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX*X o o X X # , S { =.=.2.2.2.1.@.F @ O X X X X j.dXfXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXB o . X X X O : > G &.1.1.1.1.:.<.~ q $ X X X X j.dXfXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX- = X X + 8 s &.-.2.<.2.1.*.#.> @ O X X X X X # v ,XsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXdXfXdX . o X @ @ C D *.*.2.2.<.1.o.P 1 @ X X X 3 5 b >XsXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfX,X X o X O : q D ` -.7.2.2.3.*.A C : @ X X O > A 0 D ( L.8XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXOX o . X X @ O 6 7 A H 1.<.<.3.-._ L S # @ X > 8 S D K D J +.>XyXdXfXdXfXfXfXdXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXl = X X @ # > q / 7.=.:.2.<.*.$.A 6 : @ O X X X X X : 0 G ) @.@.H H H H ' 8..;.,.,.[ [ [ E ^ P.7XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXsX. o . O @ Z %.2.2.2.2.4.6.Z.A.Z.Z.;.,.[ [ W [ Q ^ @X6XdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfX,X . o . X , %.:.2.5.6.6.S.D.D.A.S.Z.;.;.[ [ E W 0.p.2XiXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfX$X . X X . X O A -.5.5.6.6.S.D.A.D.D.D.n.u.[ [ W W f ! e.3XiXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXN o : ' 5.5.Z.S.S.S.D.D.H.F.H.H.v.;.[ [ [ T T t.5XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXl o : D 3.6.Z.S.S.S.D.H.F.H.J.H.F.n.u.[ [ W R W k.Y.yXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXsXo o O 1 <.5.6.6.D.D.D.D.J.G.H.J.J.J.B.u.y.[ W W 9.q.c. XiXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXeX . . O > <.5.6.6.D.D.D.D.G.H.J.H._.J.G.B.y.y.t.y.9.t.r.g.;XsXfXfXfXfXfXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfX*X o O 9 1.5.6.6.D.D.D.H.H.G.J.J.J.J._._.V.b.i.i.i.t.w.9.r.c.sXiXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXV o . O s <.2.6.6.D.D.D.D.G.J.J.J.J.J._._._.G.M.b.t.i.t.9.0.e.&X0XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfX4 o . 6 ' <.5.6.S.S.D.H.H.J.H.J.J.J.J.J.J._.`.(.V.M.b.t.t.9.9.0.c.0XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXdX= o A 7.5.5.6.S.S.D.H.H.H.J.J.J.J.J._.(._._.`.(.G.M.i.i.t.0.0.0.&X0XfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXpX . o O @ #.5.5.6.S.S.D.D.D.H.H.H.J.H.J.J._._._._._.`.`.(.V.i.t.t.q.0.0.c.0XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfX-X . o O 9 <.5.5.6.S.S.D.D.H.H.H.H.J.J._.J._._._._.`._.`.`.(.V.i.i.q.9.9.q.&X0XsXfXfXfXfXfXfXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXOX o X X C &.6.5.6.6.D.D.D.H.D.H.H.J.J.J.J._._._._.`._.`.`.`.].).V.i.w.w.q.9.q.c.3XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXdXfXl o # ) 4.5.6.S.S.Z.D.D.H.D.H.H.H.J.J._._._._.`._.`.`.`.`.].`.Q.V.d.w.s.w.q.9.g.2XiXfXfXfXfXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXdXfXfXfXfXfXfX= o X X : K 5.5.6.6.S.S.D.D.H.H.D.H.J.J.J.J._._._._.`._.`.`.`.`.].].].`.W.d.d.s.w.0.k r.4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXpX . o X O K ,.6.6.S.S.6.S.D.D.H.H.H.H.H.J.J._.J._._._.`.`._.`.`.`.`.].].[./.~.f.s.q.0.d d =XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfX=X X . X O y 4.6.S.S.S.S.S.D.D.D.H.D.H.J.J.J.J.J._._._._.`._.`.`.`.`.].].].].[.[.Q.d.9.k u u e.yXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfX+X . X < j.6.6.S.S.6.S.D.D.D.D.H.H.H.J.J.J.J._._._._._._.`.`.`.`.`.].].].[.[.[.{.W.r.g r t h 4XiXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXx o . X O 1 =.S.S.S.S.S.D.S.D.D.D.H.H.H.J.J.J.J._._._._.`.`.`.`.`.].].].].].].[.].[.[.Q.0.d t * u 4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfX; o . 1 E S.6.D.S.D.D.S.D.D.D.D.H.H.H.J.J.J.J._._._._._.`.`.].].].].].].].[.].[.[.[.W.0.d * % u 5XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXsXo . O > ( A.D.A.D.D.D.D.D.D.D.H.H.H.H.J.J.J.J._._.`._.`.`.`.].`.].].].].].].[.[.[.[.}.W.k e % $ u 4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXeX X . # P v.A.Z.D.D.D.D.D.D.D.D.H.H.H.H.J.J.J.J._._.`._.`.`.`.].].].].].].].].[.].[.[./.s.k e % $ B iXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfX,X . X X K b.D.D.H.H.H.D.H.H.H.H.H.H.J.J.J.J._._._._.`.`.`.`.`.`.].].].].[.].[.[.].[.[.[.XXw.h w % $ h.yXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfX#X . X 4 u.H.D.H.H.H.H.H.H.H.H.H.J.H.J.J.J._.J._._._.`.`.`.`.].`.].].[.].].}.[.].[.[.[.[.Q.9.r * $ % &XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXN X X > [ H.H.H.H.J.H.J.H.J.J.J.J.J.J._.J._._._._.`.`.`.`.`.].].].].].].[.[.].[.[.[.[.[.[.x.g t * o w 4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXdXfXfXfXdXl . X ] I.J.H.J.J.H.J.J.J.J.J.J.J.J._.J._._._._.`._.`.`.].`.].`.].].].[.].].[.[.[.[.[.[./.q.d * $ $ h rXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfX+ X X p J.J.J.J.J.J.J._.J.J._.J._._._._._._._.`.`.`.`.`.].`.].].].].].].[.[.[.[.[.[.[.[.}.W.j r * o % %XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXdXfX. < l.J._.J.J.J._._.J._._._._._._._._.`._.`._.`.`.`.].`.].].].].].[.].[.].[.[.[.[.[.[./.q.d < $ o t 4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXdXfXfX . X y.`._._._.`._._._._._.`._.`._.`.`._.`.`.`.`.`.].`.].].].].].[.[.].[.].[.[.[.[.[.[.[.f.g t $ . $ OXyXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXdXfXfXfXpXo . y _.(.`._.`._._._._._.`._.`.`.`.`.`.`.`.`.`.`.].`.].].].].].[.].].[.].[.[.[.[.[.[.}.Q.0.d * $ . t 2XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXdXV , C._._.`.`._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.].`.].].].].].[.].[.].[.[.[.[.[.[.[.}.{.d.d w % o % h.dXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXdXfXfXfXfXfXwX= R '._.`.`.`.`.`.`.`._.`.`.`.`.`.`.`.`.`.].`.].`.].].].].[.].].[.].[.[.].[.[.[.[.}.[.W.9.r * o o u yXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXdXfXeXl o O > G._.).`.`.`.`.`.`.`.`.`.`.].`.].].`.].`.].`.].].].].].].[.].[.[.].[.].[.[.[.[.[.}.).w.f < $ o * %XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXdXdXOX$ O ~ (.].`.].`.`.].`.].`.`.`.].`.].].`.].].`.].].].].].].].].[.[.].[.[.[.[.[.[.[.[.[.{.f.g r $ + o N yXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXdXfXpXV . < N.`.).].`.].].].].`.`.].`.].`.].].].].].].].].[.].[.[.[.].[.[.[.[.[.[.[.[.[.[.}.}.c.0.r * o . w ;XfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXdXfXfXfXqXx R ^.].].].`.].].`.].`.].`.].`.].].`.].].].[.].[.].[.].[.].[.[.[.[.].[.[.[.[.[.[.}.W.9.r * % . $ OXyXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXdXfXfXfXdX=Xl & W.].].[.`.].].].].].].].].].].].].[.].].].].[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.}.!.q.d w $ . o h 4XfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXpXOX% j ].oX].].].].].].].].].`.].`.[.].[.].].].[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[./.W.0.d w % o . u 4XfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXpX$X= $ !.}.[.].].].].[.].[.].].].].].[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.Q.w.g u w % X o * *XfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXsXfXfXdXdXfXfXfXdXdXsX#X% d oX[.[.[.].[.].].[.].[.].].].].].[.].[.].[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[./.W.q.g r * % o X ; #XdXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXdXdX-Xx . . f.}.[.[.[.].[.].[.].[.[.].[.[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.}.^.f.k r w % o X . t %XiXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXdXdXqXV o X $ [.}.[.[.[.[.[.].[.[.[.[.].[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.].W.q.g r w % o o $ x =XsXfXdXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXpX$Xl o . 0.[.[.[.[.[.[.[.[.[.].[.[.[.[.[.[.[.[.[.[.].[.[.[.[.[.[.[.[.[.[.[.}.^.s.g u w % $ o . % k ;XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXfXfXrXOXl . X o |.[.[.[.[.[.[.].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.f.q.f r w & o o . u %XyXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXqXV o r oX[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.}.{.f.q.k d w * + o o o B ;XiXiXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXdXfXdX-XB - X f.oX[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.[.W.s.g d e * $ $ X . u %XyXiXiXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXdXpX-X+Xl . X + /.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.[.[.[.[.}.[.}./.!.s.k d r < % $ . . % k ,XiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXrX*Xc % j }.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.[.}.[.[././.f.s.g d d w % $ X o $ t %X0XfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXdXfXfXdXpXrX*Xc $ . X x.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.}.}.^.!.s.0.d r u w * o o o $ w OX4XdXaXdXfXfXfXfXfXfXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXfXdXwX#Xm ; . $ X[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.].Q.W.s.q.0.g r r w * $ o o o % h.4XaXiXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXrX-XOXx % X r oX}.}.[.[.[.[.[.}.}.}.{.{.{.^.^.!.s.s.e.k k d u u < * % + o o $ % j -XdXaXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXsXqX$XV x % o X g XX/./.Q././.Q.Q.Q.W.f.f.s.9.0.0.g g d d r r w w * $ $ o o o w OX;XyXiXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXrXwX*XV m ; o . d g.q.0.0.9.0.0.0.k g d g d r r d u r w w * % % $ o o $ % M &XeXsXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXdXsXeX-X#XB l $ . r g d d d d d r d d r r w w w w < * * $ % $ + $ $ < u B -XyXfXiXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXdXfXfXfXdXdXdXsXpXqX*XOXm l = . X X w w * * w ; w t w ; % % * % % $ $ $ $ $ $ * u B h.-XyXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXdXdXdXpXsXpXpXeXqX*XOXV N x ; + . . * % * % $ * $ $ % $ $ $ $ + % t x u m V %X-XeXsXiXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXdXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXpXpXpXpXeX-X#XV V N l % o o . . X . o % = & ; u u x u x u h N %X%X-X;XyXyXyXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXdXsXpXpXrXrXeXeXwXeX-X$X+XOXOXV V B B N N x x x l = = = o o o o o o o o o o o o o o o o o = o $ = = $ = $ = = $ = $ % % N #X$X*X,XeXrXyXyXyXyXyXiXiXfXiXfXfXfXfXiXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXdXdXdXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXpXyXyXpXpXpXpXpXpXpXpXsXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX", "fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXfXfXfXfXfXdXfXdXfXdXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX" }; wdm-1.28/po/cs.po 644 0 0 734710221265060 132420ustar AlexeyVoinov 0 0# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # # msgid "" msgstr "" "Project-Id-Version: wdmLogin 1.23\n" "POT-Creation-Date: 2003-08-31 16:46+0400\n" "PO-Revision-Date: 2003-05-11 14:00+0100\n" "Last-Translator: Vladimir Nadvornik \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: bl/src/wdmLogin/Login.c:70 msgid "no help available." msgstr "" "wdm je grafické rozhraní pro pÅ™ihlášení uživatele do systému.\n" "\n" "Zadejte své uživatelské jméno (userid) a stisknÄ›te . Panel poté " "zobrazí výzvu k zadání hesla. Zadejte hesloa stisknÄ›te .\n" "\n" "\n" "Dále se provede pÅ™ihlášení a spustí se windowmanager.\n" "\n" "\n" "'Spustit WM' urÄuje, který windowmanager se spustí.\n" "\n" "\n" "'PÅ™edchozí' spustí stejný windowmanager jako v pÅ™edchozí relaci.\n" "\n" "\n" "'Nouzový režim' spustí pouze xterm, ostatní volby jsou pro jednotlivé " "windowmanagery.\n" "\n" "\n" "'Volby' jsou následující:\n" "\n" " PÅ™ihlášení - pÅ™ihlášení do systému\n" "\n" " Restartovat - restartuje systém\n" "\n" " UkonÄit - zastaví systém\n" "\n" " Opustit - ukonÄí display manager\n" "\n" "\n" "Volby PÅ™ihlášení, Restartovat nebo UkonÄit mohou vyžadovat platné " "uživatelské jméno a heslo nebo jméno a heslo uživatele root.\n" "\n" "\n" "POZNÃMKA: Volba Opustit je urÄena hlavnÄ› k testování wdm. Tato volba " "ukonÄípouze x-server a wdm musí být ukonÄen jiným způsobem\n" "\n" "\n" "Volba Opustit provede stejnou Äinnost jako ctrl-r v xdm.\n" "\n" "\n" "VyÄistit vymaže zadané informace a spustí pÅ™ihlášení znovu.\n" "\n" "\n" "V manuálové strénce jsou popsány možnosti konfigurace wdm.Je mnoho možností " "pro výbÄ›r obrázků, barev pozadí a ověřování pro volby PÅ™ihlášení, " "Restartovat, UkonÄit " #: bl/src/wdmLogin/Login.c:114 msgid "Login" msgstr "PÅ™ihlášení" #: bl/src/wdmLogin/Login.c:114 msgid "Reboot" msgstr "Restartovat" #: bl/src/wdmLogin/Login.c:114 msgid "Halt" msgstr "UkonÄit" #: bl/src/wdmLogin/Login.c:115 msgid "ExitLogin" msgstr "Opustit" #: bl/src/wdmLogin/Login.c:118 msgid "Login failed" msgstr "PÅ™ihlášení se nezdaÅ™ilo" #: bl/src/wdmLogin/Login.c:118 msgid "Reboot failed" msgstr "Restartování se nezdaÅ™ilo" #: bl/src/wdmLogin/Login.c:119 msgid "Halt failed" msgstr "UkonÄení se nezdaÅ™ilo" #: bl/src/wdmLogin/Login.c:119 msgid "ExitLogin failed" msgstr "OpuÅ¡tÄ›ní se nezdaÅ™ilo" #: bl/src/wdmLogin/Login.c:280 msgid "NoChange" msgstr "PÅ™edchozí" #: bl/src/wdmLogin/Login.c:299 msgid "failsafe" msgstr "nouzový režim" #: bl/src/wdmLogin/Login.c:381 msgid "ERROR" msgstr "CHYBA" #: bl/src/wdmLogin/Login.c:440 msgid "Password:" msgstr "Heslo:" #: bl/src/wdmLogin/Login.c:448 bl/src/wdmLogin/Login.c:777 msgid "Login name:" msgstr "Uživatel:" #: bl/src/wdmLogin/Login.c:479 msgid "invalid name" msgstr "neplatné jméno" #: bl/src/wdmLogin/Login.c:501 msgid "validating" msgstr "potvrzování" #: bl/src/wdmLogin/Login.c:503 bl/src/wdmLogin/Login.c:534 msgid "exiting" msgstr "konÄím" #: bl/src/wdmLogin/Login.c:552 msgid "Close Help" msgstr "Zavřít" #: bl/src/wdmLogin/Login.c:559 bl/src/wdmLogin/Login.c:871 msgid "Help" msgstr "NápovÄ›da" #: bl/src/wdmLogin/Login.c:725 msgid "Login Authentication" msgstr "Ověření pro pÅ™ihlášení" #: bl/src/wdmLogin/Login.c:734 msgid "Welcome to" msgstr "Vítejte na" #: bl/src/wdmLogin/Login.c:821 msgid "Start WM" msgstr "Spustit WM" #: bl/src/wdmLogin/Login.c:839 msgid "Options" msgstr "Volby" #: bl/src/wdmLogin/Login.c:879 msgid "Start Over" msgstr "VyÄistit" #: bl/src/wdmLogin/Login.c:886 msgid "Go!" msgstr "Start!" wdm-1.28/po/cy.po 644 0 0 1015610221265060 132600ustar AlexeyVoinov 0 0# translation of cy.po to Cymraeg # translation of en.po to Cymraeg # KD at KGyfieithu , 2004. msgid "" msgstr "" "Project-Id-Version: cy\n" "POT-Creation-Date: 2003-06-12 19:34+0400\n" "PO-Revision-Date: 2004-04-30 21:12+0100\n" "Last-Translator: KD at KGyfieithu \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language-Team: Cymraeg \n" "X-Generator: KBabel 1.2\n" #: src/wdmLogin/Login.c:79 msgid "no help available." msgstr "" "Rhyngwyneb graffegol yw wdm, sy'n cael ei ddefnyddio i ddilysu defnyddiwr i'r cysawd, a gweithredu'r broses o fewngofnodi. \n" "\n" "\n" "Rhowch eich defnydd-enw (userid) wrth yr anogiad a gwasgwch . Bydd y panel wedyn yn dangos anogiad i chi roi eich cyfrinair. Rhowch y cyfrinair a gwasgwch .\n" "\n" "\n" "Byddwch yn cael eich mewngofnodi, a bydd y rheolydd ffenestri yn cael ei gychwyn.\n" "\n" "\n" "Mae'r dewisiad yn y naidlen Cychwyn WM yn penodi'r paramedr i basio i Xsession i gychwyn y rheolydd ffenestri.\n" "\n" "\n" "Bydd DimNewid yn cychwyn yr un reolydd ffenestri a ddefnyddir am y sesiwn diwethaf.\n" "\n" "\n" "Mae methu-diogel yn sesiwn xterm syml, a bydd y dewisiadau eraill yn y rhestr yn cychwyn y rheolydd ffenestri a ddangosir (yn dibynnu ar eich arsefydliad) .\n" "\n" "\n" "Mae'r dewisiad yn y naidlen Dewisiadau yn penodi:\n" "\n" " Enw - mewngofnodi i'r cysawd\n" "\n" " Ailgychwyn - terfynu ac ailgychwyn y cysawd\n" "\n" " Terfynu - terfynu y cysawd ac aros\n" "\n" " Gadael - gadael y panel mewngofnod\n" "\n" "\n" "Mwy na thebyg, bydd angen rhoi defnydd-enw a chyfrinair dilys, neu ddefnyddenw gwraidd ('root') a chyfrinair gwraidd i weithredu Ailgychwyn, Terfynu neu Adael.\n" "\n" "\n" "NODER: Bwriedir Gadael fel cymorth wrth profi wdm. Bydd yn diffodd y gweinydd-x, and rhaid terfynu wdm drwy wneud rhywbeth arall. Bydd cychwyn wdm fel proses wedi'i ddatglymu yn golygu ei bod hi'n anodd ei derfynu.\n" "\n" "\n" "Mae Gadael yn gwneud yr un peth â ctrl-r yn xdm.\n" "\n" "\n" "1. Bydd y botwm Dechrau Eto yn gwaredu'r wybodaeth fewngofnodi gyfredol a chychwyn y broses fewngofnodi unwaith eto.\n" "\n" "\n" "2. Gweler y dudalen man am wybodaeth ychwanegol am ffurfweddu'r pecyn yma. Mae nifer o ddewisiadau am osod y lliw neu bicsfap cefndir, y logo i'r panel mewngofnodi, y dewisiad o reolyddion ffenestri i'w cychwyn, a'r dilysiant mewngofnodi ar gyfer ailgychwyn, terfynu a gadael." #: src/wdmLogin/Login.c:114 msgid "Login" msgstr "Enw" #: src/wdmLogin/Login.c:114 msgid "Reboot" msgstr "Ailgychwyn" #: src/wdmLogin/Login.c:114 msgid "Halt" msgstr "Terfynu" #: src/wdmLogin/Login.c:115 msgid "ExitLogin" msgstr "Gadael" #: src/wdmLogin/Login.c:118 msgid "Login failed" msgstr "Methodd y mewngofnodi" #: src/wdmLogin/Login.c:118 msgid "Reboot failed" msgstr "Methodd yr ailgychwyn" #: src/wdmLogin/Login.c:119 msgid "Halt failed" msgstr "Methodd y terfynu" #: src/wdmLogin/Login.c:119 msgid "ExitLogin failed" msgstr "Methodd y gadael" #: src/wdmLogin/Login.c:279 msgid "NoChange" msgstr "DimNewid" #: src/wdmLogin/Login.c:298 msgid "failsafe" msgstr "methu-diogel" #: src/wdmLogin/Login.c:376 msgid "ERROR" msgstr "GWALL" #: src/wdmLogin/Login.c:435 msgid "Password:" msgstr "Cyfrinair:" #: src/wdmLogin/Login.c:443 src/wdmLogin/Login.c:772 msgid "Login name:" msgstr "Enw:" #: src/wdmLogin/Login.c:474 msgid "invalid name" msgstr "enw annilys" #: src/wdmLogin/Login.c:496 msgid "validating" msgstr "dilysu" #: src/wdmLogin/Login.c:498 src/wdmLogin/Login.c:529 msgid "exiting" msgstr "terfynu" #: src/wdmLogin/Login.c:547 msgid "Close Help" msgstr "Cau" #: src/wdmLogin/Login.c:554 src/wdmLogin/Login.c:866 msgid "Help" msgstr "Cymorth" #: src/wdmLogin/Login.c:720 msgid "Login Authentication" msgstr "Dilysu Mewngofnodi" #: src/wdmLogin/Login.c:729 msgid "Welcome to" msgstr "Croeso i" #: src/wdmLogin/Login.c:816 msgid "Start WM" msgstr "Cychwyn WM" #: src/wdmLogin/Login.c:834 msgid "Options" msgstr "Dewisiadau" #: src/wdmLogin/Login.c:874 msgid "Start Over" msgstr "Dechrau Eto" #: src/wdmLogin/Login.c:881 msgid "Go!" msgstr "I ffwrdd â ni!" wdm-1.28/po/de.po 644 0 0 1031310221265060 132300ustar AlexeyVoinov 0 0# translation of de.po to deutsch # Michael Buesch , 2003 msgid "" msgstr "" "Project-Id-Version: de\n" "POT-Creation-Date: 2003-04-06 00:33+0400\n" "PO-Revision-Date: 2003-04-06 14:36+0200\n" "Last-Translator: Michael Buesch \n" "Language-Team: deutsch\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0\n" #: src/wdmLogin/Login.c:79 msgid "no help available." msgstr "" "wdm ist eine grafische Oberfläche, um einen Benutzer am System anzumelden.\n" "\n" "\n" "Geben Sie ihren Benutzernamen (userid) an der Eingabeaufforderung ein und " "drücken Sie . Danach wird eine Eingabeaufforderung für Ihr Paßwort " "angezeigt. Geben Sie Ihr Paßwort ein und drücken Sie .\n" "\n" "\n" "Der Anmeldeprozess wird nun durchgeführt und Ihr Window-Manager wird " "gestartet.\n" "\n" "\n" "Im \"Starte WM\"-Auswahlfeld können Sie den Parameter für Xsession wählen um " "den Window-Manager zu starten.\n" "\n" "\n" "\"Letzter\" startet den zuletzt benutzten Window-Manager.\n" "\n" "\n" "\"abgesichert\" startet eine einfache xterm Sitzung. Die anderen " "aufgelisteten Optionen starten den angegebenen (installations-spezifischen) " "Window-Manager.\n" "\n" "\n" "Im \"Optionen\"-Auswahlfeld können Sie wählen:\n" "\n" " Anmelden - Meldet Sie am System an.\n" " Neustarten - Startet das Betriebssystem neu.\n" " Herunterfahren - Fährt das Betriebssystem herunter um es abzuschalten.\n" " Login beenden - Beendet den Display-Manager und wechselt zur Console.\n" "\n" "\n" "Möglicherweise wird ein gültiger Benutzername und Paßwort oder das Superuser-" "Paßwort benötigt, um das System herunterzufahren, neuzustarten oder WDM zu " "beenden.\n" "\n" "\n" "Anmerkung: \"Login beenden\" ist zum Testen des WDM gedacht. Es beendet den " "X-Server, aber WDM muss anders beendet werden. Wenn WDM \"detached\" " "gestartet wird, wird es sehr schwierig sein, den Display-Manager zu " "beenden.\n" "\n" "\n" "\"Login beenden\" macht das gleiche, wie Strg+r in XDM.\n" "\n" "\n" "1. Die \"Löschen\"-Schaltfläche löscht alle eingegebenen Login-Informationen " "und startet den Anmeldeprozess von Vorne.\n" "\n" "\n" "2. Sehen Sie sich die man-pages für zusätzliche Informationen hinsichtlich " "der Konfiguration des WDM an. Es gibt viele Optionen um z.B. den " "Hintergrund, das Logo, die Window-Manager liste und das Verhalten bei " "\"Neustarten\" oder \"Herunterfahren\" einzustellen." #: src/wdmLogin/Login.c:163 msgid "Login" msgstr "Anmeldung" #: src/wdmLogin/Login.c:163 msgid "Reboot" msgstr "Neustarten" #: src/wdmLogin/Login.c:163 msgid "Halt" msgstr "Herunterfahren" #: src/wdmLogin/Login.c:164 msgid "ExitLogin" msgstr "Login aus" #: src/wdmLogin/Login.c:167 msgid "Login failed" msgstr "Login fehlgeschlagen" #: src/wdmLogin/Login.c:167 msgid "Reboot failed" msgstr "Neustart fehlgeschlagen" #: src/wdmLogin/Login.c:168 msgid "Halt failed" msgstr "Herunterfahren fehlgeschlagen" #: src/wdmLogin/Login.c:168 msgid "ExitLogin failed" msgstr "Login beenden fehlgeschlagen" #: src/wdmLogin/Login.c:325 msgid "NoChange" msgstr "Letzter WM" #: src/wdmLogin/Login.c:344 msgid "failsafe" msgstr "abgesichert" #: src/wdmLogin/Login.c:417 msgid "ERROR" msgstr "FEHLER" #: src/wdmLogin/Login.c:470 msgid "Password:" msgstr "Paßwort:" #: src/wdmLogin/Login.c:478 src/wdmLogin/Login.c:803 msgid "Login name:" msgstr "Benutzer:" #: src/wdmLogin/Login.c:511 msgid "invalid name" msgstr "ungültiger Benutzername" #: src/wdmLogin/Login.c:533 msgid "validating" msgstr "prüfe" #: src/wdmLogin/Login.c:535 src/wdmLogin/Login.c:568 msgid "exiting" msgstr "beende" #: src/wdmLogin/Login.c:585 msgid "Close Help" msgstr "Hilfe aus" #: src/wdmLogin/Login.c:591 src/wdmLogin/Login.c:897 msgid "Help" msgstr "Hilfe" #: src/wdmLogin/Login.c:751 msgid "Login Authentication" msgstr "System-Anmeldung" #: src/wdmLogin/Login.c:760 msgid "Welcome to" msgstr "Willkommen auf" #: src/wdmLogin/Login.c:847 msgid "Start WM" msgstr "Starte WM" #: src/wdmLogin/Login.c:865 msgid "Options" msgstr "Optionen" #: src/wdmLogin/Login.c:905 msgid "Start Over" msgstr "Löschen" #: src/wdmLogin/Login.c:912 msgid "Go!" msgstr "Los!" wdm-1.28/po/en.po 644 0 0 722210221265060 132270ustar AlexeyVoinov 0 0msgid "" msgstr "" "Project-Id-Version: wdm 1.25\n" "POT-Creation-Date: 2003-06-12 19:34+0400\n" "PO-Revision-Date: 2003-06-12 19:40+0400\n" "Last-Translator: Alexey Voinov \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=us-ascii\n" "Content-Transfer-Encoding: 7bit\n" #: src/wdmLogin/Login.c:70 msgid "no help available." msgstr "" "wdm is a graphical interface used to authenticate a user to the system and " "perform the login process.\n" "\n" "\n" "Enter your user name (userid) at the prompt and press . The panel " "will then present a prompt to enter your password. Enter the password and " "press .\n" "\n" "\n" "The login will then be performed and your window manager started.\n" "\n" "\n" "The Start WM PopUp selection specifies the parameter to pass to Xsession to " "start the window manager.\n" "\n" "\n" "NoChange will start the same window manager the user used for their last " "session.\n" "\n" "\n" "failsafe is a simple xterm session and the other listed options will start " "the indicated (installation specific) window manager.\n" "\n" "\n" "The Options PopUp selection specifies:\n" "\n" " Login - logon to the system\n" "\n" " Reboot - shutdown and reboot the system\n" "\n" " Halt - shutdown the system and halt\n" "\n" " ExitLogin - exit the display manager\n" "\n" "\n" "The installation may require a valid username and password or username=root " "and root's password to perform Reboot, Halt or Exit.\n" "\n" "\n" "NOTE: ExitLogin (or, as it is sometimes refered to: exit) is intended for " "use primarily in wdm testing. It will shut down the x-server but the wdm " "must be terminated by other means. Starting wdm as a detached process will " "result that it will be very difficult to terminate.\n" "\n" "\n" "ExitLogin performs the same operation as ctrl-r does for xdm.\n" "\n" "\n" "1. The StartOver button will erase the current login Information and begin " "the login process again.\n" "\n" "\n" "2. See the man page for additional information on configuring this package. " "There are numerous options for setting the background color or pixmap, the " "LoginPanel logo, the selection of window managers to start, and the login " "verification for Reboot, halt and exit." #: src/wdmLogin/Login.c:114 msgid "Login" msgstr "" #: src/wdmLogin/Login.c:114 msgid "Reboot" msgstr "" #: src/wdmLogin/Login.c:114 msgid "Halt" msgstr "" #: src/wdmLogin/Login.c:115 msgid "ExitLogin" msgstr "" #: src/wdmLogin/Login.c:118 msgid "Login failed" msgstr "" #: src/wdmLogin/Login.c:118 msgid "Reboot failed" msgstr "" #: src/wdmLogin/Login.c:119 msgid "Halt failed" msgstr "" #: src/wdmLogin/Login.c:119 msgid "ExitLogin failed" msgstr "" #: src/wdmLogin/Login.c:279 msgid "NoChange" msgstr "" #: src/wdmLogin/Login.c:298 msgid "failsafe" msgstr "" #: src/wdmLogin/Login.c:376 msgid "ERROR" msgstr "" #: src/wdmLogin/Login.c:435 msgid "Password:" msgstr "" #: src/wdmLogin/Login.c:443 src/wdmLogin/Login.c:772 msgid "Login name:" msgstr "" #: src/wdmLogin/Login.c:474 msgid "invalid name" msgstr "" #: src/wdmLogin/Login.c:496 msgid "validating" msgstr "" #: src/wdmLogin/Login.c:498 src/wdmLogin/Login.c:529 msgid "exiting" msgstr "" #: src/wdmLogin/Login.c:547 msgid "Close Help" msgstr "" #: src/wdmLogin/Login.c:554 src/wdmLogin/Login.c:866 msgid "Help" msgstr "" #: src/wdmLogin/Login.c:720 msgid "Login Authentication" msgstr "" #: src/wdmLogin/Login.c:729 msgid "Welcome to" msgstr "" #: src/wdmLogin/Login.c:816 msgid "Start WM" msgstr "" #: src/wdmLogin/Login.c:834 msgid "Options" msgstr "" #: src/wdmLogin/Login.c:874 msgid "Start Over" msgstr "" #: src/wdmLogin/Login.c:881 msgid "Go!" msgstr "" wdm-1.28/po/es.po 644 0 0 1024210221265060 132500ustar AlexeyVoinov 0 0# translation of es.po to spanish # translation of wdm.po to spanish # Manuel Padron Martinez , 2003. msgid "" msgstr "" "Project-Id-Version: es\n" "POT-Creation-Date: 2003-04-06 00:33+0400\n" "PO-Revision-Date: 2003-06-30 17:53+0100\n" "Last-Translator: Manuel Padron Martinez \n" "Language-Team: spanish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.2beta3\n" #: src/wdmLogin/Login.c:79 msgid "no help available." msgstr "" "wdm es una interfaz gráfica usada para autenticar a los usuarios en el sistema y " "realizar el proceso de login.\n" "\n" "\n" "Introduzca su nombre de usuario en el cuadro de dialogo y presione . El panel " " mostrara un cuadro de dialogo para que introduzca su clave. Introduzca la clave y " "presione .\n" "\n" "\n" "Entonces se autenticara en el sistema y arrancara el gestor de ventanas seleccionado.\n" "\n" "\n" "El menú desplegable de \"Gestor de ventanas\" permite elegir con que gestor de ventanas " "arrancaran la sesión de las X." "\n" "\n" "\"Sin cambios\" arrancara con el ultimo gestor de ventanas que se uso.\n" "\n" "\n" "El \"modo seguro\" arrancara una sesión solo con un terminal x mientras que el resto de las " " opciones arrancaran el gestor seleccionado." "\n" "\n" "El menú desplegable de \"Opciones\" se compone de:\n" "\n" " Login - Para autenticarse en el sistema.\n" " Reiniciar - Cierra y reinicia el sistema.\n" " Apagar - Cierra y apaga el sistema..\n" " Salir - Sale de las X y vuelve al modo consola.\n" "\n" "\n" "La instalación requiere un nombre y una clave de usuario valida o el usuario root y la clave " "para realizar un reinicio, un apagado o para salir a la consola.\n" "\n" "\n" "NOTA: Salir esta pensado para hacer pruebas en wdm. Salir cerrara el servidor de las X " "pero wdm tiene que ser cerrado por otros metodos. Si se a arrancado wdm como un proceso " "sin asociar al terminal (wdm&) resultara mas difícil de cerrar.\n" "\n" "\n" "Salir hace lo mismo que lo que hace ctrl-r en xdm.\n" "\n" "\n" "1.El botón limpiar borrara todos los datos del intento de autenticación actual.\n" "\n" "\n" "2. Para mas información sobre la configuración de este paquete consulte el manual(man). Hay numerosas opciones para establecer el color de fondo, la imagen en el panel, el gestor de ventanas para arrancar y la autenticación para reiniciar apagar y salir." #: src/wdmLogin/Login.c:163 msgid "Login" msgstr "Login" #: src/wdmLogin/Login.c:163 msgid "Reboot" msgstr "Reiniciar" #: src/wdmLogin/Login.c:163 msgid "Halt" msgstr "Apagar" #: src/wdmLogin/Login.c:164 msgid "ExitLogin" msgstr "Salir" #: src/wdmLogin/Login.c:167 msgid "Login failed" msgstr "Fallo la autenticación." #: src/wdmLogin/Login.c:167 msgid "Reboot failed" msgstr "Ocurrió un fallo al intentar reiniciar." #: src/wdmLogin/Login.c:168 msgid "Halt failed" msgstr "Ocurrió un fallo al intentar apagar." #: src/wdmLogin/Login.c:168 msgid "ExitLogin failed" msgstr "Ocurrió un fallo al intentar salir." #: src/wdmLogin/Login.c:325 msgid "NoChange" msgstr "Sin cambios" #: src/wdmLogin/Login.c:344 msgid "failsafe" msgstr "Modo seguro" #: src/wdmLogin/Login.c:417 msgid "ERROR" msgstr "ERROR" #: src/wdmLogin/Login.c:470 msgid "Password:" msgstr "Clave:" #: src/wdmLogin/Login.c:478 src/wdmLogin/Login.c:803 msgid "Login name:" msgstr "Usuario:" #: src/wdmLogin/Login.c:511 msgid "invalid name" msgstr "usuario incorrecto" #: src/wdmLogin/Login.c:533 msgid "validating" msgstr "comprobando" #: src/wdmLogin/Login.c:535 src/wdmLogin/Login.c:568 msgid "exiting" msgstr "saliendo" #: src/wdmLogin/Login.c:585 msgid "Close Help" msgstr "Cerrar ayuda" #: src/wdmLogin/Login.c:591 src/wdmLogin/Login.c:897 msgid "Help" msgstr "Ayuda" #: src/wdmLogin/Login.c:751 msgid "Login Authentication" msgstr "Autenticación" #: src/wdmLogin/Login.c:760 msgid "Welcome to" msgstr "Bienvenido a " #: src/wdmLogin/Login.c:847 msgid "Start WM" msgstr "Gestor de ventanas" #: src/wdmLogin/Login.c:865 msgid "Options" msgstr "Opciones" #: src/wdmLogin/Login.c:905 msgid "Start Over" msgstr "Limpiar" #: src/wdmLogin/Login.c:912 msgid "Go!" msgstr "Adelante!" wdm-1.28/po/fr_FR.po 644 0 0 1122710221265060 136430ustar AlexeyVoinov 0 0# Copyright 2003 (c), Mathieu Roy # # 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. msgid "" msgstr "" "Project-Id-Version: wdm 1.25\n" "POT-Creation-Date: Fri, 14 Nov 2003 09:03:15 +0100\n" "PO-Revision-Date: Fri, 14 Nov 2003 09:03:15 +0100\n" "Last-Translator: Mathieu Roy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: src/wdmLogin/Login.c:70 msgid "no help available." msgstr "" "wdm is a graphical interface used to authenticate a user to the system and " "perform the login process.\n" "\n" "\n" "Enter your user name (userid) at the prompt and press . The panel " "will then present a prompt to enter your password. Enter the password and " "press .\n" "\n" "\n" "The login will then be performed and your window manager started.\n" "\n" "\n" "The Start WM PopUp selection specifies the parameter to pass to Xsession to " "start the window manager.\n" "\n" "\n" "NoChange will start the same window manager the user used for their last " "session.\n" "\n" "\n" "failsafe is a simple xterm session and the other listed options will start " "the indicated (installation specific) window manager.\n" "\n" "\n" "The Options PopUp selection specifies:\n" "\n" " Login - logon to the system\n" "\n" " Reboot - shutdown and reboot the system\n" "\n" " Halt - shutdown the system and halt\n" "\n" " ExitLogin - exit the display manager\n" "\n" "\n" "The installation may require a valid username and password or username=root " "and root's password to perform Reboot, Halt or Exit.\n" "\n" "\n" "NOTE: ExitLogin (or, as it is sometimes refered to: exit) is intended for " "use primarily in wdm testing. It will shut down the x-server but the wdm " "must be terminated by other means. Starting wdm as a detached process will " "result that it will be very difficult to terminate.\n" "\n" "\n" "ExitLogin performs the same operation as ctrl-r does for xdm.\n" "\n" "\n" "1. The StartOver button will erase the current login Information and begin " "the login process again.\n" "\n" "\n" "2. See the man page for additional information on configuring this package. " "There are numerous options for setting the background color or pixmap, the " "LoginPanel logo, the selection of window managers to start, and the login " "verification for Reboot, halt and exit." #: src/wdmLogin/Login.c:114 msgid "Login" msgstr "Ouvrir une session" #: src/wdmLogin/Login.c:114 msgid "Reboot" msgstr "Redémarrer" #: src/wdmLogin/Login.c:114 msgid "Halt" msgstr "Arrêter le système" #: src/wdmLogin/Login.c:115 msgid "ExitLogin" msgstr "" #: src/wdmLogin/Login.c:118 msgid "Login failed" msgstr "Échec de l'ouverture de session" #: src/wdmLogin/Login.c:118 msgid "Reboot failed" msgstr "Échec du redémarrage" #: src/wdmLogin/Login.c:119 msgid "Halt failed" msgstr "Échec de l'arrêt" #: src/wdmLogin/Login.c:119 msgid "ExitLogin failed" msgstr "" #: src/wdmLogin/Login.c:279 msgid "NoChange" msgstr "Habituel" #: src/wdmLogin/Login.c:298 msgid "failsafe" msgstr "Sans échec" #: src/wdmLogin/Login.c:376 msgid "ERROR" msgstr "Erreur" #: src/wdmLogin/Login.c:435 msgid "Password:" msgstr "Mot-de-passe :" #: src/wdmLogin/Login.c:443 src/wdmLogin/Login.c:772 msgid "Login name:" msgstr "Nom d'utilisateur :" #: src/wdmLogin/Login.c:474 msgid "invalid name" msgstr "nom invalide" #: src/wdmLogin/Login.c:496 msgid "validating" msgstr "validation" #: src/wdmLogin/Login.c:498 src/wdmLogin/Login.c:529 msgid "exiting" msgstr "exit" #: src/wdmLogin/Login.c:547 msgid "Close Help" msgstr "Sans aide" #: src/wdmLogin/Login.c:554 src/wdmLogin/Login.c:866 msgid "Help" msgstr "Aide" #: src/wdmLogin/Login.c:720 msgid "Login Authentication" msgstr "Authentification" #: src/wdmLogin/Login.c:729 msgid "Welcome to" msgstr "Bienvenue sur" #: src/wdmLogin/Login.c:816 msgid "Start WM" msgstr "Démarre l'environement" #: src/wdmLogin/Login.c:834 msgid "Options" msgstr "Options" #: src/wdmLogin/Login.c:874 msgid "Start Over" msgstr "Annuler" #: src/wdmLogin/Login.c:881 msgid "Go!" msgstr "Hop !" wdm-1.28/po/ja.po 644 0 0 1026310221265060 132360ustar AlexeyVoinov 0 0# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2003-04-06 00:41+0400\n" "PO-Revision-Date: 2003-02-07 19:59+0300\n" "Last-Translator: Hiroshi Miura \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=euc-jp\n" "Content-Transfer-Encoding: 8bit\n" #: src/wdmLogin/Login.c:79 msgid "no help available." msgstr "" "%s -- Version %s\n" "\n" "\n" "\n" "\n" "%s ¤Ï¥æ¡¼¥¶¤Î¥·¥¹¥Æ¥àǧ¾Ú¤ò¹Ô¤¦¤Î¤ËÍѤ¤¤ë¥°¥é¥Õ¥£¥«¥ë¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¡¢¥í" "¥°\n" "¥¤¥ó½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£\n" "\n" "\n" "\n" "¤¢¤Ê¤¿¤Î¥æ¡¼¥¶Ì¾(userid)¤òÍ󤨯þÎϤ·¡¢¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡£¥Ñ¥Í¥ë¤Ë¤Ï¡¢" "¤¢\n" "¤Ê¤¿¤Î¥Ñ¥¹¥ï¡¼¥É¤òÆþÎϤ¹¤ë¤è¤¦É½¼¨¤µ¤ì¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤òÆþÎϤ·¡¢¤ò²¡" "¤·\n" "¤Æ¤¯¤À¤µ¤¤¡£\n" "\n" "¥í¥°¥¤¥ó¤¬¹Ô¤ï¤ì¡¢¤¢¤Ê¤¿¤ÎÀßÄꤷ¤¿¥¦¥¤¥ó¥É¥¦¥Þ¥Í¡¼¥¸¥ã¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£\n" "\n" "\n" "³«»ÏWM¥Ý¥Ã¥×¥¢¥Ã¥×¤òÁªÂò¤¹¤ë¤³¤È¤Ç¡¢Xsession¤Ø³«»Ï¤¹¤ë¥¦¥¤¥ó¥É¥¦¥Þ¥Í¡¼¥¸¥ã" "¤Î\n" "¥Ñ¥é¥á¡¼¥¿¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\n" "\n" "Êѹ¹¤Ê¤· ¤ÏÁ°²ó¥æ¡¼¥¶¤¬»ÈÍѤ·¤¿¤Î¤ÈƱ¤¸¥¦¥¤¥ó¥É¥¦¥Þ¥Í¡¼¥¸¥ã¤ò³«»Ï¤µ¤»¤Þ¤¹¡£\n" "\n" "¥Õ¥§¥¤¥ë¥»¡¼¥Õ¤Ï¡¢Ã±½ã¤Êxterm¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤·¤Þ¤¹¡£¤Þ¤¿¡¢»Ä¤ê¤Ï(¥¤¥ó¥¹" "¥È¡¼\n" "¥ë»þ¤Ë·è¤Þ¤ë)¤½¤ì¤¾¤ì¤Î¥¦¥¤¥ó¥É¥¦¥Þ¥Í¡¼¥¸¥ã¤ò³«»Ï¤µ¤»¤Þ¤¹¡£\n" "\n" "¥ª¥×¥·¥ç¥ó¥Ý¥Ã¥×¥¢¥Ã¥×¤Ï\n" "\n" " ¥í¥°¥¤¥ó - ¥·¥¹¥Æ¥à¤Ë¥í¥°¥ª¥ó¤·¤Þ¤¹¡£\n" "\n" " ºÆµ¯Æ° - ¥·¥¹¥Æ¥à¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¤È¥ê¥Ö¡¼¥È¤ò¹Ô¤¤¤Þ¤¹¡£\n" "\n" " ½ªÎ» - ¥·¥¹¥Æ¥à¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤·Ää»ß¤·¤Þ¤¹¡£\n" "\n" " ¥í¥°¥¤¥ó½ªÎ» - ¥Ç¥£¥¹¥×¥ì¡¼¥Þ¥Í¡¼¥¸¥ã¤ò½ªÎ»¤·¤Þ¤¹¡£\n" "\n" "\n" "¥¤¥ó¥¹¥È¡¼¥ë¾ò·ï¤Ç¤Ï¡¢ºÆµ¯Æ°¤ä½ªÎ»¡¢¥í¥°¥¤¥ó½ªÎ»¤Î¾ì¹ç¡¢Í­¸ú¤Ê¥æ¡¼¥¶Ì¾¤È¥Ñ" "¥¹\n" "¥ï¡¼¥É¤«¡¢username=root ¤È¥ë¡¼¥È¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£\n" "\n" "\n" "Ãí°Õ: ¥í¥°¥¤¥ó½ªÎ» (¤Þ¤¿¤Ï¡¢»þ¡¹¤Ï½ªÎ»¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¤¬¡Ë¤Ï¡¢°ìµÁŪ¤Ë¤Ïwdm" "¤Î\n" "¥Æ¥¹¥È¤Î¤¿¤á¤Ë½àÈ÷¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤Ï¡¢X¥µ¡¼¥Ð¤òÄä»ß¤·¡¢wdm¤¬°ã¤¦°ÕÌ£¤Ç½ª" "λ\n" "¤·¤Þ¤¹¡£ÆÈΩ¤·¤¿¥×¥í¥»¥¹¤È¤·¤Æwdm¤ò³«»Ï¤¹¤ë¤³¤È¤Ï¡¢½ªÎ»¤µ¤»¤ë¤³¤È¤ò¤È¤Æ¤âÆñ" "¤·\n" "¤¯¤¹¤ë¤«¤é¤À¡£\n" "\n" "\n" "¥í¥°¥¤¥ó½ªÎ»¤Ï¡¢xdm¤Ë¤ª¤±¤ëCtrl-r¤ÈƱ¤¸Áàºî¤òÄ󶡤¹¤ë¡£\n" "\n" "\n" "1. ¤ä¤ê¤Ê¤ª¤·¥Ü¥¿¥ó¤Ï¸½ºß¤Î¥í¥°¥¤¥ó¾ðÊó¤ò¾Ãµî¤·¡¢¥í¥°¥¤¥ó½èÍý¤òºÇ½é¤«¤é¹Ô\n" "¤¦¡£\n" "\n" "\n" "2. ¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤ÎÀßÄê¤Ë¤Ä¤¤¤ÆÄɲäξðÊó¤ò¸«¤¿¤¤¤È¤­¤Ë¤Ï¡¢man¥Ú¡¼¥¸¤ò¸«¤ë" "¤³\n" "¤È¡£¥Ð¥Ã¥¯¥°¥é¥ó¥É¤Î¿§¤äpixmap¡¢LoginPanel ¥í¥´¡¢³«»Ï¤¹¤ë¥¦¥¤¥ó¥É¥¦¥Þ¥Í¡¼" "¥¸¥ã\n" "¤ÎÁªÂò»è¤Î»ØÄê¡¢ºÆµ¯Æ°¡¢½ªÎ»¡¢Ää»ß¤Î¥í¥°¥¤¥óǧ¾Ú¤òÀßÄꤹ¤ë¤è¤¦¤Ê¤¿¤¯¤µ¤ó¤Î" "¥ª\n" "¥×¥·¥ç¥ó¤¬¤¢¤ë¡£" #: src/wdmLogin/Login.c:163 msgid "Login" msgstr "¥í¥°¥¤¥ó" #: src/wdmLogin/Login.c:163 msgid "Reboot" msgstr "¥ê¥Ö¡¼¥È" #: src/wdmLogin/Login.c:163 msgid "Halt" msgstr "½ªÎ»" #: src/wdmLogin/Login.c:164 msgid "ExitLogin" msgstr "¥í¥°¥¤¥ó½ªÎ»" #: src/wdmLogin/Login.c:167 msgid "Login failed" msgstr "¥í¥°¥¤¥ó¼ºÇÔ" #: src/wdmLogin/Login.c:167 msgid "Reboot failed" msgstr "¥ê¥Ö¡¼¥È¼ºÇÔ" #: src/wdmLogin/Login.c:168 msgid "Halt failed" msgstr "½ªÎ»¼ºÇÔ" #: src/wdmLogin/Login.c:168 msgid "ExitLogin failed" msgstr "¥í¥°¥¤¥ó½ªÎ»¼ºÇÔ" #: src/wdmLogin/Login.c:325 msgid "NoChange" msgstr "Êѹ¹¤Ê¤·" #: src/wdmLogin/Login.c:344 msgid "failsafe" msgstr "¥Õ¥§¡¼¥ë¥»¡¼¥Õ" #: src/wdmLogin/Login.c:417 msgid "ERROR" msgstr "¥¨¥é¡¼" #: src/wdmLogin/Login.c:470 msgid "Password:" msgstr "¥Ñ¥¹¥ï¡¼¥É:" #: src/wdmLogin/Login.c:478 src/wdmLogin/Login.c:803 msgid "Login name:" msgstr "¥í¥°¥¤¥ó̾:" #: src/wdmLogin/Login.c:511 msgid "invalid name" msgstr "ÉÔÀµ¤Ê̾Á°" #: src/wdmLogin/Login.c:533 msgid "validating" msgstr "ǧ¾ÚÃæ" #: src/wdmLogin/Login.c:535 src/wdmLogin/Login.c:568 msgid "exiting" msgstr "½ªÎ»¤·¤Þ¤¹" #: src/wdmLogin/Login.c:585 msgid "Close Help" msgstr "¤Ø¥ë¥×¤òÊĤ¸¤ë" #: src/wdmLogin/Login.c:591 src/wdmLogin/Login.c:897 msgid "Help" msgstr "¤Ø¥ë¥×" #: src/wdmLogin/Login.c:751 msgid "Login Authentication" msgstr "¥í¥°¥¤¥óǧ¾ÚÃæ" #: src/wdmLogin/Login.c:760 msgid "Welcome to" msgstr "¤è¤¦¤³¤½" #: src/wdmLogin/Login.c:847 msgid "Start WM" msgstr "WM¥¹¥¿¡¼¥È" #: src/wdmLogin/Login.c:865 msgid "Options" msgstr "¥ª¥×¥·¥ç¥ó" #: src/wdmLogin/Login.c:905 msgid "Start Over" msgstr "¤ä¤ê¤Ê¤ª¤·" #: src/wdmLogin/Login.c:912 msgid "Go!" msgstr "³«»Ï¡ª" wdm-1.28/po/ru.po 644 0 0 757610221265060 132670ustar AlexeyVoinov 0 0msgid "" msgstr "" "Project-Id-Version: wdm 1.23\n" "POT-Creation-Date: 2003-04-06 00:09+0400\n" "PO-Revision-Date: 2003-04-06 23:59+0300\n" "Last-Translator: Grigory Batalov \n" "Language-Team: None\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=KOI8-R\n" "Content-Transfer-Encoding: 8bit\n" #: src/wdmLogin/Login.c:79 msgid "no help available." msgstr "" "wdm - ÜÔÏ ÇÒÁÆÉÞÅÓËÉÊ ÉÎÔÅÒÆÅÊÓ ÄÌÑ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ ÐÏÌØÚÏ×ÁÔÅÌÑ\n" "× ÓÉÓÔÅÍÅ É ×ÙÐÏÌÎÅÎÉÑ ÐÒÏÃÅÓÓÁ ×ÈÏÄÁ × ÓÉÓÔÅÍÕ.\n" "\n" "\n" "õËÁÖÉÔÅ ÉÍÑ ÐÏÌØÚÏ×ÁÔÅÌÑ (ÉÌÉ userid) × ÐÏÌÅ ××ÏÄÁ É ÎÁÖÍÉÔÅ .\n" "îÁ ÐÁÎÅÌÉ ÐÏÑ×ÉÔÓÑ ÐÒÉÇÌÁÛÅÎÉÅ ××ÅÓÔÉ ÐÁÒÏÌØ. îÁÂÅÒÉÔÅ ÐÁÒÏÌØ\n" "É ÎÁÖÍÉÔÅ .\n" "\n" "\n" "âÕÄÅÔ ×ÙÐÏÌÎÅÎ ×ÈÏÄ × ÓÉÓÔÅÍÕ É ÚÁÐÕÝÅÎ ÏËÏÎÎÙÊ ÍÅÎÅÄÖÅÒ.\n" "\n" "\n" "÷ÙÂÏÒ ÉÚ ×ÓÐÌÙ×ÁÀÝÅÇÏ ÓÐÉÓËÁ \"ïËÏÎÎÙÊ ÍÅÎÅÄÖÅÒ\" ÏÐÒÅÄÅÌÑÅÔ\n" "ÐÅÒÅÄÁ×ÁÅÍÙÊ Xsession ÐÁÒÁÍÅÔÒ ÄÌÑ ÚÁÐÕÓËÁ ÏËÏÎÎÏÇÏ ÍÅÎÅÄÖÅÒÁ.\n" "\n" "\n" "\"ôÏÔ ÖÅ\" ÏÚÎÁÞÁÅÔ ÍÅÎÅÄÖÅÒ, ÉÓÐÏÌØÚÏ×ÁÎÎÙÊ × ÐÒÏÛÌÙÊ ÒÁÚ.\n" "\n" "\n" "\"âÅÚÏÐÁÓÎÙÊ\" - ÜÔÏ ÐÒÏÓÔÁÑ xterm-ÓÅÓÓÉÑ; ÏÓÔÁÌØÎÙÅ ÐÅÒÅÞÉÓÌÅÎÎÙÅ\n" "ÚÎÁÞÅÎÉÑ ÏÚÎÁÞÁÀÔ ÚÁÐÕÓË ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÏËÏÎÎÏÇÏ ÍÅÎÅÄÖÅÒÁ\n" "(ÚÁ×ÉÓÉÔ ÏÔ ÎÁÓÔÒÏÅË ÓÉÓÔÅÍÙ).\n" "\n" "\n" "÷ÙÂÏÒ ÉÚ ÓÐÉÓËÁ \"äÅÊÓÔ×ÉÑ\" ÏÐÒÅÄÅÌÑÅÔ:\n" "\n" " ÷ÏÊÔÉ - ×ÏÊÔÉ × ÓÉÓÔÅÍÕ\n" "\n" " ðÅÒÅÚÁÇÒÕÚÉÔØ - ÏÓÔÁÎÏ×ÉÔØ É ÐÅÒÅÚÁÇÒÕÚÉÔØ ÓÉÓÔÅÍÕ\n" "\n" " ÷ÙËÌÀÞÉÔØ - ÏÓÔÁÎÏ×ÉÔØ ÓÉÓÔÅÍÕ É ×ÙËÌÀÞÉÔØ\n" "\n" " ÷ÙÊÔÉ - ÐÏËÉÎÕÔØ ÐÒÏÇÒÁÍÍÕ\n" "\n" "\n" "óÉÓÔÅÍÁ ÍÏÖÅÔ ÐÏÔÒÅÂÏ×ÁÔØ ÓÕÝÅÓÔ×ÕÀÝÅÅ ÉÍÑ É ÐÁÒÏÌØ ÉÌÉ ÐÁÒÏÌØ\n" "root-Á ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ ÐÅÒÅÚÁÇÒÕÚËÉ, ×ÙËÌÀÞÅÎÉÑ ÉÌÉ ×ÙÈÏÄÁ.\n" "\n" "\n" "ðÒÉÍÅÞÁÎÉÅ: ÐÕÎËÔ \"÷ÙÊÔÉ\" (ÉÌÉ \"×ÙÈÏÄ\") ÐÒÅÄÎÁÚÎÁÞÅÎ\n" "ÐÒÅÉÍÕÝÅÓÔ×ÅÎÎÏ ÄÌÑ ÔÅÓÔÉÒÏ×ÁÎÉÑ wdm. ïÎ ÏÔËÌÀÞÁÅÔ X-ÓÅÒ×ÅÒ,\n" "wdm ÄÏÌÖÅÎ ÂÙÔØ ÏÓÔÁÎÏ×ÌÅÎ ÄÒÕÇÉÍ ÓÐÏÓÏÂÏÍ. úÁÐÕÓË wdm ÏÔÄÅÌØÎÙÍ\n" "ÐÒÏÃÅÓÓÏÍ ÞÒÅ×ÁÔ ÔÅÍ, ÞÔÏ ÅÇÏ ÐÏÔÏÍ ÔÒÕÄÎÏ ÏÓÔÁÎÏ×ÉÔØ.\n" "\n" "\n" "\"÷ÙÈÏÄ\" ×ÙÐÏÌÎÑÅÔ ÔÕ ÖÅ ÏÐÅÒÁÃÉÀ, ÞÔÏ É ctrl-r × xdm.\n" "\n" "\n" "1. ëÎÏÐËÁ \"óÔÅÒÅÔØ\" ÕÄÁÌÑÅÔ ÔÅËÕÝÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÐÏÌØÚÏ×ÁÔÅÌÅ\n" "É ÎÁÞÉÎÁÅÔ ÐÒÏÃÅÓÓ ÒÅÇÉÓÔÒÁÃÉÉ ÚÁÎÏ×Ï.\n" "\n" "\n" "2. äÌÑ ÄÏÐÏÌÎÉÔÅÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ Ï ÎÁÓÔÒÏÊËÁÈ ÓÍÏÔÒÉÔÅ ÒÕËÏ×ÏÄÓÔ×Ï\n" "(man wdm). éÍÅÀÔÓÑ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ× ÄÌÑ ÕÓÔÁÎÏ×ËÉ Ã×ÅÔÁ ÉÌÉ\n" "ÒÉÓÕÎËÁ ÆÏÎÁ, ÚÁÓÔÁ×ËÉ ÐÁÎÅÌÉ, ×ÙÂÏÒÁ ÏËÏÎÎÏÇÏ ÍÅÎÅÄÖÅÒÁ É ÐÒÏ×ÅÒËÉ\n" "ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÅÒÅÄ ÐÅÒÅÚÁÇÒÕÚËÏÊ, ×ÙËÌÀÞÅÎÉÅÍ É ×ÙÈÏÄÏÍ." #: src/wdmLogin/Login.c:163 msgid "Login" msgstr "÷ÈÏÄ" #: src/wdmLogin/Login.c:163 msgid "Reboot" msgstr "ðÅÒÅÚÁÐÕÓË" #: src/wdmLogin/Login.c:163 msgid "Halt" msgstr "÷ÙËÌÀÞÅÎÉÅ" #: src/wdmLogin/Login.c:164 msgid "ExitLogin" msgstr "÷ÙÈÏÄ" #: src/wdmLogin/Login.c:167 msgid "Login failed" msgstr "÷ÏÊÔÉ ÎÅ ÕÄÁÌÏÓØ" #: src/wdmLogin/Login.c:167 msgid "Reboot failed" msgstr "ïÛÉÂËÁ ÐÅÒÅÚÁÐÕÓËÁ" #: src/wdmLogin/Login.c:168 msgid "Halt failed" msgstr "ïÛÉÂËÁ ×ÙËÌÀÞÅÎÉÑ" #: src/wdmLogin/Login.c:168 msgid "ExitLogin failed" msgstr "÷ÙÊÔÉ ÎÅ ÕÄÁÌÏÓØ" #: src/wdmLogin/Login.c:325 msgid "NoChange" msgstr "ôÏÔ ÖÅ" #: src/wdmLogin/Login.c:344 msgid "failsafe" msgstr "ÂÅÚÏÐÁÓÎÙÊ" #: src/wdmLogin/Login.c:417 msgid "ERROR" msgstr "ïûéâëá" #: src/wdmLogin/Login.c:470 msgid "Password:" msgstr "ðÁÒÏÌØ:" #: src/wdmLogin/Login.c:478 src/wdmLogin/Login.c:803 msgid "Login name:" msgstr "éÍÑ:" #: src/wdmLogin/Login.c:511 msgid "invalid name" msgstr "ÐÌÏÈÏÅ ÉÍÑ" #: src/wdmLogin/Login.c:533 msgid "validating" msgstr "ÐÒÏ×ÅÒËÁ" #: src/wdmLogin/Login.c:535 src/wdmLogin/Login.c:568 msgid "exiting" msgstr "×ÙÈÏÄ" #: src/wdmLogin/Login.c:585 msgid "Close Help" msgstr "õÂÒÁÔØ" #: src/wdmLogin/Login.c:591 src/wdmLogin/Login.c:897 msgid "Help" msgstr "ðÏÍÏÝØ" #: src/wdmLogin/Login.c:751 msgid "Login Authentication" msgstr "ðÒÏ×ÅÒËÁ ÐÁÒÏÌÑ" #: src/wdmLogin/Login.c:760 msgid "Welcome to" msgstr "äÏÂÒÏ ÐÏÖÁÌÏ×ÁÔØ ÎÁ" #: src/wdmLogin/Login.c:847 msgid "Start WM" msgstr "ïËÏÎÎÙÊ ÍÅÎÅÄÖÅÒ" #: src/wdmLogin/Login.c:865 msgid "Options" msgstr "äÅÊÓÔ×ÉÑ" #: src/wdmLogin/Login.c:905 msgid "Start Over" msgstr "óÔÅÒÅÔØ" #: src/wdmLogin/Login.c:912 msgid "Go!" msgstr "÷ÐÅÒ£Ä!" wdm-1.28/src/TestLogin/TestLogin.c 644 0 0 2301610221265060 164410ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * Copyright (C) 1998 Gene Czarcinski * * 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 * * TestLogin.c: simple test for wdmLogin program */ /* * This is a simple test program to test the interface to * the external Login program rather than doing the whole * xdm thing. This program is part of the Gdm package but * is NOT an installed program -- it is only used in development * and testing of "new" external Login programs. * * This program implements the external interface of * Gdm-greet.c * * The interface to the external Login is based on (and some code * munged from) the "xdm-extgreet" package * Copyright 1998 by Tom Rothamel. * * Gene Czarcinski, August, 1998. * ************************************************************************ * The interface protocol: * * A) xdm -> Login * 1. SIGTERM to terminate sucessfully * 2. SIGUSR1 to indicate failure; retry * 3. "variables" which are needed by Login * are passes as command-line arguments (that is, * as argc, *argv[]). This has been used to make * it simple for Login. The values to be passed * can be set as Xresources * * B) xdm <- Login ... This is performed via a pipe with * xdm/greet doing reads and Login doing writes. The * stream of bytes follows the following protocol: * 1. A String is defined as a one byte length field * followed by a string of non-zero bytes. * 2. Transmission is ended with a single byte * with a zero value. * 3. Two strings are first transmitted which are * the username and password. * 4. This is followed by an extension byte. The following * extension codes are supported: * 0 - end of data (not really an extension code) * 1 - xsession parameter (original) * 2 - reboot (added) - shutdown -r now * 3 - halt (added) - shutdown -h now * 4 - exit (added) - exit Gdm/xdm * 5. The extension byte is followed by a string. * 6. The string is follwed by another extension byte * or a zero to indicate end-of-data. Normally, there * will be only one non-zero extension code but * the protocol does not limit this. * ************************************************************************* * The above protocol was defined by Tom Rothamel. Additions include * extension codes other than 0 or 1, and passing args to Login. */ #include #include #include #include #include #include #include #include #define forever 1 extern char **environ; /* some testing data */ static char LoginName[] = "gene"; /* any other user is not defined */ static char LoginPswd[] = "Testing"; static char *ExternalLogin = NULL; static char *ExternalName = NULL; /* this needs to be defined for the read routes */ void read_error(char *msg) { WDMPanic("Pipe I/O Testing error: %s\n", msg); } /* This file is Copyright 1998 Tom Rothamel. It's under the Gnu Public * * license, see the file COPYING for details. */ void guaranteed_read(int fd, char *buf, size_t count) { int bytes_read; if (count == 0) { return; } while((bytes_read = read(fd, buf, count))>0) { count -= bytes_read; buf += bytes_read; if (count == 0) { return; } } read_error("guaranteed_read failed."); } unsigned char readuc(int fd) { unsigned char uc; guaranteed_read(fd, (char *)&uc, sizeof(unsigned char)); return uc; } char *readstring(int fd) { int len; char *buf; len = (int) readuc(fd); buf = malloc(len + 1); if(!buf) read_error("malloc of string failed."); guaranteed_read(fd, buf, len); buf[len] = 0; return buf; } /* the simple test routine */ int main (int argc, char *argv[]) { int pid, filedescriptor[2], extcode=0, notdone = 0, i; char *username, *userpswd, *xsession=NULL, *exitstr=NULL; char **nargv; #if 0 FILE *f; if((f = fopen("TestLogin.log", "w")) == NULL) WDMPanic("cannot open log file"); WDMLogStream(f); #endif #if 0 WDMUseSysLog("TestLogin", LOG_USER); #endif #if 1 WDMLogLevel(WDM_LEVEL_DEBUG); #endif if (argc < 2) WDMPanic("oops -- need pgm to exec as first arg\n"); ExternalLogin = argv[1]; ExternalName = strrchr(ExternalLogin,'/'); if (ExternalName==NULL) ExternalName = ExternalLogin; else ExternalName++; WDMDebug("External Name: %s\n",ExternalName); WDMInfo("Testing: %s\n",ExternalLogin); pipe(filedescriptor); pid = fork(); switch(pid) { case -1: WDMPanic("Cannot fork for external process\n"); break; case 0: /* this is the child process */ close(filedescriptor[0]); fcntl(filedescriptor[1], F_SETFD, 0); /*unset close-on-exec */ nargv = wmalloc(sizeof(char*) * (argc + 1)); memcpy(nargv, argv + 1, sizeof(char*) * (argc - 1)); nargv[argc - 1] = wmalloc(25); sprintf(nargv[argc - 1], "-f%i", filedescriptor[1]); nargv[argc] = NULL; execve(ExternalLogin, nargv, environ); WDMPanic("Cannot exec %s\n", ExternalLogin); break; } WDMDebug("Continuing, child=%i\n",pid); close (filedescriptor[1]); /* Just need reading on our side */ while (forever) { username = readstring(filedescriptor[0]); WDMInfo("Got username: %s\n", username); userpswd = readstring(filedescriptor[0]); WDMInfo("Got userpswd: %s\n", userpswd); notdone = 1; while (notdone) { i = readuc(filedescriptor[0]); switch (i) { case 0: notdone=0; break; case 1: if (xsession) free(xsession); xsession = readstring(filedescriptor[0]); extcode = 1; break; case 2: if (exitstr) free(exitstr); exitstr = readstring(filedescriptor[0]); WDMInfo("2=reboot: %s\n", exitstr); extcode = 2; break; case 3: if (exitstr) free(exitstr); exitstr = readstring(filedescriptor[0]); WDMInfo("3=halt: %s\n", exitstr); extcode = 3; break; case 4: if (exitstr) free(exitstr); exitstr = readstring(filedescriptor[0]); WDMInfo("4=exit: %s\n", exitstr); extcode = 4; break; default: WDMWarning("bad extension code %i\n",i); /* keep reading here, greet should abort */ break; } } if (xsession) { WDMInfo("xsession=%s\n", xsession); free(xsession); xsession=NULL; } if (exitstr) { WDMInfo("exitstr=%s\n", exitstr); free(exitstr); exitstr=NULL; } /* testing insists on a good username/pswd to terminate */ if (((strcmp(username,LoginName)==0) && (strcmp(userpswd,LoginPswd)==0)) || (extcode==4)) { WDMInfo("success! Now terminate and exit\n"); wusleep(1000000); kill(pid, SIGTERM); break; /* get out of forever loop */ } WDMError(" bad name or password; go around again\n"); wusleep(1000000); kill(pid, SIGUSR1); free(username); free(userpswd); } WDMInfo("All Done, exiting\n"); return 0; } wdm-1.28/src/chooser.c 644 0 0 6342310221265060 142710ustar AlexeyVoinov 0 0/* * $Xorg: chooser.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ * Copyright 1990, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Keith Packard, MIT X Consortium */ /* $XFree86: xc/programs/xdm/chooser.c,v 3.24 2001/12/14 20:01:20 dawes Exp $ */ /* * Chooser - display a menu of names and let the user select one */ /* * Layout: * * +--------------------------------------------------+ * | +------------------+ | * | | Label | | * | +------------------+ | * | +-+--------------+ | * | |^| name-1 | | * | ||| name-2 | | * | |v| name-3 | | * | | | name-4 | | * | | | name-5 | | * | | | name-6 | | * | +----------------+ | * | cancel accept ping | * +--------------------------------------------------+ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef USE_XINERAMA #include #endif #if defined(SVR4) && !defined(SCO325) #include #endif #if defined(SVR4) && defined(PowerMAX_OS) #include #endif #if defined(SYSV) && defined(i386) #include #ifdef ISC #include #include #endif #endif #include #include #include #ifdef CSRG_BASED #include #if (BSD >= 199103) #define VARIABLE_IFREQ #endif #endif #ifdef XKB #include #endif #define BROADCAST_HOSTNAME "BROADCAST" #ifndef ishexdigit #define ishexdigit(c) (isdigit(c) || ('a' <= (c) && (c) <= 'f')) #endif #ifdef hpux # include # ifdef HAS_IFREQ # include # endif #else #ifdef __convex__ # include # include #endif #ifndef __GNU__ # include #endif /* __GNU__ */ #endif /* hpux */ #include static int FromHex (char *s, char *d, int len); Widget toplevel, label, viewport, paned, list, box, cancel, acceptit, ping; static void CvtStringToARRAY8( XrmValuePtr args, Cardinal *num_args, XrmValuePtr fromVal, XrmValuePtr toVal); static struct _app_resources { ARRAY8Ptr xdmAddress; ARRAY8Ptr clientAddress; int connectionType; } app_resources; #define offset(field) XtOffsetOf(struct _app_resources, field) #define XtRARRAY8 "ARRAY8" static XtResource resources[] = { {"xdmAddress", "XdmAddress", XtRARRAY8, sizeof (ARRAY8Ptr), offset (xdmAddress), XtRString, NULL }, {"clientAddress", "ClientAddress", XtRARRAY8, sizeof (ARRAY8Ptr), offset (clientAddress), XtRString, NULL }, {"connectionType", "ConnectionType", XtRInt, sizeof (int), offset (connectionType), XtRImmediate, (XtPointer) 0 } }; #undef offset static XrmOptionDescRec options[] = { { "-xdmaddress", "*xdmAddress", XrmoptionSepArg, NULL }, { "-clientaddress", "*clientAddress", XrmoptionSepArg, NULL }, { "-connectionType","*connectionType", XrmoptionSepArg, NULL }, }; typedef struct _hostAddr { struct _hostAddr *next; struct sockaddr *addr; int addrlen; xdmOpCode type; } HostAddr; static HostAddr *hostAddrdb; typedef struct _hostName { struct _hostName *next; char *fullname; int willing; ARRAY8 hostname, status; CARD16 connectionType; ARRAY8 hostaddr; } HostName; static HostName *hostNamedb; static int socketFD; static int pingTry; #define PING_INTERVAL 2000 #define TRIES 3 static XdmcpBuffer directBuffer, broadcastBuffer; static XdmcpBuffer buffer; #if ((defined(SVR4) && !defined(sun) && !defined(__sgi) && !defined(NCR)) || defined(ISC)) && defined(SIOCGIFCONF) /* Deal with different SIOCGIFCONF ioctl semantics on these OSs */ static int ifioctl (int fd, int cmd, char *arg) { struct strioctl ioc; int ret; bzero((char *) &ioc, sizeof(ioc)); ioc.ic_cmd = cmd; ioc.ic_timout = 0; if (cmd == SIOCGIFCONF) { ioc.ic_len = ((struct ifconf *) arg)->ifc_len; ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf; #ifdef ISC /* SIOCGIFCONF is somewhat brain damaged on ISC. The argument * buffer must contain the ifconf structure as header. Ifc_req * is also not a pointer but a one element array of ifreq * structures. On return this array is extended by enough * ifreq fields to hold all interfaces. The return buffer length * is placed in the buffer header. */ ((struct ifconf *) ioc.ic_dp)->ifc_len = ioc.ic_len - sizeof(struct ifconf); #endif } else { ioc.ic_len = sizeof(struct ifreq); ioc.ic_dp = arg; } ret = ioctl(fd, I_STR, (char *) &ioc); if (ret >= 0 && cmd == SIOCGIFCONF) #ifdef SVR4 ((struct ifconf *) arg)->ifc_len = ioc.ic_len; #endif #ifdef ISC { ((struct ifconf *) arg)->ifc_len = ((struct ifconf *)ioc.ic_dp)->ifc_len; ((struct ifconf *) arg)->ifc_buf = (caddr_t)((struct ifconf *)ioc.ic_dp)->ifc_req; } #endif return(ret); } #else /* ((SVR4 && !sun && !NCR) || ISC) && SIOCGIFCONF */ #define ifioctl ioctl #endif /* ((SVR4 && !sun) || ISC) && SIOCGIFCONF */ /* ARGSUSED */ static void PingHosts (XtPointer closure, XtIntervalId *id) { HostAddr *hosts; for (hosts = hostAddrdb; hosts; hosts = hosts->next) { if (hosts->type == QUERY) XdmcpFlush (socketFD, &directBuffer, (XdmcpNetaddr) hosts->addr, hosts->addrlen); else XdmcpFlush (socketFD, &broadcastBuffer, (XdmcpNetaddr) hosts->addr, hosts->addrlen); } if (++pingTry < TRIES) XtAddTimeOut (PING_INTERVAL, PingHosts, (XtPointer) 0); } char **NameTable; int NameTableSize; static int HostnameCompare (const void *a, const void *b) { return strcmp (*(char **)a, *(char **)b); } static void RebuildTable (int size) { char **newTable = 0; HostName *names; int i; if (size) { newTable = (char **) malloc (size * sizeof (char *)); if (!newTable) return; for (names = hostNamedb, i = 0; names; names = names->next, i++) newTable[i] = names->fullname; qsort (newTable, size, sizeof (char *), HostnameCompare); } XawListChange (list, newTable, size, 0, TRUE); if (NameTable) free ((char *) NameTable); NameTable = newTable; NameTableSize = size; } static int AddHostname (ARRAY8Ptr hostname, ARRAY8Ptr status, struct sockaddr *addr, int willing) { HostName *new, **names, *name; ARRAY8 hostAddr; CARD16 connectionType; int fulllen; switch (addr->sa_family) { case AF_INET: hostAddr.data = (CARD8 *) &((struct sockaddr_in *) addr)->sin_addr; hostAddr.length = 4; connectionType = FamilyInternet; break; default: hostAddr.data = (CARD8 *) ""; hostAddr.length = 0; connectionType = FamilyLocal; break; } for (names = &hostNamedb; *names; names = & (*names)->next) { name = *names; if (connectionType == name->connectionType && XdmcpARRAY8Equal (&hostAddr, &name->hostaddr)) { if (XdmcpARRAY8Equal (status, &name->status)) { return 0; } break; } } if (!*names) { new = (HostName *) malloc (sizeof (HostName)); if (!new) return 0; if (hostname->length) { switch (addr->sa_family) { case AF_INET: { struct hostent *hostent; char *host; hostent = gethostbyaddr ((char *)hostAddr.data, hostAddr.length, AF_INET); if (hostent) { XdmcpDisposeARRAY8 (hostname); host = (char *)hostent->h_name; XdmcpAllocARRAY8 (hostname, strlen (host)); memmove( hostname->data, host, hostname->length); } } } } if (!XdmcpAllocARRAY8 (&new->hostaddr, hostAddr.length)) { free ((char *) new->fullname); free ((char *) new); return 0; } memmove( new->hostaddr.data, hostAddr.data, hostAddr.length); new->connectionType = connectionType; new->hostname = *hostname; *names = new; new->next = 0; NameTableSize++; } else { new = *names; free (new->fullname); XdmcpDisposeARRAY8 (&new->status); XdmcpDisposeARRAY8 (hostname); } new->willing = willing; new->status = *status; hostname = &new->hostname; fulllen = hostname->length; if (fulllen < 30) fulllen = 30; new->fullname = malloc (fulllen + status->length + 10); if (!new->fullname) { new->fullname = "Unknown"; } else { sprintf (new->fullname, "%-30.*s %*.*s", hostname->length, hostname->data, status->length, status->length, status->data); } RebuildTable (NameTableSize); return 1; } static void DisposeHostname (HostName *host) { XdmcpDisposeARRAY8 (&host->hostname); XdmcpDisposeARRAY8 (&host->hostaddr); XdmcpDisposeARRAY8 (&host->status); free ((char *) host->fullname); free ((char *) host); } #if 0 static void RemoveHostname (HostName *host) { HostName **prev, *hosts; prev = &hostNamedb;; for (hosts = hostNamedb; hosts; hosts = hosts->next) { if (hosts == host) break; prev = &hosts->next; } if (!hosts) return; *prev = host->next; DisposeHostname (host); NameTableSize--; RebuildTable (NameTableSize); } #endif static void EmptyHostnames (void) { HostName *hosts, *next; for (hosts = hostNamedb; hosts; hosts = next) { next = hosts->next; DisposeHostname (hosts); } NameTableSize = 0; hostNamedb = 0; RebuildTable (NameTableSize); } /* ARGSUSED */ static void ReceivePacket (XtPointer closure, int *source, XtInputId *id) { XdmcpHeader header; ARRAY8 authenticationName; ARRAY8 hostname; ARRAY8 status; int saveHostname = 0; struct sockaddr addr; int addrlen; addrlen = sizeof (addr); if (!XdmcpFill (socketFD, &buffer, (XdmcpNetaddr) &addr, &addrlen)) return; if (!XdmcpReadHeader (&buffer, &header)) return; if (header.version != XDM_PROTOCOL_VERSION) return; hostname.data = 0; status.data = 0; authenticationName.data = 0; switch (header.opcode) { case WILLING: if (XdmcpReadARRAY8 (&buffer, &authenticationName) && XdmcpReadARRAY8 (&buffer, &hostname) && XdmcpReadARRAY8 (&buffer, &status)) { if (header.length == 6 + authenticationName.length + hostname.length + status.length) { if (AddHostname (&hostname, &status, &addr, header.opcode == (int) WILLING)) saveHostname = 1; } } XdmcpDisposeARRAY8 (&authenticationName); break; case UNWILLING: if (XdmcpReadARRAY8 (&buffer, &hostname) && XdmcpReadARRAY8 (&buffer, &status)) { if (header.length == 4 + hostname.length + status.length) { if (AddHostname (&hostname, &status, &addr, header.opcode == (int) WILLING)) saveHostname = 1; } } break; default: break; } if (!saveHostname) { XdmcpDisposeARRAY8 (&hostname); XdmcpDisposeARRAY8 (&status); } } static void RegisterHostaddr (struct sockaddr *addr, int len, xdmOpCode type) { HostAddr *host, **prev; host = (HostAddr *) malloc (sizeof (HostAddr)); if (!host) return; host->addr = (struct sockaddr *) malloc (len); if (!host->addr) { free ((char *) host); return; } memmove( (char *) host->addr, (char *) addr, len); host->addrlen = len; host->type = type; for (prev = &hostAddrdb; *prev; prev = &(*prev)->next) ; *prev = host; host->next = NULL; } /* * Register the address for this host. * Called with each of the names on the command line. * The special name "BROADCAST" looks up all the broadcast * addresses on the local host. */ #if !defined(__GNU__) /* Handle variable length ifreq in BNR2 and later */ #ifdef VARIABLE_IFREQ #define ifr_size(p) (sizeof (struct ifreq) + \ (p->ifr_addr.sa_len > sizeof (p->ifr_addr) ? \ p->ifr_addr.sa_len - sizeof (p->ifr_addr) : 0)) #else #define ifr_size(p) (sizeof (struct ifreq)) #endif static void RegisterHostname (char *name) { struct hostent *hostent; struct sockaddr_in in_addr; struct ifconf ifc; register struct ifreq *ifr; struct sockaddr broad_addr; char buf[2048], *cp, *cplim; if (!strcmp (name, BROADCAST_HOSTNAME)) { #ifdef WINTCP /* NCR with Wollongong TCP */ int ipfd; struct ifconf *ifcp; struct strioctl ioc; int n; ifcp = (struct ifconf *)buf; ifcp->ifc_buf = buf+4; ifcp->ifc_len = sizeof (buf) - 4; if ((ipfd=open( "/dev/ip", O_RDONLY )) < 0 ) { t_error( "RegisterHostname() t_open(/dev/ip) failed" ); return; } ioc.ic_cmd = IPIOC_GETIFCONF; ioc.ic_timout = 60; ioc.ic_len = sizeof( buf ); ioc.ic_dp = (char *)ifcp; if (ioctl (ipfd, (int) I_STR, (char *) &ioc) < 0) { perror( "RegisterHostname() ioctl(I_STR(IPIOC_GETIFCONF)) failed" ); close( ipfd ); return; } for (ifr = ifcp->ifc_req, n = ifcp->ifc_len / sizeof (struct ifreq); --n >= 0; ifr++) #else /* WINTCP */ ifc.ifc_len = sizeof (buf); ifc.ifc_buf = buf; if (ifioctl (socketFD, (int) SIOCGIFCONF, (char *) &ifc) < 0) return; #ifdef ISC #define IFC_IFC_REQ (struct ifreq *) ifc.ifc_buf #else #define IFC_IFC_REQ ifc.ifc_req #endif cplim = (char *) IFC_IFC_REQ + ifc.ifc_len; for (cp = (char *) IFC_IFC_REQ; cp < cplim; cp += ifr_size (ifr)) #endif /* WINTCP */ { #ifndef WINTCP ifr = (struct ifreq *) cp; #endif if (ifr->ifr_addr.sa_family != AF_INET) continue; broad_addr = ifr->ifr_addr; ((struct sockaddr_in *) &broad_addr)->sin_addr.s_addr = htonl (INADDR_BROADCAST); #ifdef SIOCGIFBRDADDR { struct ifreq broad_req; broad_req = *ifr; #ifdef WINTCP /* NCR with Wollongong TCP */ ioc.ic_cmd = IPIOC_GETIFFLAGS; ioc.ic_timout = 0; ioc.ic_len = sizeof( broad_req ); ioc.ic_dp = (char *)&broad_req; if (ioctl (ipfd, I_STR, (char *) &ioc) != -1 && #else /* WINTCP */ if (ifioctl (socketFD, SIOCGIFFLAGS, (char *) &broad_req) != -1 && #endif /* WINTCP */ (broad_req.ifr_flags & IFF_BROADCAST) && (broad_req.ifr_flags & IFF_UP) ) { broad_req = *ifr; #ifdef WINTCP /* NCR with Wollongong TCP */ ioc.ic_cmd = IPIOC_GETIFBRDADDR; ioc.ic_timout = 0; ioc.ic_len = sizeof( broad_req ); ioc.ic_dp = (char *)&broad_req; if (ioctl (ipfd, I_STR, (char *) &ioc) != -1) #else /* WINTCP */ if (ifioctl (socketFD, SIOCGIFBRDADDR, &broad_req) != -1) #endif /* WINTCP */ broad_addr = broad_req.ifr_addr; else continue; } else continue; } #endif in_addr = *((struct sockaddr_in *) &broad_addr); in_addr.sin_port = htons (XDM_UDP_PORT); #ifdef BSD44SOCKETS in_addr.sin_len = sizeof(in_addr); #endif RegisterHostaddr ((struct sockaddr *)&in_addr, sizeof (in_addr), BROADCAST_QUERY); } } else { /* address as hex string, e.g., "12180022" (depreciated) */ if (strlen(name) == 8 && FromHex(name, (char *)&in_addr.sin_addr, strlen(name)) == 0) { in_addr.sin_family = AF_INET; } /* Per RFC 1123, check first for IP address in dotted-decimal form */ else if ((in_addr.sin_addr.s_addr = inet_addr(name)) != -1) in_addr.sin_family = AF_INET; else { hostent = gethostbyname (name); if (!hostent) return; if (hostent->h_addrtype != AF_INET || hostent->h_length != 4) return; in_addr.sin_family = hostent->h_addrtype; memmove( &in_addr.sin_addr, hostent->h_addr, 4); } in_addr.sin_port = htons (XDM_UDP_PORT); #ifdef BSD44SOCKETS in_addr.sin_len = sizeof(in_addr); #endif RegisterHostaddr ((struct sockaddr *)&in_addr, sizeof (in_addr), QUERY); } } #else /* __GNU__ */ static void RegisterHostname (char *name) { struct hostent *hostent; struct sockaddr_in in_addr; if (!strcmp (name, BROADCAST_HOSTNAME)) { in_addr.sin_addr.s_addr= htonl(0xFFFFFFFF); in_addr.sin_port = htons (XDM_UDP_PORT); RegisterHostaddr ((struct sockaddr *)&in_addr, sizeof (in_addr), BROADCAST_QUERY); } else { /* address as hex string, e.g., "12180022" (depreciated) */ if (strlen(name) == 8 && FromHex(name, (char *)&in_addr.sin_addr, strlen(name)) == 0) { in_addr.sin_family = AF_INET; } /* Per RFC 1123, check first for IP address in dotted-decimal form */ else if ((in_addr.sin_addr.s_addr = inet_addr(name)) != -1) in_addr.sin_family = AF_INET; else { hostent = gethostbyname (name); if (!hostent) return; if (hostent->h_addrtype != AF_INET || hostent->h_length != 4) return; in_addr.sin_family = hostent->h_addrtype; memmove( &in_addr.sin_addr, hostent->h_addr, 4); } in_addr.sin_port = htons (XDM_UDP_PORT); RegisterHostaddr ((struct sockaddr *)&in_addr, sizeof (in_addr), QUERY); } } #endif /* __GNU__ */ static ARRAYofARRAY8 AuthenticationNames; #if 0 static void RegisterAuthenticationName (char *name, int namelen) { ARRAY8Ptr authName; if (!XdmcpReallocARRAYofARRAY8 (&AuthenticationNames, AuthenticationNames.length + 1)) return; authName = &AuthenticationNames.data[AuthenticationNames.length-1]; if (!XdmcpAllocARRAY8 (authName, namelen)) return; memmove( authName->data, name, namelen); } #endif static int InitXDMCP (char **argv) { int soopts = 1; XdmcpHeader header; int i; header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) BROADCAST_QUERY; header.length = 1; for (i = 0; i < (int)AuthenticationNames.length; i++) header.length += 2 + AuthenticationNames.data[i].length; XdmcpWriteHeader (&broadcastBuffer, &header); XdmcpWriteARRAYofARRAY8 (&broadcastBuffer, &AuthenticationNames); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) QUERY; header.length = 1; for (i = 0; i < (int)AuthenticationNames.length; i++) header.length += 2 + AuthenticationNames.data[i].length; XdmcpWriteHeader (&directBuffer, &header); XdmcpWriteARRAYofARRAY8 (&directBuffer, &AuthenticationNames); if ((socketFD = socket (AF_INET, SOCK_DGRAM, 0)) < 0) return 0; #ifdef SO_BROADCAST soopts = 1; if (setsockopt (socketFD, SOL_SOCKET, SO_BROADCAST, (char *)&soopts, sizeof (soopts)) < 0) perror ("setsockopt"); #endif XtAddInput (socketFD, (XtPointer) XtInputReadMask, ReceivePacket, (XtPointer) 0); while (*argv) { RegisterHostname (*argv); ++argv; } pingTry = 0; PingHosts ((XtPointer)NULL, (XtIntervalId *)NULL); return 1; } static void Choose (HostName *h) { if (app_resources.xdmAddress) { struct sockaddr_in in_addr; struct sockaddr *addr = NULL; int family; int len = 0; int fd; char buf[1024]; XdmcpBuffer buffer; char *xdm; xdm = (char *) app_resources.xdmAddress->data; family = (xdm[0] << 8) + xdm[1]; switch (family) { case AF_INET: #ifdef BSD44SOCKETS in_addr.sin_len = sizeof(in_addr); #endif in_addr.sin_family = family; memmove( &in_addr.sin_port, xdm + 2, 2); memmove( &in_addr.sin_addr, xdm + 4, 4); addr = (struct sockaddr *) &in_addr; len = sizeof (in_addr); break; } if ((fd = socket (family, SOCK_STREAM, 0)) == -1) { fprintf (stderr, "Cannot create response socket\n"); exit (REMANAGE_DISPLAY); } if (connect (fd, addr, len) == -1) { fprintf (stderr, "Cannot connect to xdm\n"); exit (REMANAGE_DISPLAY); } buffer.data = (BYTE *) buf; buffer.size = sizeof (buf); buffer.pointer = 0; buffer.count = 0; XdmcpWriteARRAY8 (&buffer, app_resources.clientAddress); XdmcpWriteCARD16 (&buffer, (CARD16) app_resources.connectionType); XdmcpWriteARRAY8 (&buffer, &h->hostaddr); write (fd, (char *)buffer.data, buffer.pointer); close (fd); } else { int i; printf ("%u\n", h->connectionType); for (i = 0; i < (int)h->hostaddr.length; i++) printf ("%u%s", h->hostaddr.data[i], i == h->hostaddr.length - 1 ? "\n" : " "); } } /* ARGSUSED */ static void DoAccept (Widget w, XEvent *event, String *params, Cardinal *num_params) { XawListReturnStruct *r; HostName *h; r = XawListShowCurrent (list); if (r->list_index == XAW_LIST_NONE) #ifdef XKB XkbStdBell(XtDisplay(toplevel),XtWindow(w),0,XkbBI_MinorError); #else XBell (XtDisplay (toplevel), 0); #endif else { for (h = hostNamedb; h; h = h->next) if (!strcmp (r->string, h->fullname)) { Choose (h); } exit (OBEYSESS_DISPLAY); } } /* ARGSUSED */ static void DoCheckWilling (Widget w, XEvent *event, String *params, Cardinal *num_params) { XawListReturnStruct *r; HostName *h; r = XawListShowCurrent (list); if (r->list_index == XAW_LIST_NONE) return; for (h = hostNamedb; h; h = h->next) if (!strcmp (r->string, h->fullname)) if (!h->willing) XawListUnhighlight (list); } /* ARGSUSED */ static void DoCancel (Widget w, XEvent *event, String *params, Cardinal *num_params) { exit (OBEYSESS_DISPLAY); } /* ARGSUSED */ static void DoPing (Widget w, XEvent *event, String *params, Cardinal *num_params) { EmptyHostnames (); pingTry = 0; PingHosts ((XtPointer)NULL, (XtIntervalId *)NULL); } static XtActionsRec app_actions[] = { { "Accept", DoAccept }, { "Cancel", DoCancel }, { "CheckWilling", DoCheckWilling }, { "Ping", DoPing }, }; int main (int argc, char **argv) { Arg position[3]; Dimension width, height; Position x, y; #ifdef USE_XINERAMA XineramaScreenInfo *screens; int s_num; #endif toplevel = XtInitialize (argv[0], "Chooser", options, XtNumber(options), &argc, argv); XtAddConverter(XtRString, XtRARRAY8, CvtStringToARRAY8, NULL, 0); XtGetApplicationResources (toplevel, (XtPointer) &app_resources, resources, XtNumber (resources), NULL, (Cardinal) 0); XtAddActions (app_actions, XtNumber (app_actions)); paned = XtCreateManagedWidget ("paned", panedWidgetClass, toplevel, NULL, 0); label = XtCreateManagedWidget ("label", labelWidgetClass, paned, NULL, 0); viewport = XtCreateManagedWidget ("viewport", viewportWidgetClass, paned, NULL, 0); list = XtCreateManagedWidget ("list", listWidgetClass, viewport, NULL, 0); box = XtCreateManagedWidget ("box", boxWidgetClass, paned, NULL, 0); cancel = XtCreateManagedWidget ("cancel", commandWidgetClass, box, NULL, 0); acceptit = XtCreateManagedWidget ("accept", commandWidgetClass, box, NULL, 0); ping = XtCreateManagedWidget ("ping", commandWidgetClass, box, NULL, 0); /* * center ourselves on the screen */ XtSetMappedWhenManaged(toplevel, FALSE); XtRealizeWidget (toplevel); XtSetArg (position[0], XtNwidth, &width); XtSetArg (position[1], XtNheight, &height); XtGetValues (toplevel, position, (Cardinal) 2); #ifdef USE_XINERAMA if ( XineramaIsActive(XtDisplay(toplevel)) && (screens = XineramaQueryScreens(XtDisplay(toplevel), &s_num)) != NULL ) { x = (Position)(screens[0].x_org + (screens[0].width - width) / 2); y = (Position)(screens[0].y_org + (screens[0].height - height) / 3); XFree(screens); } else #endif { x = (Position)(WidthOfScreen (XtScreen (toplevel)) - width) / 2; y = (Position)(HeightOfScreen (XtScreen (toplevel)) - height) / 3; } XtSetArg (position[0], XtNx, x); XtSetArg (position[1], XtNy, y); XtSetValues (toplevel, position, (Cardinal) 2); /* * Run */ XtMapWidget(toplevel); InitXDMCP (argv + 1); XtMainLoop (); exit(0); /*NOTREACHED*/ } /* Converts the hex string s of length len into the byte array d. Returns 0 if s was a legal hex string, 1 otherwise. */ static int FromHex (char *s, char *d, int len) { int t; int ret = len&1; /* odd-length hex strings are illegal */ while (len >= 2) { #define HexChar(c) ('0' <= (c) && (c) <= '9' ? (c) - '0' : (c) - 'a' + 10) if (!ishexdigit(*s)) ret = 1; t = HexChar (*s) << 4; s++; if (!ishexdigit(*s)) ret = 1; t += HexChar (*s); s++; *d++ = t; len -= 2; } return ret; } /*ARGSUSED*/ static void CvtStringToARRAY8 (XrmValuePtr args, Cardinal *num_args, XrmValuePtr fromVal, XrmValuePtr toVal) { static ARRAY8Ptr dest; char *s; int len; dest = (ARRAY8Ptr) XtMalloc (sizeof (ARRAY8)); len = fromVal->size; s = (char *) fromVal->addr; if (!XdmcpAllocARRAY8 (dest, len >> 1)) XtStringConversionWarning ((char *) fromVal->addr, XtRARRAY8); else { FromHex (s, (char *) dest->data, len); } toVal->addr = (caddr_t) &dest; toVal->size = sizeof (ARRAY8Ptr); } wdm-1.28/src/libwdm/debug.c 644 0 0 1037010221265060 151640ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * debug.c: some functions to help output debug information */ #include #include #include #include #include static Bool use_syslog = False; int WDMLogLevel(int level) { static int current_level = WDM_LEVEL_ERROR; if(level < 0) return current_level; return current_level = level; } FILE * WDMLogStream(FILE *debugfile) { static FILE* current_debugfile = NULL; if(!current_debugfile) current_debugfile = stderr; if(!debugfile) return current_debugfile; use_syslog = False; return current_debugfile = debugfile; } void WDMUseSysLog(const char *ident, int facility) { if(!ident) ident = "wdm"; openlog(ident, 0, facility); use_syslog = True; } void WDMCloseLog(void) { if(use_syslog) closelog(); else { fclose(WDMLogStream(NULL)); WDMLogStream(stderr); } } static int WDMLevelToSyslog(int level) { switch(level) { case WDM_LEVEL_DEBUG: return LOG_DEBUG; case WDM_LEVEL_INFO: return LOG_INFO; case WDM_LEVEL_WARNING: return LOG_WARNING; case WDM_LEVEL_ERROR: return LOG_ERR; case WDM_LEVEL_PANIC: return LOG_CRIT; } return LOG_DEBUG; } int WDMStringToFacility(const char *facility) { if(strcasecmp(facility, "auth") == 0) return LOG_AUTH; if(strcasecmp(facility, "authpriv") == 0) return LOG_AUTHPRIV; if(strcasecmp(facility, "cron") == 0) return LOG_CRON; if(strcasecmp(facility, "daemon") == 0) return LOG_DAEMON; if(strcasecmp(facility, "ftp") == 0) return LOG_FTP; if(strcasecmp(facility, "kern") == 0) return LOG_KERN; if(strcasecmp(facility, "local0") == 0) return LOG_LOCAL0; if(strcasecmp(facility, "local1") == 0) return LOG_LOCAL1; if(strcasecmp(facility, "local2") == 0) return LOG_LOCAL2; if(strcasecmp(facility, "local3") == 0) return LOG_LOCAL3; if(strcasecmp(facility, "local4") == 0) return LOG_LOCAL4; if(strcasecmp(facility, "local5") == 0) return LOG_LOCAL5; if(strcasecmp(facility, "local6") == 0) return LOG_LOCAL6; if(strcasecmp(facility, "local7") == 0) return LOG_LOCAL7; if(strcasecmp(facility, "lpr") == 0) return LOG_LPR; if(strcasecmp(facility, "mail") == 0) return LOG_MAIL; if(strcasecmp(facility, "news") == 0) return LOG_NEWS; if(strcasecmp(facility, "syslog") == 0) return LOG_SYSLOG; if(strcasecmp(facility, "user") == 0) return LOG_USER; if(strcasecmp(facility, "uucp") == 0) return LOG_UUCP; return LOG_USER; } static void WDMLogMessageRaw(int level, char *fmt, va_list args) { if(WDMLogLevel(-1) >= level) { if(use_syslog) { vsyslog(WDMLevelToSyslog(level), fmt, args); } else { vfprintf(WDMLogStream(NULL), fmt, args); fflush(WDMLogStream(NULL)); } } } void WDMLogMessage(int level, char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(level, fmt, args); va_end(args); } void WDMDebug(char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(WDM_LEVEL_DEBUG, fmt, args); va_end(args); } void WDMInfo(char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(WDM_LEVEL_INFO, fmt, args); va_end(args); } void WDMWarning(char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(WDM_LEVEL_WARNING, fmt, args); va_end(args); } void WDMError(char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(WDM_LEVEL_ERROR, fmt, args); va_end(args); } void WDMPanic(char *fmt, ...) { va_list args; va_start(args, fmt); WDMLogMessageRaw(WDM_LEVEL_PANIC, fmt, args); va_end(args); exit(EXIT_FAILURE); } wdm-1.28/src/libwdm/environment.c 644 0 0 1001210221265060 164330ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * environment.c: some functions to work with environments */ #include #include const char * WDMGetEnv(char * const env[], const char *name) { size_t len; WDMDebug("WDMGetEnv env=%p, name=\"%s\"\n", (void *)env, name); if(name == NULL) { WDMError("WDMGetEnv: internal error: name == NULL\n"); return NULL; } if(env == NULL || name[0] == '\0') return NULL; len = strlen(name); while(*env) { if(!strncmp(*env, name, len) && (*env)[len] == '=') return &(*env)[len + 1]; ++env; } return NULL; } char ** WDMPutEnv(char **env, const char *string) { const char *name_end; char **ep; int envsize; size_t len; WDMDebug("WDMPutEnv env=%p, string=\"%s\"\n", (void *)env, string); if(string == NULL) { WDMError("WDMPutEnv: internal error: string == NULL\n"); return env; } if(string[0] == '\0') return env; if((name_end = strchr(string, '=')) != NULL) { if(name_end == string) return env; ep = env; len = name_end - string; while(ep && *ep) { if(!strncmp(*ep, string, len) && (*ep)[len] == '=') break; ++ep; } if(ep == NULL || *ep == NULL) { for(envsize = 0; env && env[envsize] != 0; ++envsize) /*nothing*/; WDMDebug("WDMPutEnv: realloc env to size %i\n", envsize + 2); env = wrealloc(env, (envsize + 2) * sizeof(char *)); env[envsize++] = wstrdup((char *)string); env[envsize] = NULL; } else { wfree(*ep); *ep = wstrdup((char *)string); } return env; } return env; } char ** WDMSetEnv(char **env, const char *name, const char *value) { char *string; WDMDebug("WDMSetEnv env=%p, name=\"%s\", value=\"%s\"\n", (void *)env, name, value); if(name == NULL || name[0] == '\0') { WDMError("WDMSetEnv: internal error: name == NULL or empty\n"); return env; } if(value == NULL) { WDMError("WDMSetEnv: internal error: value == NULL\n"); return env; } string = wstrdup((char *)name); string = wstrappend(string, "="); string = wstrappend(string, (char *)value); env = WDMPutEnv(env, string); wfree(string); return env; } char ** WDMUnsetEnv(char **env, const char *name) { char **ep; int envsize; size_t len; WDMDebug("WDMUnsetEnv env=%p, name=\"%s\"\n", (void *)env, name); if(name == NULL) { WDMError("WDMUnsetEnv: internal error: name == NULL\n"); return 0; } if(env == NULL || name[0] == '\0') return 0; ep = env; len = strlen(name); while(*ep) { if(!strncmp(*ep, name, len) && (*ep)[len] == '=') break; ++ep; } if(ep == NULL || *ep == NULL) return 0; for(envsize = 0; ep[envsize] != 0; ++envsize) /*nothing*/; WDMDebug("WDMUnsetEnv: moving %i items of %p from %p to %p \n", envsize, (void*)env, (void*)(ep + 1), (void*)ep); memmove(ep, ep + 1, envsize * sizeof(char *)); for(envsize = 0; env[envsize] != 0; ++envsize) /*nothing*/; WDMDebug("WDMUnsetEnv: realloc env to size %i\n", envsize + 1); return wrealloc(env, (envsize + 1) * sizeof(char*)); } void WDMFreeEnv(char **env) { char **ep = env; WDMDebug("WDMFreeEnv env=%p\n", (void *)env); if(env == NULL) return; while(*ep) { wfree(*ep); ep++; } wfree(env); } void WDMPrintEnv(char **env) { WDMDebug("WDMPrintEnv env=%p\n", (void *)env); while(env && *env) WDMDebug("%s\n", *env++); } wdm-1.28/src/libwdm/names.c 644 0 0 434310221265060 151640ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * names.c: functions to access host names and addresses */ #include #include #include #include #include void * WDMSockaddrGetPort(struct sockaddr *from, int *len) { switch(from->sa_family) { case AF_INET: if(len) *len = sizeof(in_port_t); return (void *) &(((struct sockaddr_in *)from)->sin_port); break; case AF_INET6: if(len) *len = sizeof(in_port_t); return (void *) &(((struct sockaddr_in6 *)from)->sin6_port); break; default: if(len) *len = 0; return NULL; } } void * WDMSockaddrGetAddr(struct sockaddr *from, int *len) { switch(from->sa_family) { case AF_INET: if(len) *len = sizeof(struct in_addr); return (void *) &(((struct sockaddr_in *)from)->sin_addr); break; case AF_INET6: if(len) *len = sizeof(struct in6_addr); return (void *) &(((struct sockaddr_in6 *)from)->sin6_addr); break; default: if(len) *len = 0; return NULL; } } char * WDMGetHostName(struct sockaddr *from) { struct hostent *he; void *addr; int len; addr = WDMSockaddrGetAddr(from, &len); if((he = gethostbyaddr(addr, len, from->sa_family))==NULL) return NULL; return wstrdup(he->h_name); } char * WDMGetHostAddr(struct sockaddr *from) { char ipbuf[128]; /* FIXME: I don't like fixed size buffers */ inet_ntop(from->sa_family, WDMSockaddrGetAddr(from, NULL), ipbuf, sizeof(ipbuf)); return wstrdup(ipbuf); } wdm-1.28/src/libwdm/plcheckers.c 644 0 0 1001210221265060 162120ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * plcheckers.c: some functions to check correctness of proplist * used ad configuration data. */ #include #include #include /* * Bool bool; * WDMCheckPLBool(pl, True, &bool); */ Bool WDMCheckPLBool(WMPropList *pl, void *def, void *target) { Bool *bool_target = (Bool*)target; char *text = NULL; WDMDebug("WDMCheckPLBool(%p, %p, %p)\n", (void *)pl, def, target); *bool_target = (Bool)def; if(pl && WMIsPLString(pl)) { text = WMGetFromPLString(pl); if(!strcasecmp(text, "yes")) { *bool_target = True; } else if(!strcasecmp(text, "no")) { *bool_target = False; } } return True; } /* * char *text; * WDMCheckPLString(pl, NULL, &text); */ Bool WDMCheckPLString(WMPropList *pl, void *def, void *target) { char **charptr_target = (char**)target; char *value = (char*)def; WDMDebug("WDMCheckPLString(%p, %p, %p)\n", (void*)pl, def, target); if(pl && WMIsPLString(pl)) { value = WMGetFromPLString(pl); } *charptr_target = value ? wstrdup(value) : value; return True; } /* * WMArray *array; * WDMCheckPLArray(pl, spec, &array); */ Bool WDMCheckPLArray(WMPropList *pl, void *def, void *target) { WMArray **array_target = (WMArray**)target; WDMArraySpec *spec = (WDMArraySpec*)def; void *entry = NULL; int i, count; WDMDebug("WDMCheckPLArray(%p, %p, %p)\n", (void*)pl, def, target); if(!pl || !WMIsPLArray(pl)) return False; count = WMGetPropListItemCount(pl); *array_target = WMCreateArrayWithDestructor(count, spec->destructor); for(i = 0; i < count; ++i) { if(!(*spec->checker)( WMGetFromPLArray(pl, i), spec->data, &entry)) { WMFreeArray(*array_target); *array_target = NULL; return False; } if(spec->addnull == True || entry != NULL) { WMAddToArray(*array_target, entry); } } return True; } /* * struct *s; * WDMCheckPLDictionary(pl, spec, &s); */ Bool WDMCheckPLDictionary(WMPropList *pl, void *def, void *target) { WDMDictionarySpec *spec = (WDMDictionarySpec*)def; WDMDictionaryStruct *fields = spec->fields; void **data = (void**)target; WMPropList *key = NULL, *value = NULL; Bool plok; WDMDebug("WDMCheckPLDictionary(%p, %p, %p)\n", (void*)pl, def, target); plok = pl && WMIsPLDictionary(pl); *data = (void*)wmalloc(spec->size); memset(*data, 0, spec->size); while(fields->key) { key = WMCreatePLString(fields->key); value = plok?WMGetFromPLDictionary(pl, key):NULL; (*fields->checker)(value, fields->data, (void *)((unsigned char*)*data + fields->offset)); WMReleasePropList(key); key = NULL; fields++; } return True; } /* * This function will check if pl is string or array of strings. * It always returns WMArray. In case of string, new array will be * created and that string will be added to it. * def is ignored here. */ Bool WDMCheckPLStringOrArray(WMPropList *pl, void *def, void *target) { char *text; WMArray **array_target = (WMArray**)target; static WDMArraySpec array_of_strings = {WDMCheckPLString, NULL, wfree, False}; if(pl && WMIsPLString(pl)) { if(WDMCheckPLString(pl, NULL, &text) && text) { *array_target = WMCreateArrayWithDestructor(1, wfree); WMAddToArray(*array_target, text); return True; } } return WDMCheckPLArray(pl, &array_of_strings, target); } wdm-1.28/src/wdm/Greet.c 644 0 0 3216610221265060 144640ustar AlexeyVoinov 0 0/* $XConsortium: greet.c,v 1.41 94/09/12 21:32:49 converse Exp $ */ /* $XFree86: xc/programs/xdm/greeter/greet.c,v 3.1 1995/10/21 12:52:36 dawes Exp $ */ /* Copyright (c) 1988 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM 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. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * widget to get username/password * */ /*###################################################################*/ /*## Greet ##*/ /*## ##*/ /*## This software is Copyright (C) 1998 by Gene Czarcinski. ##*/ /*## This software falls under the GNU Public License. Please read ##*/ /*## the COPYING file for more information ##*/ /*## ##*/ /*## At the present time, PingServer is not implemented. ##*/ /*## ##*/ /*###################################################################*/ /* ************************************************************************ * The interface protocol between Greet and the external program: * * A) wdm -> wdmLogin * 1. SIGTERM to terminate sucessfully * 2. SIGUSR1 to indicate failure; retry * 3. "variables" which are needed by Login * are passed as command-line arguments (that is, * as argc, *argv[]). This has been used to make * it simple for Login. The values to be passed * can be set as Xresources. * * B) wdm <- wdmLogin ... This is performed via a pipe with * Greet doing reads and Login doing writes. The * stream of bytes follows the following protocol: * 1. A String is defined as a one byte length field * followed by a string of non-zero bytes. * 2. Transmission is ended with a single byte * with a zero value. * 3. Two strings are first transmitted which are * the username and password. * 4. This is followed by an extension byte. The following * extension codes are supported: * 0 - end of data (not really an extension code) * 1 - xsession parameter (original) * 2 - reboot (added) - shutdown -r now * 3 - halt (added) - shutdown -h now * 4 - exit (added) - exit wdm/xdm * 5. The extension byte is followed by a string. * 6. The string is followed by another extension byte * or a zero to indicate end-of-data. Normally, there * will be only one non-zero extension code but * the protocol does not limit this. * ************************************************************************* * The above protocol was defined by Tom Rothamel. Additions include * extension codes other than 0 or 1, and passing args to Login. */ #include #include #include #include #include /* wdm additions */ #include #include #include #include #include #include #ifdef HAVE_SYSLOG_H #include #endif #ifdef HAVE_SYS_PARAM_H #include #endif #include #include extern Display *dpy; extern char *wdmLogin; /* X resources (see resource.c) */ extern char *wdmWm; extern char *wdmLogo; extern char *wdmHelpFile; extern char *wdmDefaultUser; extern char *wdmDefaultPasswd; extern char *wdmBg; extern char *wdmReboot; extern char *wdmHalt; extern int wdmRoot; extern int wdmVerify; extern int wdmAnimations; extern char *wdmLocale; extern char *wdmLoginConfig; extern char *wdmCursorTheme; extern int wdmXineramaHead; static int pipe_filedes[2]; static char name[128], password[128]; static char xsessionArg[256], exitArg[256]; struct display *Save_d=NULL; extern char **systemEnv(); /**** pipe I/O routines ****/ /** The following code was adapted from in.c by Tom Rothamel */ /* This file is Copyright 1998 Tom Rothamel. It's under the Gnu Public * * License, see the file COPYING for details. */ static void guaranteed_read(int fd, char *buf, size_t count) { int bytes_read; if (count == 0) { return; } while((bytes_read = read(fd, buf, count))>0) { count -= bytes_read; buf += bytes_read; if (count == 0) { return; } } WDMError("Greet: guarenteed_read error, UNMANAGE DISPLAY\n"); WDMError("Greet: pipe read error with %s\n", wdmLogin); SessionExit (Save_d, RESERVER_DISPLAY, FALSE); /* this exits */ exit (UNMANAGE_DISPLAY); /* should not happen */ } static unsigned char readuc(int fd) { unsigned char uc; guaranteed_read(fd, (char *)&uc, sizeof(unsigned char)); return uc; } static char *readstring(int fd, char *buf) { int len; len = (int) readuc(fd); guaranteed_read(fd, buf, len); buf[len] = 0; return buf; } /**** end of pipe I/O routines ****/ static int InitGreet (struct display *d) { int pid; WDMDebug("Greet display=%s\n", d->name); pipe(pipe_filedes); pid = fork(); if (pid == -1) { /* error */ WDMError("Greet cannot fork\n"); exit(RESERVER_DISPLAY); } if (pid == 0) { /* child */ char **env = NULL; char *argv[20]; int argc = 1; /* argc = 0 is for command itself */ close(pipe_filedes[0]); fcntl(pipe_filedes[1], F_SETFD, 0); /* Reset close-on-exec (just in case) */ env = (char **)systemEnv(d, (char*)NULL, FAKEHOME); if(*wdmLocale) env = WDMSetEnv(env, "LANG", wdmLocale); if(*wdmCursorTheme) env = WDMSetEnv(env, "XCURSOR_THEME", wdmCursorTheme); if((argv[0] = strrchr(wdmLogin, '/')) == NULL) argv[0] = wdmLogin; else argv[0]++; argv[argc++] = wstrconcat("-d", d->name); if(*wdmWm) argv[argc++] = wstrconcat("-w", wdmWm); if(*wdmLogo) argv[argc++] = wstrconcat("-l", wdmLogo); if(*wdmHelpFile) argv[argc++] = wstrconcat("-h", wdmHelpFile); if(*wdmDefaultUser) argv[argc++] = "-u"; if(*wdmBg) argv[argc++] = wstrconcat("-b", wdmBg); if(*wdmLoginConfig) argv[argc++] = wstrconcat("-c", wdmLoginConfig); if(wdmAnimations) argv[argc++] = "-a"; if(wdmXineramaHead) { argv[argc] = wmalloc(25); /* much more than length of 64bit integer converted to string, but it still a hack */ sprintf(argv[argc++], "-x%i", wdmXineramaHead); } argv[argc] = wmalloc(25); sprintf(argv[argc++], "-f%i", pipe_filedes[1]); argv[argc++] = NULL; execve(wdmLogin, argv, env); WDMError("Greet cannot exec %s\n", wdmLogin); exit(RESERVER_DISPLAY); } close(pipe_filedes[1]); RegisterCloseOnFork(pipe_filedes[0]); return pid; } static void CloseGreet (int pid) { /* UnsecureDisplay (d, dpy);*/ kill(pid,SIGTERM); /* ClearCloseOnFork (XConnectionNumber (dpy));*/ /* XCloseDisplay (dpy);*/ WDMDebug("Greet connection closed\n"); } static int Greet (struct display *d, struct greet_info *greet) { int code = 0, done = 0, extension_code=0; readstring(pipe_filedes[0], name); /* username */ readstring(pipe_filedes[0], password); xsessionArg[0] = '\0'; while (!done) { extension_code = readuc(pipe_filedes[0]); switch (extension_code) { case 0: /*end of data*/ done = 1; break; case 1: /*xsession parameter*/ readstring(pipe_filedes[0], xsessionArg); break; case 2: /*reboot*/ readstring(pipe_filedes[0], exitArg); code = 2; break; case 3: /*halt*/ readstring(pipe_filedes[0], exitArg); code = 3; break; case 4: /*exit*/ readstring(pipe_filedes[0], exitArg); code = 4; break; default: /*????*/ WDMError("Bad extension code from external program: %i\n", code); exit (RESERVER_DISPLAY); break; } } greet->name = name; greet->password = password; if (xsessionArg[0] == '\0') greet->string = NULL; else greet->string = xsessionArg; return code; } /**** This is the entry point from session.c ****/ greet_user_rtn GreetUser(struct display *d, Display **dpy, struct verify_info *verify, struct greet_info *greet, struct dlfuncs *dlfuncs) { int flag; int pid; int code; Save_d = d; /* hopefully, this is OK */ *dpy = XOpenDisplay (d->name); /* make sure we have the display */ /* * Run the setup script - note this usually will not work when * the server is grabbed, so we don't even bother trying. */ if (!d->grabServer) SetupDisplay (d); if (!*dpy) { WDMError("Cannot reopen display %s for greet window\n", d->name); exit (RESERVER_DISPLAY); } pid = InitGreet(d); /* fork and exec the external program */ for (;;) { /* * Greet user, requesting name/password */ code = Greet (d, greet); WDMDebug("Greet greet done: %s, pwlen=%i\n", name, strlen(password)); if (code != 0) { WDMDebug("Greet: exit code=%i, %s\n", code, exitArg); if (wdmVerify || wdmRoot) { flag = False; if (Verify (d, greet, verify)) flag = True; if (wdmRoot && (strcmp(greet->name,"root")!=0)) flag = False; } else flag = True; if (flag == True) { switch (code) { case 2: /* reboot */ CloseGreet (pid); WDMInfo("reboot(%s) by %s\n", exitArg, name); system(wdmReboot); SessionExit (d, UNMANAGE_DISPLAY, FALSE); break; case 3: /* halt */ CloseGreet (pid); WDMInfo("halt(%s) by %s\n", exitArg, name); system(wdmHalt); SessionExit (d, UNMANAGE_DISPLAY, FALSE); break; case 4: /* exit */ CloseGreet (pid); WDMDebug("UNMANAGE_DISPLAY\n"); WDMInfo("%s exit(%s) by %s\n", PACKAGE_NAME, exitArg, name); #if 0 SessionExit (d, UNMANAGE_DISPLAY, FALSE); #else WDMDebug ("Killing parent process %d\n", getppid()); kill (getppid(), SIGINT); #endif break; } } else { kill(pid,SIGUSR1); /* Verify failed */ } } else { /* * Verify user */ if ((! *greet->name) && *wdmDefaultUser) { greet->name = wdmDefaultUser; greet->password = wdmDefaultPasswd; } if (Verify (d, greet, verify)) break; else kill(pid,SIGUSR1); /* Verify failed */ } } DeleteXloginResources (d, *dpy); CloseGreet (pid); WDMDebug("Greet loop finished\n"); /* * Run system-wide initialization file */ if (source (verify->systemEnviron, d->startup) != 0) { WDMDebug("Startup program %s exited with non-zero status\n", d->startup); SessionExit (d, OBEYSESS_DISPLAY, FALSE); } return Greet_Success; } wdm-1.28/src/wdm/access.c 644 0 0 3761610221265060 146640ustar AlexeyVoinov 0 0/* * $Xorg: access.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ * Copyright 1990, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Keith Packard, MIT X Consortium */ /* $XFree86: xc/programs/xdm/access.c,v 3.8 2001/12/14 20:01:19 dawes Exp $ */ /* * Access control for XDMCP - keep a database of allowable display addresses * and (potentially) a list of hosts to send ForwardQuery packets to */ # include #ifdef XDMCP # include # include # include # include # include # include # include #include #define ALIAS_CHARACTER '%' #define NEGATE_CHARACTER '!' #define CHOOSER_STRING "CHOOSER" #define BROADCAST_STRING "BROADCAST" #define NOBROADCAST_STRING "NOBROADCAST" #define HOST_ALIAS 0 #define HOST_ADDRESS 1 #define HOST_BROADCAST 2 #define HOST_CHOOSER 3 #define HOST_NOBROADCAST 4 typedef struct _hostEntry { struct _hostEntry *next; int type; union _hostOrAlias { char *aliasName; ARRAY8 hostAddress; } entry; } HostEntry; #define DISPLAY_ALIAS 0 #define DISPLAY_PATTERN 1 #define DISPLAY_ADDRESS 2 typedef struct _displayEntry { struct _displayEntry *next; int type; int notAllowed; int notBroadcast; int chooser; union _displayType { char *aliasName; char *displayPattern; struct _display { ARRAY8 clientAddress; CARD16 connectionType; } displayAddress; } entry; HostEntry *hosts; } DisplayEntry; static DisplayEntry *database; static ARRAY8 localAddress; ARRAY8Ptr getLocalAddress (void) { static int haveLocalAddress; if (!haveLocalAddress) { struct hostent *hostent; hostent = gethostbyname (localHostname()); XdmcpAllocARRAY8 (&localAddress, hostent->h_length); memmove( localAddress.data, hostent->h_addr, hostent->h_length); } return &localAddress; } static void FreeHostEntry (HostEntry *h) { switch (h->type) { case HOST_ALIAS: free (h->entry.aliasName); break; case HOST_ADDRESS: XdmcpDisposeARRAY8 (&h->entry.hostAddress); break; case HOST_CHOOSER: break; } free ((char *) h); } static void FreeDisplayEntry (DisplayEntry *d) { HostEntry *h, *next; switch (d->type) { case DISPLAY_ALIAS: free (d->entry.aliasName); break; case DISPLAY_PATTERN: free (d->entry.displayPattern); break; case DISPLAY_ADDRESS: XdmcpDisposeARRAY8 (&d->entry.displayAddress.clientAddress); break; } for (h = d->hosts; h; h = next) { next = h->next; FreeHostEntry (h); } free ((char *) d); } static void FreeAccessDatabase (void) { DisplayEntry *d, *next; for (d = database; d; d = next) { next = d->next; FreeDisplayEntry (d); } database = 0; } #define WORD_LEN 256 static char wordBuffer[WORD_LEN]; static int nextIsEOF; static char * ReadWord (FILE *file, int EOFatEOL) { int c; char *wordp; int quoted; wordp = wordBuffer; if (nextIsEOF) { nextIsEOF = FALSE; return NULL; } quoted = FALSE; for (;;) { c = getc (file); switch (c) { case '#': if (quoted) { *wordp++ = c; break; } while ((c = getc (file)) != EOF && c != '\n') ; case '\n': case EOF: if (c == EOF || (EOFatEOL && !quoted)) { ungetc (c, file); if (wordp == wordBuffer) return NULL; *wordp = '\0'; nextIsEOF = TRUE; return wordBuffer; } case ' ': case '\t': if (wordp != wordBuffer) { ungetc (c, file); *wordp = '\0'; return wordBuffer; } break; case '\\': if (!quoted) { quoted = TRUE; continue; } default: *wordp++ = c; break; } quoted = FALSE; } } static HostEntry * ReadHostEntry (FILE *file) { char *hostOrAlias; HostEntry *h; struct hostent *hostent; tryagain: hostOrAlias = ReadWord (file, TRUE); if (!hostOrAlias) return NULL; h = (HostEntry *) malloc (sizeof (DisplayEntry)); if (*hostOrAlias == ALIAS_CHARACTER) { h->type = HOST_ALIAS; h->entry.aliasName = malloc (strlen (hostOrAlias) + 1); if (!h->entry.aliasName) { free ((char *) h); return NULL; } strcpy (h->entry.aliasName, hostOrAlias); } else if (!strcmp (hostOrAlias, CHOOSER_STRING)) { h->type = HOST_CHOOSER; } else if (!strcmp (hostOrAlias, BROADCAST_STRING)) { h->type = HOST_BROADCAST; } else if (!strcmp (hostOrAlias, NOBROADCAST_STRING)) { h->type = HOST_NOBROADCAST; } else { h->type = HOST_ADDRESS; hostent = gethostbyname (hostOrAlias); if (!hostent) { WDMDebug("No such host %s\n", hostOrAlias); WDMError("Access file \"%s\", host \"%s\" not found\n", accessFile, hostOrAlias); free ((char *) h); goto tryagain; } if (!XdmcpAllocARRAY8 (&h->entry.hostAddress, hostent->h_length)) { WDMError("ReadHostEntry: out of memory\n"); free ((char *) h); return NULL; } memmove( h->entry.hostAddress.data, hostent->h_addr, hostent->h_length); } return h; } static int HasGlobCharacters (char *s) { for (;;) switch (*s++) { case '?': case '*': return 1; case '\0': return 0; } } static DisplayEntry * ReadDisplayEntry (FILE *file) { char *displayOrAlias; DisplayEntry *d; struct _display *display; HostEntry *h, **prev; struct hostent *hostent; displayOrAlias = ReadWord (file, FALSE); if (!displayOrAlias) return NULL; d = (DisplayEntry *) malloc (sizeof (DisplayEntry)); d->notAllowed = 0; d->notBroadcast = 0; d->chooser = 0; if (*displayOrAlias == ALIAS_CHARACTER) { d->type = DISPLAY_ALIAS; d->entry.aliasName = malloc (strlen (displayOrAlias) + 1); if (!d->entry.aliasName) { free ((char *) d); return NULL; } strcpy (d->entry.aliasName, displayOrAlias); } else { if (*displayOrAlias == NEGATE_CHARACTER) { d->notAllowed = 1; ++displayOrAlias; } if (HasGlobCharacters (displayOrAlias)) { d->type = DISPLAY_PATTERN; d->entry.displayPattern = malloc (strlen (displayOrAlias) + 1); if (!d->entry.displayPattern) { free ((char *) d); return NULL; } strcpy (d->entry.displayPattern, displayOrAlias); } else { if ((hostent = gethostbyname (displayOrAlias)) == NULL) { WDMError("Access file %s, display %s unknown\n", accessFile, displayOrAlias); free ((char *) d); return NULL; } d->type = DISPLAY_ADDRESS; display = &d->entry.displayAddress; if (!XdmcpAllocARRAY8 (&display->clientAddress, hostent->h_length)) { free ((char *) d); return NULL; } memmove( display->clientAddress.data, hostent->h_addr, hostent->h_length); switch (hostent->h_addrtype) { #ifdef AF_UNIX case AF_UNIX: display->connectionType = FamilyLocal; break; #endif #ifdef AF_INET case AF_INET: display->connectionType = FamilyInternet; break; #endif default: display->connectionType = FamilyLocal; break; } } } prev = &d->hosts; while ((h = ReadHostEntry (file))) { if (h->type == HOST_CHOOSER) { FreeHostEntry (h); d->chooser = 1; } else if (h->type == HOST_NOBROADCAST) { FreeHostEntry (h); d->notBroadcast = 1; } else { *prev = h; prev = &h->next; } } *prev = NULL; return d; } static void ReadAccessDatabase (FILE *file) { DisplayEntry *d, **prev; prev = &database; while ((d = ReadDisplayEntry (file))) { *prev = d; prev = &d->next; } *prev = NULL; } int ScanAccessDatabase (void) { FILE *datafile; FreeAccessDatabase (); if (*accessFile) { datafile = fopen (accessFile, "r"); if (!datafile) { WDMError("Cannot open access control file %s, no XDMCP requests will be granted\n", accessFile); return 0; } ReadAccessDatabase (datafile); fclose (datafile); } return 1; } /* * calls the given function for each valid indirect entry. Returns TRUE if * the local host exists on any of the lists, else FALSE */ #define MAX_DEPTH 32 static int indirectAlias ( char *alias, ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure, int depth, int broadcast); static int scanHostlist ( HostEntry *h, ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure, int depth, int broadcast) { int haveLocalhost = 0; for (; h; h = h->next) { switch (h->type) { case HOST_ALIAS: if (indirectAlias (h->entry.aliasName, clientAddress, connectionType, function, closure, depth, broadcast)) haveLocalhost = 1; break; case HOST_ADDRESS: if (XdmcpARRAY8Equal (getLocalAddress(), &h->entry.hostAddress)) haveLocalhost = 1; else if (function) (*function) (connectionType, &h->entry.hostAddress, closure); break; case HOST_BROADCAST: if (broadcast) { ARRAY8 temp; if (function) { temp.data = (BYTE *) BROADCAST_STRING; temp.length = strlen ((char *)temp.data); (*function) (connectionType, &temp, closure); } } break; } } return haveLocalhost; } /* Returns non-0 iff string is matched by pattern. Does case folding. */ static int patternMatch (char *string, char *pattern) { int p, s; if (!string) string = ""; for (;;) { s = *string++; switch (p = *pattern++) { case '*': if (!*pattern) return 1; for (string--; *string; string++) if (patternMatch (string, pattern)) return 1; return 0; case '?': if (s == '\0') return 0; break; case '\0': return s == '\0'; case '\\': p = *pattern++; /* fall through */ default: if (isupper(p)) p = tolower(p); if (isupper(s)) s = tolower(s); if (p != s) return 0; } } } static int indirectAlias ( char *alias, ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure, int depth, int broadcast) { DisplayEntry *d; int haveLocalhost = 0; if (depth == MAX_DEPTH) return 0; for (d = database; d; d = d->next) { if (d->type != DISPLAY_ALIAS || !patternMatch (alias, d->entry.aliasName)) continue; if (scanHostlist (d->hosts, clientAddress, connectionType, function, closure, depth + 1, broadcast)) { haveLocalhost = 1; } } return haveLocalhost; } int ForEachMatchingIndirectHost ( ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure) { int haveLocalhost = 0; DisplayEntry *d; char *clientName = NULL; for (d = database; d; d = d->next) { switch (d->type) { case DISPLAY_ALIAS: continue; case DISPLAY_PATTERN: if (!clientName) clientName = NetworkAddressToHostname (connectionType, clientAddress); if (!patternMatch (clientName, d->entry.displayPattern)) continue; break; case DISPLAY_ADDRESS: if (d->entry.displayAddress.connectionType != connectionType || !XdmcpARRAY8Equal (&d->entry.displayAddress.clientAddress, clientAddress)) { continue; } break; } if (!d->hosts) continue; if (d->notAllowed) break; if (d->chooser) { ARRAY8Ptr choice; choice = IndirectChoice (clientAddress, connectionType); if (!choice || XdmcpARRAY8Equal (getLocalAddress(), choice)) haveLocalhost = 1; else (*function) (connectionType, choice, closure); } else if (scanHostlist (d->hosts, clientAddress, connectionType, function, closure, 0, FALSE)) { haveLocalhost = 1; } break; } if (clientName) free (clientName); return haveLocalhost; } int UseChooser ( ARRAY8Ptr clientAddress, CARD16 connectionType) { DisplayEntry *d; char *clientName = NULL; for (d = database; d; d = d->next) { switch (d->type) { case DISPLAY_ALIAS: continue; case DISPLAY_PATTERN: if (!clientName) clientName = NetworkAddressToHostname (connectionType, clientAddress); if (!patternMatch (clientName, d->entry.displayPattern)) continue; break; case DISPLAY_ADDRESS: if (d->entry.displayAddress.connectionType != connectionType || !XdmcpARRAY8Equal (&d->entry.displayAddress.clientAddress, clientAddress)) { continue; } break; } if (!d->hosts) continue; if (d->notAllowed) break; if (d->chooser && !IndirectChoice (clientAddress, connectionType)) { if (clientName) free (clientName); return 1; } break; } if (clientName) free (clientName); return 0; } void ForEachChooserHost ( ARRAY8Ptr clientAddress, CARD16 connectionType, ChooserFunc function, char *closure) { int haveLocalhost = 0; DisplayEntry *d; char *clientName = NULL; for (d = database; d; d = d->next) { switch (d->type) { case DISPLAY_ALIAS: continue; case DISPLAY_PATTERN: if (!clientName) clientName = NetworkAddressToHostname (connectionType, clientAddress); if (!patternMatch (clientName, d->entry.displayPattern)) continue; break; case DISPLAY_ADDRESS: if (d->entry.displayAddress.connectionType != connectionType || !XdmcpARRAY8Equal (&d->entry.displayAddress.clientAddress, clientAddress)) { continue; } break; } if (!d->hosts) continue; if (d->notAllowed) break; if (!d->chooser) break; if (scanHostlist (d->hosts, clientAddress, connectionType, function, closure, 0, TRUE)) { haveLocalhost = 1; } break; } if (clientName) free (clientName); if (haveLocalhost) (*function) (connectionType, getLocalAddress(), closure); } /* * returns TRUE if the given client is acceptable to the local host. The * given display client is acceptable if it occurs without a host list. */ int AcceptableDisplayAddress ( ARRAY8Ptr clientAddress, CARD16 connectionType, xdmOpCode type) { DisplayEntry *d; char *clientName = NULL; if (!*accessFile) return 1; if (type == INDIRECT_QUERY) return 1; for (d = database; d; d = d->next) { if (d->hosts) continue; switch (d->type) { case DISPLAY_ALIAS: continue; case DISPLAY_PATTERN: if (!clientName) clientName = NetworkAddressToHostname (connectionType, clientAddress); if (!patternMatch (clientName, d->entry.displayPattern)) continue; break; case DISPLAY_ADDRESS: if (d->entry.displayAddress.connectionType != connectionType || !XdmcpARRAY8Equal (&d->entry.displayAddress.clientAddress, clientAddress)) { continue; } break; } break; } if (clientName) free (clientName); return (d != 0) && (d->notAllowed == 0) && (type == BROADCAST_QUERY ? d->notBroadcast == 0 : 1); } #endif /* XDMCP */ wdm-1.28/src/wdm/auth.c 644 0 0 7317610221265060 143650ustar AlexeyVoinov 0 0/* $Xorg: auth.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/auth.c,v 3.24 2001/12/14 20:01:19 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * auth.c * * maintain the authorization generation daemon */ #include #include #include #include #include #include #include #include #if defined(TCPCONN) # include #endif #if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(USG) || defined(SVR4) || (defined(SYSV) && defined(i386)) #define NEED_UTSNAME #include #endif #if defined(SYSV) && defined(i386) # include # ifdef ISC # include # include # endif /* ISC */ #endif /* i386 */ #ifdef SVR4 # include # ifndef SCO325 # include # endif # include #endif #ifdef __convex__ # include # include #endif #ifdef __GNU__ #include #undef SIOCGIFCONF #else /* __GNU__ */ #include #endif /* __GNU__ */ #if ((defined(SVR4) && !defined(sun)) || defined(ISC)) && defined(SIOCGIFCONF) #define SYSV_SIOCGIFCONF #endif #ifdef CSRG_BASED #include #if (BSD >= 199103) #define VARIABLE_IFREQ #endif #endif #ifdef __EMX__ #define link rename int chown(int a,int b,int c) {} #include #endif struct AuthProtocol { unsigned short name_length; char *name; void (*InitAuth)(unsigned short len, char *name); Xauth *(*GetAuth)(unsigned short len, char *name); void (*GetXdmcpAuth)( struct protoDisplay *pdpy, unsigned short authorizationNameLen, char *authorizationName); int inited; }; static struct AuthProtocol AuthProtocols[] = { { (unsigned short) 18, "MIT-MAGIC-COOKIE-1", MitInitAuth, MitGetAuth, NULL }, #ifdef HASXDMAUTH { (unsigned short) 19, "XDM-AUTHORIZATION-1", XdmInitAuth, XdmGetAuth, XdmGetXdmcpAuth, }, #endif #ifdef SECURE_RPC { (unsigned short) 9, "SUN-DES-1", SecureRPCInitAuth, SecureRPCGetAuth, NULL, }, #endif #ifdef K5AUTH { (unsigned short) 14, "MIT-KERBEROS-5", Krb5InitAuth, Krb5GetAuth, NULL, }, #endif }; #define NUM_AUTHORIZATION (sizeof (AuthProtocols) / sizeof (AuthProtocols[0])) static struct AuthProtocol * findProtocol (unsigned short name_length, char *name) { int i; for (i = 0; i < NUM_AUTHORIZATION; i++) if (AuthProtocols[i].name_length == name_length && memcmp(AuthProtocols[i].name, name, name_length) == 0) { return &AuthProtocols[i]; } return (struct AuthProtocol *) 0; } int ValidAuthorization (unsigned short name_length, char *name) { if (findProtocol (name_length, name)) return TRUE; return FALSE; } static Xauth * GenerateAuthorization (unsigned short name_length, char *name) { struct AuthProtocol *a; Xauth *auth = 0; int i; WDMDebug("GenerateAuthorization %*.*s\n", name_length, name_length, name); a = findProtocol (name_length, name); if (a) { if (!a->inited) { (*a->InitAuth) (name_length, name); a->inited = TRUE; } auth = (*a->GetAuth) (name_length, name); if (auth) { WDMDebug("Got %p (%d %*.*s) ", (void*)auth, auth->name_length, auth->name_length, auth->name_length, auth->name); for (i = 0; i < (int)auth->data_length; i++) WDMDebug(" %02x", auth->data[i] & 0xff); WDMDebug("\n"); } else WDMDebug("Got (null)\n"); } else { WDMDebug("Unknown authorization %*.*s\n", name_length, name_length, name); } return auth; } #ifdef XDMCP void SetProtoDisplayAuthorization ( struct protoDisplay *pdpy, unsigned short authorizationNameLen, char *authorizationName) { struct AuthProtocol *a; Xauth *auth; a = findProtocol (authorizationNameLen, authorizationName); pdpy->xdmcpAuthorization = pdpy->fileAuthorization = 0; if (a) { if (!a->inited) { (*a->InitAuth) (authorizationNameLen, authorizationName); a->inited = TRUE; } if (a->GetXdmcpAuth) { (*a->GetXdmcpAuth) (pdpy, authorizationNameLen, authorizationName); auth = pdpy->xdmcpAuthorization; } else { auth = (*a->GetAuth) (authorizationNameLen, authorizationName); pdpy->fileAuthorization = auth; pdpy->xdmcpAuthorization = 0; } if (auth) WDMDebug("Got %p (%d %*.*s)\n", (void *)auth, auth->name_length, auth->name_length, auth->name_length, auth->name); else WDMDebug("Got (null)\n"); } } #endif /* XDMCP */ void CleanUpFileName (char *src, char *dst, int len) { while (*src) { if (--len <= 0) break; switch (*src & 0x7f) { case '/': *dst++ = '_'; break; case '-': *dst++ = '.'; break; default: *dst++ = (*src & 0x7f); } ++src; } *dst = '\0'; } static char authdir1[] = "authdir"; static char authdir2[] = "authfiles"; static FILE * MakeServerAuthFile (struct display *d) { int len; #ifdef SYSV #define NAMELEN 14 #else #define NAMELEN 255 #endif char cleanname[NAMELEN]; int r; struct stat statb; FILE *auth_file; if (d->clientAuthFile && *d->clientAuthFile) len = strlen (d->clientAuthFile) + 1; else { CleanUpFileName (d->name, cleanname, NAMELEN - 8); len = strlen (authDir) + strlen (authdir1) + strlen (authdir2) + strlen (cleanname) + 14; } if (!d->authFile) { d->authFile = malloc ((unsigned) len); if (!d->authFile) return NULL; if (d->clientAuthFile && *d->clientAuthFile) strcpy (d->authFile, d->clientAuthFile); else { sprintf (d->authFile, "%s/%s", authDir, authdir1); r = stat(d->authFile, &statb); if (r == 0) { if (statb.st_uid != 0) (void) chown(d->authFile, 0, statb.st_gid); if ((statb.st_mode & 0077) != 0) (void) chmod(d->authFile, statb.st_mode & 0700); } else { if (errno == ENOENT) r = mkdir(d->authFile, 0700); if (r < 0) { free (d->authFile); d->authFile = NULL; return NULL; } } sprintf (d->authFile, "%s/%s/%s", authDir, authdir1, authdir2); r = mkdir(d->authFile, 0700); if (r < 0 && errno != EEXIST) { free (d->authFile); d->authFile = NULL; return NULL; } sprintf (d->authFile, "%s/%s/%s/A%s-XXXXXX", authDir, authdir1, authdir2, cleanname); #ifdef HAVE_MKSTEMP r = mkstemp (d->authFile); if(r < 0) return NULL; auth_file = fdopen(r, "w"); return auth_file; #else (void) mktemp (d->authFile); #endif } } (void) unlink (d->authFile); auth_file = fopen (d->authFile, "w"); return auth_file; } int SaveServerAuthorizations ( struct display *d, Xauth **auths, int count) { FILE *auth_file; int mask; int ret; int i; mask = umask (0077); auth_file = MakeServerAuthFile(d); umask (mask); if (!auth_file) { WDMDebug("Can't creat auth file %s\n", d->authFile); WDMError("Cannot open server authorization file %s\n", d->authFile); free (d->authFile); d->authFile = NULL; ret = FALSE; } else { WDMDebug("File: %s auth: %p\n", d->authFile, (void *)auths); ret = TRUE; for (i = 0; i < count; i++) { /* * User-based auths may not have data until * a user logs in. In which case don't write * to the auth file so xrdb and setup programs don't fail. */ if (auths[i]->data_length > 0) if (!XauWriteAuth (auth_file, auths[i]) || fflush (auth_file) == EOF) { WDMError("Cannot write server authorization file %s\n", d->authFile); ret = FALSE; free (d->authFile); d->authFile = NULL; } } fclose (auth_file); } return ret; } void SetLocalAuthorization (struct display *d) { Xauth *auth, **auths; int i, j; if (d->authorizations) { for (i = 0; i < d->authNum; i++) XauDisposeAuth (d->authorizations[i]); free ((char *) d->authorizations); d->authorizations = (Xauth **) NULL; d->authNum = 0; } if (!d->authNames) return; for (i = 0; d->authNames[i]; i++) ; d->authNameNum = i; if (d->authNameLens) free ((char *) d->authNameLens); d->authNameLens = (unsigned short *) malloc (d->authNameNum * sizeof (unsigned short)); if (!d->authNameLens) return; for (i = 0; i < d->authNameNum; i++) d->authNameLens[i] = strlen (d->authNames[i]); auths = (Xauth **) malloc (d->authNameNum * sizeof (Xauth *)); if (!auths) return; j = 0; for (i = 0; i < d->authNameNum; i++) { auth = GenerateAuthorization (d->authNameLens[i], d->authNames[i]); if (auth) auths[j++] = auth; } if (SaveServerAuthorizations (d, auths, j)) { d->authorizations = auths; d->authNum = j; } else { for (i = 0; i < j; i++) XauDisposeAuth (auths[i]); free ((char *) auths); } } /* * Set the authorization to use for xdm's initial connection * to the X server. Cannot use user-based authorizations * because no one has logged in yet, so we don't have any * user credentials. * Well, actually we could use SUN-DES-1 because we tell the server * to allow root in. This is bogus and should be fixed. */ void SetAuthorization (struct display *d) { register Xauth **auth = d->authorizations; int i; for (i = 0; i < d->authNum; i++) { if (auth[i]->name_length == 9 && memcmp(auth[i]->name, "SUN-DES-1", 9) == 0) continue; if (auth[i]->name_length == 14 && memcmp(auth[i]->name, "MIT-KERBEROS-5", 14) == 0) continue; XSetAuthorization (auth[i]->name, (int) auth[i]->name_length, auth[i]->data, (int) auth[i]->data_length); } } static int openFiles (char *name, char *new_name, FILE **oldp, FILE **newp) { int mask; strcpy (new_name, name); strcat (new_name, "-n"); mask = umask (0077); (void) unlink (new_name); *newp = fopen (new_name, "w"); (void) umask (mask); if (!*newp) { WDMDebug("can't open new file %s\n", new_name); return 0; } *oldp = fopen (name, "r"); WDMDebug("opens succeeded %s %s\n", name, new_name); return 1; } static int binaryEqual (char *a, char *b, unsigned short len) { while (len-- > 0) if (*a++ != *b++) return FALSE; return TRUE; } static void dumpBytes (unsigned short len, char *data) { unsigned short i; WDMDebug("%d: ", len); for (i = 0; i < len; i++) WDMDebug("%02x ", data[i] & 0377); WDMDebug("\n"); } static void dumpAuth (Xauth *auth) { WDMDebug("family: %d\n", auth->family); WDMDebug("addr: "); dumpBytes(auth->address_length, auth->address); WDMDebug("number: "); dumpBytes(auth->number_length, auth->number); WDMDebug("name: "); dumpBytes(auth->name_length, auth->name); WDMDebug("data: "); dumpBytes(auth->data_length, auth->data); } struct addrList { unsigned short family; unsigned short address_length; char *address; unsigned short number_length; char *number; unsigned short name_length; char *name; struct addrList *next; }; static struct addrList *addrs; static void initAddrs (void) { addrs = 0; } static void doneAddrs (void) { struct addrList *a, *n; for (a = addrs; a; a = n) { n = a->next; if (a->address) free (a->address); if (a->number) free (a->number); free ((char *) a); } } static int checkEntry (Xauth *auth); static void saveEntry (Xauth *auth) { struct addrList *new; new = (struct addrList *) malloc (sizeof (struct addrList)); if (!new) { WDMError("saveEntry: out of memory"); return; } if ((new->address_length = auth->address_length) > 0) { new->address = malloc (auth->address_length); if (!new->address) { WDMError("saveEntry: out of memory"); free ((char *) new); return; } memmove( new->address, auth->address, (int) auth->address_length); } else new->address = 0; if ((new->number_length = auth->number_length) > 0) { new->number = malloc (auth->number_length); if (!new->number) { WDMError("saveEntry: out of memory"); free (new->address); free ((char *) new); return; } memmove( new->number, auth->number, (int) auth->number_length); } else new->number = 0; if ((new->name_length = auth->name_length) > 0) { new->name = malloc (auth->name_length); if (!new->name) { WDMError("saveEntry: out of memory"); free (new->number); free (new->address); free ((char *) new); return; } memmove( new->name, auth->name, (int) auth->name_length); } else new->name = 0; new->family = auth->family; new->next = addrs; addrs = new; } static int checkEntry (Xauth *auth) { struct addrList *a; for (a = addrs; a; a = a->next) { if (a->family == auth->family && a->address_length == auth->address_length && binaryEqual (a->address, auth->address, auth->address_length) && a->number_length == auth->number_length && binaryEqual (a->number, auth->number, auth->number_length) && a->name_length == auth->name_length && binaryEqual (a->name, auth->name, auth->name_length)) { return 1; } } return 0; } static int doWrite; static void writeAuth (FILE *file, Xauth *auth) { if (debugLevel.i >= 15) { /* normally too verbose */ WDMDebug("writeAuth: doWrite = %d\n", doWrite); dumpAuth (auth); /* does Debug only */ } if (doWrite) XauWriteAuth (file, auth); } static void writeAddr ( int family, int addr_length, char *addr, FILE *file, Xauth *auth) { auth->family = (unsigned short) family; auth->address_length = addr_length; auth->address = addr; WDMDebug("writeAddr: writing and saving an entry\n"); writeAuth (file, auth); saveEntry (auth); } static void DefineLocal (FILE *file, Xauth *auth) { char displayname[100]; char tmp_displayname[100]; strcpy(tmp_displayname, ""); /* stolen from xinit.c */ /* Make sure this produces the same string as _XGetHostname in lib/X/XlibInt.c. * Otherwise, Xau will not be able to find your cookies in the Xauthority file. * * Note: POSIX says that the ``nodename'' member of utsname does _not_ have * to have sufficient information for interfacing to the network, * and so, you may be better off using gethostname (if it exists). */ #ifdef NEED_UTSNAME /* hpux: * Why not use gethostname()? Well, at least on my system, I've had to * make an ugly kernel patch to get a name longer than 8 characters, and * uname() lets me access to the whole string (it smashes release, you * see), whereas gethostname() kindly truncates it for me. */ { struct utsname name; uname(&name); strcpy(displayname, name.nodename); } writeAddr (FamilyLocal, strlen (displayname), displayname, file, auth); strcpy(tmp_displayname, displayname); #endif #if (!defined(NEED_UTSNAME) || defined (hpux)) /* AIXV3: * In AIXV3, _POSIX_SOURCE is defined, but uname gives only first * field of hostname. Thus, we use gethostname instead. */ /* * For HP-UX, HP's Xlib expects a fully-qualified domain name, which * is achieved by using gethostname(). For compatability, we must * also still create the entry using uname() above. */ gethostname(displayname, sizeof(displayname)); /* * If gethostname and uname both returned the same name, * do not write a duplicate entry. */ if (strcmp (displayname, tmp_displayname)) writeAddr (FamilyLocal, strlen (displayname), displayname, file, auth); #endif } #ifdef SYSV_SIOCGIFCONF /* Deal with different SIOCGIFCONF ioctl semantics on SYSV, SVR4 */ static int ifioctl (int fd, int cmd, char *arg) { struct strioctl ioc; int ret; bzero((char *) &ioc, sizeof(ioc)); ioc.ic_cmd = cmd; ioc.ic_timout = 0; if (cmd == SIOCGIFCONF) { ioc.ic_len = ((struct ifconf *) arg)->ifc_len; ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf; #ifdef ISC /* SIOCGIFCONF is somewhat brain damaged on ISC. The argument * buffer must contain the ifconf structure as header. Ifc_req * is also not a pointer but a one element array of ifreq * structures. On return this array is extended by enough * ifreq fields to hold all interfaces. The return buffer length * is placed in the buffer header. */ ((struct ifconf *) ioc.ic_dp)->ifc_len = ioc.ic_len - sizeof(struct ifconf); #endif } else { ioc.ic_len = sizeof(struct ifreq); ioc.ic_dp = arg; } ret = ioctl(fd, I_STR, (char *) &ioc); if (ret >= 0 && cmd == SIOCGIFCONF) #ifdef SVR4 ((struct ifconf *) arg)->ifc_len = ioc.ic_len; #endif #ifdef ISC { ((struct ifconf *) arg)->ifc_len = ((struct ifconf *)ioc.ic_dp)->ifc_len; ((struct ifconf *) arg)->ifc_buf = (caddr_t)((struct ifconf *)ioc.ic_dp)->ifc_req; } #endif return(ret); } #else /* SYSV_SIOCGIFCONF */ #define ifioctl ioctl #endif /* SYSV_SIOCGIFCONF */ #ifdef WINTCP /* NCR with Wollongong TCP */ #include #include #include #include #include #include #include #include #include static void DefineSelf (int fd, FILE *file, Xauth *auth) { /* * The Wollongong drivers used by NCR SVR4/MP-RAS don't understand the * socket IO calls that most other drivers seem to like. Because of * this, this routine must be special cased for NCR. Eventually, * this will be cleared up. */ struct ipb ifnet; struct in_ifaddr ifaddr; struct strioctl str; unsigned char *addr; int len, ipfd; if ((ipfd = open ("/dev/ip", O_RDWR, 0 )) < 0) LogError ("Getting interface configuration"); /* Indicate that we want to start at the begining */ ifnet.ib_next = (struct ipb *) 1; while (ifnet.ib_next) { str.ic_cmd = IPIOC_GETIPB; str.ic_timout = 0; str.ic_len = sizeof (struct ipb); str.ic_dp = (char *) &ifnet; if (ioctl (ipfd, (int) I_STR, (char *) &str) < 0) { close (ipfd); LogError ("Getting interface configuration"); } ifaddr.ia_next = (struct in_ifaddr *) ifnet.if_addrlist; str.ic_cmd = IPIOC_GETINADDR; str.ic_timout = 0; str.ic_len = sizeof (struct in_ifaddr); str.ic_dp = (char *) &ifaddr; if (ioctl (ipfd, (int) I_STR, (char *) &str) < 0) { close (ipfd); LogError ("Getting interface configuration"); } /* * Ignore the 127.0.0.1 entry. */ if (IA_SIN(&ifaddr)->sin_addr.s_addr == htonl(0x7f000001) ) continue; writeAddr (FamilyInternet, 4, (char *)&(IA_SIN(&ifaddr)->sin_addr), file, auth); } close(ipfd); } #else /* WINTCP */ #ifdef SIOCGIFCONF /* Handle variable length ifreq in BNR2 and later */ #ifdef VARIABLE_IFREQ #define ifr_size(p) (sizeof (struct ifreq) + \ (p->ifr_addr.sa_len > sizeof (p->ifr_addr) ? \ p->ifr_addr.sa_len - sizeof (p->ifr_addr) : 0)) #else #define ifr_size(p) (sizeof (struct ifreq)) #endif /* Define this host for access control. Find all the hosts the OS knows about * for this fd and add them to the selfhosts list. */ static void DefineSelf (int fd, FILE *file, Xauth *auth) { char buf[2048], *cp, *cplim; struct ifconf ifc; int len; char *addr; int family; register struct ifreq *ifr; ifc.ifc_len = sizeof (buf); ifc.ifc_buf = buf; if (ifioctl (fd, SIOCGIFCONF, (char *) &ifc) < 0) WDMError("Trouble getting network interface configuration"); #ifdef ISC #define IFC_IFC_REQ (struct ifreq *) ifc.ifc_buf #else #define IFC_IFC_REQ ifc.ifc_req #endif cplim = (char *) IFC_IFC_REQ + ifc.ifc_len; for (cp = (char *) IFC_IFC_REQ; cp < cplim; cp += ifr_size (ifr)) { ifr = (struct ifreq *) cp; if (ConvertAddr ((XdmcpNetaddr) &ifr->ifr_addr, &len, &addr) < 0) continue; if (len == 0) { WDMDebug("Skipping zero length address\n"); continue; } /* * don't write out 'localhost' entries, as * they may conflict with other local entries. * DefineLocal will always be called to add * the local entry anyway, so this one can * be tossed. */ if (len == 4 && addr[0] == 127 && addr[1] == 0 && addr[2] == 0 && addr[3] == 1) { WDMDebug("Skipping localhost address\n"); continue; } family = FamilyInternet; WDMDebug("DefineSelf: write network address, length %d\n", len); writeAddr (family, len, addr, file, auth); } } #else /* SIOCGIFCONF */ /* Define this host for access control. Find all the hosts the OS knows about * for this fd and add them to the selfhosts list. */ static void DefineSelf (int fd, int file, int auth) { register int n; int len; caddr_t addr; int family; struct utsname name; register struct hostent *hp; union { struct sockaddr sa; struct sockaddr_in in; } saddr; struct sockaddr_in *inetaddr; /* hpux: * Why not use gethostname()? Well, at least on my system, I've had to * make an ugly kernel patch to get a name longer than 8 characters, and * uname() lets me access to the whole string (it smashes release, you * see), whereas gethostname() kindly truncates it for me. */ uname(&name); hp = gethostbyname (name.nodename); if (hp != NULL) { saddr.sa.sa_family = hp->h_addrtype; inetaddr = (struct sockaddr_in *) (&(saddr.sa)); memmove( (char *) &(inetaddr->sin_addr), (char *) hp->h_addr, (int) hp->h_length); family = ConvertAddr ( &(saddr.sa), &len, &addr); if ( family >= 0) { writeAddr (FamilyInternet, sizeof (inetaddr->sin_addr), (char *) (&inetaddr->sin_addr), file, auth); } } } #endif /* SIOCGIFCONF else */ #endif /* WINTCP else */ static void setAuthNumber (Xauth *auth, char *name) { char *colon; char *dot, *number; WDMDebug("setAuthNumber %s\n", name); colon = strrchr(name, ':'); if (colon) { ++colon; dot = strchr(colon, '.'); if (dot) auth->number_length = dot - colon; else auth->number_length = strlen (colon); number = malloc (auth->number_length + 1); if (number) { strncpy (number, colon, auth->number_length); number[auth->number_length] = '\0'; } else { WDMError("setAuthNumber: out of memory"); auth->number_length = 0; } auth->number = number; WDMDebug("setAuthNumber: %s\n", number); } } static void writeLocalAuth (FILE *file, Xauth *auth, char *name) { int fd; WDMDebug("writeLocalAuth: %s %.*s\n", name, auth->name_length, auth->name); setAuthNumber (auth, name); #ifdef TCPCONN fd = socket (AF_INET, SOCK_STREAM, 0); DefineSelf (fd, file, auth); close (fd); #endif DefineLocal (file, auth); } #ifdef XDMCP static void writeRemoteAuth (FILE *file, Xauth *auth, XdmcpNetaddr peer, int peerlen, char *name) { int family = FamilyLocal; char *addr; WDMDebug("writeRemoteAuth: %s %.*s\n", name, auth->name_length, auth->name); if (!peer || peerlen < 2) return; setAuthNumber (auth, name); family = ConvertAddr (peer, &peerlen, &addr); WDMDebug("writeRemoteAuth: family %d\n", family); if (family != FamilyLocal) { /* WDMDebug("writeRemoteAuth: %d, %d, %x\n", family, peerlen, *(int *)addr);*/ writeAddr (family, peerlen, addr, file, auth); } else { writeLocalAuth (file, auth, name); } } #endif /* XDMCP */ void SetUserAuthorization (struct display *d, struct verify_info *verify) { FILE *old, *new; char home_name[1024], backup_name[1024], new_name[1024]; char *name = 0; const char *home; char *envname = 0; int lockStatus; Xauth *entry, **auths; int setenv = 0; struct stat statb; int i; int magicCookie; int data_len; WDMDebug("SetUserAuthorization\n"); auths = d->authorizations; if (auths) { home = WDMGetEnv(verify->userEnviron, "HOME"); lockStatus = LOCK_ERROR; if (home) { strcpy (home_name, home); if (home[strlen(home) - 1] != '/') strcat (home_name, "/"); strcat (home_name, ".Xauthority"); WDMDebug("XauLockAuth %s\n", home_name); lockStatus = XauLockAuth (home_name, 1, 2, 10); WDMDebug("Lock is %d\n", lockStatus); if (lockStatus == LOCK_SUCCESS) { if (openFiles (home_name, new_name, &old, &new)) { name = home_name; setenv = 0; } else { WDMDebug("openFiles failed\n"); XauUnlockAuth (home_name); lockStatus = LOCK_ERROR; } } } if (lockStatus != LOCK_SUCCESS) { sprintf (backup_name, "%s/.XauthXXXXXX", d->userAuthDir); #ifdef HAVE_MKSTEMP (void) mkstemp (backup_name); #else (void) mktemp (backup_name); #endif lockStatus = XauLockAuth (backup_name, 1, 2, 10); WDMDebug("backup lock is %d\n", lockStatus); if (lockStatus == LOCK_SUCCESS) { if (openFiles (backup_name, new_name, &old, &new)) { name = backup_name; setenv = 1; } else { XauUnlockAuth (backup_name); lockStatus = LOCK_ERROR; } } } if (lockStatus != LOCK_SUCCESS) { WDMDebug("can't lock auth file %s or backup %s\n", home_name, backup_name); WDMError("can't lock authorization file %s or backup %s\n", home_name, backup_name); return; } initAddrs (); doWrite = 1; WDMDebug("%d authorization protocols for %s\n", d->authNum, d->name); /* * Write MIT-MAGIC-COOKIE-1 authorization first, so that * R4 clients which only knew that, and used the first * matching entry will continue to function */ magicCookie = -1; for (i = 0; i < d->authNum; i++) { if (auths[i]->name_length == 18 && !strncmp (auths[i]->name, "MIT-MAGIC-COOKIE-1", 18)) { magicCookie = i; if (d->displayType.location == Local) writeLocalAuth (new, auths[i], d->name); #ifdef XDMCP else writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name); #endif break; } } /* now write other authorizations */ for (i = 0; i < d->authNum; i++) { if (i != magicCookie) { data_len = auths[i]->data_length; /* client will just use default Kerberos cache, so don't * even write cache info into the authority file. */ if (auths[i]->name_length == 14 && !strncmp (auths[i]->name, "MIT-KERBEROS-5", 14)) auths[i]->data_length = 0; if (d->displayType.location == Local) writeLocalAuth (new, auths[i], d->name); #ifdef XDMCP else writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name); #endif auths[i]->data_length = data_len; } } if (old) { if (fstat (fileno (old), &statb) != -1) chmod (new_name, (int) (statb.st_mode & 0777)); /*SUPPRESS 560*/ while ((entry = XauReadAuth (old))) { if (!checkEntry (entry)) { WDMDebug("Writing an entry\n"); writeAuth (new, entry); } XauDisposeAuth (entry); } fclose (old); } doneAddrs (); fclose (new); if (unlink (name) == -1) WDMDebug("unlink %s failed\n", name); envname = name; if (link (new_name, name) == -1) { WDMDebug("link failed %s %s\n", new_name, name); WDMError("Can't move authorization into place\n"); setenv = 1; envname = new_name; } else { WDMDebug("new is in place, go for it!\n"); unlink (new_name); } if (setenv) { verify->userEnviron = WDMSetEnv(verify->userEnviron, "XAUTHORITY", envname); verify->systemEnviron = WDMSetEnv(verify->systemEnviron, "XAUTHORITY", envname); } XauUnlockAuth (name); if (envname) chown (envname, verify->uid, verify->gid); } WDMDebug("done SetUserAuthorization\n"); } void RemoveUserAuthorization (struct display *d, struct verify_info *verify) { const char *home; Xauth **auths, *entry; char name[1024], new_name[1024]; int lockStatus; FILE *old, *new; struct stat statb; int i; if (!(auths = d->authorizations)) return; home = WDMGetEnv(verify->userEnviron, "HOME"); if (!home) return; WDMDebug("RemoveUserAuthorization\n"); strcpy (name, home); if (home[strlen(home) - 1] != '/') strcat (name, "/"); strcat (name, ".Xauthority"); WDMDebug("XauLockAuth %s\n", name); lockStatus = XauLockAuth (name, 1, 2, 10); WDMDebug("Lock is %d\n", lockStatus); if (lockStatus != LOCK_SUCCESS) return; if (openFiles (name, new_name, &old, &new)) { initAddrs (); doWrite = 0; for (i = 0; i < d->authNum; i++) { if (d->displayType.location == Local) writeLocalAuth (new, auths[i], d->name); #ifdef XDMCP else writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name); #endif } doWrite = 1; if (old) { if (fstat (fileno (old), &statb) != -1) chmod (new_name, (int) (statb.st_mode & 0777)); /*SUPPRESS 560*/ while ((entry = XauReadAuth (old))) { if (!checkEntry (entry)) { WDMDebug("Writing an entry\n"); writeAuth (new, entry); } XauDisposeAuth (entry); } fclose (old); } doneAddrs (); fclose (new); if (unlink (name) == -1) WDMDebug("unlink %s failed\n", name); if (link (new_name, name) == -1) { WDMDebug("link failed %s %s\n", new_name, name); WDMError("Can't move authorization into place\n"); } else { WDMDebug("new is in place, go for it!\n"); unlink (new_name); } } XauUnlockAuth (name); } wdm-1.28/src/wdm/choose.c 644 0 0 2467610221265060 147050ustar AlexeyVoinov 0 0/* * $Xorg: choose.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ * Copyright 1990, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Keith Packard, MIT X Consortium */ /* $XFree86: xc/programs/xdm/choose.c,v 3.15 2001/12/14 20:01:20 dawes Exp $ */ /* * choose.c * * xdm interface to chooser program */ #include #ifdef XDMCP #include #include #include #ifndef X_NO_SYS_UN #ifndef Lynx #include #else #include #endif #endif #include #include #include #define Time_t time_t #include static int FormatBytes ( unsigned char *data, int length, char *buf, int buflen) { int i; static char HexChars[] = "0123456789abcdef"; if (buflen < length * 2 + 1) return 0; for (i = 0; i < length; i++) { *buf++ = HexChars[(data[i] >> 4) & 0xf]; *buf++ = HexChars[(data[i]) & 0xf]; } *buf++ = '\0'; return 1; } static int FormatARRAY8 ( ARRAY8Ptr a, char *buf, int buflen) { return FormatBytes (a->data, a->length, buf, buflen); } /* Converts an Internet address in ARRAY8 format to a string in familiar dotted address notation, e.g., "18.24.0.11" Returns 1 if successful, 0 if not. */ static int ARRAY8ToDottedDecimal ( ARRAY8Ptr a, char *buf, int buflen) { if (a->length != 4 || buflen < 20) return 0; sprintf(buf, "%d.%d.%d.%d", a->data[0], a->data[1], a->data[2], a->data[3]); return 1; } typedef struct _IndirectUsers { struct _IndirectUsers *next; ARRAY8 client; CARD16 connectionType; } IndirectUsersRec, *IndirectUsersPtr; static IndirectUsersPtr indirectUsers; int RememberIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType) { IndirectUsersPtr i; for (i = indirectUsers; i; i = i->next) if (XdmcpARRAY8Equal (clientAddress, &i->client) && connectionType == i->connectionType) return 1; i = (IndirectUsersPtr) malloc (sizeof (IndirectUsersRec)); if (!XdmcpCopyARRAY8 (clientAddress, &i->client)) { free ((char *) i); return 0; } i->connectionType = connectionType; i->next = indirectUsers; indirectUsers = i; return 1; } void ForgetIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType) { IndirectUsersPtr i, prev; prev = 0; for (i = indirectUsers; i; i = i->next) { if (XdmcpARRAY8Equal (clientAddress, &i->client) && connectionType == i->connectionType) { if (prev) prev->next = i->next; else indirectUsers = i->next; XdmcpDisposeARRAY8 (&i->client); free ((char *) i); break; } prev = i; } } int IsIndirectClient ( ARRAY8Ptr clientAddress, CARD16 connectionType) { IndirectUsersPtr i; for (i = indirectUsers; i; i = i->next) if (XdmcpARRAY8Equal (clientAddress, &i->client) && connectionType == i->connectionType) return 1; return 0; } static int FormatChooserArgument (char *buf, int len) { unsigned char addr_buf[1024]; int addr_len = sizeof (addr_buf); unsigned char result_buf[1024]; int result_len = 0; int netfamily; if (GetChooserAddr ((char *)addr_buf, &addr_len) == -1) { WDMError("Cannot get return address for chooser socket\n"); WDMDebug("Cannot get chooser socket address\n"); return 0; } netfamily = NetaddrFamily((XdmcpNetaddr)addr_buf); switch (netfamily) { case AF_INET: { char *port; int portlen; ARRAY8Ptr localAddress; port = NetaddrPort((XdmcpNetaddr)addr_buf, &portlen); result_buf[0] = netfamily >> 8; result_buf[1] = netfamily & 0xFF; result_buf[2] = port[0]; result_buf[3] = port[1]; localAddress = getLocalAddress (); memmove( (char *)result_buf+4, (char *)localAddress->data, 4); result_len = 8; } break; default: WDMDebug("Chooser family %d isn't known\n", netfamily); return 0; } return FormatBytes (result_buf, result_len, buf, len); } typedef struct _Choices { struct _Choices *next; ARRAY8 client; CARD16 connectionType; ARRAY8 choice; Time_t time; } ChoiceRec, *ChoicePtr; static ChoicePtr choices; ARRAY8Ptr IndirectChoice ( ARRAY8Ptr clientAddress, CARD16 connectionType) { ChoicePtr c, next, prev; Time_t now; now = time ((Time_t*)0); prev = 0; for (c = choices; c; c = next) { next = c->next; WDMDebug("Choice checking timeout: %ld >? %d\n", (long)(now - c->time), choiceTimeout.i); if (now - c->time > (Time_t)choiceTimeout.i) { WDMDebug("Timeout choice %ld > %d\n", (long)(now - c->time), choiceTimeout.i); if (prev) prev->next = next; else choices = next; XdmcpDisposeARRAY8 (&c->client); XdmcpDisposeARRAY8 (&c->choice); free ((char *) c); } else { if (XdmcpARRAY8Equal (clientAddress, &c->client) && connectionType == c->connectionType) return &c->choice; prev = c; } } return 0; } static int RegisterIndirectChoice ( ARRAY8Ptr clientAddress, CARD16 connectionType, ARRAY8Ptr choice) { ChoicePtr c; int insert; int found = 0; WDMDebug("Got indirect choice back\n"); for (c = choices; c; c = c->next) { if (XdmcpARRAY8Equal (clientAddress, &c->client) && connectionType == c->connectionType) { found = 1; break; } } #if 0 if (!found) return 0; #endif insert = 0; if (!c) { c = (ChoicePtr) malloc (sizeof (ChoiceRec)); insert = 1; if (!c) return 0; c->connectionType = connectionType; if (!XdmcpCopyARRAY8 (clientAddress, &c->client)) { free ((char *) c); return 0; } } else { XdmcpDisposeARRAY8 (&c->choice); } if (!XdmcpCopyARRAY8 (choice, &c->choice)) { XdmcpDisposeARRAY8 (&c->client); free ((char *) c); return 0; } if (insert) { c->next = choices; choices = c; } c->time = time (0); return 1; } #ifdef notdef static RemoveIndirectChoice (clientAddress, connectionType) ARRAY8Ptr clientAddress; CARD16 connectionType; { ChoicePtr c, prev; prev = 0; for (c = choices; c; c = c->next) { if (XdmcpARRAY8Equal (clientAddress, &c->client) && connectionType == c->connectionType) { if (prev) prev->next = c->next; else choices = c->next; XdmcpDisposeARRAY8 (&c->client); XdmcpDisposeARRAY8 (&c->choice); free ((char *) c); return; } prev = c; } } #endif /*ARGSUSED*/ static void AddChooserHost ( CARD16 connectionType, ARRAY8Ptr addr, char *closure) { char ***argp; char hostbuf[1024]; argp = (char ***) closure; if (addr->length == strlen ("BROADCAST") && !strncmp ((char *)addr->data, "BROADCAST", addr->length)) { *argp = parseArgs (*argp, "BROADCAST"); } else if (ARRAY8ToDottedDecimal (addr, hostbuf, sizeof (hostbuf))) { *argp = parseArgs (*argp, hostbuf); } } void ProcessChooserSocket (int fd) { int client_fd; char buf[1024]; int len; XdmcpBuffer buffer; ARRAY8 clientAddress; CARD16 connectionType; ARRAY8 choice; WDMDebug("Process chooser socket\n"); len = sizeof (buf); client_fd = accept (fd, (struct sockaddr *)buf, (void *)&len); if (client_fd == -1) { WDMError("Cannot accept chooser connection\n"); return; } WDMDebug("Accepted %d\n", client_fd); len = read (client_fd, buf, sizeof (buf)); WDMDebug("Read returns %d\n", len); if (len > 0) { buffer.data = (BYTE *) buf; buffer.size = sizeof (buf); buffer.count = len; buffer.pointer = 0; clientAddress.data = 0; clientAddress.length = 0; choice.data = 0; choice.length = 0; if (XdmcpReadARRAY8 (&buffer, &clientAddress)) { if (XdmcpReadCARD16 (&buffer, &connectionType)) { if (XdmcpReadARRAY8 (&buffer, &choice)) { WDMDebug("Read from chooser succesfully\n"); RegisterIndirectChoice (&clientAddress, connectionType, &choice); XdmcpDisposeARRAY8 (&choice); } else { WDMError("Invalid choice response length %d\n", len); } } else { WDMError("Invalid choice response length %d\n", len); } XdmcpDisposeARRAY8 (&clientAddress); } else { WDMError("Invalid choice response length %d\n", len); } } else { WDMError("Choice response read error: %s\n", strerror(errno)); } close (client_fd); } void RunChooser (struct display *d) { char **args; char buf[1024]; char **env; WDMDebug("RunChooser %s\n", d->name); #ifndef HAS_SETPROCTITLE SetTitle (d->name, "chooser", (char *) 0); #else setproctitle("chooser %s", d->name); #endif LoadXloginResources (d); args = parseArgs ((char **) 0, d->chooser); strcpy (buf, "-xdmaddress "); if (FormatChooserArgument (buf + strlen (buf), sizeof (buf) - strlen (buf))) args = parseArgs (args, buf); strcpy (buf, "-clientaddress "); if (FormatARRAY8 (&d->clientAddr, buf + strlen (buf), sizeof (buf) - strlen (buf))) args = parseArgs (args, buf); sprintf (buf, "-connectionType %d", d->connectionType); args = parseArgs (args, buf); ForEachChooserHost (&d->clientAddr, d->connectionType, AddChooserHost, (char *) &args); env = systemEnv (d, (char *) 0, (char *) 0); WDMDebug("Running %s\n", args[0]); execute (args, env); WDMDebug("Couldn't run %s\n", args[0]); WDMError("Cannot execute %s\n", args[0]); exit (REMANAGE_DISPLAY); } #endif /* XDMCP */ wdm-1.28/src/wdm/daemon.c 644 0 0 770610221265060 146430ustar AlexeyVoinov 0 0/* $Xorg: daemon.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/daemon.c,v 3.17 2001/12/14 20:01:21 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium */ #include #if defined(SVR4) || defined(USG) #include #else #include #endif #if defined(__osf__) || defined(linux) || defined(__GNU__) || defined(__CYGWIN__) \ || (defined(IRIX) && !defined(_IRIX4)) #define setpgrp setpgid #endif #ifdef hpux #include #endif #include #include #ifdef X_NOT_POSIX #define Pid_t int #else #define Pid_t pid_t #endif #include #include #include void BecomeOrphan (void) { Pid_t child_id; #ifndef CSRG_BASED int stat; #endif /* * fork so that the process goes into the background automatically. Also * has a nice side effect of having the child process get inherited by * init (pid 1). * Separate the child into its own process group before the parent * exits. This eliminates the possibility that the child might get * killed when the init script that's running xdm exits. */ child_id = fork(); switch (child_id) { case 0: /* child */ break; case -1: /* error */ WDMError("daemon fork failed, errno = %d\n", errno); break; default: /* parent */ #ifndef CSRG_BASED #if defined(SVR4) || defined(__QNXNTO__) stat = setpgid(child_id, child_id); /* This gets error EPERM. Why? */ #else #if defined(SYSV) stat = 0; /* don't know how to set child's process group */ #else stat = setpgrp(child_id, child_id); if (stat != 0) WDMError("setting process grp for daemon failed, errno = %d\n", errno); #endif #endif #endif /* !CSRG_BASED */ exit (0); } } void BecomeDaemon (void) { #ifndef CSRG_BASED register int i; /* * Close standard file descriptors and get rid of controlling tty */ #if defined(SYSV) || defined(SVR4) || defined(__QNXNTO__) setpgrp (); #else setpgrp (0, getpid()); #endif close (0); close (1); close (2); #ifndef __EMX__ #if !((defined(SYSV) || defined(SVR4)) && defined(i386)) && !defined(__CYGWIN__) if ((i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */ #if defined(USG) && defined(TCCLRCTTY) int zero = 0; (void) ioctl (i, TCCLRCTTY, &zero); #else #if (defined(SYSV) || defined(SVR4)) && defined(TIOCTTY) int zero = 0; (void) ioctl (i, TIOCTTY, &zero); #else (void) ioctl (i, TIOCNOTTY, (char *) 0); /* detach, BSD style */ #endif #endif (void) close (i); } #endif /* !((SYSV || SVR4) && i386) */ #endif /* !__EMX__ */ /* * Set up the standard file descriptors. */ (void) open ("/", O_RDONLY); /* root inode already in core */ (void) dup2 (0, 1); (void) dup2 (0, 2); #else daemon (0, 0); #endif /* CSRG_BASED */ } wdm-1.28/src/wdm/dm.c 644 0 0 4663310221265060 140220ustar AlexeyVoinov 0 0/* $Xorg: dm.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/dm.c,v 3.19 2001/12/14 20:01:21 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * display manager */ # include #include # include # include #ifdef X_POSIX_C_SOURCE #define _POSIX_C_SOURCE X_POSIX_C_SOURCE #include #undef _POSIX_C_SOURCE #else #if defined(X_NOT_POSIX) || defined(_POSIX_SOURCE) #include #else #define _POSIX_SOURCE #include #undef _POSIX_SOURCE #endif #endif #ifdef __NetBSD__ #include #endif #ifndef sigmask #define sigmask(m) (1 << ((m - 1))) #endif # include # include # include # include #ifndef F_TLOCK #ifndef X_NOT_POSIX # include #endif #endif #include #if defined(SVR4) && !defined(SCO) extern FILE *fdopen(); #endif static SIGVAL StopAll (int n), RescanNotify (int n); static void RescanServers (void); static void RestartDisplay (struct display *d, int forceReserver); static void ScanServers (void); static void SetAccessFileTime (void); static void SetConfigFileTime (void); static void StartDisplays (void); static void TerminateProcess (int pid, int signal); int Rescan; static long ServersModTime, ConfigModTime, AccessFileModTime; #ifndef NOXDMTITLE static char *Title; static int TitleLen; #endif #ifndef UNRELIABLE_SIGNALS static SIGVAL ChildNotify (int n); #endif static int StorePid (void); static int parent_pid = -1; /* PID of parent xdm process */ int main (int argc, char **argv) { int oldpid, oldumask; char cmdbuf[1024]; int debugMode = 0; /* make sure at least world write access is disabled */ if (((oldumask = umask(022)) & 002) == 002) (void) umask (oldumask); #ifndef NOXDMTITLE Title = argv[0]; TitleLen = (argv[argc - 1] + strlen(argv[argc - 1])) - Title; #endif /* * Step 1 - load configuration parameters */ InitResources (argc, argv); SetConfigFileTime (); LoadDMResources (); /* * Only allow root to run in non-debug mode to avoid problems */ debugMode = (debugLevel.i > WDM_LEVEL_WARNING); if (!debugMode && getuid() != 0) { fprintf (stderr, "Only root wants to run %s\n", argv[0]); exit (1); } if (!debugMode && daemonMode.i) { BecomeOrphan (); BecomeDaemon (); } /* SUPPRESS 560 */ if ((oldpid = StorePid ())) { if (oldpid == -1) WDMError("Can't create/lock pid file %s\n", pidFile); else WDMError("Can't lock pid file %s, another xdm is running " "(pid %d)\n", pidFile, oldpid); exit (1); } WDMLogLevel(debugLevel.i); if(useSyslog.i) { WDMUseSysLog("wdm", WDMStringToFacility(syslogFacility)); } else if(errorLogFile && *errorLogFile) { int f; if((f = open(errorLogFile, O_CREAT | O_WRONLY | O_APPEND, 0600)) == -1) WDMError("cannot open errorLogFile %s\n", errorLogFile); else WDMLogStream(fdopen(f, "w")); } /* redirect any messages for stderr into standard logging functions. */ WDMRedirectStderr(WDM_LEVEL_ERROR); /* Clean up any old Authorization files */ sprintf(cmdbuf, "/bin/rm -f %s/authdir/authfiles/A*", authDir); system(cmdbuf); #ifdef XDMCP init_session_id (); CreateWellKnownSockets (); #else WDMDebug("xdm: not compiled for XDMCP\n"); #endif parent_pid = getpid (); (void) Signal (SIGTERM, StopAll); (void) Signal (SIGINT, StopAll); /* * Step 2 - Read /etc/Xservers and set up * the socket. * * Keep a sub-daemon running * for each entry */ SetAccessFileTime (); #ifdef XDMCP ScanAccessDatabase (); #endif ScanServers (); StartDisplays (); (void) Signal (SIGHUP, RescanNotify); #ifndef UNRELIABLE_SIGNALS (void) Signal (SIGCHLD, ChildNotify); #endif while ( #ifdef XDMCP AnyWellKnownSockets() || #endif AnyDisplaysLeft ()) { if (Rescan) { RescanServers (); Rescan = 0; } #if defined(UNRELIABLE_SIGNALS) || !defined(XDMCP) WaitForChild (); #else WaitForSomething (); #endif } WDMDebug("Nothing left to do, exiting\n"); exit(0); /*NOTREACHED*/ } /* ARGSUSED */ static SIGVAL RescanNotify (int n) { int olderrno = errno; WDMDebug("Caught SIGHUP\n"); Rescan = 1; #ifdef SIGNALS_RESET_WHEN_CAUGHT (void) Signal (SIGHUP, RescanNotify); #endif errno = olderrno; } static void ScanServers (void) { char lineBuf[10240]; int len; FILE *serversFile; struct stat statb; static DisplayType acceptableTypes[] = { { Local, Permanent, FromFile }, { Foreign, Permanent, FromFile }, }; #define NumTypes (sizeof (acceptableTypes) / sizeof (acceptableTypes[0])) if (servers[0] == '/') { serversFile = fopen (servers, "r"); if (serversFile == NULL) { WDMError("cannot access servers file %s\n", servers); return; } if (ServersModTime == 0) { fstat (fileno (serversFile), &statb); ServersModTime = statb.st_mtime; } while (fgets (lineBuf, sizeof (lineBuf)-1, serversFile)) { len = strlen (lineBuf); if (lineBuf[len-1] == '\n') lineBuf[len-1] = '\0'; ParseDisplay (lineBuf, acceptableTypes, NumTypes); } fclose (serversFile); } else { ParseDisplay (servers, acceptableTypes, NumTypes); } } static void MarkDisplay (struct display *d) { d->state = MissingEntry; } static void RescanServers (void) { WDMDebug("rescanning servers\n"); WDMInfo("Rescanning both config and servers files\n"); ForEachDisplay (MarkDisplay); SetConfigFileTime (); ReinitResources (); LoadDMResources (); ScanServers (); SetAccessFileTime (); #ifdef XDMCP ScanAccessDatabase (); #endif StartDisplays (); } static void SetConfigFileTime (void) { struct stat statb; if (stat (config, &statb) != -1) ConfigModTime = statb.st_mtime; } static void SetAccessFileTime (void) { struct stat statb; if (stat (accessFile, &statb) != -1) AccessFileModTime = statb.st_mtime; } static void RescanIfMod (void) { struct stat statb; if (config && stat (config, &statb) != -1) { if (statb.st_mtime != ConfigModTime) { WDMDebug("Config file %s has changed, rereading\n", config); WDMInfo("Rereading configuration file %s\n", config); ConfigModTime = statb.st_mtime; ReinitResources (); LoadDMResources (); } } if (servers[0] == '/' && stat(servers, &statb) != -1) { if (statb.st_mtime != ServersModTime) { WDMDebug("Servers file %s has changed, rescanning\n", servers); WDMInfo("Rereading servers file %s\n", servers); ServersModTime = statb.st_mtime; ForEachDisplay (MarkDisplay); ScanServers (); } } #ifdef XDMCP if (accessFile && accessFile[0] && stat (accessFile, &statb) != -1) { if (statb.st_mtime != AccessFileModTime) { WDMDebug("Access file %s has changed, rereading\n", accessFile); WDMInfo("Rereading access file %s\n", accessFile); AccessFileModTime = statb.st_mtime; ScanAccessDatabase (); } } #endif } /* * catch a SIGTERM, kill all displays and exit */ /* ARGSUSED */ static SIGVAL StopAll (int n) { int olderrno = errno; if (parent_pid != getpid()) { /* * We are a child xdm process that was killed by the * master xdm before we were able to return from fork() * and remove this signal handler. * * See defect XWSog08655 for more information. */ WDMDebug("Child xdm caught SIGTERM before it remove that signal.\n"); (void) Signal (n, SIG_DFL); TerminateProcess (getpid(), SIGTERM); errno = olderrno; return; } WDMDebug("Shutting down entire manager\n"); #ifdef XDMCP DestroyWellKnownSockets (); #endif ForEachDisplay (StopDisplay); #ifdef SIGNALS_RESET_WHEN_CAUGHT /* to avoid another one from killing us unceremoniously */ (void) Signal (SIGTERM, StopAll); (void) Signal (SIGINT, StopAll); #endif errno = olderrno; } /* * notice that a child has died and may need another * sub-daemon started */ int ChildReady; #ifndef UNRELIABLE_SIGNALS /* ARGSUSED */ static SIGVAL ChildNotify (int n) { int olderrno = errno; ChildReady = 1; #ifdef ISC (void) Signal (SIGCHLD, ChildNotify); #endif errno = olderrno; } #endif void WaitForChild (void) { int pid; struct display *d; waitType status; #if !defined(X_NOT_POSIX) && !defined(__EMX__) sigset_t mask, omask; #else int omask; #endif #ifdef UNRELIABLE_SIGNALS /* XXX classic System V signal race condition here with RescanNotify */ if ((pid = wait (&status)) != -1) #else #ifndef X_NOT_POSIX sigemptyset(&mask); sigaddset(&mask, SIGCHLD); sigaddset(&mask, SIGHUP); sigprocmask(SIG_BLOCK, &mask, &omask); WDMDebug("signals blocked\n"); #else omask = sigblock (sigmask (SIGCHLD) | sigmask (SIGHUP)); WDMDebug("signals blocked, mask was 0x%x\n", omask); #endif if (!ChildReady && !Rescan) #ifndef X_NOT_POSIX sigsuspend(&omask); #else sigpause (omask); #endif ChildReady = 0; #ifndef X_NOT_POSIX sigprocmask(SIG_SETMASK, &omask, (sigset_t *)NULL); #else sigsetmask (omask); #endif #ifndef X_NOT_POSIX while ((pid = waitpid (-1, &status, WNOHANG)) > 0) #else while ((pid = wait3 (&status, WNOHANG, (struct rusage *) 0)) > 0) #endif #endif { WDMDebug("Manager wait returns pid: %d sig %d core %d code %d\n", pid, waitSig(status), waitCore(status), waitCode(status)); if (autoRescan.i) RescanIfMod (); /* SUPPRESS 560 */ if ((d = FindDisplayByPid (pid))) { d->pid = -1; switch (waitVal (status)) { case UNMANAGE_DISPLAY: WDMDebug("Display exited with UNMANAGE_DISPLAY\n"); StopDisplay (d); break; case OBEYSESS_DISPLAY: d->startTries = 0; WDMDebug("Display exited with OBEYSESS_DISPLAY\n"); if (d->displayType.lifetime != Permanent || d->status == zombie) StopDisplay (d); else RestartDisplay (d, FALSE); break; default: WDMDebug("Display exited with unknown status %d\n", waitVal(status)); WDMError("Unknown session exit code %d from process %d\n", waitVal (status), pid); StopDisplay (d); break; case OPENFAILED_DISPLAY: WDMDebug("Display exited with OPENFAILED_DISPLAY, try %d of %d\n", d->startTries, d->startAttempts); WDMError ("Display %s cannot be opened\n", d->name); /* * no display connection was ever made, tell the * terminal that the open attempt failed */ #ifdef XDMCP if (d->displayType.origin == FromXDMCP) SendFailed (d, "Cannot open display"); #endif if (d->displayType.origin == FromXDMCP || d->status == zombie || ++d->startTries >= d->startAttempts) { WDMError ("Display %s is being disabled\n", d->name); StopDisplay (d); } else { RestartDisplay (d, TRUE); } break; case RESERVER_DISPLAY: d->startTries = 0; WDMDebug("Display exited with RESERVER_DISPLAY\n"); if (d->displayType.origin == FromXDMCP || d->status == zombie) StopDisplay(d); else RestartDisplay (d, TRUE); { Time_t Time; time(&Time); WDMDebug("time %i %i\n", (int)Time, (int)d->lastCrash); if (d->lastCrash && ((Time - d->lastCrash) < XDM_BROKEN_INTERVAL)) { WDMDebug("Server crash frequency too high:" " removing display %s\n",d->name); WDMError("Server crash rate too high:" " removing display %s\n",d->name); RemoveDisplay (d); } else d->lastCrash = Time; } break; case waitCompose (SIGTERM,0,0): WDMDebug("Display exited on SIGTERM, try %d of %d\n", d->startTries, d->startAttempts); if (d->displayType.origin == FromXDMCP || d->status == zombie || ++d->startTries >= d->startAttempts) { WDMError ("Display %s is being disabled\n", d->name); StopDisplay(d); } else RestartDisplay (d, TRUE); break; case REMANAGE_DISPLAY: d->startTries = 0; WDMDebug("Display exited with REMANAGE_DISPLAY\n"); /* * XDMCP will restart the session if the display * requests it */ if (d->displayType.origin == FromXDMCP || d->status == zombie) StopDisplay(d); else RestartDisplay (d, FALSE); break; } } /* SUPPRESS 560 */ else if ((d = FindDisplayByServerPid (pid))) { d->serverPid = -1; switch (d->status) { case zombie: WDMDebug("Zombie server reaped, removing display %s\n", d->name); RemoveDisplay (d); break; case phoenix: WDMDebug("Phoenix server arises, restarting display %s\n", d->name); d->status = notRunning; break; case running: WDMDebug("Server for display %s terminated unexpectedly, status %d %d\n", d->name, waitVal (status), status); WDMError("Server for display %s terminated unexpectedly: %d\n", d->name, waitVal (status)); d->status = notRunning; if (d->pid != -1) { WDMDebug("Terminating session pid %d\n", d->pid); TerminateProcess (d->pid, SIGTERM); } break; case notRunning: WDMDebug("Server exited for notRunning session on display %s\n", d->name); break; } } else { WDMDebug("Unknown child termination, status %d\n", waitVal (status)); } } StartDisplays (); } static void CheckDisplayStatus (struct display *d) { if (d->displayType.origin == FromFile) { switch (d->state) { case MissingEntry: StopDisplay (d); break; case NewEntry: d->state = OldEntry; case OldEntry: if (d->status == notRunning) StartDisplay (d); break; } } } static void StartDisplays (void) { ForEachDisplay (CheckDisplayStatus); } void StartDisplay (struct display *d) { int pid; WDMDebug("StartDisplay %s\n", d->name); LoadServerResources (d); if (d->displayType.location == Local) { /* don't bother pinging local displays; we'll * certainly notice when they exit */ d->pingInterval = 0; if (d->authorize) { WDMDebug("SetLocalAuthorization %s, auth %s\n", d->name, d->authNames[0]); SetLocalAuthorization (d); /* * reset the server after writing the authorization information * to make it read the file (for compatibility with old * servers which read auth file only on reset instead of * at first connection) */ if (d->serverPid != -1 && d->resetForAuth && d->resetSignal) kill (d->serverPid, d->resetSignal); } if (d->serverPid == -1 && !StartServer (d)) { WDMError("Server for display %s can't be started, session disabled\n", d->name); RemoveDisplay (d); return; } } else { /* this will only happen when using XDMCP */ if (d->authorizations) SaveServerAuthorizations (d, d->authorizations, d->authNum); } pid = fork (); switch (pid) { case 0: CleanUpChild (); LoadSessionResources (d); SetAuthorization (d); (void) Signal (SIGPIPE, SIG_IGN); (void) Signal (SIGHUP, SIG_IGN); if (!WaitForServer (d)) exit (OPENFAILED_DISPLAY); #ifdef XDMCP if (d->useChooser) RunChooser (d); else #endif ManageSession (d); exit (REMANAGE_DISPLAY); case -1: break; default: WDMDebug("pid: %d\n", pid); d->pid = pid; d->status = running; break; } } static void TerminateProcess (int pid, int signal) { kill (pid, signal); #ifdef SIGCONT kill (pid, SIGCONT); #endif } /* * transition from running to zombie or deleted */ void StopDisplay (struct display *d) { if (d->serverPid != -1) d->status = zombie; /* be careful about race conditions */ if (d->pid != -1) TerminateProcess (d->pid, SIGTERM); if (d->serverPid != -1) TerminateProcess (d->serverPid, d->termSignal); else RemoveDisplay (d); } /* * transition from running to phoenix or notRunning */ static void RestartDisplay (struct display *d, int forceReserver) { if (d->serverPid != -1 && (forceReserver || d->terminateServer)) { TerminateProcess (d->serverPid, d->termSignal); d->status = phoenix; } else { d->status = notRunning; } } static FD_TYPE CloseMask; static int max; void RegisterCloseOnFork (int fd) { FD_SET (fd, &CloseMask); if (fd > max) max = fd; } void ClearCloseOnFork (int fd) { FD_CLR (fd, &CloseMask); if (fd == max) { while (--fd >= 0) if (FD_ISSET (fd, &CloseMask)) break; max = fd; } } void CloseOnFork (void) { int fd; for (fd = 0; fd <= max; fd++) if (FD_ISSET (fd, &CloseMask)) { close (fd); } FD_ZERO (&CloseMask); max = 0; } static int pidFd; static FILE *pidFilePtr; static int StorePid (void) { int oldpid; if (pidFile[0] != '\0') { pidFd = open (pidFile, O_RDWR); if (pidFd == -1 && errno == ENOENT) pidFd = open (pidFile, O_RDWR|O_CREAT, 0666); if (pidFd == -1 || !(pidFilePtr = fdopen (pidFd, "r+"))) { WDMError("process-id file %s cannot be opened\n", pidFile); return -1; } if (fscanf (pidFilePtr, "%d\n", &oldpid) != 1) oldpid = -1; fseek (pidFilePtr, 0l, 0); if (lockPidFile.i) { #ifdef F_SETLK #ifndef SEEK_SET #define SEEK_SET 0 #endif struct flock lock_data; lock_data.l_type = F_WRLCK; lock_data.l_whence = SEEK_SET; lock_data.l_start = lock_data.l_len = 0; if (fcntl(pidFd, F_SETLK, &lock_data) == -1) { if (errno == EAGAIN) return oldpid; else return -1; } #else #ifdef LOCK_EX if (flock (pidFd, LOCK_EX|LOCK_NB) == -1) { if (errno == EWOULDBLOCK) return oldpid; else return -1; } #else if (lockf (pidFd, F_TLOCK, 0) == -1) { if (errno == EACCES) return oldpid; else return -1; } #endif #endif } fprintf (pidFilePtr, "%5ld\n", (long)getpid ()); (void) fflush (pidFilePtr); RegisterCloseOnFork (pidFd); } return 0; } #if 0 void UnlockPidFile (void) { if (lockPidFile) #ifdef F_SETLK { struct flock lock_data; lock_data.l_type = F_UNLCK; lock_data.l_whence = SEEK_SET; lock_data.l_start = lock_data.l_len = 0; (void) fcntl(pidFd, F_SETLK, &lock_data); } #else #ifdef F_ULOCK lockf (pidFd, F_ULOCK, 0); #else flock (pidFd, LOCK_UN); #endif #endif close (pidFd); fclose (pidFilePtr); } #endif #ifndef HAS_SETPROCTITLE void SetTitle (char *name, ...) { #ifndef NOXDMTITLE char *p = Title; int left = TitleLen; char *s; va_list args; va_start(args,name); *p++ = '-'; --left; s = name; while (s) { while (*s && left > 0) { *p++ = *s++; left--; } s = va_arg (args, char *); } while (left > 0) { *p++ = ' '; --left; } va_end(args); #endif } #endif wdm-1.28/src/wdm/dpylist.c 644 0 0 1365310221265060 151060ustar AlexeyVoinov 0 0/* $Xorg: dpylist.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/dpylist.c,v 1.5 2001/12/14 20:01:21 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * a simple linked list of known displays */ # include # include static struct display *displays; static int no_xserver_started = 1; int AnyDisplaysLeft (void) { return no_xserver_started || (displays != (struct display *) 0); } void ForEachDisplay (void (*f)(struct display *)) { struct display *d, *next; for (d = displays; d; d = next) { next = d->next; (*f) (d); } } struct display * FindDisplayByName (char *name) { struct display *d; for (d = displays; d; d = d->next) if (!strcmp (name, d->name)) return d; return 0; } struct display * FindDisplayByPid (int pid) { struct display *d; for (d = displays; d; d = d->next) if (pid == d->pid) return d; return 0; } struct display * FindDisplayByServerPid (int serverPid) { struct display *d; for (d = displays; d; d = d->next) if (serverPid == d->serverPid) return d; return 0; } #ifdef XDMCP struct display * FindDisplayBySessionID (CARD32 sessionID) { struct display *d; for (d = displays; d; d = d->next) if (sessionID == d->sessionID) return d; return 0; } struct display * FindDisplayByAddress (XdmcpNetaddr addr, int addrlen, CARD16 displayNumber) { struct display *d; for (d = displays; d; d = d->next) if (d->displayType.origin == FromXDMCP && d->displayNumber == displayNumber && addressEqual (d->from, d->fromlen, addr, addrlen)) { return d; } return 0; } #endif /* XDMCP */ #define IfFree(x) if (x) free ((char *) x) void RemoveDisplay (struct display *old) { struct display *d, *p; char **x; int i; p = 0; for (d = displays; d; d = d->next) { if (d == old) { if (p) p->next = d->next; else displays = d->next; IfFree (d->name); IfFree (d->class); for (x = d->argv; x && *x; x++) IfFree (*x); IfFree (d->argv); IfFree (d->resources); IfFree (d->xrdb); IfFree (d->setup); IfFree (d->startup); IfFree (d->reset); IfFree (d->session); IfFree (d->userPath); IfFree (d->systemPath); IfFree (d->systemShell); IfFree (d->failsafeClient); IfFree (d->chooser); if (d->authorizations) { for (i = 0; i < d->authNum; i++) XauDisposeAuth (d->authorizations[i]); free ((char *) d->authorizations); } IfFree (d->clientAuthFile); if (d->authFile) (void) unlink (d->authFile); IfFree (d->authFile); IfFree (d->userAuthDir); for (x = d->authNames; x && *x; x++) IfFree (*x); IfFree (d->authNames); IfFree (d->authNameLens); #ifdef XDMCP IfFree (d->peer); IfFree (d->from); XdmcpDisposeARRAY8 (&d->clientAddr); #endif free ((char *) d); break; } p = d; } } struct display * NewDisplay (char *name, char *class) { struct display *d; d = (struct display *) malloc (sizeof (struct display)); if (!d) { WDMError("NewDisplay: out of memory"); return 0; } d->next = displays; d->name = malloc ((unsigned) (strlen (name) + 1)); if (!d->name) { WDMError("NewDisplay: out of memory"); free ((char *) d); return 0; } strcpy (d->name, name); if (class) { d->class = malloc ((unsigned) (strlen (class) + 1)); if (!d->class) { WDMError("NewDisplay: out of memory"); free (d->name); free ((char *) d); return 0; } strcpy (d->class, class); } else { d->class = (char *) 0; } /* initialize every field to avoid possible problems */ d->argv = 0; d->status = notRunning; d->pid = -1; d->serverPid = -1; d->state = NewEntry; d->resources = NULL; d->xrdb = NULL; d->setup = NULL; d->startup = NULL; d->reset = NULL; d->session = NULL; d->userPath = NULL; d->systemPath = NULL; d->systemShell = NULL; d->failsafeClient = NULL; d->chooser = NULL; d->authorize = FALSE; d->authorizations = NULL; d->authNum = 0; d->authNameNum = 0; d->clientAuthFile = NULL; d->authFile = NULL; d->userAuthDir = NULL; d->authNames = NULL; d->authNameLens = NULL; d->authComplain = 1; d->openDelay = 0; d->openRepeat = 0; d->openTimeout = 0; d->startAttempts = 0; d->startTries = 0; d->lastCrash = 0; d->terminateServer = 0; d->grabTimeout = 0; #ifdef XDMCP d->sessionID = 0; d->peer = 0; d->peerlen = 0; d->from = 0; d->fromlen = 0; d->displayNumber = 0; d->useChooser = 0; d->clientAddr.data = NULL; d->clientAddr.length = 0; d->connectionType = 0; #endif d->version = 1; /* registered with The Open Group */ displays = d; no_xserver_started = 0; return d; } wdm-1.28/src/wdm/file.c 644 0 0 1272410221265060 143330ustar AlexeyVoinov 0 0/* $Xorg: file.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/file.c,v 1.6 2001/12/14 20:01:21 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * file.c */ # include # include #include static int DisplayTypeMatch (DisplayType d1, DisplayType d2) { return d1.location == d2.location && d1.lifetime == d2.lifetime && d1.origin == d2.origin; } static void freeFileArgs (char **args) { char **a; for (a = args; *a; a++) free (*a); free ((char *) args); } static char ** splitIntoWords (char *s) { char **args, **newargs; char *wordStart; int nargs; args = 0; nargs = 0; while (*s) { while (*s && isspace (*s)) ++s; if (!*s || *s == '#') break; wordStart = s; while (*s && *s != '#' && !isspace (*s)) ++s; if (!args) { args = (char **) malloc (2 * sizeof (char *)); if (!args) return NULL; } else { newargs = (char **) realloc ((char *) args, (nargs+2)*sizeof (char *)); if (!newargs) { freeFileArgs (args); return NULL; } args = newargs; } args[nargs] = malloc (s - wordStart + 1); if (!args[nargs]) { freeFileArgs (args); return NULL; } strncpy (args[nargs], wordStart, s - wordStart); args[nargs][s-wordStart] = '\0'; ++nargs; args[nargs] = NULL; } return args; } static char ** copyArgs (char **args) { char **a, **new, **n; for (a = args; *a; a++) /* SUPPRESS 530 */ ; new = (char **) malloc ((a - args + 1) * sizeof (char *)); if (!new) return NULL; n = new; a = args; /* SUPPRESS 560 */ while ((*n++ = *a++)) /* SUPPRESS 530 */ ; return new; } static void freeSomeArgs (char **args, int n) { char **a; a = args; while (n--) free (*a++); free ((char *) args); } void ParseDisplay (char *source, DisplayType *acceptableTypes, int numAcceptable) { char **args, **argv, **a; char *name, *class, *type; struct display *d; int usedDefault; DisplayType displayType; args = splitIntoWords (source); if (!args) return; if (!args[0]) { WDMError("Missing display name in servers file\n"); freeFileArgs (args); return; } name = args[0]; if (!args[1]) { WDMError("Missing display type for %s\n", args[0]); freeFileArgs (args); return; } displayType = parseDisplayType (args[1], &usedDefault); class = NULL; type = args[1]; argv = args + 2; /* * extended syntax; if the second argument doesn't * exactly match a legal display type and the third * argument does, use the second argument as the * display class string */ if (usedDefault && args[2]) { displayType = parseDisplayType (args[2], &usedDefault); if (!usedDefault) { class = args[1]; type = args[2]; argv = args + 3; } } while (numAcceptable) { if (DisplayTypeMatch (*acceptableTypes, displayType)) break; --numAcceptable; ++acceptableTypes; } if (!numAcceptable) { WDMError("Unacceptable display type %s for display %s\n", type, name); } d = FindDisplayByName (name); if (d) { d->state = OldEntry; if (class && strcmp (d->class, class)) { char *newclass; newclass = malloc ((unsigned) (strlen (class) + 1)); if (newclass) { free (d->class); strcpy (newclass, class); d->class = newclass; } } WDMDebug("Found existing display: %s %s %s", d->name, d->class , type); freeFileArgs (d->argv); } else { d = NewDisplay (name, class); WDMDebug("Found new display: %s %s %s", d->name, d->class ? d->class : "", type); } d->displayType = displayType; d->argv = copyArgs (argv); for (a = d->argv; a && *a; a++) WDMDebug(" %s", *a); WDMDebug("\n"); freeSomeArgs (args, argv - args); } static struct displayMatch { char *name; DisplayType type; } displayTypes[] = { { "local", { Local, Permanent, FromFile } }, { "foreign", { Foreign, Permanent, FromFile } }, { 0, { Local, Permanent, FromFile } }, }; DisplayType parseDisplayType (char *string, int *usedDefault) { struct displayMatch *d; for (d = displayTypes; d->name; d++) if (!strcmp (d->name, string)) { *usedDefault = 0; return d->type; } *usedDefault = 1; return d->type; } wdm-1.28/src/wdm/genauth.c 644 0 0 1346110221265060 150460ustar AlexeyVoinov 0 0/* $Xorg: genauth.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/genauth.c,v 3.13 2001/12/14 20:01:22 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium */ # include # include # include # include #include #include #define Time_t time_t #include static unsigned char key[8]; #ifdef HASXDMAUTH typedef unsigned char auth_cblock[8]; /* block size */ typedef struct auth_ks_struct { auth_cblock _; } auth_wrapper_schedule[16]; extern void _XdmcpWrapperToOddParity(); static void longtochars (long l, unsigned char *c) { c[0] = (l >> 24) & 0xff; c[1] = (l >> 16) & 0xff; c[2] = (l >> 8) & 0xff; c[3] = l & 0xff; } #endif # define FILE_LIMIT 1024 /* no more than this many buffers */ #if !defined(ARC4_RANDOM) && !defined(DEV_RANDOM) static int sumFile (char *name, long sum[2]) { long buf[1024*2]; int cnt; int fd; int loops; int reads; int i; int ret_status = 0; fd = open (name, O_RDONLY); if (fd < 0) { WDMError("Cannot open randomFile \"%s\", errno = %d\n", name, errno); return 0; } #ifdef FRAGILE_DEV_MEM if (strcmp(name, "/dev/mem") == 0) lseek (fd, (off_t) 0x100000, SEEK_SET); #endif reads = FILE_LIMIT; sum[0] = 0; sum[1] = 0; while ((cnt = read (fd, (char *) buf, sizeof (buf))) > 0 && --reads > 0) { loops = cnt / (2 * sizeof (long)); for (i = 0; i < loops; i+= 2) { sum[0] += buf[i]; sum[1] += buf[i+1]; ret_status = 1; } } if (cnt < 0) WDMError("Cannot read randomFile \"%s\", errno = %d\n", name, errno); close (fd); return ret_status; } #endif #ifdef HASXDMAUTH static void InitXdmcpWrapper (void) { #ifdef ARC4_RANDOM u_int32_t sum[2]; sum[0] = arc4random(); sum[1] = arc4random(); *(u_char *)sum = 0; _XdmcpWrapperToOddParity(sum, key); #elif DEV_RANDOM int fd; unsigned char tmpkey[8]; if ((fd = open(DEV_RANDOM, O_RDONLY)) >= 0) { if (read(fd, tmpkey, 8) == 8) { tmpkey[0] = 0; _XdmcpWrapperToOddParity(tmpkey, key); close(fd); return; } else { close(fd); } } #else long sum[2]; unsigned char tmpkey[8]; if (!sumFile (randomFile, sum)) { sum[0] = time ((Time_t *) 0); sum[1] = time ((Time_t *) 0); } longtochars (sum[0], tmpkey+0); longtochars (sum[1], tmpkey+4); tmpkey[0] = 0; _XdmcpWrapperToOddParity (tmpkey, key); #endif } #endif #ifndef HASXDMAUTH /* A random number generator that is more unpredictable than that shipped with some systems. This code is taken from the C standard. */ static unsigned long int next = 1; static int xdm_rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768; } static void xdm_srand(unsigned int seed) { next = seed; } #endif /* no HASXDMAUTH */ void GenerateAuthData (char *auth, int len) { long ldata[2]; #ifdef ITIMER_REAL { struct timeval now; X_GETTIMEOFDAY (&now); ldata[0] = now.tv_usec; ldata[1] = now.tv_sec; } #else { #ifndef __EMX__ long time (); #endif ldata[0] = time ((long *) 0); ldata[1] = getpid (); } #endif #ifdef HASXDMAUTH { int bit; int i; auth_wrapper_schedule schedule; unsigned char data[8]; static int xdmcpAuthInited; longtochars (ldata[0], data+0); longtochars (ldata[1], data+4); if (!xdmcpAuthInited) { InitXdmcpWrapper (); xdmcpAuthInited = 1; } _XdmcpAuthSetup (key, schedule); for (i = 0; i < len; i++) { auth[i] = 0; for (bit = 1; bit < 256; bit <<= 1) { _XdmcpAuthDoIt (data, data, schedule, 1); if ((data[0] + data[1]) & 0x4) auth[i] |= bit; } } } #else { int seed; int value; int i; static long localkey[2] = {0,0}; if ( (localkey[0] == 0) && (localkey[1] == 0) ) { #ifdef ARC4_RANDOM localkey[0] = arc4random(); localkey[1] = arc4random(); #elif defined(DEV_RANDOM) int fd; if ((fd = open(DEV_RANDOM, O_RDONLY)) >= 0) { if (read(fd, (char *)localkey, 8) != 8) { localkey[0] = 1; } close(fd); } else { localkey[0] = 1; } #else if (!sumFile (randomFile, localkey)) { localkey[0] = 1; /* To keep from continually calling sumFile() */ } #endif } seed = (ldata[0]+localkey[0]) + ((ldata[1]+localkey[1]) << 16); xdm_srand (seed); for (i = 0; i < len; i++) { value = xdm_rand (); auth[i] = (value & 0xff00) >> 8; } value = len; if (value > sizeof (key)) value = sizeof (key); memmove( (char *) key, auth, value); } #endif } wdm-1.28/src/wdm/loghelpers.c 644 0 0 737010221265060 155410ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003, 2004 Alexey Voinov * * 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 * * loghelpers.c: helper functions for intecepting messages in stderr * and redirecting them to standard logging functions. */ #include #include #include #include #include #include #include #include #include /* * I hate global variables. But I don't know other way to pass information to * signal handler... :( */ static pid_t childpid = 0; /* * Function that treats buffer as set of lines separated with '\n' * These lines will be directed to WDMLogMessage function with * specified message level. n is a number of actual characters in buffer. * * Returned value is pointer to string that is left unterminated with '\n' */ char * WDMLogMessages(int level, char *buffer, int n) { char *tmpmsg, *pos; while((pos = memchr(buffer, '\n', n)) != NULL) { tmpmsg = wmalloc(pos - buffer + 2); strncpy(tmpmsg, buffer, pos - buffer + 1); tmpmsg[pos - buffer + 1] = '\0'; WDMLogMessage(level, "%s", tmpmsg); wfree(tmpmsg); n -= pos - buffer + 1; buffer = pos + 1; } return buffer; } void WDMBufferedLogMessages(int level, char *buffer, int n) { static char *old = NULL; static size_t oldn = 0; char *rest; old = wrealloc(old, oldn + n); memcpy(old + oldn, buffer, n); oldn += n; rest = WDMLogMessages(level, old, oldn); oldn -= rest - old; memmove(old, rest, oldn); } int WDMRedirectFileToLog(int level, pid_t pid, int fd) { fd_set set; int status; struct timeval tv; char buf[1024]; int n; WDMDebug("logger started\n"); while(waitpid(pid, &status, WNOHANG) == 0) { FD_ZERO(&set); FD_SET(fd, &set); tv.tv_sec = 1; tv.tv_usec = 0; if(select(fd + 1, &set, NULL, NULL, &tv) > 0) { n = read(fd, buf, sizeof(buf)); if(n == -1) WDMError("error reading form pipe(stderr)\n"); WDMBufferedLogMessages(level, buf, n); } } WDMBufferedLogMessages(level, "\n", 1); WDMDebug("logger stopped\n"); return WEXITSTATUS(status); } void WDMRedirectSignals(int n) { kill(childpid, n); #ifdef SIGNALS_RESET_WHEN_CAUGHT Signal(n, WDMRedirectSignals); #endif } void WDMRedirectStderr(int level) { int errpipe[2]; int exitstatus; if(pipe(errpipe) == -1) WDMError("cannot create pipe. " "all stderr messages will go to stderr\n"); childpid = fork(); if(childpid == -1) { WDMError("fork failed. " "all stderr messages will go to stderr\n"); close(errpipe[0]); close(errpipe[1]); } else if(childpid != 0) { /* parent, will read all messages from stderr and * redirect it to log */ Signal(SIGTERM, WDMRedirectSignals); Signal(SIGINT, WDMRedirectSignals); Signal(SIGHUP, WDMRedirectSignals); close(errpipe[1]); exitstatus = WDMRedirectFileToLog(WDM_LEVEL_ERROR, childpid, errpipe[0]); close(errpipe[0]); exit(exitstatus); } /* child, will close read end of pipe and dup2 * write end of pipe to stderr */ close(errpipe[0]); RegisterCloseOnFork(errpipe[1]); dup2(errpipe[1], 2); } wdm-1.28/src/wdm/mitauth.c 644 0 0 500310221265060 150370ustar AlexeyVoinov 0 0/* $Xorg: mitauth.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/mitauth.c,v 1.4 2001/12/14 20:01:22 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * mitauth * * generate authorization keys * for MIT-MAGIC-COOKIE-1 type authorization */ # include # include # include # define AUTH_DATA_LEN 16 /* bytes of authorization data */ static char auth_name[256]; static int auth_name_len; void MitInitAuth (unsigned short name_len, char *name) { if (name_len > 256) name_len = 256; auth_name_len = name_len; memmove( auth_name, name, name_len); } Xauth * MitGetAuth (unsigned short namelen, char *name) { Xauth *new; new = (Xauth *) malloc (sizeof (Xauth)); if (!new) return (Xauth *) 0; new->family = FamilyWild; new->address_length = 0; new->address = 0; new->number_length = 0; new->number = 0; new->data = (char *) malloc (AUTH_DATA_LEN); if (!new->data) { free ((char *) new); return (Xauth *) 0; } new->name = (char *) malloc (namelen); if (!new->name) { free ((char *) new->data); free ((char *) new); return (Xauth *) 0; } memmove( (char *)new->name, name, namelen); new->name_length = namelen; GenerateAuthData (new->data, AUTH_DATA_LEN); new->data_length = AUTH_DATA_LEN; return new; } wdm-1.28/src/wdm/netaddr.c 644 0 0 1030010221265060 150210ustar AlexeyVoinov 0 0/* $Xorg: netaddr.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1991, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/netaddr.c,v 3.6 2001/12/14 20:01:22 dawes Exp $ */ /* * xdm - X display manager * * netaddr.c - Interpretation of XdmcpNetaddr object. */ #include #include /* FamilyInternet, etc. */ #ifdef XDMCP #include #ifdef UNIXCONN #ifndef X_NO_SYS_UN #ifndef Lynx #include /* struct sockaddr_un */ #else #include /* struct sockaddr_un */ #endif #endif #endif #include /* given an XdmcpNetaddr, returns the socket protocol family used, e.g., AF_INET */ int NetaddrFamily(XdmcpNetaddr netaddrp) { return ((struct sockaddr *)netaddrp)->sa_family; } /* given an XdmcpNetaddr, returns a pointer to the TCP/UDP port used and sets *lenp to the length of the address or 0 if not using TCP or UDP. */ char * NetaddrPort(XdmcpNetaddr netaddrp, int *lenp) { switch (NetaddrFamily(netaddrp)) { case AF_INET: *lenp = 2; return (char *)&(((struct sockaddr_in *)netaddrp)->sin_port); default: *lenp = 0; return NULL; } } /* given an XdmcpNetaddr, returns a pointer to the network address and sets *lenp to the length of the address */ char * NetaddrAddress(XdmcpNetaddr netaddrp, int *lenp) { switch (NetaddrFamily(netaddrp)) { #ifdef UNIXCONN case AF_UNIX: *lenp = strlen(((struct sockaddr_un *)netaddrp)->sun_path); return (char *) (((struct sockaddr_un *)netaddrp)->sun_path); #endif #ifdef TCPCONN case AF_INET: *lenp = sizeof (struct in_addr); return (char *) &(((struct sockaddr_in *)netaddrp)->sin_addr); #endif default: *lenp = 0; return NULL; } } /* given an XdmcpNetaddr, sets *addr to the network address used and sets *len to the number of bytes in addr. Returns the X protocol family used, e.g., FamilyInternet */ int ConvertAddr (XdmcpNetaddr saddr, int *len, char **addr) { int retval; if (len == NULL) return -1; *addr = NetaddrAddress(saddr, len); switch (NetaddrFamily(saddr)) { #ifdef AF_UNSPEC case AF_UNSPEC: retval = FamilyLocal; break; #endif #ifdef AF_UNIX #ifndef hpux case AF_UNIX: retval = FamilyLocal; break; #endif #endif #ifdef TCPCONN case AF_INET: retval = FamilyInternet; break; #endif default: retval = -1; break; } WDMDebug("ConvertAddr returning %d for family %d\n", retval, NetaddrFamily(saddr)); return retval; } int addressEqual (XdmcpNetaddr a1, int len1, XdmcpNetaddr a2, int len2) { int partlen1, partlen2; char *part1, *part2; if (len1 != len2) { return FALSE; } if (NetaddrFamily(a1) != NetaddrFamily(a2)) { return FALSE; } part1 = NetaddrPort(a1, &partlen1); part2 = NetaddrPort(a2, &partlen2); if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) { return FALSE; } part1 = NetaddrAddress(a1, &partlen1); part2 = NetaddrAddress(a2, &partlen2); if (partlen1 != partlen2 || memcmp(part1, part2, partlen1) != 0) { return FALSE; } return TRUE; } #endif /* XDMCP */ wdm-1.28/src/wdm/policy.c 644 0 0 1106310221265060 147060ustar AlexeyVoinov 0 0/* $Xorg: policy.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * policy.c. Implement site-dependent policy for XDMCP connections */ /* $XFree86: xc/programs/xdm/policy.c,v 3.7 2001/12/27 20:01:56 dawes Exp $ */ # include # include #include #ifdef XDMCP # include # include static ARRAY8 noAuthentication = { (CARD16) 0, (CARD8Ptr) 0 }; typedef struct _XdmAuth { ARRAY8 authentication; ARRAY8 authorization; } XdmAuthRec, *XdmAuthPtr; static XdmAuthRec auth[] = { #ifdef HASXDMAUTH { {(CARD16) 20, (CARD8 *) "XDM-AUTHENTICATION-1"}, {(CARD16) 19, (CARD8 *) "XDM-AUTHORIZATION-1"}, }, #endif { {(CARD16) 0, (CARD8 *) 0}, {(CARD16) 0, (CARD8 *) 0}, } }; #define NumAuth (sizeof auth / sizeof auth[0]) ARRAY8Ptr ChooseAuthentication (ARRAYofARRAY8Ptr authenticationNames) { int i, j; for (i = 0; i < (int)authenticationNames->length; i++) for (j = 0; j < NumAuth; j++) if (XdmcpARRAY8Equal (&authenticationNames->data[i], &auth[j].authentication)) return &authenticationNames->data[i]; return &noAuthentication; } int CheckAuthentication ( struct protoDisplay *pdpy, ARRAY8Ptr displayID, ARRAY8Ptr name, ARRAY8Ptr data) { #ifdef HASXDMAUTH if (name->length && !strncmp ((char *)name->data, "XDM-AUTHENTICATION-1", 20)) return XdmCheckAuthentication (pdpy, displayID, name, data); #endif return TRUE; } int SelectAuthorizationTypeIndex ( ARRAY8Ptr authenticationName, ARRAYofARRAY8Ptr authorizationNames) { int i, j; for (j = 0; j < NumAuth; j++) if (XdmcpARRAY8Equal (authenticationName, &auth[j].authentication)) break; if (j < NumAuth) { for (i = 0; i < (int)authorizationNames->length; i++) if (XdmcpARRAY8Equal (&authorizationNames->data[i], &auth[j].authorization)) return i; } for (i = 0; i < (int)authorizationNames->length; i++) if (ValidAuthorization (authorizationNames->data[i].length, (char *) authorizationNames->data[i].data)) return i; return -1; } /*ARGSUSED*/ int Willing ( ARRAY8Ptr addr, CARD16 connectionType, ARRAY8Ptr authenticationName, ARRAY8Ptr status, xdmOpCode type) { char statusBuf[256]; int ret; ret = AcceptableDisplayAddress (addr, connectionType, type); if (!ret) sprintf (statusBuf, "Display not authorized to connect"); else { if (*willing) { FILE *fd = NULL; if ((fd = popen(willing, "r"))) { char *s = NULL; while(!(s = fgets(statusBuf, 256, fd)) && errno == EINTR) ; if(s) statusBuf[strlen(statusBuf)-1] = 0; /* chop newline */ else sprintf (statusBuf, "Willing, but %s failed",willing); } else sprintf (statusBuf, "Willing, but %s failed",willing); if (fd) pclose(fd); } else sprintf (statusBuf, "Willing to manage"); } status->length = strlen (statusBuf); status->data = (CARD8Ptr) malloc (status->length); if (!status->data) status->length = 0; else memmove( status->data, statusBuf, status->length); return ret; } /*ARGSUSED*/ ARRAY8Ptr Accept ( struct sockaddr *from, int fromlen, CARD16 displayNumber) { return 0; } /*ARGSUSED*/ int SelectConnectionTypeIndex ( ARRAY16Ptr connectionTypes, ARRAYofARRAY8Ptr connectionAddresses) { return 0; } #endif /* XDMCP */ wdm-1.28/src/wdm/protodpy.c 644 0 0 776710221265060 152670ustar AlexeyVoinov 0 0/* * $Xorg: protodpy.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ * Copyright 1989, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. * * Author: Keith Packard, MIT X Consortium */ /* $XFree86: xc/programs/xdm/protodpy.c,v 1.5 2001/12/14 20:01:23 dawes Exp $ */ /* * protodpy.c * * manage a collection of proto-displays. These are displays for * which sessionID's have been generated, but no session has been * started. */ #include #ifdef XDMCP #include #include #define Time_t time_t #include static struct protoDisplay *protoDisplays; struct protoDisplay * FindProtoDisplay ( XdmcpNetaddr address, int addrlen, CARD16 displayNumber) { struct protoDisplay *pdpy; WDMDebug("FindProtoDisplay\n"); for (pdpy = protoDisplays; pdpy; pdpy=pdpy->next) { if (pdpy->displayNumber == displayNumber && addressEqual (address, addrlen, pdpy->address, pdpy->addrlen)) { return pdpy; } } return (struct protoDisplay *) 0; } static void TimeoutProtoDisplays (Time_t now) { struct protoDisplay *pdpy, *next; for (pdpy = protoDisplays; pdpy; pdpy = next) { next = pdpy->next; if (pdpy->date < now - PROTO_TIMEOUT) DisposeProtoDisplay (pdpy); } } struct protoDisplay * NewProtoDisplay ( XdmcpNetaddr address, int addrlen, CARD16 displayNumber, CARD16 connectionType, ARRAY8Ptr connectionAddress, CARD32 sessionID) { struct protoDisplay *pdpy; Time_t date; WDMDebug("NewProtoDisplay\n"); time (&date); TimeoutProtoDisplays (date); pdpy = (struct protoDisplay *) malloc (sizeof *pdpy); if (!pdpy) return NULL; pdpy->address = (XdmcpNetaddr) malloc (addrlen); if (!pdpy->address) { free ((char *) pdpy); return NULL; } pdpy->addrlen = addrlen; memmove( pdpy->address, address, addrlen); pdpy->displayNumber = displayNumber; pdpy->connectionType = connectionType; pdpy->date = date; if (!XdmcpCopyARRAY8 (connectionAddress, &pdpy->connectionAddress)) { free ((char *) pdpy->address); free ((char *) pdpy); return NULL; } pdpy->sessionID = sessionID; pdpy->fileAuthorization = (Xauth *) NULL; pdpy->xdmcpAuthorization = (Xauth *) NULL; pdpy->next = protoDisplays; protoDisplays = pdpy; return pdpy; } void DisposeProtoDisplay (pdpy) struct protoDisplay *pdpy; { struct protoDisplay *p, *prev; prev = 0; for (p = protoDisplays; p; p=p->next) { if (p == pdpy) break; prev = p; } if (!p) return; if (prev) prev->next = pdpy->next; else protoDisplays = pdpy->next; bzero(&pdpy->key, sizeof(pdpy->key)); if (pdpy->fileAuthorization) XauDisposeAuth (pdpy->fileAuthorization); if (pdpy->xdmcpAuthorization) XauDisposeAuth (pdpy->xdmcpAuthorization); XdmcpDisposeARRAY8 (&pdpy->connectionAddress); free ((char *) pdpy->address); free ((char *) pdpy); } #endif /* XDMCP */ wdm-1.28/src/wdm/reset.c 644 0 0 606010221265060 145120ustar AlexeyVoinov 0 0/* $Xorg: reset.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/reset.c,v 1.4 2001/12/14 20:01:23 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * pseudoReset -- pretend to reset the server by killing all clients * with windows. It will reset the server most of the time, unless * a client remains connected with no windows. */ # include # include # include #include /*ARGSUSED*/ static int ignoreErrors (Display *dpy, XErrorEvent *event) { WDMDebug("ignoring error\n"); return 0; } /* * this is mostly bogus -- but quite useful. I wish the protocol * had some way of enumerating and identifying clients, that way * this code wouldn't have to be this kludgy. */ static void killWindows (Display *dpy, Window window) { Window root, parent, *children; int child; unsigned int nchildren = 0; while (XQueryTree (dpy, window, &root, &parent, &children, &nchildren) && nchildren > 0) { for (child = 0; child < nchildren; child++) { WDMDebug("XKillClient 0x%lx\n", (unsigned long)children[child]); XKillClient (dpy, children[child]); } XFree ((char *)children); } } static Jmp_buf resetJmp; /* ARGSUSED */ static SIGVAL abortReset (int n) { Longjmp (resetJmp, 1); } /* * this display connection better not have any windows... */ void pseudoReset (Display *dpy) { Window root; int screen; if (Setjmp (resetJmp)) { WDMError("pseudoReset timeout\n"); } else { (void) Signal (SIGALRM, abortReset); (void) alarm (30); XSetErrorHandler (ignoreErrors); for (screen = 0; screen < ScreenCount (dpy); screen++) { WDMDebug("pseudoReset screen %d\n", screen); root = RootWindow (dpy, screen); killWindows (dpy, root); } WDMDebug("before XSync\n"); XSync (dpy, False); (void) alarm (0); } Signal (SIGALRM, SIG_DFL); XSetErrorHandler ((XErrorHandler)0 ); WDMDebug("pseudoReset done\n"); } wdm-1.28/src/wdm/resource.c 644 0 0 4447210221265060 152500ustar AlexeyVoinov 0 0/* $Xorg: resource.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/resource.c,v 3.7 2001/12/14 20:01:23 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * resource.c */ # include #include # include # include char *config; char *servers; int_resource request_port; int_resource debugLevel; char *errorLogFile; char *syslogFacility; int_resource useSyslog; int_resource daemonMode; char *pidFile; int_resource lockPidFile; int_resource sourceAddress; char *authDir; int_resource autoRescan; int_resource removeDomainname; char *keyFile; char *accessFile; char *accessFilePL; slist_resource exportList; char *randomFile; char *greeterLib; char *willing; int_resource choiceTimeout; /* chooser choice timeout */ /* wdm additions */ #define DEF_WDMLOGIN "/usr/X11R6/bin/wdmLogin" char *wdmLogin; /* full path to external program Login */ char *wdmWm; /* list of optional window managers to start */ char *wdmLogo; /* points to optional Logo pixmap */ char *wdmHelpFile; /* points to optional help file */ char *wdmDefaultUser; /* points to optional default user name */ char *wdmDefaultPasswd; /* points to optional default passwd */ char *wdmBg; /* pixmap or color(s) for background */ char *wdmReboot; /* command for Reboot */ char *wdmHalt; /* command to Halt */ int_resource wdmVerify; /* if true, require name & password for Exit */ /* reboot or halt */ int_resource wdmRoot; /* if true only username=root and verified */ /* password can do Exit, reboot or halt */ int_resource wdmAnimations; /* if true, enable shake and rollup */ /* animations */ /* if false, disable animations */ char *wdmLocale; /* this will be LANG value before starting */ /* wdmLogin */ char *wdmLoginConfig; /* this will be passed to wdmLogin with */ /* -c option */ char *wdmCursorTheme; /* this will be XCURSOR_THEME value before */ /* starting wdmLogin */ int_resource wdmXineramaHead;/* select xinerama head where to show login */ /* panel this _should_ be display dependant, */ /* but I make it later */ # define DM_STRING 0 # define DM_INT 1 # define DM_BOOL 2 # define DM_ARGV 3 /* * the following constants are supposed to be set in the makefile from * parameters set util/imake.includes/site.def (or *.macros in that directory * if it is server-specific). DO NOT CHANGE THESE DEFINITIONS! */ #ifndef __EMX__ #ifndef DEF_SERVER_LINE #define DEF_SERVER_LINE ":0 local /usr/bin/X11/X :0" #endif #ifndef XRDB_PROGRAM #define XRDB_PROGRAM "/usr/bin/X11/xrdb" #endif #ifndef DEF_SESSION #define DEF_SESSION "/usr/bin/X11/xterm -ls" #endif #ifndef DEF_USER_PATH #define DEF_USER_PATH ":/bin:/usr/bin:/usr/bin/X11:/usr/ucb" #endif #ifndef DEF_SYSTEM_PATH #define DEF_SYSTEM_PATH "/etc:/bin:/usr/bin:/usr/bin/X11:/usr/ucb" #endif #ifndef DEF_SYSTEM_SHELL #define DEF_SYSTEM_SHELL "/bin/sh" #endif #ifndef DEF_FAILSAFE_CLIENT #define DEF_FAILSAFE_CLIENT "/usr/bin/X11/xterm" #endif #ifndef DEF_XDM_CONFIG #define DEF_XDM_CONFIG "/usr/lib/X11/xdm/xdm-config" #endif #ifndef DEF_CHOOSER #define DEF_CHOOSER "/usr/lib/X11/xdm/chooser" #endif #ifndef DEF_AUTH_NAME #ifdef HASXDMAUTH #define DEF_AUTH_NAME "XDM-AUTHORIZATION-1 MIT-MAGIC-COOKIE-1" #else #define DEF_AUTH_NAME "MIT-MAGIC-COOKIE-1" #endif #endif #ifndef DEF_AUTH_DIR #define DEF_AUTH_DIR "/usr/lib/X11/xdm" #endif #ifndef DEF_USER_AUTH_DIR #define DEF_USER_AUTH_DIR "/tmp" #endif #ifndef DEF_KEY_FILE #define DEF_KEY_FILE "" #endif #ifndef DEF_ACCESS_FILE #define DEF_ACCESS_FILE "" #endif #ifndef DEF_ACCESS_FILE_PL #define DEF_ACCESS_FILE_PL "" #endif #ifndef DEF_RANDOM_FILE #define DEF_RANDOM_FILE "/dev/mem" #endif #ifndef DEF_GREETER_LIB #define DEF_GREETER_LIB "/X11/lib/X11/xdm/libXdmGreet.so" #endif #else /* unfortunately I have to declare all of them, because there is a limit * in argument size in OS/2 * but everything needs to be fixed again */ #define DEF_SERVER_LINE ":0 local /XFree86/bin/X :0" #ifndef XRDB_PROGRAM #define XRDB_PROGRAM "/XFree86/bin/xrdb" #endif #ifndef DEF_SESSION #define DEF_SESSION "/XFree86/bin/xterm -ls" #endif #ifndef DEF_USER_PATH #define DEF_USER_PATH "c:\\os2;c:\\os2\apps;\\XFree86\\bin" #endif #ifndef DEF_SYSTEM_PATH #define DEF_SYSTEM_PATH "c:\\os2;c:\\os2\apps;\\XFree86\\bin" #endif #ifndef DEF_SYSTEM_SHELL #define DEF_SYSTEM_SHELL "sh" #endif #ifndef DEF_FAILSAFE_CLIENT #define DEF_FAILSAFE_CLIENT "/XFree86/bin/xterm" #endif #ifndef DEF_XDM_CONFIG #define DEF_XDM_CONFIG "/XFree86/lib/X11/xdm/xdm-config" #endif #ifndef DEF_CHOOSER #define DEF_CHOOSER "/XFree86/lib/X11/xdm/chooser" #endif #ifndef DEF_AUTH_NAME #ifdef HASXDMAUTH #define DEF_AUTH_NAME "XDM-AUTHORIZATION-1 MIT-MAGIC-COOKIE-1" #else #define DEF_AUTH_NAME "MIT-MAGIC-COOKIE-1" #endif #endif #ifndef DEF_AUTH_DIR #define DEF_AUTH_DIR "/XFree86/lib/X11/xdm" #endif #ifndef DEF_USER_AUTH_DIR #define DEF_USER_AUTH_DIR "/tmp" #endif #ifndef DEF_KEY_FILE #define DEF_KEY_FILE "" #endif #ifndef DEF_ACCESS_FILE #define DEF_ACCESS_FILE "" #endif #ifndef DEF_ACCESS_FILE_PL #define DEF_ACCESS_FILE_PL "" #endif #ifndef DEF_RANDOM_FILE #define DEF_RANDOM_FILE "" #endif #ifndef DEF_GREETER_LIB #define DEF_GREETER_LIB "/XFree86/lib/X11/xdm/libXdmGreet.so" #endif #endif /* __EMX__ */ #define DEF_UDP_PORT "177" /* registered XDMCP port, dont change */ struct dmResources { char *name, *class; int type; char **dm_value; char *default_value; } DmResources[] = { { "servers", "Servers", DM_STRING, &servers, DEF_SERVER_LINE} , { "requestPort","RequestPort", DM_INT, &request_port.c, DEF_UDP_PORT} , { "debugLevel", "DebugLevel", DM_INT, &debugLevel.c, "1"} , { "errorLogFile","ErrorLogFile", DM_STRING, &errorLogFile, ""} , { "syslogFacility","SyslogFacility", DM_STRING, &syslogFacility, ""} , { "useSyslog", "UseSyslog", DM_BOOL, &useSyslog.c, "false"} , { "daemonMode", "DaemonMode", DM_BOOL, &daemonMode.c, "true"} , { "pidFile", "PidFile", DM_STRING, &pidFile, ""} , { "lockPidFile","LockPidFile", DM_BOOL, &lockPidFile.c, "true"} , { "authDir", "authDir", DM_STRING, &authDir, DEF_AUTH_DIR} , { "autoRescan", "AutoRescan", DM_BOOL, &autoRescan.c, "true"} , { "removeDomainname","RemoveDomainname",DM_BOOL,&removeDomainname.c, "true"} , { "keyFile", "KeyFile", DM_STRING, &keyFile, DEF_KEY_FILE} , { "accessFile", "AccessFile", DM_STRING, &accessFile, DEF_ACCESS_FILE} , { "accessFilePL","AccessFilePL",DM_STRING, &accessFilePL, DEF_ACCESS_FILE_PL} , { "exportList", "ExportList", DM_ARGV, &exportList.c, ""} , { "randomFile", "RandomFile", DM_STRING, &randomFile, DEF_RANDOM_FILE} , { "greeterLib", "GreeterLib", DM_STRING, &greeterLib, DEF_GREETER_LIB} , { "choiceTimeout","ChoiceTimeout",DM_INT, &choiceTimeout.c, "15"} , { "sourceAddress","SourceAddress",DM_BOOL, &sourceAddress.c, "false"} , { "willing", "Willing", DM_STRING, &willing, ""} , { "wdmLogin", "WdmLogin", DM_STRING, &wdmLogin, DEF_WDMLOGIN} , { "wdmReboot", "WdmReboot", DM_STRING, &wdmReboot, "reboot"} , { "wdmHalt", "WdmHalt", DM_STRING, &wdmHalt, "halt"} , { "wdmVerify", "WdmVerify", DM_BOOL, &wdmVerify.c, "false"} , { "wdmRoot", "WdmRoot", DM_BOOL, &wdmRoot.c, "false"} , }; # define NUM_DM_RESOURCES (sizeof DmResources / sizeof DmResources[0]) # define boffset(f) XtOffsetOf(struct display, f) struct displayResource { char *name, *class; int type; int offset; char *default_value; }; /* resources for managing the server */ struct displayResource serverResources[] = { { "serverAttempts","ServerAttempts",DM_INT, boffset(serverAttempts), "1" }, { "openDelay", "OpenDelay", DM_INT, boffset(openDelay), "15" }, { "openRepeat", "OpenRepeat", DM_INT, boffset(openRepeat), "5" }, { "openTimeout","OpenTimeout", DM_INT, boffset(openTimeout), "120" }, { "startAttempts","StartAttempts",DM_INT, boffset(startAttempts), "4" }, { "pingInterval","PingInterval",DM_INT, boffset(pingInterval), "5" }, { "pingTimeout","PingTimeout", DM_INT, boffset(pingTimeout), "5" }, { "terminateServer","TerminateServer",DM_BOOL, boffset(terminateServer), "false" }, { "grabServer", "GrabServer", DM_BOOL, boffset(grabServer), "false" }, { "grabTimeout","GrabTimeout", DM_INT, boffset(grabTimeout), "3" }, { "resetSignal","Signal", DM_INT, boffset(resetSignal), "1" }, /* SIGHUP */ { "termSignal", "Signal", DM_INT, boffset(termSignal), "15" }, /* SIGTERM */ { "resetForAuth","ResetForAuth",DM_BOOL, boffset(resetForAuth), "false" }, { "authorize", "Authorize", DM_BOOL, boffset(authorize), "true" }, { "authComplain","AuthComplain",DM_BOOL, boffset(authComplain), "true" }, { "authName", "AuthName", DM_ARGV, boffset(authNames), DEF_AUTH_NAME }, { "authFile", "AuthFile", DM_STRING, boffset(clientAuthFile), "" }, }; # define NUM_SERVER_RESOURCES (sizeof serverResources/\ sizeof serverResources[0]) /* resources which control the session behaviour */ struct displayResource sessionResources[] = { { "resources", "Resources", DM_STRING, boffset(resources), "" }, { "xrdb", "Xrdb", DM_STRING, boffset(xrdb), XRDB_PROGRAM }, { "setup", "Setup", DM_STRING, boffset(setup), "" }, { "startup", "Startup", DM_STRING, boffset(startup), "" }, { "reset", "Reset", DM_STRING, boffset(reset), "" }, { "session", "Session", DM_STRING, boffset(session), DEF_SESSION }, { "userPath", "Path", DM_STRING, boffset(userPath), DEF_USER_PATH }, { "systemPath", "Path", DM_STRING, boffset(systemPath), DEF_SYSTEM_PATH }, { "systemShell","Shell", DM_STRING, boffset(systemShell), DEF_SYSTEM_SHELL }, { "failsafeClient","FailsafeClient", DM_STRING, boffset(failsafeClient), DEF_FAILSAFE_CLIENT }, { "userAuthDir","UserAuthDir", DM_STRING, boffset(userAuthDir), DEF_USER_AUTH_DIR }, { "chooser", "Chooser", DM_STRING, boffset(chooser), DEF_CHOOSER }, }; # define NUM_SESSION_RESOURCES (sizeof sessionResources/\ sizeof sessionResources[0]) struct dmResources wdmResources[] = { { "wdmWm", "WdmWm", DM_STRING, &wdmWm, ""} , { "wdmLogo", "WdmLogo", DM_STRING, &wdmLogo, ""} , { "wdmHelpFile","WdmHelpFile", DM_STRING, &wdmHelpFile, ""} , { "wdmBg", "WdmBg", DM_STRING, &wdmBg, ""} , { "wdmDefaultUser", "WdmDefaultUser", DM_STRING, &wdmDefaultUser, ""} , { "wdmDefaultPasswd", "WdmDefaultPasswd", DM_STRING, &wdmDefaultPasswd, ""} , { "wdmAnimations", "WdmAnimations", DM_BOOL, &wdmAnimations.c, "true"} , { "wdmLocale", "WdmLocale", DM_STRING, &wdmLocale, ""} , { "wdmLoginConfig", "WdmLoginConfig", DM_STRING, &wdmLoginConfig, DEF_WDMLOGIN_CONFIG} , { "wdmCursorTheme", "WdmCursorTheme", DM_STRING, &wdmCursorTheme, ""} , { "wdmXineramaHead", "WdmXineramaHead", DM_INT, &wdmXineramaHead.c, "0"} , }; # define NUM_WDM_RESOURCES (sizeof wdmResources/\ sizeof wdmResources[0]) XrmDatabase DmResourceDB; static void GetResource ( char *name, char *class, int valueType, char **valuep, char *default_value) { char *type; XrmValue value; char *string, *new_string; char str_buf[50]; int len; if (DmResourceDB && XrmGetResource (DmResourceDB, name, class, &type, &value)) { string = value.addr; len = value.size; } else { string = default_value; len = strlen (string); } WDMDebug("%s/%s value %*.*s\n", name, class, len, len, string); if (valueType == DM_STRING && *valuep) { if (strlen (*valuep) == len && !strncmp (*valuep, string, len)) return; else free (*valuep); } switch (valueType) { case DM_STRING: new_string = malloc ((unsigned) (len+1)); if (!new_string) { WDMError("GetResource: out of memory"); return; } strncpy (new_string, string, len); new_string[len] = '\0'; *(valuep) = new_string; break; case DM_INT: strncpy (str_buf, string, sizeof (str_buf)); str_buf[sizeof (str_buf)-1] = '\0'; *((int *) valuep) = atoi (str_buf); break; case DM_BOOL: strncpy (str_buf, string, sizeof (str_buf)); str_buf[sizeof (str_buf)-1] = '\0'; XmuCopyISOLatin1Lowered (str_buf, str_buf); if (!strcmp (str_buf, "true") || !strcmp (str_buf, "on") || !strcmp (str_buf, "yes")) *((int *) valuep) = 1; else if (!strcmp (str_buf, "false") || !strcmp (str_buf, "off") || !strcmp (str_buf, "no")) *((int *) valuep) = 0; break; case DM_ARGV: freeArgs (*(char ***) valuep); *((char ***) valuep) = parseArgs ((char **) 0, string); break; } } XrmOptionDescRec configTable [] = { {"-server", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-udpPort", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-error", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-resources", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-session", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-debug", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-xrm", NULL, XrmoptionSkipArg, (caddr_t) NULL }, {"-config", ".configFile", XrmoptionSepArg, (caddr_t) NULL } }; XrmOptionDescRec optionTable [] = { {"-server", ".servers", XrmoptionSepArg, (caddr_t) NULL }, {"-udpPort", ".requestPort", XrmoptionSepArg, (caddr_t) NULL }, {"-error", ".errorLogFile", XrmoptionSepArg, (caddr_t) NULL }, {"-resources", "*resources", XrmoptionSepArg, (caddr_t) NULL }, {"-session", "*session", XrmoptionSepArg, (caddr_t) NULL }, {"-debug", "*debugLevel", XrmoptionSepArg, (caddr_t) NULL }, {"-xrm", NULL, XrmoptionResArg, (caddr_t) NULL }, {"-daemon", ".daemonMode", XrmoptionNoArg, "true" }, {"-nodaemon", ".daemonMode", XrmoptionNoArg, "false" }, {"-syslog", ".syslogFacility", XrmoptionSepArg, (caddr_t) NULL }, {"-usesyslog", ".useSyslog", XrmoptionNoArg, "true" }, {"-useerrfile", ".useSyslog", XrmoptionNoArg, "false" } }; static int originalArgc; static char **originalArgv; void InitResources (int argc, char **argv) { XrmInitialize (); originalArgc = argc; originalArgv = argv; ReinitResources (); } void ReinitResources (void) { int argc; char **a; char **argv; XrmDatabase newDB; argv = (char **) malloc ((originalArgc + 1) * sizeof (char *)); if (!argv) WDMError("no space for argument realloc\n"); for (argc = 0; argc < originalArgc; argc++) argv[argc] = originalArgv[argc]; argv[argc] = 0; if (DmResourceDB) XrmDestroyDatabase (DmResourceDB); DmResourceDB = XrmGetStringDatabase (""); /* pre-parse the command line to get the -config option, if any */ XrmParseCommand (&DmResourceDB, configTable, sizeof (configTable) / sizeof (configTable[0]), "DisplayManager", &argc, argv); GetResource ("DisplayManager.configFile", "DisplayManager.ConfigFile", DM_STRING, &config, DEF_XDM_CONFIG); newDB = XrmGetFileDatabase ( config ); if (newDB) { if (DmResourceDB) XrmDestroyDatabase (DmResourceDB); DmResourceDB = newDB; } else if (argc != originalArgc) WDMError("Can't open configuration file %s\n", config); XrmParseCommand (&DmResourceDB, optionTable, sizeof (optionTable) / sizeof (optionTable[0]), "DisplayManager", &argc, argv); if (argc > 1) { WDMError("extra arguments on command line:"); for (a = argv + 1; *a; a++) WDMError(" \"%s\"", *a); WDMError("\n"); } free (argv); } void LoadDMResources (void) { int i; char name[1024], class[1024]; for (i = 0; i < NUM_DM_RESOURCES; i++) { sprintf (name, "DisplayManager.%s", DmResources[i].name); sprintf (class, "DisplayManager.%s", DmResources[i].class); GetResource (name, class, DmResources[i].type, (char **) DmResources[i].dm_value, DmResources[i].default_value); } } static void CleanUpName (char *src, char *dst, int len) { while (*src) { if (--len <= 0) break; switch (*src) { case ':': case '.': *dst++ = '_'; break; default: *dst++ = *src; } ++src; } *dst = '\0'; } static void LoadDisplayResources ( struct display *d, struct displayResource *resources, int numResources) { int i; char name[1024], class[1024]; char dpyName[512], dpyClass[512]; CleanUpName (d->name, dpyName, sizeof (dpyName)); CleanUpName (d->class ? d->class : d->name, dpyClass, sizeof (dpyClass)); for (i = 0; i < numResources; i++) { sprintf (name, "DisplayManager.%s.%s", dpyName, resources[i].name); sprintf (class, "DisplayManager.%s.%s", dpyClass, resources[i].class); GetResource (name, class, resources[i].type, (char **) (((char *) d) + resources[i].offset), resources[i].default_value); } } static void LoadWdmResources ( struct display *d) { int i; char name[1024], class[1024]; char dpyName[512], dpyClass[512]; CleanUpName (d->name, dpyName, sizeof (dpyName)); CleanUpName (d->class ? d->class : d->name, dpyClass, sizeof (dpyClass)); for (i = 0; i < NUM_WDM_RESOURCES; i++) { sprintf (name, "DisplayManager.%s.%s", dpyName, wdmResources[i].name); sprintf (class, "DisplayManager.%s.%s", dpyClass, wdmResources[i].class); GetResource (name, class, wdmResources[i].type, (char **) wdmResources[i].dm_value, wdmResources[i].default_value); } } void LoadServerResources (struct display *d) { LoadDisplayResources (d, serverResources, NUM_SERVER_RESOURCES); LoadWdmResources (d); } void LoadSessionResources (struct display *d) { LoadDisplayResources (d, sessionResources, NUM_SESSION_RESOURCES); } wdm-1.28/src/wdm/server.c 644 0 0 2113310221265060 147140ustar AlexeyVoinov 0 0/* $Xorg: server.c,v 1.5 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/server.c,v 3.13 2001/12/14 20:01:23 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * server.c - manage the X server */ # include # include # include # include # include # include # include # include #include static int receivedUsr1; static int serverPause (unsigned t, int serverPid); static Display *dpy; /* ARGSUSED */ static SIGVAL CatchUsr1 (int n) { int olderrno = errno; #ifdef SIGNALS_RESET_WHEN_CAUGHT (void) Signal (SIGUSR1, CatchUsr1); #endif WDMDebug("display manager caught SIGUSR1\n"); ++receivedUsr1; errno = olderrno; } char *_SysErrorMsg (int n) { char *s = strerror(n); return (s ? s : "unknown error"); } static int StartServerOnce (struct display *d) { char **f; char **argv; char arg[1024]; int pid; WDMDebug("StartServer for %s\n", d->name); receivedUsr1 = 0; (void) Signal (SIGUSR1, CatchUsr1); argv = d->argv; switch (pid = fork ()) { case 0: CleanUpChild (); #ifdef XDMCP /* The chooser socket is not closed by CleanUpChild() */ DestroyWellKnownSockets(); #endif if (d->authFile) { sprintf (arg, "-auth %s", d->authFile); argv = parseArgs (argv, arg); } if (!argv) { WDMError ("StartServer: no arguments\n"); sleep ((unsigned) d->openDelay); exit (UNMANAGE_DISPLAY); } for (f = argv; *f; f++) WDMDebug("'%s' ", *f); WDMDebug("\n"); /* * give the server SIGUSR1 ignored, * it will notice that and send SIGUSR1 * when ready */ (void) Signal (SIGUSR1, SIG_IGN); (void) execv (argv[0], argv); WDMError("server %s cannot be executed\n", argv[0]); sleep ((unsigned) d->openDelay); exit (REMANAGE_DISPLAY); case -1: WDMError("fork failed, sleeping\n"); return 0; default: break; } WDMDebug("Server Started %d\n", pid); d->serverPid = pid; if (serverPause ((unsigned) d->openDelay, pid)) return FALSE; return TRUE; } int StartServer (struct display *d) { int i; int ret = FALSE; i = 0; while (d->serverAttempts == 0 || i < d->serverAttempts) { if ((ret = StartServerOnce (d)) == TRUE) break; sleep (d->openDelay); i++; } return ret; } /* * sleep for t seconds, return 1 if the server is dead when * the sleep finishes, 0 else */ static Jmp_buf pauseAbort; static int serverPauseRet; /* ARGSUSED */ static SIGVAL serverPauseAbort (int n) { Longjmp (pauseAbort, 1); } /* ARGSUSED */ static SIGVAL serverPauseUsr1 (int n) { WDMDebug("display manager paused til SIGUSR1\n"); ++receivedUsr1; Longjmp (pauseAbort, 1); } static int serverPause (unsigned t, int serverPid) { int pid; serverPauseRet = 0; if (!Setjmp (pauseAbort)) { (void) Signal (SIGALRM, serverPauseAbort); (void) Signal (SIGUSR1, serverPauseUsr1); #ifdef SYSV if (receivedUsr1) (void) alarm ((unsigned) 1); else (void) alarm (t); #else if (!receivedUsr1) (void) alarm (t); else WDMDebug("Already received USR1\n"); #endif for (;;) { #if defined(SYSV) && defined(X_NOT_POSIX) pid = wait ((waitType *) 0); #else if (!receivedUsr1) pid = wait ((waitType *) 0); else #ifndef X_NOT_POSIX pid = waitpid (-1, (int *) 0, WNOHANG); #else pid = wait3 ((waitType *) 0, WNOHANG, (struct rusage *) 0); #endif /* X_NOT_POSIX */ #endif /* SYSV */ if (pid == serverPid || (pid == -1 && errno == ECHILD)) { WDMDebug("Server dead\n"); serverPauseRet = 1; break; } #if !defined(SYSV) || !defined(X_NOT_POSIX) if (pid == 0) { WDMDebug("Server alive and kicking\n"); break; } #endif } } (void) alarm ((unsigned) 0); (void) Signal (SIGALRM, SIG_DFL); (void) Signal (SIGUSR1, CatchUsr1); if (serverPauseRet) { WDMDebug("Server died\n"); WDMError("server unexpectedly died\n"); } return serverPauseRet; } /* * this code is complicated by some TCP failings. On * many systems, the connect will occasionally hang forever, * this trouble is avoided by setting up a timeout to Longjmp * out of the connect (possibly leaving piles of garbage around * inside Xlib) and give up, terminating the server. */ static Jmp_buf openAbort; /* ARGSUSED */ static SIGVAL abortOpen (int n) { Longjmp (openAbort, 1); } #ifdef XDMCP static void GetRemoteAddress (struct display *d, int fd) { char buf[512]; int len = sizeof (buf); if (d->peer) free ((char *) d->peer); getpeername (fd, (struct sockaddr *) buf, (void *)&len); d->peerlen = 0; if (len) { d->peer = (XdmcpNetaddr) malloc (len); if (d->peer) { memmove( (char *) d->peer, buf, len); d->peerlen = len; } } WDMDebug("Got remote address %s %d\n", d->name, d->peerlen); } #endif /* XDMCP */ static int openErrorHandler (Display *dpy) { WDMError("IO Error in XOpenDisplay\n"); exit (OPENFAILED_DISPLAY); /*NOTREACHED*/ return(0); } int WaitForServer (struct display *d) { static int i; for (i = 0; i < (d->openRepeat > 0 ? d->openRepeat : 1); i++) { (void) Signal (SIGALRM, abortOpen); (void) alarm ((unsigned) d->openTimeout); if (!Setjmp (openAbort)) { WDMDebug("Before XOpenDisplay(%s)\n", d->name); errno = 0; (void) XSetIOErrorHandler (openErrorHandler); dpy = XOpenDisplay (d->name); (void) alarm ((unsigned) 0); (void) Signal (SIGALRM, SIG_DFL); (void) XSetIOErrorHandler ((int (*)(Display *)) 0); WDMDebug("After XOpenDisplay(%s)\n", d->name); if (dpy) { #ifdef XDMCP if (d->displayType.location == Foreign) GetRemoteAddress (d, ConnectionNumber (dpy)); #endif RegisterCloseOnFork (ConnectionNumber (dpy)); (void) fcntl (ConnectionNumber (dpy), F_SETFD, 0); return 1; } else { WDMDebug("OpenDisplay failed %d (%s) on \"%s\"\n", errno, strerror (errno), d->name); } WDMDebug("waiting for server to start %d\n", i); sleep ((unsigned) d->openDelay); } else { WDMDebug("hung in open, aborting\n"); WDMError("Hung in XOpenDisplay(%s), aborting\n", d->name); (void) Signal (SIGALRM, SIG_DFL); break; } } WDMDebug("giving up on server\n"); WDMError("server open failed for %s, giving up\n", d->name); return 0; } void ResetServer (struct display *d) { if (dpy && d->displayType.origin != FromXDMCP) pseudoReset (dpy); } static Jmp_buf pingTime; static void PingLost (void) { Longjmp (pingTime, 1); } /* ARGSUSED */ static int PingLostIOErr (Display *dpy) { PingLost(); return 0; } /* ARGSUSED */ static SIGVAL PingLostSig (int n) { PingLost(); } int PingServer (struct display *d, Display *alternateDpy) { int (*oldError)(Display *); SIGVAL (*oldSig)(int); int oldAlarm; static Display *aDpy; aDpy = (alternateDpy != NULL ? alternateDpy : dpy); oldError = XSetIOErrorHandler (PingLostIOErr); oldAlarm = alarm (0); oldSig = Signal (SIGALRM, PingLostSig); (void) alarm (d->pingTimeout * 60); if (!Setjmp (pingTime)) { WDMDebug("Ping server\n"); XSync (aDpy, 0); } else { WDMDebug("Server dead\n"); (void) alarm (0); (void) Signal (SIGALRM, SIG_DFL); XSetIOErrorHandler (oldError); return 0; } (void) alarm (0); (void) Signal (SIGALRM, oldSig); (void) alarm (oldAlarm); WDMDebug("Server alive\n"); XSetIOErrorHandler (oldError); return 1; } wdm-1.28/src/wdm/session.c 644 0 0 5144110221265060 150760ustar AlexeyVoinov 0 0/* $Xorg: session.c,v 1.8 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/session.c,v 3.33 2001/12/14 20:01:23 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * session.c */ #include #include #include #include #include #include #include #include #include #include #include /* for initgroups */ #include #ifdef AIXV3 # include #endif #ifdef SECURE_RPC # include # include #endif #ifdef K5AUTH # include #endif #ifndef GREET_USER_STATIC #include #ifndef RTLD_NOW #define RTLD_NOW 1 #endif #endif #include static int runAndWait (char **args, char **environ); #ifdef HAVE_SHADOW_H #include #endif #ifdef WITH_SELINUX #include #include #endif #if defined(CSRG_BASED) #include #include #else extern struct passwd *getpwnam(GETPWNAM_ARGS); #ifdef linux extern void endpwent(void); #endif extern char *crypt(CRYPT_ARGS); #endif #ifdef USE_PAM pam_handle_t **thepamhp() { static pam_handle_t *pamh = NULL; return &pamh; } pam_handle_t *thepamh() { pam_handle_t **pamhp; pamhp = thepamhp(); if (pamhp) return *pamhp; else return NULL; } #endif static struct dlfuncs dlfuncs = { PingServer, SessionPingFailed, WDMDebug, RegisterCloseOnFork, SecureDisplay, UnsecureDisplay, ClearCloseOnFork, SetupDisplay, WDMError, SessionExit, DeleteXloginResources, source, defaultEnv, WDMSetEnv, WDMPutEnv, parseArgs, WDMPrintEnv, systemEnv, setgrent, getgrent, endgrent, #ifdef HAVE_SHADOW_H getspnam, #ifndef QNX4 endspent, #endif /* QNX4 doesn't use endspent */ #endif getpwnam, #ifdef linux endpwent, #endif crypt, #ifdef USE_PAM thepamhp, #endif }; static Bool StartClient( struct verify_info *verify, struct display *d, int *pidp, char *name, char *passwd); static int clientPid; static struct greet_info greet; static struct verify_info verify; static Jmp_buf abortSession; /* ARGSUSED */ static SIGVAL catchTerm (int n) { Longjmp (abortSession, 1); } static Jmp_buf pingTime; /* ARGSUSED */ static SIGVAL catchAlrm (int n) { Longjmp (pingTime, 1); } static Jmp_buf tenaciousClient; /* ARGSUSED */ static SIGVAL waitAbort (int n) { Longjmp (tenaciousClient, 1); } #if defined(_POSIX_SOURCE) || defined(SYSV) || defined(SVR4) #define killpg(pgrp, sig) kill(-(pgrp), sig) #endif static void AbortClient (int pid) { int sig = SIGTERM; volatile int i; int retId; for (i = 0; i < 4; i++) { if (killpg (pid, sig) == -1) { switch (errno) { case EPERM: WDMError ("xdm can't kill client\n"); case EINVAL: case ESRCH: return; } } if (!Setjmp (tenaciousClient)) { (void) Signal (SIGALRM, waitAbort); (void) alarm ((unsigned) 10); retId = wait ((waitType *) 0); (void) alarm ((unsigned) 0); (void) Signal (SIGALRM, SIG_DFL); if (retId == pid) break; } else (void) Signal (SIGALRM, SIG_DFL); sig = SIGKILL; } } void SessionPingFailed (struct display *d) { if (clientPid > 1) { AbortClient (clientPid); source (verify.systemEnviron, d->reset); } SessionExit (d, RESERVER_DISPLAY, TRUE); } /* * We need our own error handlers because we can't be sure what exit code Xlib * will use, and our Xlib does exit(1) which matches REMANAGE_DISPLAY, which * can cause a race condition leaving the display wedged. We need to use * RESERVER_DISPLAY for IO errors, to ensure that the manager waits for the * server to terminate. For other X errors, we should give up. */ /*ARGSUSED*/ static int IOErrorHandler (Display *dpy) { WDMError("fatal IO error %d (%s)\n", errno, _SysErrorMsg(errno)); exit(RESERVER_DISPLAY); /*NOTREACHED*/ return 0; } static int ErrorHandler(Display *dpy, XErrorEvent *event) { WDMError("X error\n"); if (XmuPrintDefaultErrorMessage (dpy, event, stderr) == 0) return 0; exit(UNMANAGE_DISPLAY); /*NOTREACHED*/ } void ManageSession (struct display *d) { static int pid = 0; Display *dpy; greet_user_rtn greet_stat; static GreetUserProc greet_user_proc = NULL; #ifndef GREET_USER_STATIC void *greet_lib_handle; #endif WDMDebug("ManageSession %s\n", d->name); (void)XSetIOErrorHandler(IOErrorHandler); (void)XSetErrorHandler(ErrorHandler); #ifndef HAS_SETPROCTITLE SetTitle(d->name, (char *) 0); #else setproctitle("%s", d->name); #endif /* * Load system default Resources */ LoadXloginResources (d); #ifdef GREET_USER_STATIC greet_user_proc = GreetUser; #else WDMDebug("ManageSession: loading greeter library %s\n", greeterLib); greet_lib_handle = dlopen(greeterLib, RTLD_NOW); if (greet_lib_handle != NULL) greet_user_proc = (GreetUserProc)dlsym(greet_lib_handle, "GreetUser"); if (greet_user_proc == NULL) { WDMError("%s while loading %s\n", dlerror(), greeterLib); exit(UNMANAGE_DISPLAY); } #endif /* tell the possibly dynamically loaded greeter function * what data structure formats to expect. * These version numbers are registered with The Open Group. */ verify.version = 1; greet.version = 1; greet_stat = (*greet_user_proc)(d, &dpy, &verify, &greet, &dlfuncs); if (greet_stat == Greet_Success) { clientPid = 0; if (!Setjmp (abortSession)) { (void) Signal (SIGTERM, catchTerm); /* * Start the clients, changing uid/groups * setting up environment and running the session */ if (StartClient (&verify, d, &clientPid, greet.name, greet.password)) { WDMDebug("Client Started\n"); #ifndef GREET_USER_STATIC /* Save memory; close library */ dlclose(greet_lib_handle); #endif /* * Wait for session to end, */ for (;;) { if (d->pingInterval) { if (!Setjmp (pingTime)) { (void) Signal (SIGALRM, catchAlrm); (void) alarm (d->pingInterval * 60); pid = wait ((waitType *) 0); (void) alarm (0); } else { (void) alarm (0); if (!PingServer (d, (Display *) NULL)) SessionPingFailed (d); } } else { pid = wait ((waitType *) 0); } if (pid == clientPid) break; } } else { WDMError("session start failed\n"); } } else { /* * when terminating the session, nuke * the child and then run the reset script */ AbortClient (clientPid); } } /* * run system-wide reset file */ WDMDebug("Source reset program %s\n", d->reset); source (verify.systemEnviron, d->reset); SessionExit (d, OBEYSESS_DISPLAY, TRUE); } void LoadXloginResources (struct display *d) { char **args; char **env = 0; if (d->resources[0] && access (d->resources, 4) == 0) { env = systemEnv (d, (char *) 0, (char *) 0); args = parseArgs ((char **) 0, d->xrdb); args = parseArgs (args, d->resources); WDMDebug("Loading resource file: %s\n", d->resources); (void) runAndWait (args, env); freeArgs (args); WDMFreeEnv (env); } } void SetupDisplay (struct display *d) { char **env = 0; if (d->setup && d->setup[0]) { env = systemEnv (d, (char *) 0, (char *) 0); (void) source (env, d->setup); WDMFreeEnv (env); } } /*ARGSUSED*/ void DeleteXloginResources (struct display *d, Display *dpy) { int i; Atom prop = XInternAtom(dpy, "SCREEN_RESOURCES", True); XDeleteProperty(dpy, RootWindow (dpy, 0), XA_RESOURCE_MANAGER); if (prop) { for (i = ScreenCount(dpy); --i >= 0; ) XDeleteProperty(dpy, RootWindow (dpy, i), prop); } } static Jmp_buf syncJump; /* ARGSUSED */ static SIGVAL syncTimeout (int n) { Longjmp (syncJump, 1); } void SecureDisplay (struct display *d, Display *dpy) { WDMDebug("SecureDisplay %s\n", d->name); (void) Signal (SIGALRM, syncTimeout); if (Setjmp (syncJump)) { WDMError("WARNING: display %s could not be secured\n", d->name); SessionExit (d, RESERVER_DISPLAY, FALSE); } (void) alarm ((unsigned) d->grabTimeout); WDMDebug("Before XGrabServer %s\n", d->name); XGrabServer (dpy); if (XGrabKeyboard (dpy, DefaultRootWindow (dpy), True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) { (void) alarm (0); (void) Signal (SIGALRM, SIG_DFL); WDMError("WARNING: keyboard on display %s could not be secured\n", d->name); SessionExit (d, RESERVER_DISPLAY, FALSE); } WDMDebug("XGrabKeyboard succeeded %s\n", d->name); (void) alarm (0); (void) Signal (SIGALRM, SIG_DFL); pseudoReset (dpy); if (!d->grabServer) { XUngrabServer (dpy); XSync (dpy, 0); } WDMDebug("done secure %s\n", d->name); } void UnsecureDisplay (struct display *d, Display *dpy) { WDMDebug("Unsecure display %s\n", d->name); if (d->grabServer) { XUngrabServer (dpy); XSync (dpy, 0); } } void SessionExit (struct display *d, int status, int removeAuth) { #ifdef USE_PAM pam_handle_t *pamh = thepamh(); if(pamh) { /* shutdown PAM session */ if(pam_setcred(pamh, PAM_DELETE_CRED) != PAM_SUCCESS) WDMError("pam_setcred(DELETE_CRED) failed, errno=%d", errno); pam_close_session(pamh, 0); pam_end(pamh, PAM_SUCCESS); pamh = NULL; } #endif /* make sure the server gets reset after the session is over */ if (d->serverPid >= 2 && d->resetSignal) kill (d->serverPid, d->resetSignal); else ResetServer (d); if (removeAuth) { setgid (verify.gid); setuid (verify.uid); RemoveUserAuthorization (d, &verify); #ifdef K5AUTH /* do like "kdestroy" program */ { krb5_error_code code; krb5_ccache ccache; code = Krb5DisplayCCache(d->name, &ccache); if (code) WDMError("%s while getting Krb5 ccache to destroy\n", error_message(code)); else { code = krb5_cc_destroy(ccache); if (code) { if (code == KRB5_FCC_NOFILE) { WDMDebug("No Kerberos ccache file found to destroy\n"); } else WDMError("%s while destroying Krb5 credentials cache\n", error_message(code)); } else WDMDebug("Kerberos ccache destroyed\n"); krb5_cc_close(ccache); } } #endif /* K5AUTH */ } WDMDebug("Display %s exiting with status %d\n", d->name, status); exit (status); } static Bool StartClient ( struct verify_info *verify, struct display *d, int *pidp, char *name, char *passwd) { char **f; const char *home; char *failsafeArgv[2]; int pid; #ifdef HAS_SETUSERCONTEXT struct passwd* pwd; #endif #ifdef USE_PAM pam_handle_t *pamh = thepamh(); #endif if (verify->argv) { WDMDebug("StartSession %s: ", verify->argv[0]); for (f = verify->argv; *f; f++) WDMDebug ("%s ", *f); WDMDebug("; "); } if (verify->userEnviron) { for (f = verify->userEnviron; *f; f++) WDMDebug("%s ", *f); WDMDebug("\n"); } #ifdef USE_PAM #endif switch (pid = fork ()) { case 0: CleanUpChild (); #ifdef XDMCP /* The chooser socket is not closed by CleanUpChild() */ DestroyWellKnownSockets(); #endif /* Do system-dependent login setup here */ #ifndef AIXV3 if (setgid(verify->gid) < 0) { WDMError("setgid %d (user \"%s\") failed, errno=%d\n", verify->gid, name, errno); return (0); } #if defined(BSD) && (BSD >= 199103) if (setlogin(name) < 0) { WDMError("setlogin for \"%s\" failed, errno=%d", name, errno); return(0); } #endif #ifndef QNX4 if (initgroups(name, verify->gid) < 0) { WDMError("initgroups for \"%s\" failed, errno=%d\n", name, errno); return (0); } #endif /* QNX4 doesn't support multi-groups, no initgroups() */ #ifdef USE_PAM if(pamh) { if(pam_setcred(thepamh(), PAM_ESTABLISH_CRED) != PAM_SUCCESS) { WDMError("pam_setcred failed, errno=%d\n", errno); pam_end(pamh, PAM_SUCCESS); pamh = NULL; return 0; } /* pass in environment variables set by libpam and modules it called */ {long i; char **pam_env = pam_getenvlist(pamh); for(i = 0; pam_env && pam_env[i]; i++) { verify->userEnviron = WDMPutEnv(verify->userEnviron, pam_env[i]); }} pam_open_session(pamh, 0); } #endif if (setuid(verify->uid) < 0) { WDMError("setuid %d (user \"%s\") failed, errno=%d\n", verify->uid, name, errno); return (0); } #else /* AIXV3 */ /* * Set the user's credentials: uid, gid, groups, * audit classes, user limits, and umask. */ if (setpcred(name, NULL) == -1) { WDMError("setpcred for \"%s\" failed, errno=%d\n", name, errno); return (0); } #endif /* AIXV3 */ /* * for Security Enhanced Linux, * set the default security context for this user. */ #ifdef WITH_SELINUX if (is_selinux_enabled()) { security_context_t scontext; if (get_default_context(name,NULL,&scontext)) WDMError("Failed to get default security context" " for %s.", name); WDMDebug("setting security context to %s", scontext); if (setexeccon(scontext)) { freecon(scontext); WDMError("Failed to set exec security context %s " "for %s.", scontext, name); } freecon(scontext); } #endif /* * for user-based authorization schemes, * use the password to get the user's credentials. */ #ifdef SECURE_RPC /* do like "keylogin" program */ { char netname[MAXNETNAMELEN+1], secretkey[HEXKEYBYTES+1]; int nameret, keyret; int len; int key_set_ok = 0; nameret = getnetname (netname); WDMDebug("User netname: %s\n", netname); len = strlen (passwd); if (len > 8) bzero (passwd + 8, len - 8); keyret = getsecretkey(netname,secretkey,passwd); WDMDebug("getsecretkey returns %d, key length %d\n", keyret, strlen (secretkey)); /* is there a key, and do we have the right password? */ if (keyret == 1) { if (*secretkey) { keyret = key_setsecret(secretkey); WDMDebug("key_setsecret returns %d\n", keyret); if (keyret == -1) WDMError("failed to set NIS secret key\n"); else key_set_ok = 1; } else { /* found a key, but couldn't interpret it */ WDMError("password incorrect for NIS principal \"%s\"\n", nameret ? netname : name); } } if (!key_set_ok) { /* remove SUN-DES-1 from authorizations list */ int i, j; for (i = 0; i < d->authNum; i++) { if (d->authorizations[i]->name_length == 9 && memcmp(d->authorizations[i]->name, "SUN-DES-1", 9) == 0) { for (j = i+1; j < d->authNum; j++) d->authorizations[j-1] = d->authorizations[j]; d->authNum--; break; } } } bzero(secretkey, strlen(secretkey)); } #endif #ifdef K5AUTH /* do like "kinit" program */ { int i, j; int result; extern char *Krb5CCacheName(); result = Krb5Init(name, passwd, d); if (result == 0) { /* point session clients at the Kerberos credentials cache */ verify->userEnviron = WDMSetEnv(verify->userEnviron, "KRB5CCNAME", Krb5CCacheName(d->name)); } else { for (i = 0; i < d->authNum; i++) { if (d->authorizations[i]->name_length == 14 && memcmp(d->authorizations[i]->name, "MIT-KERBEROS-5", 14) == 0) { /* remove Kerberos from authorizations list */ for (j = i+1; j < d->authNum; j++) d->authorizations[j-1] = d->authorizations[j]; d->authNum--; break; } } } } #endif /* K5AUTH */ bzero(passwd, strlen(passwd)); SetUserAuthorization (d, verify); home = WDMGetEnv(verify->userEnviron, "HOME"); if (home) if (chdir (home) == -1) { WDMError("user \"%s\": cannot chdir to home \"%s\" (err %d), using \"/\"\n", WDMGetEnv(verify->userEnviron, "USER"), home, errno); chdir ("/"); verify->userEnviron = WDMSetEnv(verify->userEnviron, "HOME", "/"); } if (verify->argv) { WDMDebug("executing session %s\n", verify->argv[0]); execute (verify->argv, verify->userEnviron); WDMError("Session \"%s\" execution failed (err %d)\n", verify->argv[0], errno); } else { WDMError("Session has no command/arguments\n"); } failsafeArgv[0] = d->failsafeClient; failsafeArgv[1] = 0; execute (failsafeArgv, verify->userEnviron); exit (1); case -1: bzero(passwd, strlen(passwd)); WDMDebug("StartSession, fork failed\n"); WDMError("can't start session on \"%s\", fork failed, errno=%d\n", d->name, errno); return 0; default: bzero(passwd, strlen(passwd)); WDMDebug("StartSession, fork succeeded %d\n", pid); *pidp = pid; return 1; } } int source (char **environ, char *file) { char **args, *args_safe[2]; int ret; if (file && file[0]) { WDMDebug("source %s\n", file); args = parseArgs ((char **) 0, file); if (!args) { args = args_safe; args[0] = file; args[1] = NULL; } ret = runAndWait (args, environ); freeArgs (args); return ret; } return 0; } static int runAndWait (char **args, char **environ) { int pid; waitType result; switch (pid = fork ()) { case 0: CleanUpChild (); execute (args, environ); WDMError("can't execute \"%s\" (err %d)\n", args[0], errno); exit (1); case -1: WDMDebug("fork failed\n"); WDMError("can't fork to execute \"%s\" (err %d)\n", args[0], errno); return 1; default: while (wait (&result) != pid) /* SUPPRESS 530 */ ; break; } return waitVal (result); } void execute (char **argv, char **environ) { /* give /dev/null as stdin */ (void) close (0); open ("/dev/null", O_RDONLY); /* make stdout follow stderr to the log file */ dup2 (2,1); execve (argv[0], argv, environ); /* * In case this is a shell script which hasn't been * made executable (or this is a SYSV box), do * a reasonable thing */ if (errno != ENOENT) { char program[1024], *e, *p, *optarg; FILE *f; char **newargv, **av; int argc; /* * emulate BSD kernel behaviour -- read * the first line; check if it starts * with "#!", in which case it uses * the rest of the line as the name of * program to run. Else use "/bin/sh". */ f = fopen (argv[0], "r"); if (!f) return; if (fgets (program, sizeof (program) - 1, f) == NULL) { fclose (f); return; } fclose (f); e = program + strlen (program) - 1; if (*e == '\n') *e = '\0'; if (!strncmp (program, "#!", 2)) { p = program + 2; while (*p && isspace (*p)) ++p; optarg = p; while (*optarg && !isspace (*optarg)) ++optarg; if (*optarg) { *optarg = '\0'; do ++optarg; while (*optarg && isspace (*optarg)); } else optarg = 0; } else { p = "/bin/sh"; optarg = 0; } WDMDebug ("Shell script execution: %s (optarg %s)\n", p, optarg ? optarg : "(null)"); for (av = argv, argc = 0; *av; av++, argc++) /* SUPPRESS 530 */ ; newargv = (char **) malloc ((argc + (optarg ? 3 : 2)) * sizeof (char *)); if (!newargv) return; av = newargv; *av++ = p; if (optarg) *av++ = optarg; /* SUPPRESS 560 */ while ((*av++ = *argv++)) /* SUPPRESS 530 */ ; execve (newargv[0], newargv, environ); } } char ** defaultEnv (void) { char **env, **exp, *value; env = 0; for (exp = exportList.l; exp && *exp; ++exp) { value = getenv (*exp); if (value) env = WDMSetEnv(env, *exp, value); } return env; } char ** systemEnv (struct display *d, char *user, char *home) { char **env; env = defaultEnv(); env = WDMSetEnv(env, "DISPLAY", d->name); if (home) env = WDMSetEnv(env, "HOME", home); if (user) { env = WDMSetEnv(env, "USER", user); env = WDMSetEnv(env, "LOGNAME", user); } env = WDMSetEnv(env, "PATH", d->systemPath); env = WDMSetEnv(env, "SHELL", d->systemShell); if (d->authFile) env = WDMSetEnv(env, "XAUTHORITY", d->authFile); return env; } #if (defined(Lynx) && !defined(HAS_CRYPT)) || defined(SCO) && !defined(SCO_USA) && !defined(_SCO_DS) char *crypt(char *s1, char *s2) { return(s2); } #endif wdm-1.28/src/wdm/socket.c 644 0 0 674510221265060 146720ustar AlexeyVoinov 0 0/* $Xorg: socket.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/socket.c,v 3.10 2001/12/14 20:01:24 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * socket.c - Support for BSD sockets */ #include #ifdef XDMCP #include #include #ifndef X_NO_SYS_UN #ifndef Lynx #include #else #include #endif #endif #include #include extern int xdmcpFd; extern int chooserFd; extern FD_TYPE WellKnownSocketsMask; extern int WellKnownSocketsMax; void CreateWellKnownSockets (void) { struct sockaddr_in sock_addr; char *name; if (request_port.i == 0) return; WDMDebug("creating socket %d\n", request_port.i); xdmcpFd = socket (AF_INET, SOCK_DGRAM, 0); if (xdmcpFd == -1) { WDMError("XDMCP socket creation failed, errno %d\n", errno); return; } name = localHostname (); registerHostname (name, strlen (name)); RegisterCloseOnFork (xdmcpFd); /* zero out the entire structure; this avoids 4.4 incompatibilities */ bzero ((char *) &sock_addr, sizeof (sock_addr)); #ifdef BSD44SOCKETS sock_addr.sin_len = sizeof(sock_addr); #endif sock_addr.sin_family = AF_INET; sock_addr.sin_port = htons ((short) request_port.i); sock_addr.sin_addr.s_addr = htonl (INADDR_ANY); if (bind (xdmcpFd, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) == -1) { WDMError("error %d binding socket address %d\n", errno, request_port.i); close (xdmcpFd); xdmcpFd = -1; return; } WellKnownSocketsMax = xdmcpFd; FD_SET (xdmcpFd, &WellKnownSocketsMask); chooserFd = socket (AF_INET, SOCK_STREAM, 0); WDMDebug("Created chooser socket %d\n", chooserFd); if (chooserFd == -1) { WDMError("chooser socket creation failed, errno %d\n", errno); return; } listen (chooserFd, 5); if (chooserFd > WellKnownSocketsMax) WellKnownSocketsMax = chooserFd; FD_SET (chooserFd, &WellKnownSocketsMask); } int GetChooserAddr ( char *addr, int *lenp) { struct sockaddr_in in_addr; int len; len = sizeof in_addr; if (getsockname (chooserFd, (struct sockaddr *)&in_addr, (void *)&len) < 0) return -1; WDMDebug("Chooser socket port: %d\n", ntohs(in_addr.sin_port)); memmove( addr, (char *) &in_addr, len); *lenp = len; return 0; } #endif /* XDMCP */ wdm-1.28/src/wdm/util.c 644 0 0 673410221265060 143550ustar AlexeyVoinov 0 0/* $Xorg: util.c,v 1.4 2001/02/09 02:05:41 xorgcvs Exp $ */ /* Copyright 1989, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/util.c,v 3.19 2001/12/14 20:01:24 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * util.c * * various utility routines */ # include #include /* for XmuGetHostname */ #include #include # define isblank(c) ((c) == ' ' || c == '\t') char ** parseArgs (char **argv, char *string) { char *word; char *save; char **newargv; int i; i = 0; while (argv && argv[i]) ++i; if (!argv) { argv = (char **) malloc (sizeof (char *)); if (!argv) { WDMError("parseArgs: out of memory"); return 0; } } word = string; for (;;) { if (!*string || isblank (*string)) { if (word != string) { newargv = (char **) realloc ((char *) argv, (unsigned) ((i + 2) * sizeof (char *))); save = malloc ((unsigned) (string - word + 1)); if (!newargv || !save) { WDMError("parseArgs: out of memory"); free ((char *) argv); if (save) free (save); return 0; } else { argv = newargv; } argv[i] = strncpy (save, word, string-word); argv[i][string-word] = '\0'; i++; } if (!*string) break; word = string + 1; } ++string; } argv[i] = 0; return argv; } void freeArgs (char **argv) { char **a; if (!argv) return; for (a = argv; *a; a++) free (*a); free ((char *) argv); } void CleanUpChild (void) { #ifdef CSRG_BASED setsid(); #else setpgid (0, getpid ()); sigsetmask (0); #endif #ifdef SIGCHLD (void) Signal (SIGCHLD, SIG_DFL); #endif (void) Signal (SIGTERM, SIG_DFL); (void) Signal (SIGPIPE, SIG_DFL); (void) Signal (SIGALRM, SIG_DFL); (void) Signal (SIGHUP, SIG_DFL); CloseOnFork (); WDMCloseLog(); } static char localHostbuf[256]; static int gotLocalHostname; char * localHostname (void) { if (!gotLocalHostname) { XmuGetHostname (localHostbuf, sizeof (localHostbuf) - 1); gotLocalHostname = 1; } return localHostbuf; } SIGVAL (*Signal (int sig, SIGFUNC handler))(int) { #if !defined(X_NOT_POSIX) && !defined(__EMX__) struct sigaction sigact, osigact; sigact.sa_handler = handler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(sig, &sigact, &osigact); return osigact.sa_handler; #else return signal(sig, handler); #endif } wdm-1.28/src/wdm/verify.c 644 0 0 3116710221265060 147220ustar AlexeyVoinov 0 0/* $Xorg: verify.c,v 1.4 2001/02/09 02:05:41 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/greeter/verify.c,v 3.21 2001/12/14 20:01:29 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * verify.c * * typical unix verification routine. */ #include #include #ifdef USE_PAM # include # include #else # ifdef HAVE_SHADOW_H # include # include # endif #endif # include #include #ifdef QNX4 extern char *crypt(const char *, const char *); #endif static char *envvars[] = { "TZ", /* SYSV and SVR4, but never hurts */ #if defined(sony) && !defined(SYSTYPE_SYSV) && !defined(_SYSTYPE_SYSV) "bootdev", "boothowto", "cputype", "ioptype", "machine", "model", "CONSDEVTYPE", "SYS_LANGUAGE", "SYS_CODE", #endif #if (defined(SVR4) || defined(SYSV)) && defined(i386) && !defined(sun) "XLOCAL", #endif NULL }; #ifdef KERBEROS #include #include #include static char krbtkfile[MAXPATHLEN]; #endif static char ** userEnv (struct display *d, int useSystemPath, char *user, char *home, char *shell) { char **env; char **envvar; char *str; env = defaultEnv (); env = WDMSetEnv(env, "DISPLAY", d->name); env = WDMSetEnv(env, "HOME", home); env = WDMSetEnv(env, "LOGNAME", user); /* POSIX, System V */ env = WDMSetEnv(env, "USER", user); /* BSD */ env = WDMSetEnv(env, "PATH", useSystemPath ? d->systemPath : d->userPath); env = WDMSetEnv(env, "SHELL", shell); #ifdef KERBEROS if (krbtkfile[0] != '\0') env = WDMSetEnv(env, "KRBTKFILE", krbtkfile); #endif for (envvar = envvars; *envvar; envvar++) { str = getenv(*envvar); if (str) env = WDMSetEnv(env, *envvar, str); } return env; } #ifdef USE_PAM static char *PAM_password; static int pam_error; static int PAM_conv (int num_msg, #ifdef sun struct pam_message **msg, #else const struct pam_message **msg, #endif struct pam_response **resp, void *appdata_ptr) { int count = 0, replies = 0; struct pam_response *reply = NULL; #define PAM_RESPONSE_SIZE sizeof(struct pam_response) size_t size = PAM_RESPONSE_SIZE; #define COPY_STRING(s) (s) ? strdup(s) : (char*)NULL for (count = 0; count < num_msg; count++) { switch (msg[count]->msg_style) { case PAM_PROMPT_ECHO_ON: /* user name given to PAM already */ return PAM_CONV_ERR; case PAM_PROMPT_ECHO_OFF: /* wants password */ if (reply) { reply = realloc(reply, size); bzero(reply + size - PAM_RESPONSE_SIZE, PAM_RESPONSE_SIZE); } else { reply = (struct pam_response*)malloc(size); bzero(reply, size); } if (!reply) return PAM_CONV_ERR; size += PAM_RESPONSE_SIZE; reply[replies].resp_retcode = PAM_SUCCESS; reply[replies].resp = COPY_STRING(PAM_password); /* PAM frees resp */ break; case PAM_TEXT_INFO: /* ignore the informational mesage */ break; default: /* unknown or PAM_ERROR_MSG */ if (reply) free (reply); return PAM_CONV_ERR; } } #undef COPY_STRING if (reply) *resp = reply; return PAM_SUCCESS; } static struct pam_conv PAM_conversation = { PAM_conv, NULL }; #endif /* USE_PAM */ #ifdef USE_BSDAUTH int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify) { struct passwd *p; login_cap_t *lc; auth_session_t *as; char *style, *shell, *home, *s, **argv; char path[MAXPATHLEN]; int authok; /* User may have specified an authentication style. */ if ((style = strchr(greet->name, ':')) != NULL) *style++ = '\0'; Debug ("Verify %s, style %s ...\n", greet->name, style ? style : "default"); p = getpwnam (greet->name); endpwent(); if (!p || strlen (greet->name) == 0) { Debug("getpwnam() failed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } if ((lc = login_getclass(p->pw_class)) == NULL) { Debug("login_getclass() failed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } if ((style = login_getstyle(lc, style, "xdm")) == NULL) { Debug("login_getstyle() failed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } if ((as = auth_open()) == NULL) { Debug("auth_open() failed.\n"); login_close(lc); bzero(greet->password, strlen(greet->password)); return 0; } if (auth_setoption(as, "login", "yes") == -1) { Debug("auth_setoption() failed.\n"); login_close(lc); bzero(greet->password, strlen(greet->password)); return 0; } /* Set up state for no challenge, just check a response. */ auth_setstate(as, 0); auth_setdata(as, "", 1); auth_setdata(as, greet->password, strlen(greet->password) + 1); /* Build path of the auth script and call it */ snprintf(path, sizeof(path), _PATH_AUTHPROG "%s", style); auth_call(as, path, style, "-s", "response", greet->name, NULL); authok = auth_getstate(as); if ((authok & AUTH_ALLOW) == 0) { Debug("password verify failed\n"); bzero(greet->password, strlen(greet->password)); auth_close(as); login_close(lc); return 0; } /* Run the approval script */ if (!auth_approval(as, lc, greet->name, "auth-xdm")) { Debug("login not approved\n"); bzero(greet->password, strlen(greet->password)); auth_close(as); login_close(lc); return 0; } auth_close(as); login_close(lc); /* Check empty passwords against allowNullPasswd */ if (!greet->allow_null_passwd && strlen(greet->password) == 0) { Debug("empty password not allowed\n"); return 0; } /* Only accept root logins if allowRootLogin resource is set */ if (p->pw_uid == 0 && !greet->allow_root_login) { Debug("root logins not allowed\n"); bzero(greet->password, strlen(greet->password)); return 0; } /* * Shell must be in /etc/shells */ for (;;) { s = getusershell(); if (s == NULL) { /* did not found the shell in /etc/shells -> failure */ Debug("shell not in /etc/shells\n"); bzero(greet->password, strlen(greet->password)); endusershell(); return 0; } if (strcmp(s, p->pw_shell) == 0) { /* found the shell in /etc/shells */ endusershell(); break; } } #else /* !USE_BSDAUTH */ int Verify (struct display *d, struct greet_info *greet, struct verify_info *verify) { struct passwd *p; #ifdef USE_PAM pam_handle_t **pamhp = thepamhp(); #else #ifdef HAVE_SHADOW_H struct spwd *sp; #endif char *user_pass = NULL; #endif #ifdef __OpenBSD__ char *s; struct timeval tp; #endif char *shell, *home; char **argv; WDMDebug("Verify %s ...\n", greet->name); #ifndef USE_PAM p = getpwnam (greet->name); endpwent(); if (!p || strlen (greet->name) == 0) { WDMDebug("getpwnam() failed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } else { #ifdef linux if (!strcmp(p->pw_passwd, "!") || !strcmp(p->pw_passwd, "*")) { WDMDebug("The account is locked, no login allowed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } #endif user_pass = p->pw_passwd; } #endif #ifdef KERBEROS if(strcmp(greet->name, "root") != 0){ char name[ANAME_SZ]; char realm[REALM_SZ]; char *q; int ret; if(krb_get_lrealm(realm, 1)){ WDMDebug("Can't get Kerberos realm.\n"); } else { sprintf(krbtkfile, "%s.%s", TKT_ROOT, d->name); krb_set_tkt_string(krbtkfile); unlink(krbtkfile); ret = krb_verify_user(greet->name, "", realm, greet->password, 1, "rcmd"); if(ret == KSUCCESS){ chown(krbtkfile, p->pw_uid, p->pw_gid); WDMDebug("kerberos verify succeeded\n"); if (k_hasafs()) { if (k_setpag() == -1) WDMError("setpag() failed for %s\n", greet->name); if((ret = k_afsklog(NULL, NULL)) != KSUCCESS) WDMError("Warning %s\n", krb_get_err_text(ret)); } goto done; } else if(ret != KDC_PR_UNKNOWN && ret != SKDC_CANT){ /* failure */ WDMDebug("kerberos verify failure %d\n", ret); krbtkfile[0] = '\0'; } } } #endif #ifndef USE_PAM #ifdef HAVE_SHADOW_H errno = 0; sp = getspnam(greet->name); if (sp == NULL) { WDMDebug("getspnam() failed, errno=%d. Are you root?\n", errno); } else { user_pass = sp->sp_pwdp; } #ifndef QNX4 endspent(); #endif /* QNX4 doesn't need endspent() to end shadow passwd ops */ #endif #if defined(ultrix) || defined(__ultrix__) if (authenticate_user(p, greet->password, NULL) < 0) #else if (strcmp (crypt (greet->password, user_pass), user_pass)) #endif { if(!greet->allow_null_passwd || strlen(p->pw_passwd) > 0) { WDMDebug("password verify failed\n"); bzero(greet->password, strlen(greet->password)); return 0; } /* else: null passwd okay */ } #ifdef KERBEROS done: #endif #ifdef __OpenBSD__ /* * Only accept root logins if allowRootLogin resource is set */ if ((p->pw_uid == 0) && !greet->allow_root_login) { WDMDebug("root logins not allowed\n"); bzero(greet->password, strlen(greet->password)); return 0; } /* * Shell must be in /etc/shells */ for (;;) { s = getusershell(); if (s == NULL) { /* did not found the shell in /etc/shells -> failure */ WDMDebug("shell not in /etc/shells\n"); bzero(greet->password, strlen(greet->password)); endusershell(); return 0; } if (strcmp(s, p->pw_shell) == 0) { /* found the shell in /etc/shells */ endusershell(); break; } } /* * Test for expired password */ if (p->pw_change || p->pw_expire) (void)gettimeofday(&tp, (struct timezone *)NULL); if (p->pw_change) { if (tp.tv_sec >= p->pw_change) { WDMDebug("Password has expired.\n"); bzero(greet->password, strlen(greet->password)); return 0; } } if (p->pw_expire) { if (tp.tv_sec >= p->pw_expire) { WDMDebug("account has expired.\n"); bzero(greet->password, strlen(greet->password)); return 0; } } #endif /* __OpenBSD__ */ bzero(user_pass, strlen(user_pass)); /* in case shadow password */ #else /* USE_PAM */ #define PAM_BAIL \ if (pam_error != PAM_SUCCESS) goto pam_failed; PAM_password = greet->password; pam_error = pam_start("wdm", greet->name, &PAM_conversation, pamhp); PAM_BAIL; pam_error = pam_set_item(*pamhp, PAM_TTY, d->name); PAM_BAIL; pam_error = pam_set_item(*pamhp, PAM_RHOST, ""); PAM_BAIL; pam_error = pam_authenticate(*pamhp, 0); PAM_BAIL; pam_error = pam_acct_mgmt(*pamhp, 0); /* really should do password changing, but it doesn't fit well */ PAM_BAIL; pam_error = pam_setcred(*pamhp, 0); PAM_BAIL; p = getpwnam (greet->name); endpwent(); if (!p || strlen (greet->name) == 0) { WDMDebug("getpwnam() failed.\n"); bzero(greet->password, strlen(greet->password)); return 0; } if (pam_error != PAM_SUCCESS) { pam_failed: pam_end(*pamhp, PAM_SUCCESS); *pamhp = NULL; return 0; } #undef PAM_BAIL #endif /* USE_PAM */ #endif /* USE_BSDAUTH */ WDMDebug("verify succeeded\n"); /* The password is passed to StartClient() for use by user-based authorization schemes. It is zeroed there. */ verify->uid = p->pw_uid; verify->gid = p->pw_gid; home = p->pw_dir; shell = p->pw_shell; argv = 0; if (d->session) argv = parseArgs (argv, d->session); if (greet->string) argv = parseArgs (argv, greet->string); if (!argv) argv = parseArgs (argv, "xsession"); verify->argv = argv; verify->userEnviron = userEnv (d, p->pw_uid == 0, greet->name, home, shell); WDMDebug("user environment:\n"); WDMPrintEnv (verify->userEnviron); verify->systemEnviron = systemEnv (d, greet->name, home); WDMDebug("system environment:\n"); WDMPrintEnv (verify->systemEnviron); WDMDebug("end of environments\n"); return 1; } wdm-1.28/src/wdm/xdmcp.c 644 0 0 10320110221265060 145360ustar AlexeyVoinov 0 0/* $Xorg: xdmcp.c,v 1.4 2001/02/09 02:05:41 xorgcvs Exp $ */ /* Copyright 1988, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP 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. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. */ /* $XFree86: xc/programs/xdm/xdmcp.c,v 3.19 2001/12/14 20:01:25 dawes Exp $ */ /* * xdm - display manager daemon * Author: Keith Packard, MIT X Consortium * * xdmcp.c - Support for XDMCP */ # include # include #ifdef XDMCP # include # include # include # include # include #ifndef X_NO_SYS_UN #ifndef Lynx #include #else #include #endif #endif #if defined(__SVR4) && defined(__sun) /* * make sure we get the resolver's version of gethostbyname * otherwise we may not get all the addresses! */ #define gethostbyname res_gethostbyname #endif #include #include #define Time_t time_t #define getString(name,len) ((name = malloc (len + 1)) ? 1 : 0) #include /* * misc externs */ extern int Rescan, ChildReady; extern int sourceAddress; /* * Forward reference */ static void broadcast_respond (struct sockaddr *from, int fromlen, int length); static void forward_respond (struct sockaddr *from, int fromlen, int length); static void manage (struct sockaddr *from, int fromlen, int length); static void query_respond (struct sockaddr *from, int fromlen, int length); static void request_respond (struct sockaddr *from, int fromlen, int length); static void send_accept (struct sockaddr *to, int tolen, CARD32 sessionID, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr authorizationName, ARRAY8Ptr authorizationData); static void send_alive (struct sockaddr *from, int fromlen, int length); static void send_decline (struct sockaddr *to, int tolen, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr status); static void send_failed (struct sockaddr *from, int fromlen, char *name, CARD32 sessionID, char *reason); static void send_refuse (struct sockaddr *from, int fromlen, CARD32 sessionID); static void send_unwilling (struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status); static void send_willing (struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status); int xdmcpFd = -1; int chooserFd = -1; FD_TYPE WellKnownSocketsMask; int WellKnownSocketsMax; #define pS(s) ((s) ? ((char *) (s)) : "empty string") void DestroyWellKnownSockets (void) { if (xdmcpFd != -1) { close (xdmcpFd); xdmcpFd = -1; } if (chooserFd != -1) { close (chooserFd); chooserFd = -1; } } int AnyWellKnownSockets (void) { return xdmcpFd != -1 || chooserFd != -1; } static XdmcpBuffer buffer; /*ARGSUSED*/ static void sendForward ( CARD16 connectionType, ARRAY8Ptr address, char *closure) { #ifdef AF_INET struct sockaddr_in in_addr; #endif struct sockaddr *addr; int addrlen; switch (connectionType) { #ifdef AF_INET case FamilyInternet: addr = (struct sockaddr *) &in_addr; bzero ((char *) &in_addr, sizeof (in_addr)); #ifdef BSD44SOCKETS in_addr.sin_len = sizeof(in_addr); #endif in_addr.sin_family = AF_INET; in_addr.sin_port = htons ((short) XDM_UDP_PORT); if (address->length != 4) return; memmove( (char *) &in_addr.sin_addr, address->data, address->length); addrlen = sizeof (struct sockaddr_in); break; #endif default: return; } XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) addr, addrlen); return; } static void ClientAddress ( struct sockaddr *from, ARRAY8Ptr addr, /* return */ ARRAY8Ptr port, /* return */ CARD16 *type) /* return */ { int length, family; char *data; data = NetaddrPort((XdmcpNetaddr) from, &length); XdmcpAllocARRAY8 (port, length); memmove( port->data, data, length); port->length = length; family = ConvertAddr((XdmcpNetaddr) from, &length, &data); XdmcpAllocARRAY8 (addr, length); memmove( addr->data, data, length); addr->length = length; *type = family; } static void all_query_respond ( struct sockaddr *from, int fromlen, ARRAYofARRAY8Ptr authenticationNames, xdmOpCode type) { ARRAY8Ptr authenticationName; ARRAY8 status; ARRAY8 addr; CARD16 connectionType; int family; int length; family = ConvertAddr((XdmcpNetaddr) from, &length, (char **)&(addr.data)); addr.length = length; /* convert int to short */ WDMDebug ("all_query_respond: conntype=%d, addr=%lx, len=%d\n", family, (unsigned long) *(addr.data), addr.length); if (family < 0) return; connectionType = family; if (type == INDIRECT_QUERY) RememberIndirectClient (&addr, connectionType); else ForgetIndirectClient (&addr, connectionType); authenticationName = ChooseAuthentication (authenticationNames); if (Willing (&addr, connectionType, authenticationName, &status, type)) send_willing (from, fromlen, authenticationName, &status); else if (type == QUERY) send_unwilling (from, fromlen, authenticationName, &status); XdmcpDisposeARRAY8 (&status); } static void indirect_respond ( struct sockaddr *from, int fromlen, int length) { ARRAYofARRAY8 queryAuthenticationNames; ARRAY8 clientAddress; ARRAY8 clientPort; CARD16 connectionType; int expectedLen; int i; XdmcpHeader header; int localHostAsWell; WDMDebug ("Indirect respond %d\n", length); if (!XdmcpReadARRAYofARRAY8 (&buffer, &queryAuthenticationNames)) return; expectedLen = 1; for (i = 0; i < (int)queryAuthenticationNames.length; i++) expectedLen += 2 + queryAuthenticationNames.data[i].length; if (length == expectedLen) { ClientAddress (from, &clientAddress, &clientPort, &connectionType); /* * set up the forward query packet */ header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) FORWARD_QUERY; header.length = 0; header.length += 2 + clientAddress.length; header.length += 2 + clientPort.length; header.length += 1; for (i = 0; i < (int)queryAuthenticationNames.length; i++) header.length += 2 + queryAuthenticationNames.data[i].length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteARRAY8 (&buffer, &clientAddress); XdmcpWriteARRAY8 (&buffer, &clientPort); XdmcpWriteARRAYofARRAY8 (&buffer, &queryAuthenticationNames); localHostAsWell = ForEachMatchingIndirectHost (&clientAddress, connectionType, sendForward, (char *) 0); XdmcpDisposeARRAY8 (&clientAddress); XdmcpDisposeARRAY8 (&clientPort); if (localHostAsWell) all_query_respond (from, fromlen, &queryAuthenticationNames, INDIRECT_QUERY); } else { WDMDebug("Indirect length error got %d expect %d\n", length, expectedLen); } XdmcpDisposeARRAYofARRAY8 (&queryAuthenticationNames); } static void ProcessRequestSocket (void) { XdmcpHeader header; struct sockaddr addr; int addrlen = sizeof addr; WDMDebug("ProcessRequestSocket\n"); bzero ((char *) &addr, sizeof (addr)); if (!XdmcpFill (xdmcpFd, &buffer, (XdmcpNetaddr) &addr, &addrlen)) { WDMDebug("XdmcpFill failed\n"); return; } if (!XdmcpReadHeader (&buffer, &header)) { WDMDebug("XdmcpReadHeader failed\n"); return; } if (header.version != XDM_PROTOCOL_VERSION) { WDMDebug("XDMCP header version read was %d, expected %d\n", header.version, XDM_PROTOCOL_VERSION); return; } WDMDebug("header: %d %d %d\n", header.version, header.opcode, header.length); switch (header.opcode) { case BROADCAST_QUERY: broadcast_respond (&addr, addrlen, header.length); break; case QUERY: query_respond (&addr, addrlen, header.length); break; case INDIRECT_QUERY: indirect_respond (&addr, addrlen, header.length); break; case FORWARD_QUERY: forward_respond (&addr, addrlen, header.length); break; case REQUEST: request_respond (&addr, addrlen, header.length); break; case MANAGE: manage (&addr, addrlen, header.length); break; case KEEPALIVE: send_alive (&addr, addrlen, header.length); break; } } void WaitForSomething (void) { FD_TYPE reads; int nready; WDMDebug("WaitForSomething\n"); if (AnyWellKnownSockets () && !ChildReady) { reads = WellKnownSocketsMask; nready = select (WellKnownSocketsMax + 1, &reads, 0, 0, 0); WDMDebug("select returns %d. Rescan: %d ChildReady: %d\n", nready, Rescan, ChildReady); if (nready > 0) { if (xdmcpFd >= 0 && FD_ISSET (xdmcpFd, &reads)) ProcessRequestSocket (); if (chooserFd >= 0 && FD_ISSET (chooserFd, &reads)) #ifdef ISC if (!ChildReady) { WaitForSomething (); } else #endif ProcessChooserSocket (chooserFd); } if (ChildReady) { WaitForChild (); } } else WaitForChild (); } /* * respond to a request on the UDP socket. */ static ARRAY8 Hostname; void registerHostname ( char *name, int namelen) { int i; if (!XdmcpReallocARRAY8 (&Hostname, namelen)) return; for (i = 0; i < namelen; i++) Hostname.data[i] = name[i]; } static void direct_query_respond ( struct sockaddr *from, int fromlen, int length, xdmOpCode type) { ARRAYofARRAY8 queryAuthenticationNames; int expectedLen; int i; if (!XdmcpReadARRAYofARRAY8 (&buffer, &queryAuthenticationNames)) return; expectedLen = 1; for (i = 0; i < (int)queryAuthenticationNames.length; i++) expectedLen += 2 + queryAuthenticationNames.data[i].length; if (length == expectedLen) all_query_respond (from, fromlen, &queryAuthenticationNames, type); XdmcpDisposeARRAYofARRAY8 (&queryAuthenticationNames); } static void query_respond ( struct sockaddr *from, int fromlen, int length) { WDMDebug("Query respond %d\n", length); direct_query_respond (from, fromlen, length, QUERY); } static void broadcast_respond ( struct sockaddr *from, int fromlen, int length) { direct_query_respond (from, fromlen, length, BROADCAST_QUERY); } /* computes an X display name */ static char * NetworkAddressToName( CARD16 connectionType, ARRAY8Ptr connectionAddress, struct sockaddr *originalAddress, CARD16 displayNumber) { switch (connectionType) { case FamilyInternet: { CARD8 *data; struct hostent *hostent; char *name; char *localhost; int multiHomed = 0; data = connectionAddress->data; hostent = gethostbyaddr ((char *)data, connectionAddress->length, AF_INET); if (sourceAddress && hostent) { hostent = gethostbyname(hostent->h_name); if (hostent) multiHomed = hostent->h_addr_list[1] != NULL; } localhost = localHostname (); /* * protect against bogus host names */ if (hostent && hostent->h_name && hostent->h_name[0] && (hostent->h_name[0] != '.') && !multiHomed) { if (!strcmp (localhost, hostent->h_name)) { if (!getString (name, 10)) return 0; sprintf (name, ":%d", displayNumber); } else { if (removeDomainname.i) { char *localDot, *remoteDot; /* check for a common domain name. This * could reduce names by recognising common * super-domain names as well, but I don't think * this is as useful, and will confuse more * people */ if ((localDot = strchr(localhost, '.')) && (remoteDot = strchr(hostent->h_name, '.'))) { /* smash the name in place; it won't * be needed later. */ if (!strcmp (localDot+1, remoteDot+1)) *remoteDot = '\0'; } } if (!getString (name, strlen (hostent->h_name) + 10)) return 0; sprintf (name, "%s:%d", hostent->h_name, displayNumber); } } else { if (!getString (name, 25)) return 0; if (multiHomed) data = (CARD8 *) &((struct sockaddr_in *)originalAddress)-> sin_addr.s_addr; sprintf(name, "%d.%d.%d.%d:%d", data[0], data[1], data[2], data[3], displayNumber); } return name; } default: return NULL; } } /*ARGSUSED*/ static void forward_respond ( struct sockaddr *from, int fromlen, int length) { ARRAY8 clientAddress; ARRAY8 clientPort; ARRAYofARRAY8 authenticationNames; struct sockaddr *client; int clientlen; int expectedLen; int i; WDMDebug("Forward respond %d\n", length); clientAddress.length = 0; clientAddress.data = 0; clientPort.length = 0; clientPort.data = 0; authenticationNames.length = 0; authenticationNames.data = 0; if (XdmcpReadARRAY8 (&buffer, &clientAddress) && XdmcpReadARRAY8 (&buffer, &clientPort) && XdmcpReadARRAYofARRAY8 (&buffer, &authenticationNames)) { expectedLen = 0; expectedLen += 2 + clientAddress.length; expectedLen += 2 + clientPort.length; expectedLen += 1; /* authenticationNames */ for (i = 0; i < (int)authenticationNames.length; i++) expectedLen += 2 + authenticationNames.data[i].length; if (length == expectedLen) { int j; j = 0; for (i = 0; i < (int)clientPort.length; i++) j = j * 256 + clientPort.data[i]; WDMDebug("Forward client address (port %d)", j); for (i = 0; i < (int)clientAddress.length; i++) WDMDebug(" %d", clientAddress.data[i]); WDMDebug("\n"); switch (from->sa_family) { #ifdef AF_INET case AF_INET: { struct sockaddr_in in_addr; if (clientAddress.length != 4 || clientPort.length != 2) { goto badAddress; } bzero ((char *) &in_addr, sizeof (in_addr)); #ifdef BSD44SOCKETS in_addr.sin_len = sizeof(in_addr); #endif in_addr.sin_family = AF_INET; memmove( &in_addr.sin_addr, clientAddress.data, 4); memmove( (char *) &in_addr.sin_port, clientPort.data, 2); client = (struct sockaddr *) &in_addr; clientlen = sizeof (in_addr); all_query_respond (client, clientlen, &authenticationNames, FORWARD_QUERY); } break; #endif #ifdef AF_UNIX case AF_UNIX: { struct sockaddr_un un_addr; if (clientAddress.length >= sizeof (un_addr.sun_path)) goto badAddress; bzero ((char *) &un_addr, sizeof (un_addr)); un_addr.sun_family = AF_UNIX; memmove( un_addr.sun_path, clientAddress.data, clientAddress.length); un_addr.sun_path[clientAddress.length] = '\0'; client = (struct sockaddr *) &un_addr; #if defined(BSD44SOCKETS) && !defined(Lynx) && defined(UNIXCONN) un_addr.sun_len = strlen(un_addr.sun_path); clientlen = SUN_LEN(&un_addr); #else clientlen = sizeof (un_addr); #endif all_query_respond (client, clientlen, &authenticationNames, FORWARD_QUERY); } break; #endif } } else { WDMDebug("Forward length error got %d expect %d\n", length, expectedLen); } } badAddress: XdmcpDisposeARRAY8 (&clientAddress); XdmcpDisposeARRAY8 (&clientPort); XdmcpDisposeARRAYofARRAY8 (&authenticationNames); } static void send_willing ( struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status) { XdmcpHeader header; WDMDebug("Send willing %*.*s %*.*s\n", authenticationName->length, authenticationName->length, pS(authenticationName->data), status->length, status->length, pS(status->data)); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) WILLING; header.length = 6 + authenticationName->length + Hostname.length + status->length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteARRAY8 (&buffer, authenticationName); XdmcpWriteARRAY8 (&buffer, &Hostname); XdmcpWriteARRAY8 (&buffer, status); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) from, fromlen); } static void send_unwilling ( struct sockaddr *from, int fromlen, ARRAY8Ptr authenticationName, ARRAY8Ptr status) { XdmcpHeader header; WDMDebug("Send unwilling %*.*s %*.*s\n", authenticationName->length, authenticationName->length, pS(authenticationName->data), status->length, status->length, pS(status->data)); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) UNWILLING; header.length = 4 + Hostname.length + status->length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteARRAY8 (&buffer, &Hostname); XdmcpWriteARRAY8 (&buffer, status); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) from, fromlen); } static unsigned long globalSessionID; #define NextSessionID() (++globalSessionID) void init_session_id(void) { /* Set randomly so we are unlikely to reuse id's from a previous * incarnation so we don't say "Alive" to those displays. * Start with low digits 0 to make debugging easier. */ globalSessionID = (time((Time_t)0)&0x7fff) * 16000; } static ARRAY8 outOfMemory = { (CARD16) 13, (CARD8Ptr) "Out of memory" }; static ARRAY8 noValidAddr = { (CARD16) 16, (CARD8Ptr) "No valid address" }; static ARRAY8 noValidAuth = { (CARD16) 22, (CARD8Ptr) "No valid authorization" }; static ARRAY8 noAuthentic = { (CARD16) 29, (CARD8Ptr) "XDM has no authentication key" }; static void request_respond ( struct sockaddr *from, int fromlen, int length) { CARD16 displayNumber; ARRAY16 connectionTypes; ARRAYofARRAY8 connectionAddresses; ARRAY8 authenticationName; ARRAY8 authenticationData; ARRAYofARRAY8 authorizationNames; ARRAY8 manufacturerDisplayID; ARRAY8Ptr reason = 0; int expectlen; int i, j; struct protoDisplay *pdpy; ARRAY8 authorizationName, authorizationData; ARRAY8Ptr connectionAddress; WDMDebug("Request respond %d\n", length); connectionTypes.data = 0; connectionAddresses.data = 0; authenticationName.data = 0; authenticationData.data = 0; authorizationNames.data = 0; authorizationName.length = 0; authorizationData.length = 0; manufacturerDisplayID.data = 0; if (XdmcpReadCARD16 (&buffer, &displayNumber) && XdmcpReadARRAY16 (&buffer, &connectionTypes) && XdmcpReadARRAYofARRAY8 (&buffer, &connectionAddresses) && XdmcpReadARRAY8 (&buffer, &authenticationName) && XdmcpReadARRAY8 (&buffer, &authenticationData) && XdmcpReadARRAYofARRAY8 (&buffer, &authorizationNames) && XdmcpReadARRAY8 (&buffer, &manufacturerDisplayID)) { expectlen = 0; expectlen += 2; /* displayNumber */ expectlen += 1 + 2*connectionTypes.length; /* connectionTypes */ expectlen += 1; /* connectionAddresses */ for (i = 0; i < (int)connectionAddresses.length; i++) expectlen += 2 + connectionAddresses.data[i].length; expectlen += 2 + authenticationName.length; /* authenticationName */ expectlen += 2 + authenticationData.length; /* authenticationData */ expectlen += 1; /* authoriationNames */ for (i = 0; i < (int)authorizationNames.length; i++) expectlen += 2 + authorizationNames.data[i].length; expectlen += 2 + manufacturerDisplayID.length; /* displayID */ if (expectlen != length) { WDMDebug("Request length error got %d expect %d\n", length, expectlen); goto abort; } if (connectionTypes.length == 0 || connectionAddresses.length != connectionTypes.length) { reason = &noValidAddr; pdpy = 0; goto decline; } pdpy = FindProtoDisplay ((XdmcpNetaddr) from, fromlen, displayNumber); if (!pdpy) { /* Check this Display against the Manager's policy */ reason = Accept (from, fromlen, displayNumber); if (reason) goto decline; /* Check the Display's stream services against Manager's policy */ i = SelectConnectionTypeIndex (&connectionTypes, &connectionAddresses); if (i < 0) { reason = &noValidAddr; goto decline; } /* The Manager considers this a new session */ connectionAddress = &connectionAddresses.data[i]; pdpy = NewProtoDisplay ((XdmcpNetaddr) from, fromlen, displayNumber, connectionTypes.data[i], connectionAddress, NextSessionID()); WDMDebug("NewProtoDisplay %p\n", (void *)pdpy); if (!pdpy) { reason = &outOfMemory; goto decline; } } if (authorizationNames.length == 0) j = 0; else j = SelectAuthorizationTypeIndex (&authenticationName, &authorizationNames); if (j < 0) { reason = &noValidAuth; goto decline; } if (!CheckAuthentication (pdpy, &manufacturerDisplayID, &authenticationName, &authenticationData)) { reason = &noAuthentic; goto decline; } if (j < (int)authorizationNames.length) { Xauth *auth; SetProtoDisplayAuthorization (pdpy, (unsigned short) authorizationNames.data[j].length, (char *) authorizationNames.data[j].data); auth = pdpy->xdmcpAuthorization; if (!auth) auth = pdpy->fileAuthorization; if (auth) { authorizationName.length = auth->name_length; authorizationName.data = (CARD8Ptr) auth->name; authorizationData.length = auth->data_length; authorizationData.data = (CARD8Ptr) auth->data; } } if (pdpy) { send_accept (from, fromlen, pdpy->sessionID, &authenticationName, &authenticationData, &authorizationName, &authorizationData); } else { decline: ; send_decline (from, fromlen, &authenticationName, &authenticationData, reason); if (pdpy) DisposeProtoDisplay (pdpy); } } abort: XdmcpDisposeARRAY16 (&connectionTypes); XdmcpDisposeARRAYofARRAY8 (&connectionAddresses); XdmcpDisposeARRAY8 (&authenticationName); XdmcpDisposeARRAY8 (&authenticationData); XdmcpDisposeARRAYofARRAY8 (&authorizationNames); XdmcpDisposeARRAY8 (&manufacturerDisplayID); } static void send_accept ( struct sockaddr *to, int tolen, CARD32 sessionID, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr authorizationName, ARRAY8Ptr authorizationData) { XdmcpHeader header; WDMDebug("Accept Session ID %ld\n", (long) sessionID); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) ACCEPT; header.length = 4; /* session ID */ header.length += 2 + authenticationName->length; header.length += 2 + authenticationData->length; header.length += 2 + authorizationName->length; header.length += 2 + authorizationData->length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteCARD32 (&buffer, sessionID); XdmcpWriteARRAY8 (&buffer, authenticationName); XdmcpWriteARRAY8 (&buffer, authenticationData); XdmcpWriteARRAY8 (&buffer, authorizationName); XdmcpWriteARRAY8 (&buffer, authorizationData); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) to, tolen); } static void send_decline ( struct sockaddr *to, int tolen, ARRAY8Ptr authenticationName, ARRAY8Ptr authenticationData, ARRAY8Ptr status) { XdmcpHeader header; WDMDebug("Decline %*.*s\n", status->length, status->length, pS(status->data)); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) DECLINE; header.length = 0; header.length += 2 + status->length; header.length += 2 + authenticationName->length; header.length += 2 + authenticationData->length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteARRAY8 (&buffer, status); XdmcpWriteARRAY8 (&buffer, authenticationName); XdmcpWriteARRAY8 (&buffer, authenticationData); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) to, tolen); } static void manage ( struct sockaddr *from, int fromlen, int length) { CARD32 sessionID; CARD16 displayNumber; ARRAY8 displayClass; int expectlen; struct protoDisplay *pdpy; struct display *d; char *name = NULL; char *class = NULL; XdmcpNetaddr from_save; ARRAY8 clientAddress, clientPort; CARD16 connectionType; WDMDebug("Manage %d\n", length); displayClass.data = 0; displayClass.length = 0; if (XdmcpReadCARD32 (&buffer, &sessionID) && XdmcpReadCARD16 (&buffer, &displayNumber) && XdmcpReadARRAY8 (&buffer, &displayClass)) { expectlen = 4 + /* session ID */ 2 + /* displayNumber */ 2 + displayClass.length; /* displayClass */ if (expectlen != length) { WDMDebug("Manage length error got %d expect %d\n", length, expectlen); goto abort; } pdpy = FindProtoDisplay ((XdmcpNetaddr) from, fromlen, displayNumber); WDMDebug("Manage Session ID %ld, pdpy %p\n", (long) sessionID, (void *)pdpy); if (!pdpy || pdpy->sessionID != sessionID) { /* * We may have already started a session for this display * but it hasn't seen the response in the form of an * XOpenDisplay() yet. So check if it is in the list of active * displays, and if so check that the session id's match. * If all this is true, then we have a duplicate request that * can be ignored. */ if (!pdpy && (d = FindDisplayByAddress((XdmcpNetaddr) from, fromlen, displayNumber)) && d->sessionID == sessionID) { WDMDebug("manage: got duplicate pkt, ignoring\n"); goto abort; } WDMDebug("Session ID %ld refused\n", (long) sessionID); if (pdpy) WDMDebug("Existing Session ID %ld\n", (long) pdpy->sessionID); send_refuse (from, fromlen, sessionID); } else { name = NetworkAddressToName (pdpy->connectionType, &pdpy->connectionAddress, from, pdpy->displayNumber); WDMDebug("Computed display name: %s\n", name); if (!name) { send_failed (from, fromlen, "(no name)", sessionID, "out of memory"); goto abort; } d = FindDisplayByName (name); if (d) { WDMDebug("Terminating active session for %s\n", d->name); StopDisplay (d); } class = malloc (displayClass.length + 1); if (!class) { send_failed (from, fromlen, name, sessionID, "out of memory"); goto abort; } if (displayClass.length) { memmove( class, displayClass.data, displayClass.length); class[displayClass.length] = '\0'; } else { free ((char *) class); class = (char *) NULL; } from_save = (XdmcpNetaddr) malloc (fromlen); if (!from_save) { send_failed (from, fromlen, name, sessionID, "out of memory"); goto abort; } memmove( from_save, from, fromlen); d = NewDisplay (name, class); if (!d) { free ((char *) from_save); send_failed (from, fromlen, name, sessionID, "out of memory"); goto abort; } d->displayType.location = Foreign; d->displayType.lifetime = Transient; d->displayType.origin = FromXDMCP; d->sessionID = pdpy->sessionID; d->from = from_save; d->fromlen = fromlen; d->displayNumber = pdpy->displayNumber; ClientAddress (from, &clientAddress, &clientPort, &connectionType); d->useChooser = 0; if (IsIndirectClient (&clientAddress, connectionType)) { WDMDebug("IsIndirectClient\n"); ForgetIndirectClient (&clientAddress, connectionType); if (UseChooser (&clientAddress, connectionType)) { d->useChooser = 1; WDMDebug("Use chooser for %s\n", d->name); } } d->clientAddr = clientAddress; d->connectionType = connectionType; XdmcpDisposeARRAY8 (&clientPort); if (pdpy->fileAuthorization) { d->authorizations = (Xauth **) malloc (sizeof (Xauth *)); if (!d->authorizations) { free ((char *) from_save); free ((char *) d); send_failed (from, fromlen, name, sessionID, "out of memory"); goto abort; } d->authorizations[0] = pdpy->fileAuthorization; d->authNum = 1; pdpy->fileAuthorization = 0; } DisposeProtoDisplay (pdpy); WDMDebug("Starting display %s,%s\n", d->name, d->class); StartDisplay (d); } } abort: XdmcpDisposeARRAY8 (&displayClass); if (name) free ((char*) name); if (class) free ((char*) class); } void SendFailed ( struct display *d, char *reason) { WDMDebug("Display start failed, sending Failed\n"); send_failed ((struct sockaddr *)(d->from), d->fromlen, d->name, d->sessionID, reason); } static void send_failed ( struct sockaddr *from, int fromlen, char *name, CARD32 sessionID, char *reason) { static char buf[256]; XdmcpHeader header; ARRAY8 status; sprintf (buf, "Session %ld failed for display %.100s: %.100s", (long) sessionID, name, reason); WDMDebug("Send failed %ld %s\n", (long) sessionID, buf); status.length = strlen (buf); status.data = (CARD8Ptr) buf; header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) FAILED; header.length = 6 + status.length; XdmcpWriteHeader (&buffer, &header); XdmcpWriteCARD32 (&buffer, sessionID); XdmcpWriteARRAY8 (&buffer, &status); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) from, fromlen); } static void send_refuse ( struct sockaddr *from, int fromlen, CARD32 sessionID) { XdmcpHeader header; WDMDebug("Send refuse %ld\n", (long) sessionID); header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) REFUSE; header.length = 4; XdmcpWriteHeader (&buffer, &header); XdmcpWriteCARD32 (&buffer, sessionID); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) from, fromlen); } static void send_alive ( struct sockaddr *from, int fromlen, int length) { CARD32 sessionID; CARD16 displayNumber; struct display *d; XdmcpHeader header; CARD8 sendRunning; CARD32 sendSessionID; WDMDebug("Send alive\n"); if (XdmcpReadCARD16 (&buffer, &displayNumber) && XdmcpReadCARD32 (&buffer, &sessionID)) { if (length == 6) { d = FindDisplayBySessionID (sessionID); if (!d) { d = FindDisplayByAddress ((XdmcpNetaddr) from, fromlen, displayNumber); } sendRunning = 0; sendSessionID = 0; if (d && d->status == running) { if (d->sessionID == sessionID) sendRunning = 1; sendSessionID = d->sessionID; } header.version = XDM_PROTOCOL_VERSION; header.opcode = (CARD16) ALIVE; header.length = 5; WDMDebug("alive: %d %ld\n", sendRunning, (long) sendSessionID); XdmcpWriteHeader (&buffer, &header); XdmcpWriteCARD8 (&buffer, sendRunning); XdmcpWriteCARD32 (&buffer, sendSessionID); XdmcpFlush (xdmcpFd, &buffer, (XdmcpNetaddr) from, fromlen); } } } char * NetworkAddressToHostname ( CARD16 connectionType, ARRAY8Ptr connectionAddress) { char *name = 0; switch (connectionType) { case FamilyInternet: { struct hostent *hostent; char dotted[20]; char *local_name; hostent = gethostbyaddr ((char *)connectionAddress->data, connectionAddress->length, AF_INET); if (hostent) local_name = hostent->h_name; else { /* can't get name, so use emergency fallback */ sprintf(dotted, "%d.%d.%d.%d", connectionAddress->data[0], connectionAddress->data[1], connectionAddress->data[2], connectionAddress->data[3]); local_name = dotted; WDMError("Cannot convert Internet address %s to host name\n", dotted); } if (!getString (name, strlen (local_name))) break; strcpy (name, local_name); break; } default: break; } return name; } #if 0 static int HostnameToNetworkAddress ( char *name, CARD16 connectionType, ARRAY8Ptr connectionAddress) { switch (connectionType) { case FamilyInternet: { struct hostent *hostent; hostent = gethostbyname (name); if (!hostent) return FALSE; if (!XdmcpAllocARRAY8 (connectionAddress, hostent->h_length)) return FALSE; memmove( connectionAddress->data, hostent->h_addr, hostent->h_length); return TRUE; } } return FALSE; } /* * converts a display name into a network address, using * the same rules as XOpenDisplay (algorithm cribbed from there) */ static int NameToNetworkAddress( char *name, CARD16Ptr connectionTypep, ARRAY8Ptr connectionAddress, CARD16Ptr displayNumber) { char *colon, *display_number; char hostname[1024]; int dnet = FALSE; CARD16 number; CARD16 connectionType; colon = strchr(name, ':'); if (!colon) return FALSE; if (colon != name) { if (colon - name > sizeof (hostname)) return FALSE; strncpy (hostname, name, colon - name); hostname[colon - name] = '\0'; } else { strcpy (hostname, localHostname ()); } if (colon[1] == ':') { dnet = TRUE; colon++; } display_number = colon + 1; while (*display_number && *display_number != '.') { if (!isascii (*display_number) || !isdigit(*display_number)) return FALSE; } if (display_number == colon + 1) return FALSE; number = atoi (colon + 1); connectionType = FamilyInternet; if (!HostnameToNetworkAddress (hostname, connectionType, connectionAddress)) return FALSE; *displayNumber = number; *connectionTypep = connectionType; return TRUE; } #endif #endif /* XDMCP */ wdm-1.28/src/wdmChooser/chooser.c 644 0 0 272310221265060 163570ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * chooser.c: wdmChooser program. replacement for chooser from xdm */ #include #include void closeAction(WMWidget *self, void *data) { WMDestroyWidget(self); exit(0); } int main(int argc, char *argv[]) { WMScreen *scr; WMWindow *win; WMInitializeApplication("wdmChooser", &argc, argv); scr = WMOpenScreen(NULL); if(scr == NULL) WDMPanic("could not initialize Screen"); win = WMCreateWindow(scr, "wdmChooser"); WMResizeWidget(win, 600, 300); WMMoveWidget(win, 100, 100); WMRealizeWidget(win); WMMapWidget(win); WMSetWindowCloseAction(win, closeAction, NULL); WMSetWindowTitle(win, "wdmChooser"); WMScreenMainLoop(scr); return 0; } wdm-1.28/src/wdmLogin/Login.c 644 0 0 7726210221265060 154650ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003, 2004 Alexey Voinov * Copyright (C) 1998 Gene Czarcinski * * 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 * * Login.c: draw login panel and interact with user. */ #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_PARAM_H #include #endif #include #include #include #include #include #include #include #ifdef HAVE_XINERAMA #include #endif /* temporary hack {{{ */ #include /* }}} */ #include #include #include /*###################################################################*/ /** Global Variables and Constants **/ #define FOREVER 1 WMRect screen; static int help_heigth = 140; static int text_width = 150, text_heigth = 26; static char displayArgDefault[] = ""; static char *displayArg = displayArgDefault; /*###################################################################*/ static int WmDefUser = False; /* default username */ static char *helpArg = NULL; static char *HelpMsg = N_("no help available."); /*###################################################################*/ typedef struct LoginPanel { WMScreen *scr; WMWindow *win; WMFrame *winF1; WMFrame *logoF1, *logoF2; WMLabel *logoL; WMFrame *authF; WMLabel *welcomeMsg1, *welcomeMsg2; WMTextField *entryText; WMLabel *entryLabel; WMFrame *msgF; WMLabel *msgL; int msgFlag; WMFrame *wmF; WMPopUpButton *wmBtn; WMFrame *exitF; WMPopUpButton *exitBtn; WMFrame *cmdF; WMButton *helpBtn; WMButton *startoverBtn; WMButton *goBtn; WMFrame *helpF; WMScrollView *helpSV; WMFrame *helpTextF; WMLabel *helpTextL; KeyCode retkey; KeyCode tabkey; } LoginPanel; static LoginPanel *panel = NULL; /*###################################################################*/ static int LoginSwitch = False; static char *LoginName = NULL; static char *LoginPswd = NULL; static int OptionCode = 0; static char *ExitStr[] = { N_("Login"), N_("Reboot"), N_("Halt"), #ifdef WITH_EXITLOGIN N_("ExitLogin"), #endif NULL }; static char *ExitFailStr[] = { N_("Login failed"), N_("Reboot failed"), N_("Halt failed"), #ifdef WITH_EXITLOGIN N_("ExitLogin failed"), #endif NULL }; static int WmOptionCode = 0; static char WmDefault[] = "wmaker:afterstep:xsession"; static char *WmArg = WmDefault; static char **WmStr = NULL; static char *logoArg = NULL; static char *bgArg = NULL; static char *bgOption = NULL; static int animate = False; static int smoothScale = True; static char *configFile = NULL; static int wdm_fd = 1; #ifdef HAVE_XINERAMA static int xinerama_head = 0; #endif static WDMLoginConfig *cfg; static int exit_request = 0; char *ProgName = "Login"; char * read_help_file(int handle) { char *HelpText = NULL; struct stat s; if(fstat(handle, &s) == 0) { HelpText = wmalloc(s.st_size + 1); if(read(handle, HelpText, s.st_size) == -1) { WDMError("%s - read_help_file(): can't read %s\n", ProgName, helpArg); wfree(HelpText); return NULL; } HelpText[s.st_size] = '\0'; } else WDMError("%s - read_help_file(): can't stat %s\n", ProgName, helpArg); return HelpText; } char * parse_helpArg(void) { int handle; char *HelpText = NULL; char *defaultHelpText = NULL; /* a good default value, even in case of errors */ defaultHelpText = wstrconcat("wdm --- " PACKAGE_VERSION "\n\n\n\n\n", _(HelpMsg)); HelpText = defaultHelpText; if(helpArg) { if((handle = open(helpArg, O_RDONLY)) == -1) { WDMError("%s - parse_helpArg(): can't open %s\n", ProgName, helpArg); return defaultHelpText; } if((HelpText = read_help_file(handle)) != NULL) wfree(defaultHelpText); close(handle); } return HelpText; } /*###################################################################*/ void wAbort() /* for WINGs compatibility */ { WDMPanic("%s - wAbort from WINGs\n", ProgName); } /*###################################################################*/ /*** pipe I/O routines ***/ /** The following code was adapted from out.c by Tom Rothamel */ /* This file is Copyright 1998 Tom Rothamel. It's under the Gnu Public * * license, see the file COPYING for details. */ void writeuc(int fd, unsigned char c) { write(fd, &c, sizeof(unsigned char)); } void writestring(int fd, char *string) { int len; len = strlen(string); if(len > 255) len = 255; writeuc(fd, (unsigned char) len); write(fd, string, len); } /*** communicate authentication information ***/ static void OutputAuth(char *user, char *pswd) { writestring(wdm_fd, user ? user : ""); writestring(wdm_fd, pswd ? pswd : ""); if(OptionCode == 0) { if(WmOptionCode == 0) writeuc(wdm_fd, 0); /* end of data */ else { writeuc(wdm_fd, 1); writestring(wdm_fd, WmStr[WmOptionCode]); writeuc(wdm_fd, 0); /* end of data */ } } else { writeuc(wdm_fd, OptionCode + 1); writestring(wdm_fd, ExitStr[OptionCode]); writeuc(wdm_fd, 0); /* end of data */ } return; } /*###################################################################*/ static void SetupWm() { int i = 0, n = 0; char *ptr = WmArg; /* count number of items, skip empty items. n = number of items - 1 */ while(*ptr) if(*ptr++ == ':' && *ptr != ':' && *ptr) ++n; /* reserve one position fo NULL pointer, one for 'NoChange' and one for 'FailSafe' */ WmStr = (char **) malloc(sizeof(char *) * (n + 4)); WmStr[i++] = N_("NoChange"); if(strcasecmp(WmArg, "none") != 0) /* we explicitly don't want any choice */ { ptr = WmArg; while(*ptr) { while(*ptr == ':') ++ptr; if(!*ptr) break; WmStr[i++] = ptr; while(*ptr != ':' && *ptr) ++ptr; if(!*ptr) break; *ptr++ = '\0'; } WmStr[i++] = N_("failsafe"); } WmStr[i] = NULL; } static void LoginArgs(int argc, char *argv[]) { int c; while((c = getopt(argc, argv, "asb:d:h:l:uw:c:x:f:")) != -1) { switch (c) { case 'a': animate = True; break; case 's': smoothScale = False; break; case 'd': /* display */ displayArg = optarg; break; case 'h': /* helpfile */ helpArg = optarg; break; case 'l': /* logo */ logoArg = optarg; break; case 'u': /* default user */ WmDefUser = True; break; case 'w': /* wm list */ WmArg = optarg; break; case 'b': /* background */ bgArg = optarg; break; case 'c': /* configfile */ configFile = optarg; break; case 'f': /* filedescriptor for wdm comm.*/ wdm_fd = strtol(optarg, NULL, 0); if(wdm_fd < 1) wdm_fd = 1; break; #ifdef HAVE_XINERAMA case 'x': /* xinerama head */ xinerama_head = strtol(optarg, NULL, 0); break; #endif default: WDMError("bad option: %c\n", c); break; } } } /*###################################################################*/ /* write error message to the panel */ static void ClearMsgs(LoginPanel * panel) { WMSetFrameRelief(panel->msgF, WRFlat); WMSetFrameTitle(panel->msgF, ""); WMSetLabelText(panel->msgL, ""); panel->msgFlag = False; XFlush(WMScreenDisplay(panel->scr)); } static void PrintErrMsg(LoginPanel * panel, char *msg) { int i, x; struct timespec timeReq; XSynchronize(WMScreenDisplay(panel->scr), True); ClearMsgs(panel); WMSetFrameRelief(panel->msgF, WRGroove); WMSetFrameTitle(panel->msgF, _("ERROR")); WMSetLabelText(panel->msgL, msg); panel->msgFlag = True; XFlush(WMScreenDisplay(panel->scr)); /* shake the panel like Login.app */ if(animate) { timeReq.tv_sec = 0; timeReq.tv_nsec = 15; for(i = 0; i < 3; i++) { for(x = 2; x <= 30; x += 10) { WMMoveWidget(panel->win, cfg->geometry.pos.x + x, cfg->geometry.pos.y); nanosleep(&timeReq, NULL); } for(x = 30; x >= -30; x -= 10) { WMMoveWidget(panel->win, cfg->geometry.pos.x + x, cfg->geometry.pos.y); nanosleep(&timeReq, NULL); } for(x = -28; x <= 0; x += 10) { WMMoveWidget(panel->win, cfg->geometry.pos.x + x, cfg->geometry.pos.y); nanosleep(&timeReq, NULL); } XFlush(WMScreenDisplay(panel->scr)); } } XSynchronize(WMScreenDisplay(panel->scr), False); } /* write info message to panel */ static void PrintInfoMsg(LoginPanel * panel, char *msg) { XSynchronize(WMScreenDisplay(panel->scr), True); ClearMsgs(panel); WMSetLabelText(panel->msgL, msg); XFlush(WMScreenDisplay(panel->scr)); panel->msgFlag = True; XSynchronize(WMScreenDisplay(panel->scr), False); } /*###################################################################*/ static void init_pwdfield(char *pwd) { WMSetTextFieldText(panel->entryText, pwd); WMSetTextFieldSecure(panel->entryText, True); WMSetLabelText(panel->entryLabel, _("Password:")); } static void init_namefield(char *name) { WMResizeWidget(panel->entryText, text_width, text_heigth); WMSetTextFieldText(panel->entryText, name); WMSetLabelText(panel->entryLabel, _("Login name:")); WMSetFocusToWidget(panel->entryText); WMSetTextFieldSecure(panel->entryText, False); } static void InitializeLoginInput(LoginPanel * panel) { LoginSwitch = False; if(LoginName) wfree(LoginName); LoginName = NULL; if(LoginPswd) wfree(LoginPswd); LoginPswd = NULL; init_namefield(""); } static void PerformLogin(LoginPanel * panel, int canexit) { if(LoginSwitch == False) { if(LoginName) wfree(LoginName); LoginName = WMGetTextFieldText(panel->entryText); if((LoginName[0] == '\0') && (WmDefUser == False)) { InitializeLoginInput(panel); PrintErrMsg(panel, _("invalid name")); return; } LoginSwitch = True; init_pwdfield(LoginPswd); return; } LoginSwitch = False; if(LoginPswd) wfree(LoginPswd); LoginPswd = WMGetTextFieldText(panel->entryText); if(canexit == False) { init_namefield(LoginName); return; } init_namefield(""); if(OptionCode == 0) PrintInfoMsg(panel, _("validating")); else PrintInfoMsg(panel, _("exiting")); OutputAuth(LoginName, LoginPswd); } /*###################################################################*/ /* Actions */ static void goPressed(WMWidget * self, LoginPanel * panel) { if(OptionCode == 0) { if(LoginSwitch == False) { PerformLogin(panel, True); if(LoginSwitch == False) return; } PerformLogin(panel, True); return; } if(LoginSwitch == True) { if(LoginPswd) wfree(LoginPswd); LoginPswd = WMGetTextFieldText(panel->entryText); WMSetTextFieldText(panel->entryText, ""); } PrintInfoMsg(panel, _("exiting")); OutputAuth(LoginName, LoginPswd); } static void startoverPressed(WMWidget * self, LoginPanel * panel) { ClearMsgs(panel); InitializeLoginInput(panel); } static void helpPressed(WMWidget * self, LoginPanel * panel) { static Bool helpshown = False; if(!helpshown) { helpshown = True; WMSetButtonText(panel->helpBtn, _("Close Help")); WMResizeWidget(panel->win, WMWidgetWidth(panel->win), WMWidgetHeight(panel->win) + help_heigth); } else { helpshown = False; WMSetButtonText(panel->helpBtn, _("Help")); WMResizeWidget(panel->win, WMWidgetWidth(panel->win), WMWidgetHeight(panel->win) - help_heigth); } } static void changeWm(WMWidget * self, LoginPanel * panel) { WmOptionCode = WMGetPopUpButtonSelectedItem(self); WMSetFocusToWidget(panel->entryText); } static void changeOption(WMPopUpButton * self, LoginPanel * panel) { int item; item = WMGetPopUpButtonSelectedItem(self); OptionCode = item; WMSetFocusToWidget(panel->entryText); } static void handleKeyPress(XEvent * event, void *clientData) { LoginPanel *panel = (LoginPanel *) clientData; if(panel->msgFlag) { ClearMsgs(panel); } if(event->xkey.keycode == panel->retkey) { PerformLogin(panel, True); } else if(event->xkey.keycode == panel->tabkey) { PerformLogin(panel, False); } } /*###################################################################*/ /* create and destroy our panel */ static void CreateLogo(LoginPanel * panel) { RImage *image1, *image2; WMPixmap *pixmap; RColor gray; RContext *context; unsigned w = 200, h = 130; float ratio = 1.; panel->logoF1 = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->logoF1, WRSunken); WMSetFrameTitlePosition(panel->logoF1, WTPAtTop); WMMoveWidget(panel->logoF1, 15, 18); WMResizeWidget(panel->logoF1, 206, 136); panel->logoF2 = WMCreateFrame(panel->logoF1); WMSetFrameRelief(panel->logoF2, WRSunken); WMSetFrameTitlePosition(panel->logoF2, WTPAtTop); WMMoveWidget(panel->logoF2, 1, 1); WMResizeWidget(panel->logoF2, 204, 134); panel->logoL = WMCreateLabel(panel->logoF2); WMMoveWidget(panel->logoL, 2, 2); WMResizeWidget(panel->logoL, 200, 130); WMSetLabelImagePosition(panel->logoL, WIPImageOnly); context = WMScreenRContext(panel->scr); image1 = NULL; if(logoArg != NULL) { image1 = RLoadImage(context, logoArg, 0); } if(image1 == NULL) { RColor first, second; first.red = 0xae; first.green = 0xaa; first.blue = 0xc0; second.red = 0xae; second.green = 0xaa; second.blue = 0xae; image1 = RRenderGradient(200, 300, &first, &second, RDiagonalGradient); } if(image1 == NULL) return; #if 0 WDMDebug("width=%i,heigth=%i\n", image1->width, image1->height); #endif if(image1->width > 200) { /* try to keep the aspect ratio */ ratio = (float) 200. / (float) image1->width; h = (int) ((float) image1->height * ratio); } #if 0 WDMDebug("new: ratio=%.5f,width=%i,heigth=%i\n", ratio, w, h); #endif if(image1->height > 130) { if(h > 130) { ratio = (float) 130. / (float) h; w = (int) ((float) w * ratio); h = 130; } } #if 0 WDMDebug("new: ratio=%.5f,width=%i,heigth=%i\n", ratio, w, h); #endif /* if image is too small, do not reallly resize since this looks bad */ /* the image will be centered */ if((image1->width < 200) && (image1->height < 130)) { w = image1->width; h = image1->height; } /* last check in case the above logic is faulty */ if(w > 200) w = 200; if(h > 130) h = 130; #if 0 WDMDebug("new: ratio=%.5f,width=%i,heigth=%i\n", ratio, w, h); #endif if(smoothScale) image2 = RSmoothScaleImage(image1, w, h); else image2 = RScaleImage(image1, w, h); RReleaseImage(image1); if(image2 == NULL) return; gray.red = 0xae; gray.green = 0xaa; gray.blue = 0xae; RCombineImageWithColor(image2, &gray); pixmap = WMCreatePixmapFromRImage(panel->scr, image2, 0); RReleaseImage(image2); if(pixmap == NULL) { WDMError("unable to load pixmap\n"); return; } WMSetLabelImage(panel->logoL, pixmap); WMReleasePixmap(pixmap); } static void CreateAuthFrame(LoginPanel * panel) { char str[128] = "?"; WMFont *font = NULL; int y; panel->authF = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->authF, WRGroove); WMSetFrameTitlePosition(panel->authF, WTPAtTop); WMSetFrameTitle(panel->authF, _("Login Authentication")); WMMoveWidget(panel->authF, (WMWidgetWidth(panel->win) - 290), 10); WMResizeWidget(panel->authF, 275, 120); gethostname(str, 127); y = 20; panel->welcomeMsg1 = WMCreateLabel(panel->authF); WMResizeWidget(panel->welcomeMsg1, 255, 26); WMSetLabelText(panel->welcomeMsg1, _("Welcome to")); WMMoveWidget(panel->welcomeMsg1, 11, y); y += 26; WMSetLabelTextAlignment(panel->welcomeMsg1, WACenter); font = WMBoldSystemFontOfSize(panel->scr, 18); if(font) { WMSetLabelFont(panel->welcomeMsg1, font); WMReleaseFont(font); } panel->welcomeMsg2 = WMCreateLabel(panel->authF); WMResizeWidget(panel->welcomeMsg2, 255, 26); WMMoveWidget(panel->welcomeMsg2, 11, y); WMSetLabelText(panel->welcomeMsg2, str); WMSetLabelTextAlignment(panel->welcomeMsg2, WACenter); y = 18; if(strlen(str) > 20) y = 16; if(strlen(str) > 30) y = 14; if(strlen(str) > 34) y = 12; if(strlen(str) > 40) y = 10; font = WMBoldSystemFontOfSize(panel->scr, y); if(font) { WMSetLabelFont(panel->welcomeMsg2, font); WMReleaseFont(font); } y = 84; panel->entryLabel = WMCreateLabel(panel->authF); WMMoveWidget(panel->entryLabel, 10, y); WMResizeWidget(panel->entryLabel, 100, 26); font = WMBoldSystemFontOfSize(panel->scr, 14); if(font) { WMSetLabelFont(panel->entryLabel, font); WMReleaseFont(font); } WMSetLabelText(panel->entryLabel, _("Login name:")); WMSetLabelTextAlignment(panel->entryLabel, WARight); panel->entryText = WMCreateTextField(panel->authF); WMMoveWidget(panel->entryText, 115, y); WMResizeWidget(panel->entryText, text_width, text_heigth); WMSetTextFieldText(panel->entryText, ""); WMSetTextFieldSecure(panel->entryText, False); } static void CreateMsgsFrames(LoginPanel * panel) { WMFont *font; panel->msgF = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->msgF, WRFlat); WMSetFrameTitlePosition(panel->msgF, WTPAtBottom); WMMoveWidget(panel->msgF, (WMWidgetWidth(panel->win) - 290), 136); WMResizeWidget(panel->msgF, 275, 40); WMSetFrameTitle(panel->msgF, ""); panel->msgL = WMCreateLabel(panel->msgF); WMResizeWidget(panel->msgL, 260, 26); WMMoveWidget(panel->msgL, 5, 2); font = WMBoldSystemFontOfSize(panel->scr, 14); if(font) { WMSetLabelFont(panel->msgL, font); WMReleaseFont(font); } WMSetLabelText(panel->msgL, ""); WMSetLabelTextAlignment(panel->msgL, WARight); } static void CreatePopups(LoginPanel * panel) { int i; panel->wmF = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->wmF, WRGroove); WMSetFrameTitlePosition(panel->wmF, WTPAtTop); WMSetFrameTitle(panel->wmF, _("Start WM")); WMMoveWidget(panel->wmF, 13, 178); WMResizeWidget(panel->wmF, 118, 45); panel->wmBtn = WMCreatePopUpButton(panel->wmF); WMMoveWidget(panel->wmBtn, 4, 15); WMResizeWidget(panel->wmBtn, 110, 25); WMSetPopUpButtonAction(panel->wmBtn, (WMAction *) changeWm, panel); i = 0; while(WmStr[i] != NULL) { WMAddPopUpButtonItem(panel->wmBtn, _(WmStr[i])); i++; } panel->exitF = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->exitF, WRGroove); WMSetFrameTitlePosition(panel->exitF, WTPAtTop); WMSetFrameTitle(panel->exitF, _("Options")); WMMoveWidget(panel->exitF, 134, 178); WMResizeWidget(panel->exitF, 98, 45); panel->exitBtn = WMCreatePopUpButton(panel->exitF); WMMoveWidget(panel->exitBtn, 4, 15); WMResizeWidget(panel->exitBtn, 90, 25); WMSetPopUpButtonAction(panel->exitBtn, (WMAction *) changeOption, panel); i = 0; while(ExitStr[i] != NULL) { WMAddPopUpButtonItem(panel->exitBtn, _(ExitStr[i])); i++; } } static void CreateButtons(LoginPanel * panel) { int i; panel->cmdF = WMCreateFrame(panel->winF1); WMSetFrameRelief(panel->cmdF, WRFlat); WMSetFrameTitlePosition(panel->cmdF, WTPAtTop); WMMoveWidget(panel->cmdF, (WMWidgetWidth(panel->win) - 290), 185); WMResizeWidget(panel->cmdF, 282, 38); i = 3; panel->helpBtn = WMCreateCommandButton(panel->cmdF); WMSetButtonAction(panel->helpBtn, (WMAction *) helpPressed, panel); WMMoveWidget(panel->helpBtn, i, 8); WMSetButtonText(panel->helpBtn, _("Help")); WMResizeWidget(panel->helpBtn, 80, 25); i += 96; panel->startoverBtn = WMCreateCommandButton(panel->cmdF); WMSetButtonAction(panel->startoverBtn, (WMAction *) startoverPressed, panel); WMMoveWidget(panel->startoverBtn, i, 8); WMSetButtonText(panel->startoverBtn, _("Start Over")); WMResizeWidget(panel->startoverBtn, 80, 25); i += 96; panel->goBtn = WMCreateCommandButton(panel->cmdF); WMSetButtonAction(panel->goBtn, (WMAction *) goPressed, panel); WMMoveWidget(panel->goBtn, i, 8); WMSetButtonText(panel->goBtn, _("Go!")); WMResizeWidget(panel->goBtn, 80, 25); } static void CreateHelpFrames(LoginPanel * panel) { int height; char *HelpText = NULL; panel->helpF = WMCreateFrame(panel->win); WMSetFrameRelief(panel->helpF, WRRaised); WMMoveWidget(panel->helpF, 0, WMWidgetHeight(panel->win)); WMResizeWidget(panel->helpF, WMWidgetWidth(panel->win), help_heigth); panel->helpSV = WMCreateScrollView(panel->helpF); WMResizeWidget(panel->helpSV, (WMWidgetWidth(panel->win) - 10), (help_heigth - 10)); WMMoveWidget(panel->helpSV, 5, 5); WMSetScrollViewRelief(panel->helpSV, WRSunken); WMSetScrollViewHasVerticalScroller(panel->helpSV, True); WMSetScrollViewHasHorizontalScroller(panel->helpSV, False); WMSetScrollViewLineScroll(panel->helpSV, 12); HelpText = parse_helpArg(); panel->helpTextF = WMCreateFrame(panel->helpF); WMSetFrameRelief(panel->helpTextF, WRFlat); panel->helpTextL = WMCreateLabel(panel->helpTextF); WMSetLabelTextAlignment(panel->helpTextL, WALeft); height = W_GetTextHeight(WMDefaultSystemFont(panel->scr), HelpText, (WMWidgetWidth(panel->win) - 60), True) + 10; WMResizeWidget(panel->helpTextF, (WMWidgetWidth(panel->win) - 50), height); WMMoveWidget(panel->helpTextL, 2, 1); WMResizeWidget(panel->helpTextL, (WMWidgetWidth(panel->win) - 60), height - 5); WMSetLabelText(panel->helpTextL, HelpText); WMSetLabelWraps(panel->helpTextL, True); wfree(HelpText); } static LoginPanel * CreateLoginPanel(WMScreen *scr, WDMLoginConfig *cfg) { LoginPanel *panel; panel = malloc(sizeof(LoginPanel)); if(!panel) return NULL; memset(panel, 0, sizeof(LoginPanel)); panel->scr = scr; /* basic window and frames */ panel->win = WMCreateWindow(scr, ProgName); WMResizeWidget(panel->win, cfg->geometry.size.width, cfg->geometry.size.height); panel->winF1 = WMCreateFrame(panel->win); WMResizeWidget(panel->winF1, cfg->geometry.size.width, cfg->geometry.size.height); WMSetFrameRelief(panel->winF1, WRRaised); CreateAuthFrame(panel); CreateLogo(panel); CreatePopups(panel); CreateButtons(panel); CreateMsgsFrames(panel); CreateHelpFrames(panel); WMRealizeWidget(panel->win); WMMapSubwidgets(panel->win); WMMapSubwidgets(panel->winF1); WMMapSubwidgets(panel->logoF1); WMMapSubwidgets(panel->logoF2); WMMapSubwidgets(panel->authF); WMMapSubwidgets(panel->wmF); WMMapSubwidgets(panel->exitF); WMMapSubwidgets(panel->cmdF); WMMapSubwidgets(panel->msgF); WMMapSubwidgets(panel->helpF); WMMapWidget(panel->helpF); WMMapSubwidgets(panel->helpSV); WMMapSubwidgets(panel->helpTextF); WMSetScrollViewContentView(panel->helpSV, WMWidgetView(panel->helpTextF)); WMSetPopUpButtonSelectedItem(panel->wmBtn, 0); WMSetPopUpButtonSelectedItem(panel->exitBtn, 0); panel->msgFlag = False; return panel; } static void DestroyLoginPanel(LoginPanel * panel) { int width, height; struct timespec timeReq; /* roll up the window before destroying it */ if(animate) { timeReq.tv_sec = 0; timeReq.tv_nsec = 400; XSynchronize(WMScreenDisplay(panel->scr), True); /* slow things up */ for(width = WMWidgetWidth(panel->win) - 2, height = WMWidgetHeight(panel->win) - 1; (height > 0 && width > 0); height -= 15, width -= 30) { WMResizeWidget(panel->win, width, height); nanosleep(&timeReq, NULL); } XSynchronize(WMScreenDisplay(panel->scr), False); } WMUnmapWidget(panel->win); WMDestroyWidget(panel->win); free(panel); } /*###################################################################*/ /** set the background **/ static int parseBG() { char *tmp; if(bgArg == NULL) return 0; tmp = strchr(bgArg, ':'); if(tmp == NULL) return 0; *tmp = '\0'; bgOption = tmp + 1; while(*bgOption == ' ') bgOption++; if(*bgOption == '\0') return 0; tmp = bgArg; while(*tmp != '\0') { *tmp = tolower(*tmp); tmp++; } if(strcmp(bgArg, "pixmap") == 0) return 1; if(strcmp(bgArg, "solid") == 0) return 2; if(strcmp(bgArg, "hgradient") == 0) return 3; if(strcmp(bgArg, "vgradient") == 0) return 4; if(strcmp(bgArg, "dgradient") == 0) return 5; return 0; } static RImage * loadBGpixmap(RContext * rcontext) { RImage *image, *tmp; image = RLoadImage(rcontext, bgOption, 0); if(image == NULL) { WDMError("%s could not load bg image %s\n", ProgName, bgOption); return NULL; } tmp = RScaleImage(image, screen.size.width, screen.size.height); if(tmp == NULL) { WDMError("%s could not resize bg image %s\n", ProgName, bgOption); RReleaseImage(image); return NULL; } RReleaseImage(image); return tmp; } static RColor ** allocmem(int num) { RColor **colors = NULL; int i; colors = malloc(sizeof(RColor *) * (num + 1)); for(i = 0; i < num; i++) { colors[i] = malloc(sizeof(RColor)); } colors[i] = NULL; return colors; } static void freemem(int num, RColor ** colors) { int i; for(i = 0; i < num; i++) { free(colors[i]); } free(colors); } static RImage * createBGcolor(WMScreen * scr, RContext * rcontext, char *str, int style) { RImage *image; RColor **colors = NULL; XColor color; int num_colors = 0; int i; char *tmp, *colorstr; colorstr = str; while(*colorstr) { num_colors++; tmp = strchr(colorstr, ','); if(tmp == NULL) colorstr = str + strlen(str); else colorstr = tmp + 1; } if(num_colors == 0) return NULL; colors = allocmem(num_colors); tmp = str; for(i = 0; i < num_colors; i++) { colorstr = tmp; tmp = strchr(tmp, ','); if(tmp != NULL) { *tmp = '\0'; tmp++; } else tmp = colorstr + strlen(colorstr); if(!XParseColor (WMScreenDisplay(scr), rcontext->cmap, colorstr, &color)) { WDMError("could not parse color \"%s\"\n", colorstr); freemem(num_colors, colors); return NULL; } colors[i]->red = color.red >> 8; colors[i]->green = color.green >> 8; colors[i]->blue = color.blue >> 8; } image = RRenderMultiGradient(screen.size.width, screen.size.height, colors, style); freemem(num_colors, colors); return image; } static void setBG(WMScreen * scr) { Window root_window; int cpc = 4, render_mode = RBestMatchRendering, default_depth = 8; RContextAttributes rattr; RContext *rcontext; RImage *image; XColor defcolor; Pixmap pixmap; /* if not specified or none, then skip setting background */ /* user can still set background via other means */ if(bgArg == NULL) return; if(strcasecmp(bgArg, "none") == 0) return; /* use of scr->rootWin is temporary hack */ root_window = scr->rootWin; default_depth = WMScreenDepth(scr); if(default_depth <= 8) render_mode = RDitheredRendering; rattr.flags = RC_RenderMode | RC_ColorsPerChannel; rattr.render_mode = render_mode; rattr.colors_per_channel = cpc; /* use of scr->screen is temporary hack */ rcontext = RCreateContext(WMScreenDisplay(scr), scr->screen, &rattr); if(rcontext == NULL) { WDMError("%s could not initialize " "graphics library context: %s\n", ProgName, RMessageForError(RErrorCode)); return; } defcolor.pixel = 0L; /* default=black */ switch (parseBG()) { case 1: image = loadBGpixmap(rcontext); break; case 2: image = createBGcolor(scr, rcontext, bgOption, RGRD_HORIZONTAL); break; case 3: image = createBGcolor(scr, rcontext, bgOption, RGRD_HORIZONTAL); break; case 4: image = createBGcolor(scr, rcontext, bgOption, RGRD_VERTICAL); break; case 5: image = createBGcolor(scr, rcontext, bgOption, RGRD_DIAGONAL); break; default: image = NULL; break; } if(image == NULL) { XSetWindowBackground(WMScreenDisplay(scr), root_window, 0L); XClearWindow(WMScreenDisplay(scr), root_window); XFlush(WMScreenDisplay(scr)); return; } RConvertImage(rcontext, image, &pixmap); RReleaseImage(image); XSetWindowBackgroundPixmap(WMScreenDisplay(scr), root_window, pixmap); XClearWindow(WMScreenDisplay(scr), root_window); XFlush(WMScreenDisplay(scr)); } /*###################################################################*/ /* signal processing */ static void SignalUsr1(int ignored) /* oops, an error */ { InitializeLoginInput(panel); PrintErrMsg(panel, _(ExitFailStr[OptionCode])); signal(SIGUSR1, SignalUsr1); } static void SignalTerm(int ignored) /* all done */ { exit_request = 1; /* corrects some hanging problems, thanks to A. Kabaev */ } /*###################################################################*/ /* M A I N */ int main(int argc, char **argv) { WMScreen *scr; int xine_count; #ifdef HAVE_XINERAMA XineramaScreenInfo *xine; #endif ProgName = argv[0]; setlocale(LC_ALL, ""); #ifdef I18N if(getenv("NLSPATH")) bindtextdomain("wdm", getenv("NLSPATH")); else bindtextdomain("wdm", NLSDIR); #if WINGS_H_VERSION >= 20040406 bind_textdomain_codeset("wdm", "UTF-8"); #endif textdomain("wdm"); #endif animate = False; LoginArgs(argc, argv); /* process our args */ cfg = LoadConfiguration(configFile); /* load configs */ if(cfg) { printf("geometry: %ix%i+%i+%i\n", cfg->geometry.size.width, cfg->geometry.size.height, cfg->geometry.pos.x, cfg->geometry.pos.y); } SetupWm(); /* and init the startup list */ WMInitializeApplication(ProgName, &argc, argv); scr = WMOpenScreen(displayArg); if(!scr) { WDMPanic("could not initialize Screen\n"); exit(2); } #if WINGS_H_VERSION < 20040406 if(cfg->multibyte) scr->useMultiByte = True; #endif #ifdef USE_AA if(cfg->aaenabled) { scr->antialiasedText = True; scr->normalFont = WMSystemFontOfSize(scr, WINGsConfiguration.defaultFontSize); scr->boldFont = WMBoldSystemFontOfSize(scr, WINGsConfiguration.defaultFontSize); if(!scr->boldFont) scr->boldFont = scr->normalFont; if(!scr->normalFont) { WDMError("could not load any fonts."); exit(2); } } #endif if(cfg->animations) animate = True; screen.pos.x = 0; screen.pos.y = 0; screen.size.width = WMScreenWidth(scr); screen.size.height = WMScreenHeight(scr); #ifdef HAVE_XINERAMA if(XineramaIsActive(WMScreenDisplay(scr))) { xine = XineramaQueryScreens(WMScreenDisplay(scr), &xine_count); if(xine != NULL) { if(xinerama_head < xine_count) { screen.pos.x = xine[xinerama_head].x_org; screen.pos.y = xine[xinerama_head].y_org; screen.size.width = xine[xinerama_head].width; screen.size.height = xine[xinerama_head].height; } } } #endif if(cfg->geometry.pos.x == INT_MIN || cfg->geometry.pos.y == INT_MIN) { cfg->geometry.pos.x = screen.pos.x + (screen.size.width - cfg->geometry.size.width)/2; cfg->geometry.pos.y = screen.pos.y + (screen.size.height - cfg->geometry.size.height)/2; } XSynchronize(WMScreenDisplay(scr), False); /* use of scr->rootWin is temporary hack */ XWarpPointer(WMScreenDisplay(scr), None, scr->rootWin, 0, 0, 0, 0, (cfg->geometry.pos.x + (cfg->geometry.size.width - 10)), (cfg->geometry.pos.y + (cfg->geometry.size.height - 10))); /* use of scr->rootWin is temporary hack */ XDefineCursor(WMScreenDisplay(scr), scr->rootWin, XCreateFontCursor(WMScreenDisplay(scr), XC_top_left_arrow)); setBG(scr); panel = CreateLoginPanel(scr, cfg); WMSetWindowTitle(panel->win, ProgName); /* the following Resize and the one following the Move fake out WINGs */ /* so that the move is not visible */ WMResizeWidget(panel->win, 1, 1); WMMapWidget(panel->win); WMSetWindowTitle(panel->win, ProgName); WMMoveWidget(panel->win, cfg->geometry.pos.x, cfg->geometry.pos.y); WMResizeWidget(panel->win, cfg->geometry.size.width, cfg->geometry.size.height); WMSetFocusToWidget(panel->entryText); XSetInputFocus(WMScreenDisplay(scr), WMWidgetXID(panel->win), RevertToParent, CurrentTime); panel->retkey = XKeysymToKeycode(WMScreenDisplay(scr), XK_Return); panel->tabkey = XKeysymToKeycode(WMScreenDisplay(scr), XK_Tab); WMCreateEventHandler(WMWidgetView(panel->entryText), KeyPressMask, handleKeyPress, panel); exit_request = 0; signal(SIGUSR1, SignalUsr1); signal(SIGTERM, SignalTerm); signal(SIGINT, SignalTerm); signal(SIGPIPE, SIG_DFL); while(!exit_request) { XEvent event; WMNextEvent(WMScreenDisplay(scr), &event); WMHandleEvent(&event); } DestroyLoginPanel(panel); return 0; } wdm-1.28/src/wdmLogin/config.c 644 0 0 727310221265060 156350ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * Copyright (C) 1998 Gene Czarcinski * * 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 * * config.c: read configuration for wdmLogin */ #include #include #include #include #include static Bool WDMCheckPLGeometry(WMPropList *pl, void *def, void *target); static WMRect default_geometry = {{INT_MIN, INT_MIN}, {530, 240}}; static WDMDictionaryStruct wdmLogin_config_struct[] = { {"geometry", WDMCheckPLGeometry, &default_geometry, offsetof(WDMLoginConfig, geometry)}, #ifdef USE_AA {"aa", WDMCheckPLBool, (void*)False, offsetof(WDMLoginConfig, aaenabled)}, {"multibyte", WDMCheckPLBool, (void*)True, offsetof(WDMLoginConfig, multibyte)}, #endif {"animations", WDMCheckPLBool, False, offsetof(WDMLoginConfig, animations)}, {NULL, NULL, NULL, 0} }; static WDMDictionarySpec wdmLogin_config = {sizeof(WDMLoginConfig), wdmLogin_config_struct}; static Bool WDMCheckPLInteger(WMPropList *pl, void *def, void *target) { int *int_target = (int *)target; int int_def = (int)def; char *text = NULL; char *endptr = NULL; WDMDebug("WDMCheckPLInteger(%p, %p, %p)\n", (void*)pl, def, target); *int_target = int_def; if(pl && WMIsPLString(pl)) { text = WMGetFromPLString(pl); if(text != NULL) *int_target = strtol(text, &endptr, 0); } return True; } static Bool WDMCheckPLUInteger(WMPropList *pl, void *def, void *target) { unsigned int *int_target = (unsigned int *)target; unsigned int int_def = (unsigned int)def; char *text = NULL; char *endptr = NULL; WDMDebug("WDMCheckPLUInteger(%p, %p, %p)\n", (void*)pl, def, target); *int_target = int_def; if(pl && WMIsPLString(pl)) { text = WMGetFromPLString(pl); if(text != NULL) *int_target = strtoul(text, &endptr, 0); } return True; } static Bool WDMCheckPLGeometry(WMPropList *pl, void *def, void *target) { WMRect *rect_target = (WMRect *)target; WDMDebug("WDMCheckPLGeometry(%p, %p, %p)\n", (void*)pl, def, target); if(def) memcpy(rect_target, def, sizeof(WMRect)); if(pl != NULL && WMIsPLArray(pl)) { WDMCheckPLUInteger(WMGetFromPLArray(pl, 0), (void*)rect_target->size.width, &rect_target->size.width); WDMCheckPLUInteger(WMGetFromPLArray(pl, 1), (void*)rect_target->size.height, &rect_target->size.height); WDMCheckPLInteger(WMGetFromPLArray(pl, 2), (void*)rect_target->pos.x, &rect_target->pos.x); WDMCheckPLInteger(WMGetFromPLArray(pl, 3), (void*)rect_target->pos.y, &rect_target->pos.y); return True; } return False; } WDMLoginConfig * LoadConfiguration(char *configFile) { char *filename = configFile ? configFile : DEF_WDMLOGIN_CONFIG; WMPropList *db; WDMLoginConfig *config = NULL; db = WMReadPropListFromFile(filename); if(db == NULL) WDMError("Cannot open config file. Using builtin defaults\n"); if(!WDMCheckPLDictionary(db, &wdmLogin_config, &config)) WDMError("Error parsing config file. Using builtin defaults\n"); if(db) WMReleasePropList(db); return config; } wdm-1.28/src/wdmPrefs/prefs.c 644 0 0 1336210221265060 155320ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * prefs.c: wdmPrefs program. configuration tool for wdm */ #include #include #include #include typedef struct _wdmPrefsPanel { WMWindow *win; WMFrame *fsects; WMArray *sections; } wdmPrefsPanel; wdmPrefsPanel wdmPrefs = {NULL, NULL, NULL}; static void ChangeSection(WMWidget *self, void *data) { static Panel *current = NULL; Panel *new = data; if(current && current->hide) current->hide(current); if(new && new->show) new->show(new); current = new; } static void DestroyButton(void *data) { WMButton *button = data; Panel *panel = WMGetHangedData(button); if(panel) panel->destroy(panel); } void AddSectionButton(Panel *panel, const char *iconfile) { WMButton *button; char *filename; RColor color; WMPixmap *icon; button = WMCreateCustomButton(wdmPrefs.fsects, WBBStateLightMask | WBBStateChangeMask); WMResizeWidget(button, 70, 70); WMMoveWidget(button, WMGetArrayItemCount(wdmPrefs.sections) * WMWidgetWidth(button), 0); WMSetButtonImagePosition(button, WIPImageOnly); WMSetButtonAction(button, ChangeSection, panel); WMHangData(button, panel); if(panel && panel->description) WMSetBalloonTextForView(panel->description, WMWidgetView(button)); WMAddToArray(wdmPrefs.sections, button); if(WMGetArrayItemCount(wdmPrefs.sections) > 1) WMGroupButtons(WMGetFromArray(wdmPrefs.sections, 0), button); WMResizeWidget(wdmPrefs.fsects, WMGetArrayItemCount(wdmPrefs.sections) * 70, 70); if(iconfile) { color.red = 0xae; color.green = 0xaa; color.blue = 0xae; color.alpha = 0; filename = WMPathForResourceOfType((char*)iconfile, NULL); if(filename) { icon = WMCreateBlendedPixmapFromFile( WMWidgetScreen(button), filename, &color); WMSetButtonImage(button, icon); if(icon) WMReleasePixmap(icon); wfree(filename); } } WMMapWidget(button); } static void CloseAction(WMWidget *self, void *data) { WMFreeArray(wdmPrefs.sections); WMDestroyWidget(self); exit(0); } static WMFrame * CreateSectionsSelector(WMBox *box) { WMFrame *frame; WMScrollView *scrollv; WMScroller *scroller; frame = WMCreateFrame(box); WMMapWidget(frame); WMSetFrameRelief(frame, WRRaised); scrollv = WMCreateScrollView(frame); WMMapWidget(scrollv); WMSetScrollViewRelief(scrollv, WRSunken); WMSetViewExpandsToParent(WMWidgetView(scrollv), 10, 10, 10, 10); wdmPrefs.fsects = WMCreateFrame(scrollv); WMResizeWidget(wdmPrefs.fsects, 500, 70); WMMapWidget(wdmPrefs.fsects); WMSetFrameRelief(wdmPrefs.fsects, WRFlat); WMSetScrollViewContentView(scrollv, WMWidgetView(wdmPrefs.fsects)); WMSetScrollViewHasHorizontalScroller(scrollv, True); WMSetScrollViewHasVerticalScroller(scrollv, False); scroller = WMGetScrollViewHorizontalScroller(scrollv); WMSetScrollerArrowsPosition(scroller, WSANone); return frame; } static WMFrame * CreateButtons(WMBox *box) { WMFrame *fcontrols; WMBox *buttonbox; WMButton *bsave, *bclose; fcontrols = WMCreateFrame(box); WMMapWidget(fcontrols); WMSetFrameRelief(fcontrols, WRRaised); buttonbox = WMCreateBox(fcontrols); WMMapWidget(buttonbox); WMSetBoxBorderWidth(buttonbox, 0); WMSetViewExpandsToParent(WMWidgetView(buttonbox), 10, 10, 10, 10); WMSetBoxHorizontal(buttonbox, True); bsave = WMCreateCommandButton(buttonbox); WMMapWidget(bsave); WMSetButtonText(bsave, "Save"); WMAddBoxSubviewAtEnd(buttonbox, WMWidgetView(bsave), False, False, 100, 100, 0); bclose = WMCreateCommandButton(buttonbox); WMMapWidget(bclose); WMSetButtonText(bclose, "Close"); WMSetButtonAction(bclose, CloseAction, NULL); WMAddBoxSubviewAtEnd(buttonbox, WMWidgetView(bclose), False, False, 100, 100, 10); return fcontrols; } static WMFrame * CreateSections(WMBox *box) { WMFrame *frame; frame = WMCreateFrame(box); WMMapWidget(frame); WMSetFrameRelief(frame, WRRaised); InitTestPanel(frame); InitTestPanel2(frame); return frame; } static void CreatePrefsWindow(WMScreen *scr) { WMBox *box; wdmPrefs.win = WMCreateWindow(scr, "wdmPrefs"); WMSetWindowCloseAction(wdmPrefs.win, CloseAction, NULL); WMSetWindowTitle(wdmPrefs.win, "wdmPrefs"); box = WMCreateBox(wdmPrefs.win); WMMapWidget(box); WMSetBoxBorderWidth(box, 0); WMSetViewExpandsToParent(WMWidgetView(box), 0, 0, 0, 0); WMAddBoxSubview(box, WMWidgetView(CreateSectionsSelector(box)), False, False, 113, 113, 0); WMAddBoxSubview(box, WMWidgetView(CreateSections(box)), True, True, 0, 0, 0); WMAddBoxSubview(box, WMWidgetView(CreateButtons(box)), False, False, 50, 50, 0); } int main(int argc, char *argv[]) { WMScreen *scr; wdmPrefs.sections = WMCreateArrayWithDestructor(0, DestroyButton); WMInitializeApplication("wdmPrefs", &argc, argv); scr = WMOpenScreen(NULL); if(scr == NULL) WDMPanic("could not initialize Screen"); WMSetResourcePath(WGFXDIR); CreatePrefsWindow(scr); WMResizeWidget(wdmPrefs.win, 600, 400); WMMoveWidget(wdmPrefs.win, 100, 100); WMRealizeWidget(wdmPrefs.win); WMMapSubwidgets(wdmPrefs.win); WMMapWidget(wdmPrefs.win); WMScreenMainLoop(scr); return 0; } wdm-1.28/src/wdmPrefs/testPanel.c 644 0 0 427010221265060 163300ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * testPanel.c: panel for testing internal wdmPrefs functions. */ #include #include #include #include typedef struct testPanel_ { WMBox *box; WMButton *button; } testPanel; static void * CreateTestPanel(WMWidget *win) { testPanel *data = malloc(sizeof(testPanel)); data->box = WMCreateBox(win); WMSetBoxBorderWidth(data->box, 5); WMSetBoxHorizontal(data->box, True); WMSetViewExpandsToParent(WMWidgetView(data->box), 0, 0, 0, 0); data->button = WMCreateSwitchButton(data->box); WMMapWidget(data->button); WMSetButtonText(data->button, "test button"); WMAddBoxSubview(data->box, WMWidgetView(data->button), False, False, 100, 100, 10); return data; } static void DestroyTestPanel(Panel *panel) { free(panel); } static void ShowTestPanel(Panel *panel) { testPanel *data = panel->data; WMMapWidget(data->box); } static void HideTestPanel(Panel *panel) { testPanel *data = panel->data; WMUnmapWidget(data->box); } static void SaveTestData(Panel *panel) { } static void UndoTestData(Panel *panel) { } void InitTestPanel(WMWidget *win) { Panel *panel = calloc(1, sizeof(Panel)); panel->description = "simple test panel"; panel->destroy = DestroyTestPanel; panel->show = ShowTestPanel; panel->hide = HideTestPanel; panel->save = SaveTestData; panel->undo = UndoTestData; panel->data = CreateTestPanel(win); AddSectionButton(panel, ""); } wdm-1.28/src/wdmPrefs/testPanel2.c 644 0 0 466110221265060 164160ustar AlexeyVoinov 0 0/* * wdm - WINGs display manager * Copyright (C) 2003 Alexey Voinov * * 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 * * testPanel.c: panel for testing internal wdmPrefs functions. */ #include #include #include #include typedef struct testPanel_ { WMBox *box; WMButton *button1; WMButton *button2; } testPanel; static void * CreateTestPanel(WMWidget *win) { testPanel *data = malloc(sizeof(testPanel)); data->box = WMCreateBox(win); WMSetBoxBorderWidth(data->box, 5); WMSetBoxHorizontal(data->box, True); WMSetViewExpandsToParent(WMWidgetView(data->box), 0, 0, 0, 0); data->button1 = WMCreateSwitchButton(data->box); WMMapWidget(data->button1); WMSetButtonText(data->button1, "test button 1"); WMAddBoxSubview(data->box, WMWidgetView(data->button1), False, False, 100, 100, 10); data->button2 = WMCreateSwitchButton(data->box); WMMapWidget(data->button2); WMSetButtonText(data->button2, "test button 2"); WMAddBoxSubview(data->box, WMWidgetView(data->button2), False, False, 100, 100, 10); return data; } static void DestroyTestPanel(Panel *panel) { free(panel); } static void ShowTestPanel(Panel *panel) { testPanel *data = panel->data; WMMapWidget(data->box); } static void HideTestPanel(Panel *panel) { testPanel *data = panel->data; WMUnmapWidget(data->box); } static void SaveTestData(Panel *panel) { } static void UndoTestData(Panel *panel) { } void InitTestPanel2(WMWidget *win) { Panel *panel = calloc(1, sizeof(Panel)); panel->description = "simple test panel 2"; panel->destroy = DestroyTestPanel; panel->show = ShowTestPanel; panel->hide = HideTestPanel; panel->save = SaveTestData; panel->undo = UndoTestData; panel->data = CreateTestPanel(win); AddSectionButton(panel, ""); } wdm-1.28/test/debug_test.c 644 0 0 51010221265060 150700ustar AlexeyVoinov 0 0#include #include int main(void) { WDMDebug("\ntest debug functions %i\n\n", 1); WDMLogLevel(1); WDMDebug("\ntest debug functions %i\n\n", 2); WDMLogLevel(0); WDMDebug("\ntest debug functions %i\n\n", 3); return 0; } /* CFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib LIBS=-lWINGs -lwdm */ wdm-1.28/test/dummy.c 644 0 0 15110221265060 140770ustar AlexeyVoinov 0 0int main(void) { return 0; } /* CFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib LIBS=-lWINGs */ wdm-1.28/test/env_test.c 644 0 0 225410221265060 146210ustar AlexeyVoinov 0 0#include #include int check_working_environment(void) { char **env = NULL; env = WDMPutEnv(env, "aaa=bbb"); test_assert(env != NULL); test_assert(strcmp(WDMGetEnv((const char **)env, "aaa"), "bbb") == 0); test_assert(strcmp(env[0], "aaa=bbb") == 0); test_assert(env[1] == NULL); env = WDMSetEnv(env, "aaa", "ccc"); test_assert(strcmp(WDMGetEnv((const char **)env, "aaa"), "ccc") == 0); test_assert(strcmp(env[0], "aaa=ccc") == 0); test_assert(env[1] == NULL); env = WDMSetEnv(env, "ddd", "eee"); test_assert(strcmp(WDMGetEnv((const char **)env, "aaa"), "ccc") == 0); test_assert(strcmp(WDMGetEnv((const char **)env, "ddd"), "eee") == 0); test_assert(strcmp(env[0], "aaa=ccc") == 0); test_assert(strcmp(env[1], "ddd=eee") == 0); test_assert(env[2] == NULL); env = WDMUnsetEnv(env, "aaa"); test_assert(strcmp(env[0], "ddd=eee") == 0); test_assert(env[1] == NULL); env = WDMUnsetEnv(env, "ddd"); test_assert(env[0] == NULL); WDMFreeEnv(env); return 1; } int main(void) { /* WDMLogLevel(WDM_LEVEL_DEBUG);*/ if(check_working_environment()) return 0; return 1; } /* CFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib LIBS=-lwdm -lWINGs */ wdm-1.28/test/plcheckers_test.c 644 0 0 1027610221265060 161770ustar AlexeyVoinov 0 0#include #include static WDMArraySpec array_of_bool = { WDMCheckPLBool, (void*)False, NULL }; static WDMArraySpec array_of_strings = { WDMCheckPLString, "default", wfree }; static WDMArraySpec array_of_strings2 = { WDMCheckPLString, NULL, wfree, False }; void free_test_struct(void *data); typedef struct _test_struct { Bool boolval; char *stringval; WMArray *arrayval; } test_struct; static WDMDictionaryStruct test_struct_fields[] = { {"bool", WDMCheckPLBool, False, offsetof(test_struct, boolval)}, {"string", WDMCheckPLString, "aaa", offsetof(test_struct, stringval)}, {"array", WDMCheckPLArray, &array_of_strings, offsetof(test_struct, arrayval)}, {NULL, NULL, NULL, 0} }; static WDMDictionarySpec test_struct_spec = {sizeof(test_struct), test_struct_fields}; static WDMArraySpec array_of_structs = {WDMCheckPLDictionary, &test_struct_spec, free_test_struct}; int check_array_of_bool(void) { WMPropList *pl = NULL; WMArray *array = NULL; pl = WMCreatePropListFromDescription("(yes, Yes, no)"); test_assert(WDMCheckPLArray(pl, &array_of_bool, &array) == True); test_assert((Bool)WMGetFromArray(array, 0) == True); test_assert((Bool)WMGetFromArray(array, 1) == True); test_assert((Bool)WMGetFromArray(array, 2) == False); WMFreeArray(array); WMReleasePropList(pl); return 1; } int check_array_of_strings(void) { WMPropList *pl = NULL; WMArray *array = NULL; pl = WMCreatePropListFromDescription("(yes, Yes, (), no)"); test_assert(WDMCheckPLArray(pl, &array_of_strings, &array) == True); test_assert(strcmp(WMGetFromArray(array, 0), "yes") == 0); test_assert(strcmp(WMGetFromArray(array, 1), "Yes") == 0); test_assert(strcmp(WMGetFromArray(array, 2), "default") == 0); test_assert(strcmp(WMGetFromArray(array, 3), "no") == 0); WMFreeArray(array); WMReleasePropList(pl); return 1; } int check_string_or_array(void) { WMPropList *pl = NULL; WMArray *array = NULL; pl = WMCreatePropListFromDescription("(yes, Yes, (), no)"); test_assert(WDMCheckPLStringOrArray(pl, NULL, &array) == True); test_assert(strcmp(WMGetFromArray(array, 0), "yes") == 0); test_assert(strcmp(WMGetFromArray(array, 1), "Yes") == 0); test_assert(strcmp(WMGetFromArray(array, 2), "no") == 0); WMFreeArray(array); WMReleasePropList(pl); pl = WMCreatePropListFromDescription("string"); test_assert(WDMCheckPLStringOrArray(pl, NULL, &array) == True); test_assert(strcmp(WMGetFromArray(array, 0), "string") == 0); WMFreeArray(array); WMReleasePropList(pl); return 1; } int check_array_of_strings2(void) { WMPropList *pl = NULL; WMArray *array = NULL; pl = WMCreatePropListFromDescription("(yes, Yes, (), no)"); test_assert(WDMCheckPLArray(pl, &array_of_strings2, &array) == True); test_assert(strcmp(WMGetFromArray(array, 0), "yes") == 0); test_assert(strcmp(WMGetFromArray(array, 1), "Yes") == 0); test_assert(strcmp(WMGetFromArray(array, 2), "no") == 0); WMFreeArray(array); WMReleasePropList(pl); return 1; } void free_test_struct(void *data) { test_struct *s = data; if(s->stringval) wfree(s->stringval); if(s->arrayval) WMFreeArray(s->arrayval); wfree(data); } int check_array_of_structs(void) { WMPropList *pl = NULL; WMArray *array = NULL; test_struct *tst = NULL; pl = WMCreatePropListFromDescription( "({bool=yes; string=qqq; array=(bbb, ccc);}," "{bool=False; array=yyy;})"); test_assert(WDMCheckPLArray(pl, &array_of_structs, &array) == True); test_assert((tst = WMGetFromArray(array, 0)) != NULL); test_assert(tst->boolval == True); test_assert(strcmp(tst->stringval, "qqq") == 0); test_assert(tst->arrayval != NULL); test_assert(strcmp(WMGetFromArray(tst->arrayval, 0), "bbb") == 0); test_assert(strcmp(WMGetFromArray(tst->arrayval, 1), "ccc") == 0); test_assert((tst = WMGetFromArray(array, 1)) != NULL); test_assert(tst->boolval == False); test_assert(strcmp(tst->stringval, "aaa") == 0); test_assert(tst->arrayval == NULL); WMFreeArray(array); WMReleasePropList(pl); return 1; } int main(void) { if(check_array_of_bool() && check_array_of_strings() && check_array_of_strings2() && check_string_or_array() && check_array_of_structs()) return 0; return 1; } /* CFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib LIBS=-lwdm -lWINGs */ wdm-1.28/wdm-1.20.spec 644 0 0 555410221265060 136760ustar AlexeyVoinov 0 0Name: wdm Version: 1.20 Release: 0 Copyright: Copyright 1998 Gene Czarcinski - GPL Source0: wdm-%{PACKAGE_VERSION}.tar.gz Packager: Gene Czarcinski Group: X11/XFree86 Requires: XFree86 => 3.3.2 Requires: WindowMaker => 0.17.5 Requires: libPropList BuildRoot: /tmp/wdm-root Summary: WINGs Display Manager %description wdm is a modification/enhancement of XFree86's xdm which provides a more flexible login panel while maintaining the basic xdm code to interface with pam, etc. The basic code uses XFree86 xdm with RedHat patches to implement pam. This package is automake/autoconf based rather than Imake. Xdm manages one more more X displays, which may be on the local host or remote servers. wdm is an enhancement of the xdm distributed as part of XFree86. It replaces the logon panel with an external "greet" module (that is, a separate binary executable file). This separate executable file has been implemented using the WindowMaker WINGs widget library and the WindowMaker wraster graphics library. The interface to the external routine supports passing a parameter to the Xsession script (such as failsafe which just starts an xterm window). This interface can be used (with a modified Xsession) to specify the window manager to start. Except for the pam configuration file which is /etc/pam.d/wdm, the install location prefix of /usr/X11R6 is used. wdm's configuration directory is /etc/X11/wdm. Note: This rpm has been compiled assuming that the path for the wmaker program is /usr/bin/wmaker and the path for the afterstep program is /usr/X11R6/bin/afterstep. If this is incorrect for your system, then the file /etc/X11/wdm/Xclients must be modified to reflect the correct locations. Note: Additional window managers can be added by modifying the wdmWm Xresources in the /etc/X11/wdm/wdm-config file and changing the /etc/X11/wdm/Xclients file to start the added window managers. Note: The rpm binary install process runs a post install script to find window managers on the install system and update the wdm-config and Xclients files. Although this shell script can do a reasonable job, there is nothing like editing these files to tailor them to a particular system. This script can be run manually if new window managers are installed. %changelog * Sat Sep 13 1998 Gene Czarcinski - create wdm 1.0 - includes running wdmReconfig as postinstall process %prep %setup %build CFLAGS="${RPM_OPT_FLAGS}" ./configure \ --enable-pam \ --prefix=/usr/X11R6 \ --with-wdmdir=/etc/X11/wdm make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %post /etc/X11/wdm/wdmReconfig %clean rm -rf $RPM_BUILD_ROOT %files %doc AUTHORS COPYING ChangeLog INSTALL NEWS README README.pam TODO /etc/pam.d/wdm /usr/X11R6/bin/wdm /usr/X11R6/bin/wdmLogin /usr/X11R6/man/man1/* /etc/X11/wdm/* wdm-1.28/wdm.spec 644 0 0 555410221265060 133200ustar AlexeyVoinov 0 0Name: wdm Version: 1.20 Release: 0 Copyright: Copyright 1998 Gene Czarcinski - GPL Source0: wdm-%{PACKAGE_VERSION}.tar.gz Packager: Gene Czarcinski Group: X11/XFree86 Requires: XFree86 => 3.3.2 Requires: WindowMaker => 0.17.5 Requires: libPropList BuildRoot: /tmp/wdm-root Summary: WINGs Display Manager %description wdm is a modification/enhancement of XFree86's xdm which provides a more flexible login panel while maintaining the basic xdm code to interface with pam, etc. The basic code uses XFree86 xdm with RedHat patches to implement pam. This package is automake/autoconf based rather than Imake. Xdm manages one more more X displays, which may be on the local host or remote servers. wdm is an enhancement of the xdm distributed as part of XFree86. It replaces the logon panel with an external "greet" module (that is, a separate binary executable file). This separate executable file has been implemented using the WindowMaker WINGs widget library and the WindowMaker wraster graphics library. The interface to the external routine supports passing a parameter to the Xsession script (such as failsafe which just starts an xterm window). This interface can be used (with a modified Xsession) to specify the window manager to start. Except for the pam configuration file which is /etc/pam.d/wdm, the install location prefix of /usr/X11R6 is used. wdm's configuration directory is /etc/X11/wdm. Note: This rpm has been compiled assuming that the path for the wmaker program is /usr/bin/wmaker and the path for the afterstep program is /usr/X11R6/bin/afterstep. If this is incorrect for your system, then the file /etc/X11/wdm/Xclients must be modified to reflect the correct locations. Note: Additional window managers can be added by modifying the wdmWm Xresources in the /etc/X11/wdm/wdm-config file and changing the /etc/X11/wdm/Xclients file to start the added window managers. Note: The rpm binary install process runs a post install script to find window managers on the install system and update the wdm-config and Xclients files. Although this shell script can do a reasonable job, there is nothing like editing these files to tailor them to a particular system. This script can be run manually if new window managers are installed. %changelog * Sat Sep 13 1998 Gene Czarcinski - create wdm 1.0 - includes running wdmReconfig as postinstall process %prep %setup %build CFLAGS="${RPM_OPT_FLAGS}" ./configure \ --enable-pam \ --prefix=/usr/X11R6 \ --with-wdmdir=/etc/X11/wdm make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %post /etc/X11/wdm/wdmReconfig %clean rm -rf $RPM_BUILD_ROOT %files %doc AUTHORS COPYING ChangeLog INSTALL NEWS README README.pam TODO /etc/pam.d/wdm /usr/X11R6/bin/wdm /usr/X11R6/bin/wdmLogin /usr/X11R6/man/man1/* /etc/X11/wdm/* wdm-1.28/wdm.spec.in 644 0 0 556110221265060 137230ustar AlexeyVoinov 0 0Name: wdm Version: #VERSION# Release: 0 Copyright: Copyright 1998 Gene Czarcinski - GPL Source0: wdm-%{PACKAGE_VERSION}.tar.gz Packager: Gene Czarcinski Group: X11/XFree86 Requires: XFree86 => 3.3.2 Requires: WindowMaker => 0.17.5 Requires: libPropList BuildRoot: /tmp/wdm-root Summary: WINGs Display Manager %description wdm is a modification/enhancement of XFree86's xdm which provides a more flexible login panel while maintaining the basic xdm code to interface with pam, etc. The basic code uses XFree86 xdm with RedHat patches to implement pam. This package is automake/autoconf based rather than Imake. Xdm manages one more more X displays, which may be on the local host or remote servers. wdm is an enhancement of the xdm distributed as part of XFree86. It replaces the logon panel with an external "greet" module (that is, a separate binary executable file). This separate executable file has been implemented using the WindowMaker WINGs widget library and the WindowMaker wraster graphics library. The interface to the external routine supports passing a parameter to the Xsession script (such as failsafe which just starts an xterm window). This interface can be used (with a modified Xsession) to specify the window manager to start. Except for the pam configuration file which is /etc/pam.d/wdm, the install location prefix of /usr/X11R6 is used. wdm's configuration directory is /etc/X11/wdm. Note: This rpm has been compiled assuming that the path for the wmaker program is /usr/bin/wmaker and the path for the afterstep program is /usr/X11R6/bin/afterstep. If this is incorrect for your system, then the file /etc/X11/wdm/Xclients must be modified to reflect the correct locations. Note: Additional window managers can be added by modifying the wdmWm Xresources in the /etc/X11/wdm/wdm-config file and changing the /etc/X11/wdm/Xclients file to start the added window managers. Note: The rpm binary install process runs a post install script to find window managers on the install system and update the wdm-config and Xclients files. Although this shell script can do a reasonable job, there is nothing like editing these files to tailor them to a particular system. This script can be run manually if new window managers are installed. %changelog * Sat Sep 13 1998 Gene Czarcinski - create wdm 1.0 - includes running wdmReconfig as postinstall process %prep %setup %build CFLAGS="${RPM_OPT_FLAGS}" ./configure \ --enable-pam \ --prefix=/usr/X11R6 \ --with-wdmdir=/etc/X11/wdm make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %post /etc/X11/wdm/wdmReconfig %clean rm -rf $RPM_BUILD_ROOT %files %doc AUTHORS COPYING ChangeLog INSTALL NEWS README README.pam TODO /etc/pam.d/wdm /usr/X11R6/bin/wdm /usr/X11R6/bin/wdmLogin /usr/X11R6/man/man1/* /etc/X11/wdm/*