# HG changeset patch # User cvs # Date 1186989585 -7200 # Node ID fe104dbd9147e64426c6943f09fd27c005e54d0c # Parent e183fc0495789df6a9151ab52ca839872e631db7 Import from CVS: tag r20-1b7 diff -r e183fc049578 -r fe104dbd9147 CHANGES-beta --- a/CHANGES-beta Mon Aug 13 09:18:41 2007 +0200 +++ b/CHANGES-beta Mon Aug 13 09:19:45 2007 +0200 @@ -1,4 +1,29 @@ -*- indented-text -*- +to 20.1 beta7 +-- Update to time.el. +-- htmlpro DTD, IE3 DTDs added to etc/sgml. +-- I18N patches and more courtesy of Jareth Hein +-- Invisibility to visibility extent patch courtesy of David Moore + (fixes long-standing Gnus annoyance when unhiding .signature). +-- cperl-mode-1.31+ +-- Synch to Emacs/mule API +-- Configure gets --canna-libs and --canna-includes courtesy of YAMAMOTO Toru +-- w3-3.0.68 +-- Custom-1.63 +-- Define BROKEN_SIGIO for SunOS 4.1 +-- timer.el courtesy of Kyle Jones +-- itimer.el-1.04 +-- cperl-mode.el-1.31 +-- tm-7.105.2 +-- cc-mode-4.379 courtesy of Barry Warsaw +-- more about.el hacking +-- Logo adjusted to be more colormap friendly +-- efs/dired updates courtesy of Michael Sperber [on hold] +-- miscellaneous bug fixes +-- hyperbole fix +-- Gnus-5.4.26 +-- sit-for, etc. The Final Solution courtesy of David Moore + to 20.1 beta6 -- filladapt.el-2.09 courtesy of Kyle Jones -- itimer.el-1.03 diff -r e183fc049578 -r fe104dbd9147 ChangeLog --- a/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,15 @@ +Sat Mar 15 17:15:18 1997 Steven L Baur + + * etc/sgml/CATALOG: Added IE3 DTDs and htmlpro DTD. + +Thu Mar 13 10:40:11 1997 Steven L Baur + + * configure.in: Add sunos4-1-4 header files. + +Wed Mar 12 18:53:08 1997 Steven L Baur + + * configure.in: Use new file bsdos3.h with BSDI 3.0. + Sat Mar 8 15:19:33 1997 Steven L Baur * XEmacs-20.1-b6 is released. diff -r e183fc049578 -r fe104dbd9147 configure --- a/configure Mon Aug 13 09:18:41 2007 +0200 +++ b/configure Mon Aug 13 09:19:45 2007 +0200 @@ -284,6 +284,8 @@ --wnn-libraries=DIR Search for WNN libraries in DIR. --with-i18n3 Compile with I18N level 3 (support for message translation). This doesn't currently work. +--canna-includes=DIR Search for Canna header files in DIR. +--canna-libraries=DIR Search for Canna libraries in DIR. Debugging options: @@ -449,6 +451,8 @@ x_libraries | \ wnn_includes | \ wnn_libraries | \ + canna_includes | \ + canna_libraries | \ site_includes | \ site_libraries | \ site_runtime_libraries ) @@ -1348,7 +1352,8 @@ i[3-9]86-*-sunos4* ) opsys=sunos4-0 ;; *-sunos4.0* ) opsys=sunos4-0 ;; *-sunos4.1.2* ) opsys=sunos4-1-2 ;; - *-sunos4.1.[3-9]* ) opsys=sunos4-1-3 ;; + *-sunos4.1.3* ) opsys=sunos4-1-3 ;; + *-sunos4.1.[4-9]* ) opsys=sunos4-1-4 ;; *-sunos4* | *-sunos ) opsys=sunos4-1 ;; *-solaris2.3* ) opsys=sol2-3 ;; @@ -1439,7 +1444,7 @@ *-linux* ) opsys=linux ;; *-sco3.2v4* ) opsys=sco4 ; NON_GNU_CPP=/lib/cpp ;; *-bsd386* | *-bsdi1* ) opsys=bsd386 ;; - *-bsdi3* ) opsys=bsdos2-1 ;; + *-bsdi3* ) opsys=bsdos3 ;; *-bsdi2.1* ) opsys=bsdos2-1 ;; *-bsdi2* ) opsys=bsdos2 ;; *-sco3.2v5* ) opsys=sco5 ; @@ -4472,6 +4477,26 @@ done fi +# +# set defaults for finding Canna includes and libs +# +if test "${with_canna}" = "yes" ; then + for arg in "-I${canna_includes}" "-I/usr/X11R6/include" + do + if test -f `echo "${arg}/canna/RK.h" | sed 's/^\-I//'` ; then + C_SWITCH_SITE="${C_SWITCH_SITE} ${arg}" + canna_includes=${arg} + fi + done + for arg in "-L${canna_libraries}" "-I/usr/X11R6/lib" + do + if test -f `echo "${arg}/libcanna.a" | sed 's/^\-L//'` ; then + LD_SWITCH_SITE="${LD_SWITCH_SITE} ${arg}" + canna_libraries=${arg} + fi + done +fi + # If netdb.h doesn't declare h_errno, we must declare it by hand. test -n "$silent" || echo "checking for declaration of h_errno in netdb.h" cat > conftest.${ac_ext} <], diff -r e183fc049578 -r fe104dbd9147 etc/BETA --- a/etc/BETA Mon Aug 13 09:18:41 2007 +0200 +++ b/etc/BETA Mon Aug 13 09:19:45 2007 +0200 @@ -35,6 +35,24 @@ List manager Chuck Thompson . +** Beta Release Schedule +======================== + +The URL ftp://ftp.xemacs.org/pub/beta/README always contains the best +estimate of when the next beta XEmacs will be released. For weekend +betas the release time is generally in the vicinity of 2PM to 5PM US +Pacific Time (Universal Time minus 8 hours). For weekday betas, the +release time is generally in the vicinity of 8PM to Midnight US +Pacific Time on the listed day. + +While 19.15 and 20.x are in parallel development, a simultaneous +release day implies a release of 20.x first, followed a few hours +later by 19.15. + +Betas are nominally a week apart, scheduled on every Saturday. +Midweek releases are made when a serious enough problem warrants it. + + ** Reporting Problems ===================== diff -r e183fc049578 -r fe104dbd9147 etc/jens.xpm.Z Binary file etc/jens.xpm.Z has changed diff -r e183fc049578 -r fe104dbd9147 etc/jensm.xpm.Z Binary file etc/jensm.xpm.Z has changed diff -r e183fc049578 -r fe104dbd9147 etc/sgml/CATALOG --- a/etc/sgml/CATALOG Mon Aug 13 09:18:41 2007 +0200 +++ b/etc/sgml/CATALOG Mon Aug 13 09:19:45 2007 +0200 @@ -48,5 +48,8 @@ PUBLIC "-//W3C//DTD HTML 3.2//EN" html-3.2.dtd PUBLIC "-//W3C//DTD HTML 3.2 Final//EN" html-3.2f.dtd PUBLIC "-//W3C//DTD HTML Experimental 19960712//EN" html-cougar.dtd +PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 Tables//EN" ie3tables.dtd +PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN" ie30.dtd +PUBLIC "+//Silmaril//DTD HTML Pro v0r11 19970101//EN" htmlpro.dtd DOCTYPE HTML html.dtd DOCTYPE HTML-3 html-3.dtd diff -r e183fc049578 -r fe104dbd9147 etc/sgml/htmlpro.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/sgml/htmlpro.dtd Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,6093 @@ + + + + + ... + + -- + > + + + + + +%html; diff -r e183fc049578 -r fe104dbd9147 etc/sgml/ie30.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/sgml/ie30.dtd Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,867 @@ + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + +%ISOlat1; + + + + + + + + + + + + + + + + + + + + +]]> + + + + +]]> + + + + + + + + +]]> + + + + + + +]]> + + + + + + + + +]]> + + + + + +]]> + + + + + +]]> + + + + +]]> + + + + +]]> + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + +]]> + + +]]> + + + + + + + +]]> + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%ietables; + + + + + + +]]> + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + diff -r e183fc049578 -r fe104dbd9147 etc/sgml/ie3tables.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/sgml/ie3tables.dtd Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-0.0.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-0.0.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,22 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 2 1", +/* colors */ +"` s None c None", +". c #606060", +/* pixels */ +"``````````", +"``````....", +"`````.....", +"`````.....", +"````......", +"````......", +"```.......", +"```.......", +"``........", +"``........", +"`.........", +"`.........", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-0.5.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-0.5.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,23 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 3 1", +/* colors */ +"` s None c None", +"a c #0AB224", +". c #606060", +/* pixels */ +"``````````", +"``````....", +"`````.....", +"`````.....", +"````......", +"````......", +"```.......", +"```.......", +"``........", +"``........", +"`.........", +"`aaaaaaaaa", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-1.0.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-1.0.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,23 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 3 1", +/* colors */ +"` s None c None", +"a c #0AB224", +". c #606060", +/* pixels */ +"``````````", +"``````....", +"`````.....", +"`````.....", +"````......", +"````......", +"```.......", +"```.......", +"``........", +"``aaaaaaaa", +"`.........", +"`aaaaaaaaa", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-1.5.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-1.5.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,24 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 4 1", +/* colors */ +"` s None c None", +"a c #2AD244", +"b c #DEE614", +". c #606060", +/* pixels */ +"``````````", +"``````....", +"`````.....", +"`````.....", +"````......", +"````......", +"```.......", +"```bbbbbbb", +"``........", +"``aaaaaaaa", +"`.........", +"`aaaaaaaaa", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-2.0.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-2.0.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,24 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 4 1", +/* colors */ +"` s None c None", +"a c #0AB224", +"b c #DEE614", +". c #606060", +/* pixels */ +"``````````", +"``````....", +"`````.....", +"`````.....", +"````......", +"````bbbbbb", +"```.......", +"```bbbbbbb", +"``........", +"``aaaaaaaa", +"`.........", +"`aaaaaaaaa", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-2.5.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-2.5.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,25 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 5 1", +/* colors */ +"a s None c None", +"` c #FE0204", +"b c #0AB224", +"c c #DEE614", +". c #606060", +/* pixels */ +"aaaaaaaaaa", +"aaaaaa....", +"aaaaa.....", +"aaaaa`````", +"aaaa......", +"aaaacccccc", +"aaa.......", +"aaaccccccc", +"aa........", +"aabbbbbbbb", +"a.........", +"abbbbbbbbb", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/time/l-jtl-3.0.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/etc/time/l-jtl-3.0.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,25 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"10 13 5 1", +/* colors */ +"a s None c None", +"` c #FE0204", +"b c #0AB224", +"c c #DEE614", +". c #606060", +/* pixels */ +"aaaaaaaaaa", +"aaaaaa````", +"aaaaa.....", +"aaaaa`````", +"aaaa......", +"aaaacccccc", +"aaa.......", +"aaaccccccc", +"aa........", +"aabbbbbbbb", +"a.........", +"abbbbbbbbb", +".........." +}; diff -r e183fc049578 -r fe104dbd9147 etc/xemacs.xpm --- a/etc/xemacs.xpm Mon Aug 13 09:18:41 2007 +0200 +++ b/etc/xemacs.xpm Mon Aug 13 09:19:45 2007 +0200 @@ -1,192 +1,177 @@ /* XPM */ static char *noname[] = { /* width height ncolors chars_per_pixel */ -"388 145 40 2", +"388 145 25 1", /* colors */ -"`` c #787879", -"`a c #1F2374", -"`b c #8587AD", -"`c c #585859", -"`d c #F5F5F6", -"`e c #383839", -"`f c #363ACC", -"`g c #E5E5E6", -"`h c #5458B1", -"`i s background c None", -"`j c #5256DA", -"`k c #282829", -"`l c #D7D7D8", -"`m c #494949", -"`n c #6F73E2", -"`o c #13154C", -"`p c #222454", -"`q c #252992", -"`r c #B6B8DE", -"`s c #999DF3", -"`t c #050508", -"`u c #494B6F", -"`v c #B6BAFB", -"`w c #888888", -"`x c #9699CE", -"`y c #686868", -"`z c #666891", -"a` c #A6AAF4", -"aa c #585979", -"ab c #171718", -"ac c #4245A2", -"ad c #868AEB", -"ae c #A8A8A9", -"af c #4249D3", -"ag c #989899", -"ah c #797CB6", -"ai c #6266DB", -"aj c #333785", -"ak c #B9B9B9", -"al c #C5C7F3", +"` c #686869", +"a c #A6AAF5", +"b c #585859", +"c c #797979", +"d c #09090B", +"e c #989CEA", +"f c #383839", +"g c #363ACC", +"h c #282829", +"i c #88888A", +"j c #13154C", +"k c #7074DF", +"l c #5256D8", +"m c #484949", +"n c #232788", +"o s None c None", +"p c #B8B8B9", +"q c #4249D0", +"r c #B6BAF9", +"s c #868AEB", +"t c #A8A8A9", +"u c #C8C8CF", +"v c #989899", +"w c #6266DB", +"x s None c None", /* pixels */ -"`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`l`l`i`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`l`l`i`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`l`l`i`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i", -"`i`i`i`i`i`i`l`i`l`l`i`l`l`i`l`i`i`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`l`i`l`i`i`l`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`l`i`l`l`i`l`l`i`l`i`i`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`l`i`l`i`i`l`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`l`i`l`l`i`l`l`i`l`i`i`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`l`i`l`i`i`l`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`l`l`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`l`i`l`l`l`l`i`l`i`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`l`l`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`l`i`l`l`l`l`i`l`i`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`i`l`i`l`i`i`i`l`i`l`i`l`l`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`l`i`l`l`l`l`i`l`i`l`i`l`i`i`l`i`i`i`i", -"`i`i`i`l`i`i`l`i`l`l`i`l`i`l`i`i`l`i`i`l`l`i`l`l`l`i`l`i`l`i`i`i`i`i`l`i`l`i`i`i`l`i`l`l`i`l`i`i`i`l`i`i`i`i`l`l`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`l`i`i`l`l`l`i`i`i`i`i`i`i`l`l`i`l`i`l`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`i`l`i`l`i`l`i`l`i`l`i`i`l`i`i`i`i`l`i`l`l`i`l`i`l`i`i`l`i`i`l`l`i`l`l`l`i`l`i`l`i`i`i`i`i`l`i`l`i`i`i`l`i`l`l`i`l`i`i`i`l`i`i`i`i`l`l`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`l`i`i`l`l`l`i`i`i`i`i`i`i`l`l`i`l`i`l`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`i`l`i`l`i`l`i`l`i`l`i`i`l`i`i`i`i`l`i`l`l`i`l`i`l`i`i`l`i`i`l`l`i`l`l`l`i`l`i`l`i`i`i`i`i`l`i`l`i`i`i`l`i`l`l`i`l`i`i`i`l`i`i`i`i`l`l`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`i`l`i`i`l`l`l`i`i`i`i`i`i`i`l`l`i`l`i`l`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`i`l`i`l`i`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`l`i`l`i`i`i`l`i`l`l`i`i`i`i`i`i`l`i`i`l`i`l`l`i`l`i`i`i`i`l`l`i`l`i`i`i`i`i`l`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i`i`i`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`i`i`l`i`l`i`l`i`l`l`i`l`i`i`lal`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i`l`i`l`l`i`i`i`i`i`i`l`i`i`l`i`l`l`i`l`i`i`i`i`l`l`i`l`i`i`i`i`i`l`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i`i`i`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`i`i`l`i`l`i`l`i`l`l`i`l`i`i`lal`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i`l`i`l`l`i`i`i`i`i`i`l`i`i`l`i`l`l`i`l`i`i`i`i`l`l`i`l`i`i`i`i`i`l`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i`i`i`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`i`i`l`i`l`i`l`i`l`l`i`l`i`i`lal`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`i`l`l`i`l`i`i`i", -"`i`i`i`l`i`i`i`i`i`i`i`l`l`i`i`l`i`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`l`l`l`i`l`i`l`i`l`l`l`l`l`i`i`i`i`l`i`i`i`l`i`i`l`i`i`i`l`i`l`i`l`i`i`i`l`i`l`i`l`l`i`l`i`i`i`l`i`l`i`l`l`i`l`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`l`i`i`i`l`i`l`l`l`l`i`l`i`i`i`l`i`i`i`i`i`i`i`i`l`l`i`i`l`i`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`l`l`l`i`l`i`l`i`l`l`l`l`l`i`i`i`i`l`i`i`i`l`i`i`l`i`i`i`l`i`l`i`l`i`i`i`l`i`l`i`l`l`i`l`i`i`i`l`i`l`i`l`l`i`l`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`l`i`i`i`l`i`l`l`l`l`i`l`i`i`i`l`i`i`i`i`i`i`i`i`l`l`i`i`l`i`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`l`l`l`i`l`i`l`i`l`l`l`l`l`i`i`i`i`l`i`i`i`l`i`i`l`i`i`i`l`i`l`i`l`i`i`i`l`i`l`i`l`l`i`l`i`i`i`l`i`l`i`l`l`i`l`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`i`l`i`i`l`i`l`i`l`l`i`i`i`l`i`l`l`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`l`i`l`i`l`i`l`i`l`i`l`i`i`l`l`l`l`i`l`l`i`i`i`l`l`l`i`l`i`i`i`i`l`i`l`l`l`i`l`i`i`l`l`l`l`i`l`i`i`i`i`l`l`i`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`i`l`l`i`i`l`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`l`i`i`l`i`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`l`l`l`l`i`l`l`l`i`l`l`i`l`i`l`i`l`i`i`l`l`l`l`i`l`l`i`i`i`l`l`l`i`l`i`i`i`i`l`i`l`l`l`i`l`i`i`l`l`l`l`i`l`i`i`i`i`l`l`i`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`i`l`l`i`i`l`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`l`i`i`l`i`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`l`l`l`l`i`l`l`l`i`l`l`i`l`i`l`i`l`i`i`l`l`l`l`i`l`l`i`i`i`l`l`l`i`l`i`i`i`i`l`i`l`l`l`i`l`i`i`l`l`l`l`i`l`i`i`i`i`l`l`i`l`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`i`l`l`i`i`l`i`l`i`l`i`l`i`l`l`i`l`i`l`i`i`i`l`i`i`l`i`l`l`l`i`l`i`l`i`l`i`i`l`i`l`i`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`l`i`l`i`l`l`i`l`l`l`l`l`i`i`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`i`l`i`i`l`i`l`l`i`l`i`l`l`i`l`i`l`i`l`l`i`i`l`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`i`l`i`l`i`l`l`l`i`l`l`i`l`i`l`i`l`l`l`i`l`i`i`i`l`l`l`l`l`i`l`i`l`l`i`i`l`i`i`l`i`i`l`i`i`l`i`l`i`l`i`l`l`i`l`l`l`l`l`i`i`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`i`l`i`i`l`i`l`l`i`l`i`l`l`i`l`i`l`i`l`l`i`i`l`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`i`l`i`l`i`l`l`l`i`l`l`i`l`i`l`i`l`l`l`i`l`i`i`i`l`l`l`l`l`i`l`i`l`l`i`i`l`i`i`l`i`i`l`i`i`l`i`l`i`l`i`l`l`i`l`l`l`l`l`i`i`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`i`l`i`i`l`i`l`l`i`l`i`l`l`i`l`i`l`i`l`l`i`i`l`i`i`l`l`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`i`l`i`l`i`l`l`l`i`l`l`i`l`i`l`i`l`l`l`i`l`i`l`l`i`l`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`l`i`iakak`l`l`l`l`i`iae`i`l`l`l`l`l`l`l`lakak`l`l`l`l`i`l`i`l`i`i`l`l`i`l`i`l`l`i`l`lakak`i`i`i`lal`i`i`l`i`l`i`l`i`ialae`i`l`l`l`i`l`i`l`l`l`i`i`l`i`l`l`l`i`l`l`i`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`i`l`l`l`i`i`l`i`i`l`i`i`l`l`i`l`i`l`l`i`l`l`l`l`l`l`l`i`l`i`laeal`i`i`l`l`l`l`l`i`l`l`i`l`l`l`l`lae`i`l`l`i`l`l`l`l`i`l`i`l`i`i`l`l`i`l`i`l`laeal`l`l`i`i`i`i`lal`i`i`l`i`l`i`l`i`i`l`l`l`l`l`l`i`l`i`l`l`l`i`i`l`i`l`l`l`i`l`l`i`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`i`l`l`l`i`i`l`i`i`l`i`i`l`l`i`l`i`l`l`i`l`l`l`l`l`l`l`i`l`i`l`i`l`i`i`l`l`l`l`l`i`l`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`l`i`l`i`l`i`i`l`l`i`l`i`l`l`i`l`l`l`i`i`i`i`lal`i`i`l`i`l`i`l`i`i`l`l`l`l`l`l`i`l`i`l`l`l`i`i`l`i`l`l`l`i`l`l`i`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`i`l`l`l`i`i`l`i`i`l`i`i`l`l`i`i`i`i`l`l`i`l`l`i`l`i`i`l`i`i", -"`i`i`i`i`i`i`i`l`i`r`l`i`i`l`l`lak`l`l`l`l`l`l`i`i`l`iak`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`lak`l`l`i`l`i`l`l`l`l`l`i`l`l`iakag`l`l`i`lakaeagak`i`l`l`i`l`l`i`l`i`l`laeaeagaeaeak`l`l`i`l`l`i`l`i`iagak`ialagak`l`l`l`i`l`l`l`i`l`l`l`l`i`i`l`l`i`l`l`l`l`l`l`l`l`i`l`iak`l`i`l`l`i`i`l`l`l`l`l`l`l`l`l`l`iak`l`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`lak`i`l`l`l`l`i`l`i`l`l`l`l`l`i`l`l`i`i`l`l`i`i`l`l`i`l`l`i`l`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`l`i`l`l`l`l`i`i`l`l`i`l`l`l`l`l`l`l`l`i`l`l`l`i`i`l`l`i`i`l`l`l`l`l`l`l`l`l`l`i`i`l`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`i`l`i`l`l`l`l`l`i`l`l`i`i`l`l`i`i`l`l`i`l`l`i`l`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`i`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`l`i`l`l`l`l`l`i`l`l`i`i`l`l`l`i`i`i`i`i", -"`i`i`i`i`l`lak`i`l`i`i`l`lalak`lak`l`i`i`l`l`l`l`l`l`lak`iak`i`i`i`i`l`iakak`l`i`l`i`lakak`l`i`l`lak`lakakak`l`l`i`l`l`l`l`i`i`iaeak`i`l`l`i`i`lak`l`l`i`l`l`l`iakak`l`l`lak`lak`l`lak`l`l`lakak`i`l`l`lakae`lakak`l`l`l`l`l`l`l`l`iakalak`lak`i`i`l`l`iakak`l`l`l`l`lak`i`gak`l`l`lakak`i`l`l`l`l`l`i`l`l`l`l`lakalak`l`l`l`i`lakak`i`i`i`i`l`iakal`i`l`l`lak`lakak`i`i`l`i`l`l`i`l`l`l`l`i`i`i`l`i`l`l`l`i`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`i`g`l`i`l`l`l`l`l`l`l`l`i`i`l`l`l`l`l`i`l`l`l`l`l`i`i`i`l`i`i`i`i`l`i`l`i`l`l`l`i`i`l`i`i`i`l`i`l`l`i`l`l`l`l`i`i`i`l`i`l`l`l`i`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`i`l`i`l`i`l`i`i`i`l`i`l`i`i", -"`i`i`i`i`iak`iakakak`i`iakakakaeae`g`l`l`l`l`l`l`l`l`laeakakak`i`l`lakaeakakae`l`l`iaeakakae`i`i`lak`laeakak`l`i`l`i`l`l`l`l`l`iae`l`l`i`l`l`l`lak`l`i`l`l`i`lak`iak`i`l`g`l`lak`l`l`l`l`iaeakakaeak`l`l`lakakak`l`l`i`l`l`l`l`l`l`laeakaeaeakae`l`iakaeakakae`l`l`iaeakakaeak`l`iaeakakaeak`l`l`l`l`l`l`l`l`l`lagakakae`l`l`laeakakaeak`l`iakaeakakae`l`i`lak`lagak`i`i`l`i`i`l`i`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`i`i`i`l`l`l`l`i`l`i`l`g`l`l`l`l`l`l`l`l`i`i`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`i`i`l`l`i`l`l`l`l`l`l`i`l`i`i`l`i`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`i`l`l`i`l`i`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`l`i`l`i`i`i`i", -"`ial`i`i`i`i`i`l`iak`l`lak`l`g`lak`l`lakaeagaeagak`l`lak`l`l`lak`l`lak`l`l`i`iak`iak`l`l`i`lak`l`lakag`i`l`l`i`l`l`l`i`l`l`l`l`l`i`l`l`l`l`l`l`lak`l`l`l`i`i`iaeagakak`l`l`l`lak`l`g`l`lakakakakakag`l`l`l`iag`i`l`l`lakagagaeagak`lakak`lak`lak`l`lak`l`l`i`lak`lak`g`l`l`lak`lakakakakakag`l`laeaeaeagaeak`l`lak`l`gak`l`l`i`i`l`l`lak`l`lak`l`i`l`iak`l`laeag`i`i`l`l`l`l`l`i`l`i`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`l`l`l`i`i`l`g`l`g`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`l`i`l`i`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`l`l`l`l`l`i`l`l`i`i`l`i`i`l`l`l`l`l`i`l`i`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`l`l`l`i`i`l`g`l`g`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`i`l`i`i`i`i`i`l`i", -"`i`i`i`i`i`i`i`l`iak`l`lak`l`l`lak`l`l`l`l`l`l`l`l`l`lak`l`l`lak`l`lak`l`i`l`lak`iak`l`l`l`iak`l`lakakae`i`l`l`i`l`i`l`l`l`l`l`l`l`i`i`l`l`l`i`iak`l`lak`l`lae`i`l`iak`g`l`l`gak`g`l`l`laeakakakakak`l`l`lag`lae`i`l`l`l`l`l`l`l`i`iakak`lak`lak`l`lak`l`l`l`lak`lak`i`l`l`lak`laeakakakakak`l`g`l`l`l`l`l`l`g`lak`l`lak`l`lak`l`l`l`lak`i`lak`i`l`l`lak`l`laeakak`l`l`i`i`i`l`l`l`l`i`l`l`l`l`l`i`l`i`l`l`l`i`l`i`l`l`l`l`l`i`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`i`l`i`l`l`l`l`l`l`i`i`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`l`l`i`l`l`l`l`l`l`l`i`i`i`l`l`l`l`i`l`l`l`l`l`i`l`i`l`l`l`i`l`i`l`l`l`l`l`i`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`i`l`i`l`i`l`i`l`i`i`i`l`i`l`i`i`i", -"`i`i`i`i`iak`i`lakak`i`iak`i`l`iag`g`l`l`g`l`l`l`l`g`lak`l`g`lak`l`laeak`i`iae`l`lalae`l`lakak`l`lak`l`iae`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`lak`l`iak`l`lak`l`lakak`l`l`l`lak`l`g`l`l`lag`l`g`l`i`l`lae`i`l`iag`g`l`l`g`g`l`l`l`lakak`iak`lak`l`lakak`l`iag`l`lakak`l`iagak`l`iag`l`l`g`i`l`l`l`l`l`g`l`l`l`lak`l`lak`l`g`lae`i`lakae`l`laeak`l`iae`l`l`lak`lakak`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`l`i`l`l`l`l`i`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`l`i`l`l`l`l`i`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`l`l`l`l`l`i`l`i`l`l`i`l`l`l`i`i`i`i`i`i`i", -"`iak`i`i`i`iakak`iakak`l`iaeaeaeakae`l`l`l`l`g`l`l`lakagal`lagagal`l`lakagag`i`l`l`lakagag`i`l`laeak`l`lagag`l`i`l`l`l`l`l`l`l`l`l`i`l`i`l`laeagagagagag`l`lakagag`iagak`g`lagagagak`g`l`l`iaeagae`i`lakagak`lakagae`g`l`l`l`l`l`lakagae`lag`iakae`l`laeagae`i`l`l`lakagae`lag`i`l`iaeagae`l`l`l`l`g`l`l`l`l`lagag`l`iagag`g`l`iaeagak`l`l`l`laeagae`i`i`lag`i`l`iagae`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`i`l`l`i`l`g`l`l`l`l`l`i`l`l`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`l`l`i`l`l`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`i`l`l`i`l`g`l`l`l`l`l`i`l`l`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`i`l`l`i`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`i`l`i`l`l`l`l`g`l`l`l`l`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`i`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`i`g`l`l`l`l`l`l`g`l`l`g`l`g`l`g`l`l`g`l`g`l`l`l`l`i`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`l`g`l`l`g`g`l`g`l`g`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`g`l`l`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`g`l`l`l`l`l`g`l`g`l`g`g`g`l`l`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`g`g`l`g`l`l`g`l`g`l`l`g`g`l`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`i`l`l`i`l`l`l`l`g`l`l`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`g`l`l`l`l`l`l`g`l`g`g`l`l`l`l`g`l`i`i`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`l`l`i`l`i`i`l`l`i`l`l`l`g`l`l`l`l`l`g`l`l`g`l`l`g`l`l`g`l`l`i`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`l`l`l`l`l`g`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`g`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`g`l`g`l`l`l`l`l`l`l`i`i`g`l`g`l`l`l`l`l`g`l`l`l`g`l`l`g`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`g`l`g`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`i`l`l`g`g`l`g`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`g`l`g`l`l`l`i`i`l`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`g`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`i`l`l`l`g`l`g`g`g`l`l`l`l`l`l`g`l`l`l`l`l`l`l`i`l`l`g`g`l`g`l`g`l`g`l`l`i`l`i`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`i`g`l`g`l`l`l`l`i`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`g`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`i`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`g`g`g`l`l`g`l`g`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`i`i`l`l`i`g`l`g`l`l`l`l`i`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`g`l`l`g`l`l`g`l`l`l`l`l`l`l`l`i`l`l`l`l`i`l`l`l`l`i`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`l`i`l`i`i`i`l`l`l`l`l`l`l`l`l`i`i`l`i`l`i`l`l`g`g`g`l`g`l`l`i`l`l`l`i`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`i`l`g`l`g`l`l`l`l`l`l`l`g`l`l`g`l`g`l`g`l`l`g`g`l`l`l`g`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`i`l`l`i`i`l`l`g`l`g`l`g`l`l`l`l`l`l`i`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`g`l`l`g`l`l`l`g`l`l`g`g`l`l`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`i`l`l`l`g`l`l`g`l`l`l`l`l`l`l`g`l`g`l`l`l`l`i`i`l`l`i`i`l`l`g`l`g`l`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`g`l`l`g`l`l`l`g`l`l`g`g`l`l`g`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`i`l`l`l`l`i`i`l`l`i`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`i`g`g`l`i`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`i`g`l`l`l`g`g`g`l`l`l`l`l`l`l`l`i`g`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`g`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`i`l`l`g`g`l`l`l`l`g`g`l`l`l`l`i`l`l`l`l`l`l`g`l`l`l`l`l`g`l`l`g`l`l`l`g`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`g`l`g`l`l`l`l`g`l`l`g`l`g`l`l`l`l`l`l`l`l`l`g`g`g`l`l`g`l`g`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`g`l`l`l`l`g`g`g`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`l`l`g`l`l`l`g`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`g`g`l`l`l`l`l`g`l`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`l`l`l`i`l`i`i`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`l`l`l`l`l`l`g`l`g`l`l`l`g`l`l`l`l`l`g`l`g`l`l`g`l`l`l`l`g`g`l`i`l`g`g`l`l`l`i`i`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`l`g`l`g`l`l`l`l`g`l`l`l`g`g`g`g`l`g`g`g`g`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`i`l`l`l`l`l`g`g`g`l`l`l`l`l`l`l`l`g`l`i`l`l`l`l`i`l`i`l`l`l`l`l`l`l`g`l`g`l`g`l`g`l`l`l`l`l`g`g`g`l`l`l`l`l`l`g`g`g`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`l`g`l`g`l`g`l`l`g`l`l`l`g`g`g`g`l`l`g`g`l`l`l`l`l`g`l`l`l`l`l`g`l`l`l`l`l`l`l`i`l`l`g`l`l`i`l`l`l`l`l`g`g`g`l`l`l`l`l`l`l`g`l`l`l`l`l`l`i`l`l`i`l`l`l`l`i`l`l`g`l`g`l`l`g`l`g`l`g`l`l`g`g`g`l`l`l`l`l`l`g`g`g`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`l`g`l`g`l`g`l`l`g`l`l`l`g`g`g`g`l`l`g`g`l`l`l`l`l`g`l`l`l`i`l`l`i`l`l`i`l`i`i`i`i`l`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`l`i`l`l`i`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`g`g`g`g`g`l`l`g`g`g`l`g`g`g`l`l`g`l`g`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`l`l`g`l`l`g`l`g`g`l`g`l`g`g`l`g`l`g`g`g`l`l`g`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`i`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`g`g`l`g`l`g`g`g`l`g`l`g`l`l`g`g`l`l`l`l`l`l`i`l`g`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`l`l`g`g`l`l`g`l`g`l`l`g`l`g`g`l`l`g`g`g`g`g`l`g`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`g`g`g`g`l`l`g`l`g`l`g`l`g`l`l`g`g`l`l`l`l`l`l`i`l`g`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`l`l`g`g`l`l`g`l`g`l`l`g`l`g`g`l`l`g`g`g`g`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`l`i`l`l`l`l`i`l`l`l`l`l`l`l`l`i`i`l`i`l`i`l`l`g`l`i`l`l`l`l`g`l`i`l`d`l`g`l`g`g`g`g`g`g`l`l`g`l`l`g`l`l`l`i`l`l`g`lak`g`l`l`w```l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`lak`w`l`g`l`g`g`l`l`l`g`gaeae`l`l`g`l`g`l`l`l`l`g`l`g`g`l`g`l`l`l`g`lak`l`g`l`gak`l`l`l`l`l`l`l`g`l`g`g`g`i`g`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`l`l`l`g`g`l`g`l`g`g`g`g`g`l`l`l`l`l`l`l`l`l`l`i`l`g`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`g`l`l`l`l`l`g`g`l`g`l`g`l`g`l`g`g`g`l`l`g`g`g`g`l`l`g`g`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`g`l`l`l`g`l`i`l`l`l`l`l`l`g`l`g`g`l`l`l`g`l`g`l`l`l`l`l`i`l`l`i`l`l`l`g`l`i`l`l`l`l`g`l`i`l`g`g`g`l`g`g`g`g`g`g`l`l`l`l`l`l`l`l`l`l`i`l`g`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`g`l`l`l`l`l`g`g`l`g`l`g`l`l`l`g`g`g`l`l`g`g`g`g`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i`l`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`g`l`g`l`g`l`l`l`l`g`g`g`g`g`g`d`l`l`l`g`g`g`l`l`g`l`l`l`l`lag`i`g`l`l`lae`l`l`l`g`l`g`l`g`l`g`l`g`g`l`g`l`g`g`gak`g`l`g`l`g`g`g`g`l`g`gak`l`g`g`l`l`l`l`g`g`l`l`l`l`l`l`g`l`l`l`l`w`l`l`l`lag`l`l`l`l`l`i`l`g`g`g`g`g`l`l`l`l`g`l`g`l`l`l`l`l`i`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`i`g`g`g`g`g`g`g`l`l`g`g`g`g`l`g`g`l`l`g`l`g`g`l`g`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`g`g`g`l`l`g`l`g`l`g`l`l`g`l`g`g`g`l`g`g`g`l`g`l`l`l`l`l`g`l`l`l`l`g`l`l`g`l`l`g`l`l`l`g`l`l`l`l`l`l`l`l`i`l`g`g`g`g`g`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`g`l`g`l`l`l`l`l`i`g`g`g`g`g`g`g`l`l`g`g`g`g`l`g`g`l`l`g`l`g`g`l`g`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`g`g`g`l`l`g`l`g`l`g`l`l`g`l`g`g`l`g`l`g`g`l`g`g`l`l`l`l`g`l`l`l`l`l`i`l`l`i`l`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`g`l`l`l`l`l`l`l`l`i`i`l`g`l`l`l`l`l`g`l`g`g`g`l`g`g`w`g`l`g`l`lae`l`l`l`l`l`lakae`i`l`lakakak`iakak`l`lak`lakak`i`l`g`g`lakak`lak`g`l`l`iakak`l`g`l`g`l`l`g`l`l`g`g`g`gakak`g`l`g`lakak`l`l`g`l`l`l`l`g`g`g`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`d`l`g`l`l`l`l`l`l`l`i`l`g`l`l`l`l`l`l`g`l`g`g`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`g`g`l`g`g`l`g`g`l`g`l`l`g`g`l`g`l`g`g`g`l`g`g`l`l`g`g`g`l`l`l`g`l`g`g`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`g`g`g`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`d`g`l`l`g`l`l`l`l`l`i`l`g`l`l`l`l`l`l`g`l`g`g`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`g`g`l`g`g`g`g`g`g`l`l`g`g`l`g`g`g`g`g`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`i`l`i`l`l`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`l`i`l`l`l`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`g`l`i`l`g`g`g`g`l`g`l`l`l`l`l`l`g`g`l`g`l`l`g`l`l`l`g`l`g`l`g`l`gakak`g`l`g`l`gae`l`l`g`l`lakaeaeag`l`lae`wae``akaeak`gaeagaeae`w`i`l`gagakae`wae`g`g`iaeaeaeak`l`g`g`g`l`l`g`l`l`i`l`lag`g`l`g`l`l`gae`g`l`l`g`l`l`l`l`l`g`g`l`l`l`g`l`l`l`g`l`l`l`l`l`l`l`l`l`g`l`i`l`g`g`g`d`l`l`l`l`l`l`l`g`g`g`l`l`g`l`g`l`l`l`g`l`g`l`l`g`g`l`g`g`l`g`l`g`i`l`l`g`l`g`g`l`l`l`l`g`l`l`l`l`l`g`l`g`l`g`g`l`g`l`g`g`g`g`g`g`g`g`g`g`l`l`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`g`l`g`l`g`g`l`g`g`l`g`l`l`l`l`l`g`g`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`g`l`i`l`g`g`g`g`l`g`l`l`l`l`l`g`g`g`l`l`g`l`g`l`l`l`g`l`g`l`l`g`g`l`g`g`l`g`l`g`i`l`l`g`l`g`g`l`l`l`l`g`l`l`l`l`g`g`l`l`l`l`g`l`g`g`l`g`g`g`g`l`g`g`g`g`g`l`l`l`l`g`l`l`l`l`l`l`i`i`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`i`i`l`l`l`l`l`i`i`l`l`l`l`l`l`g`l`l`l`l`l`l`g`d`g`g`l`l`g`g`l`l`l`l`l`g`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`g`gak`g`g`l`l`g`lak`i`i`g`l`gak`w``ag`l`l`l```lak`l`gae`gae`i`g`l`gae`lak`i`g`g`gag`g`g`lag``aeak`l`g`l`l`g`l`l`g`l`l`g`lae`l`l`l`g`l`lak`l`l`l`l`g`g`l`l`l`g`g`g`g`i`l`g`l`l`l`g`g`l`g`l`l`g`l`l`g`d`g`g`l`l`l`g`g`l`l`l`g`g`l`l`l`g`l`g`l`l`l`l`l`i`g`l`l`g`g`g`g`l`g`g`l`l`l`g`l`l`i`l`l`l`l`g`g`l`l`l`l`g`l`g`g`g`l`g`l`g`g`l`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`g`l`l`g`l`g`l`l`l`g`g`l`l`l`l`l`g`l`g`l`l`l`g`l`g`l`l`g`g`g`g`g`i`l`g`g`l`l`g`l`g`l`l`l`l`l`l`g`d`g`l`l`l`g`g`l`l`l`l`l`g`l`l`l`g`l`l`g`l`l`l`l`i`g`l`l`g`g`g`g`l`g`g`l`l`l`g`l`l`i`l`l`l`l`g`g`l`l`l`l`g`l`l`g`l`g`g`g`l`g`g`l`g`g`g`g`g`g`g`g`g`g`l`g`l`g`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i", -"`i`i`i`l`i`i`l`i`l`l`i`l`i`l`i`l`g`l`l`l`l`l`g`l`l`g`g`g`g`g`l`g`l`g`g`l`g`l`l`d`g`g`d`g`g`d`l`l`g`g`g`g`g`g`l`g`l`l`g`l`l`g`g`lae`l`g`g`g`l`lae`l`l`l`l`iag`l`lag`l`l`l```gae`l`gae`lak`l`g`g`lae`gae`g`g`g`gae`g`gag`i`g`iae`g`l`g`l`g`l`g`l`l`l`l`gae`l`l`l`g`l`lae`g`l`g`g`g`l`g`l`g`g`l`l`g`g`g`l`g`g`g`l`g`g`g`g`g`g`g`l`g`l`g`g`l`g`l`l`g`g`d`g`g`g`g`l`l`g`g`g`g`g`g`l`g`l`l`l`l`l`g`g`l`g`g`l`g`g`l`l`l`g`l`l`l`g`l`l`l`g`l`l`l`g`g`l`l`l`g`l`g`l`g`g`g`g`l`g`g`g`g`g`l`l`g`g`g`g`l`g`g`g`l`g`g`l`l`g`l`l`l`l`l`l`g`l`g`l`g`l`g`l`g`l`g`l`g`l`l`g`l`l`g`d`g`l`l`l`g`l`g`g`g`g`g`g`g`l`g`l`d`g`g`l`l`l`d`g`g`g`g`d`g`l`l`g`g`g`g`l`g`l`g`l`l`l`l`l`g`g`l`g`g`l`g`g`l`l`l`g`l`l`l`g`l`l`l`g`l`l`l`g`g`g`l`g`l`g`l`g`l`g`g`g`l`g`g`g`g`g`l`l`g`g`l`g`l`g`l`l`l`l`l`l`l`l`i`l`l`l`i`l`i`i`i`l`i`i`i", -"`i`i`i`i`l`i`l`i`i`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`g`g`g`g`g`g`l`l`l`g`g`d`g`g`l`g`d`g`g`d`g`g`g`g`g`g`g`g`l`l`g`l`l`g`i`lae`l`l`g`l`lae`l`g`l`lak`i`g`g```g`l`g```gae`l`gae`gae`w`i`gakak`g`i`w`g`lag`w`g`gae`g`gaeak`g`g`g`g`l`g`g`g`g`l`l`gag`g`g`l`l`g`iae`g`g`l`g`g`l`g`i`l`l`g`l`g`g`g`l`l`l`l`l`g`l`l`l`g`g`g`g`g`g`g`g`l`l`l`g`d`g`g`g`g`g`d`d`g`g`g`g`g`g`d`l`g`g`l`g`l`l`l`l`i`g`g`l`g`g`l`l`l`l`g`l`l`g`g`g`l`g`g`l`l`g`g`g`l`l`g`g`g`g`l`g`g`g`g`l`g`g`l`g`g`g`g`g`g`g`g`l`g`g`g`l`g`g`g`l`g`l`g`l`g`l`l`l`g`l`l`g`l`g`g`g`g`l`g`l`l`l`g`l`g`g`g`g`g`l`l`g`l`l`l`g`g`g`g`g`g`g`g`l`g`l`l`g`g`d`g`g`l`g`d`g`d`g`g`g`g`g`d`g`g`g`l`g`l`l`l`l`i`g`g`l`g`g`l`l`l`l`g`l`l`g`g`g`l`g`g`l`l`l`g`l`l`g`l`g`g`g`g`l`g`g`g`l`g`g`l`g`g`l`g`g`l`g`l`l`g`l`l`l`l`l`l`l`l`i`i`l`i`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`i`l`g`g`l`g`d`g`g`g`g`g`g`g`l`l`g`g`g`g`g`l`g`l`g`g`g`g`d`g`l`g`l`l`i`g`l`gag`l`g`iak````````ak`g`l`w```wak```l`````gagak`l``ak```i````ak`g`g`g`l````akagag`lae`````i``ak`l`g`g`l`g`l`l`g`g`g`l`iag`l`g`l`iag`i`l`l`g`l`l`l`g`l`l`l`g`l`lal`l`l`l`lal`l`l`i`l`l`l`l`g`g`g`g`g`g`g`g`g`g`g`g`l`l`l`g`g`l`d`g`l`g`l`g`g`g`d`g`l`l`l`l`l`g`l`g`g`l`l`l`g`l`l`l`g`g`g`l`g`g`g`l`g`l`g`l`l`l`g`l`l`g`l`g`l`l`g`g`g`g`g`g`l`g`l`l`g`l`g`g`l`g`g`l`g`g`l`g`g`l`g`g`g`g`l`g`g`l`l`l`l`l`l`l`g`l`g`l`g`l`l`l`g`l`l`l`l`l`g`l`l`l`g`l`g`l`l`l`g`g`l`g`d`g`g`g`g`g`d`g`l`l`g`g`l`g`g`g`g`l`g`g`g`g`g`g`l`l`l`l`l`g`l`g`g`l`l`l`g`l`l`l`g`g`g`l`g`g`g`l`g`g`g`l`g`l`g`l`l`g`g`l`l`g`g`g`g`g`g`g`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`l`i`l`l`i`l`i`l`l`l`i`l`l`g`l`g`g`g`l`l`g`g`g`g`v`v`val`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`val`gakak`l`l`g`g`lal`v`v`v`v`v`v`v`v`v`va``v`v`v`v`v`v`v`val`l`l`g`g`g`g`g`g`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`v`val`v`v`v`v`vadadadadadadadadadada``g`g`g`g`g`g`l`l`l`l`g`g`g`g`g`g`g`l`l`l`l`g`g`g`g`g`g`d`g`g`l`l`g`l`d`g`g`g`g`l`g`g`g`l`l`l`l`l`g`g`g`g`g`g`g`g`l`l`l`g`g`l`l`g`l`g`l`g`l`g`g`g`g`g`g`l`g`g`g`g`g`l`g`g`l`l`g`l`l`g`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`g`l`l`g`g`g`g`g`g`g`l`g`g`g`g`l`g`l`l`l`l`l`g`g`g`g`g`g`l`l`l`l`g`g`l`g`g`g`d`g`g`l`l`g`l`d`g`g`g`g`l`g`g`g`l`l`l`l`l`g`g`g`g`l`g`g`l`l`l`l`g`g`l`l`g`l`l`l`g`l`g`g`g`g`g`g`l`l`g`g`l`g`l`g`l`l`l`l`l`l`l`l`i`i`l`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`n`g`g`g`l`g`l`galai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`n`l`l`l`l`l`g`d`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faf`f`f`f`f`f`f`fag`l`g`l`l`g`g`g`l`l`g`g`g`g`g`g`g`g`l`g`g`l`l`l`l`g`l`l`g`g`g`l`g`g`g`l`g`g`l`g`l`g`g`g`l`g`g`l`g`l`g`l`g`g`g`l`g`l`l`l`g`g`g`l`g`l`g`l`l`g`l`g`d`l`l`g`l`g`g`l`l`g`g`l`g`l`l`g`g`l`g`g`g`g`g`l`l`l`l`l`l`g`l`l`l`g`l`g`g`l`g`l`l`l`l`l`g`l`g`l`l`g`g`g`l`g`l`l`g`l`g`l`g`g`g`l`l`g`g`g`g`g`g`g`g`l`g`g`g`l`g`l`l`l`g`l`g`g`g`l`g`g`g`l`g`g`l`g`l`g`g`g`l`g`g`l`g`l`g`g`g`g`g`l`g`l`l`l`g`g`g`l`g`g`l`g`l`g`l`g`d`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`l`l`l`i`l`i`l`l`i`l`i`l`l`l`i`l`g`i`l`l`l`l`l`l`g`l`gal`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`m`g`l`g`g`g`l`lai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`m`g`g`g`g`g`gal`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`l`g`g`g`l`l`g`g`g`g`g`l`g`g`l`g`g`g`g`l`g`g`l`l`l`l`g`l`g`g`l`g`g`g`l`g`g`l`l`g`l`g`g`g`l`g`l`l`g`g`g`g`l`g`g`g`l`l`l`l`l`g`l`g`g`g`g`g`g`g`l`g`g`g`g`l`g`g`l`l`g`g`l`g`g`g`l`l`g`g`l`l`l`g`l`l`g`g`g`l`g`g`l`l`l`g`g`g`g`l`g`g`g`l`l`l`g`g`g`l`g`g`l`l`g`l`l`l`l`g`l`l`l`g`g`g`g`g`g`l`g`g`g`g`g`g`l`g`l`g`l`l`l`l`g`l`g`g`l`g`g`g`l`g`g`l`l`g`l`g`g`g`l`g`l`l`g`g`l`g`l`g`g`g`l`l`l`l`l`g`l`g`g`g`g`g`g`l`g`g`g`g`g`g`g`l`l`l`g`l`l`l`l`l`l`l`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`i`i`l`i`l`i`l`l`i`l`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`n`q`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`q`q`o`c`l`g`g`l`l`g`g`xac`q`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faj`o`m`l`g`l`l`g`g`d`n`a`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`m`l`l`l`l`l`l`g`g`g`g`l`g`g`g`g`g`l`g`l`l`g`l`g`l`l`l`g`g`g`g`d`g`g`g`g`l`g`g`g`g`g`l`g`g`g`g`l`l`g`g`l`g`g`g`g`g`g`l`g`l`g`g`g`g`l`l`g`l`l`g`g`g`d`g`g`g`g`g`l`l`l`g`d`g`g`g`l`g`l`l`g`l`l`l`g`g`l`l`l`l`g`l`g`g`l`g`l`g`g`l`l`l`l`g`l`l`l`d`g`g`l`g`g`l`g`l`l`l`l`g`l`g`l`l`g`g`g`g`l`g`g`g`l`g`l`g`l`g`l`g`l`g`l`l`g`g`g`g`d`g`g`g`g`l`g`g`g`g`g`l`g`g`g`g`l`l`g`g`g`g`g`g`g`g`g`l`g`l`g`g`g`g`l`l`g`l`l`g`l`g`g`g`g`l`l`l`l`i`l`l`g`l`l`l`l`i`l`l`l`l`i`l`l`i`i`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`i`l`i`l`l`i`l`i`l`g`l`l`g`l`g`l`l`l`l`g`l`l`l`g`m`e`t`a`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`o`t`t`k`m`m```l`l`l`g`l`g`g`g`w`m`m`uaf`f`f`f`f`f`f`f`f`f`f`q`o`t`t`e```g`l`l`l`g`l`l`g`m`mab`t`aaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`t`o`o`q`q`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o```l`l`l`l`l`l`g`l`g`l`g`l`l`g`l`g`l`g`g`l`l`g`g`g`g`g`g`g`g`g`g`g`d`g`g`l`g`l`g`l`g`l`g`g`g`d`g`l`l`l`l`g`g`g`g`g`l`g`l`l`g`l`l`l`g`l`g`l`g`l`g`g`l`g`l`g`g`g`g`g`l`l`l`g`g`g`g`g`g`g`l`g`l`l`g`g`l`g`g`l`g`l`g`l`g`l`g`l`g`g`g`l`g`g`l`l`l`l`d`d`g`l`g`g`g`g`l`g`l`g`l`g`l`g`g`l`l`g`l`l`l`g`g`g`l`g`g`l`l`g`g`g`g`g`g`g`g`g`g`g`d`g`g`l`g`l`g`l`g`l`g`g`g`d`g`l`l`l`l`g`g`g`g`g`l`l`l`g`g`l`l`l`g`l`g`g`l`g`g`g`l`l`l`g`g`l`g`l`l`i`l`g`l`l`l`l`l`i`l`l`i`i`l`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`l`l`i`l`l`l`l`l`l`l`l`g`l`l`g`l`g`g`l`g`l`l`g`g`g`g`g`lae```h`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`mae`l`l`l`i`i`i`i`i`i`l`i`i`g`d`g`g`lad`f`f`f`f`f`f`f`f`f`o`t`e`y`i`i`i`i`i`i`g`l`l`g`g`d`g`d`g`i`x`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`tab`yak`i`i`i`i`iag`w`w`m`k`o`q`f`f`f`f`f`f`f`f`f`f`f`f`f`t```i`iak`i`l`l`g`l`l`l`l`g`l`l`g`g`l`l`l`g`g`g`l`g`g`l`g`g`g`g`g`g`g`g`g`g`g`l`l`g`g`g`l`l`g`d`g`g`d`g`g`g`l`g`g`g`g`l`g`l`g`g`g`g`l`g`g`g`l`d`g`g`g`g`d`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`l`l`l`l`l`g`g`g`g`g`g`g`g`g`l`g`g`d`l`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`l`l`g`l`l`g`l`l`l`l`g`g`l`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`l`l`g`g`g`l`l`g`d`g`g`g`g`g`g`l`g`g`g`d`l`g`l`g`g`g`g`l`g`l`g`l`g`g`l`g`g`g`l`g`g`l`g`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`i`i`l`l`i`i`i`i", -"`i`i`l`i`i`l`i`i`l`i`l`l`l`l`i`l`l`l`l`i`l`l`g`l`l`l`g`l`g`l`g`g`g`g`g`g`l`l`l`i`i`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`makaeakakakakakakakaeakak`i`i`l`g`g`dalad`f`f`f`f`f`f`f`f`t`taaakakakakakakakakak`i`i`i`l`g`g`g`g`lalai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`kakakakakakaeaeakaeakaeakakak```m`q`f`f`f`f`f`f`f`f`f`f`q`taeaeaeaeakak`i`i`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`l`l`l`l`l`g`g`g`g`g`g`l`d`g`g`g`g`g`g`g`g`l`g`l`g`g`l`l`g`l`g`g`g`g`l`g`g`g`g`g`l`g`d`g`g`g`g`g`g`g`l`g`g`l`l`g`l`g`g`g`g`l`g`g`g`g`l`g`l`l`l`g`g`g`g`g`g`g`g`l`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`g`l`l`g`l`l`g`l`l`l`l`l`l`l`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`l`l`l`l`l`g`g`g`g`d`g`l`d`g`d`g`g`g`l`g`g`l`g`l`g`g`l`g`l`l`g`l`g`g`l`g`g`g`g`l`l`l`g`g`l`l`l`g`l`l`i`l`l`l`i`l`l`l`i`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`l`i`i`i`i`i`i`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`g`l`g`g`g`g`g`g`l`lak`r`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`c`w`w`w`w`wagag`wag`wagaeak`i`i`l`l`g`vai`f`f`f`f`f`f`q`tab```w`w```w`w`w`w`wagagaeak`i`i`l`l`g`g`i`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t```w`w`w`w`wag`w`wag`w`w`wag`w`b`w```uaf`f`f`f`f`f`f`f`f`aab```````w`wagae`i`l`l`g`g`g`g`g`g`g`l`l`g`l`l`l`l`l`g`g`g`g`g`g`l`g`g`l`g`g`g`g`g`l`l`g`g`l`l`g`g`g`g`g`g`g`l`g`g`g`g`g`d`g`g`l`l`l`g`g`g`d`l`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`l`l`g`l`g`g`g`l`g`g`g`l`g`l`g`g`g`l`l`g`l`l`l`g`l`l`g`g`g`g`g`l`l`g`g`d`l`g`g`g`g`g`g`g`g`g`d`g`g`g`g`g`g`g`g`g`g`l`l`g`l`g`l`l`l`g`g`g`g`g`g`l`g`g`l`g`g`g`g`g`l`l`g`g`l`l`l`g`g`g`g`d`l`l`g`g`g`g`g`d`g`g`l`l`l`g`g`g`g`g`g`g`l`g`l`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`i`l`i`l`i`i`l`i`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`g`l`g`g`g`d`g`g`g`g`lakae`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`m`y`c`c`c`c`c`y`y```````waeak`i`l`g`va``f`f`f`f`f`f`q`tab`c`c`c`c`c`c`c`y`y`y`y```waeak`l`l`g`g`l`l`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`oab`c`c`c`c`c`c`c`c`y`y`y`y`y`y`y`y`y`y`yaaaf`f`f`f`f`f`f`f`o`k`m`c`m`m`c``agak`i`l`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`l`i`g`l`g`g`l`l`l`g`g`g`g`g`g`l`g`g`g`l`l`g`g`g`l`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`d`d`g`g`g`g`g`l`g`g`l`g`g`l`g`g`g`g`l`g`g`g`g`g`l`l`l`l`g`l`g`g`g`g`g`g`l`g`g`d`g`g`g`g`g`g`g`g`d`d`d`g`g`g`g`g`g`g`g`g`g`g`l`g`l`g`g`g`g`g`l`i`g`l`g`g`l`l`l`g`g`g`g`g`g`l`g`g`g`l`l`g`g`g`l`l`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`l`l`g`l`g`g`l`g`g`l`g`g`l`l`l`g`g`l`l`l`l`l`i`l`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`i`l`i`i`i`i`l`l`l`l`l`l`l`g`l`g`g`l`l`g`l`g`l`g`g`d`g`l`g`l`iakaga``f`f`f`f`f`f`f`f`f`f`f`f`f`f`pab`k`k`k`k`e`e`m`m`c`y```waeak`i`lal`v`j`f`f`f`f`f`q`tabab`k`e`k`e`e`k`e`e`e`m`c`y`c`m`cae`g`g`gak`i`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`k`k`e`k`k`e`e`e`k`k`m`c`c`c`c`c`c`c`m`m`m`zaf`f`f`f`f`f`f`tab`k`k`k`e`e`y`wae`i`l`g`d`g`g`g`g`l`g`g`g`l`g`g`l`l`g`g`l`g`g`l`l`l`g`l`l`l`l`g`g`d`g`g`g`g`l`g`g`l`g`g`l`d`g`g`d`d`g`l`g`g`g`g`g`g`g`g`g`g`wag`g`g`g`g`g`g`g`g`g`g`g`g`d`g`d`d`d`g`g`g`g`l`l`g`g`g`g`g`g`l`g`g`g`l`g`g`l`g`g`g`g`l`l`g`g`g`g`g`g`g`l`g`g`d`g`g`l`g`g`g`g`g`d`d`g`g`g`d`d`g`g`g`g`l`g`g`g`l`g`g`l`g`l`g`l`g`g`l`l`l`g`l`l`l`l`g`g`d`g`g`g`g`g`g`l`l`g`g`g`g`g`g`d`d`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`l`l`g`g`l`g`l`l`g`g`l`l`g`g`l`l`l`l`l`i`l`l`l`l`l`i`l`i`i`i`i", -"`i`i`i`l`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`g`l`g`g`g`d`g`g`g`g`g`iakagagai`f`f`f`f`f`f`f`f`f`f`f`f`f`q`tabababab`k`e`m`c`y```wagae`i`l`l`v`n`f`f`f`f`f`q`tab`e`kabababababab`k`k`e`m`c```cae`i`l`g`g`gakal`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`tababababab`k`e`m`e`c`c`y`y`y`c`y`c`c`u`m`e`n`f`f`f`f`f`f`t`t`t`tabab`e`c`y`m`m`y`i`g`g`l`g`g`g`g`l`g`lag`y`y`m`y`m`g`l`g`l`g`l`l`g`g`m`c`g`g`m`y`g`g`g`g`g`l`g`g`g`g`g`d`g`g`g`g`g`l`g`g`d`d`d`g`d`d`g`dae`d`g`d`d`d`d`g`d`g`g`d`g`g`g`d`g`d`d`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`l`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`d`d`g`d`g`g`g`g`l`g`g`g`g`l`g`l`l`l`g`g`g`g`g`l`g`l`g`l`l`g`g`g`l`g`g`g`d`g`g`g`g`g`l`g`g`g`d`g`g`g`g`g`g`g`l`g`g`d`d`d`g`d`g`g`g`g`g`g`g`g`g`g`g`g`g`l`l`g`l`l`l`l`g`l`l`l`l`l`l`i`i`i`i`i`i`l`i`i`i", -"`i`i`i`i`i`l`i`l`i`i`i`i`i`l`l`i`l`l`l`l`g`l`l`l`g`l`l`g`l`g`g`g`d`g`g`l`g`g`l`i`iakaead`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`k`e`c```wagagaeak`i`l`vad`f`f`f`f`f`a`t`k`c`e`kab`t`t`t`tab`k`e`c`y`y`y`c`wae`g`g`gaeagalad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`k`e`c`m`w`y`y```w`w`w`y`c`y`yaa`baf`f`f`f`f`a`t`t`t`t`tab`k`c`wae`w`l`g`g`g`g`g`iagae`g`g`gae`l`gag`gae`g`g`gaeagak`l`l`l`l`m`l`i```g`g`g`g`g`g`l`l`gae`iae`iakak`d`g`g`laeae`d`d`d`d`daeak`gae`d`d`gakaeak`g`g`g`g`g`g`g`g`d`gaeakae`dae`l`g`l`gakaeak`g`l`iae`gaeae`l`d`l`g`l`g`l`g`l`l`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`d`d`d`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`l`l`g`g`g`g`l`l`l`g`l`l`l`l`l`l`g`g`l`g`g`g`g`g`g`l`g`g`d`g`g`g`g`g`d`g`g`g`g`d`d`g`d`g`g`d`g`g`d`g`g`g`l`l`l`l`l`l`g`l`l`l`g`g`l`l`l`l`i`l`l`i`l`l`l`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`l`l`l`i`l`i`l`i`l`i`l`l`l`l`l`g`l`g`l`l`g`g`g`g`g`d`g`g`l`l`g`l`l`i`iak`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`tab`k`c```waeakak`i`i`l`v`s`f`f`f`f`f`q`t`e`c`c`eabab`t`t`tabab`k`e```w`w```yagae`g`g`lae``al`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`e`c```yae`c`yagakae`c`y`y`c`m`wag`n`f`f`f`f`o`t`t`t`t`tab`e`c`wakag`l`g`g`g`g`gaeaeae`w`l`g`g`g`gae`g`g`g`l```wag`w```g`l`g`i```c`l`g`l`g`d`g`d`g`g`gae`yae`yaeag`i`d`l`yaeae`y`l`g`d``aeae`c`w`g`g```wae`w```g`g`g`g`g`d`d`g`l``ag`w``ae`w`g`g`iaeaeagak`g`i`````wag``ak`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`d`g`g`d`d`d`d`d`d`d`l`l`g`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`l`g`l`l`l`l`g`l`g`g`l`l`g`l`g`g`d`g`d`g`g`g`g`d`d`d`d`d`d`d`d`g`d`d`d`g`d`g`g`g`g`l`l`g`g`g`g`g`l`g`l`l`l`l`g`g`g`l`g`l`l`l`l`l`l`l`i`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`i`i`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`g`g`l`g`g`g`l`l`g`g`l`l`g`l`lalai`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`k`e`y`waeak`i`i`l`lala`af`f`f`f`f`a`t`m`wakag`y`eabab`tabab`k`m`kagak`i`iag`l`l`l`g`g`gag`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`k``ag```mae`i`i`lak`y`wag`w`c`baead`f`f`f`fab`t`t`t`tabab`e`y`wakag`g`l`g`g`g`g`w`c```w`g`l`g`g`gag`g`g`l`i``aeaeag`cak`l`l`i```w`g`l`lak`y`y`y`c`y`d`g`c`dae`d`dae`gae`d`d`d`gae`gae`i`l`d`gag`g`i``agaeae`yak`g`w`y`y`y`yag`daeae`lae`gag`d`d`l```cagae`g`lae`i`d`l`g`w`g`g`l`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`d`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`l`g`d`g`g`g`g`l`g`g`g`g`l`l`l`l`l`l`l`g`l`g`l`g`g`d`l`l`d`d`g`l`d`d`d`d`g`g`d`d`d`d`g`g`g`g`g`g`g`g`g`g`l`l`l`l`g`l`g`l`g`l`l`l`g`l`l`l`l`i`l`l`l`l`l`l`i`l`l`l`i`l`i`i", -"`i`i`i`i`i`i`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`g`g`l`l`g`l`l`l`g`l`lad`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`k`m``agak`l`g`l`g`va`af`f`f`f`f`f`t`m`lagak`w`c`eabab`t`k`e`m`c``akak`l`lae`l`g`g`d`l`g`r`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`y`wak`wae`y`g`g`lak``agagagagak`i`s`f`f`f`f`tabab`t`t`t`k`m`yagakag`l`g`lae`gaeak`l`l`w`g`g`g`g`gag`g`g`gae``agagagae`i`g`g`wakagae`g`g`d`l`d`g`d`g`g`l`y`dae`g`dae`gae`d`d`d`gae`gae`g`g`l`gae`gak``aeagagag`l`g`g`l`g`d`d`d`daeae`gag`lag`l`l`w`g`d`lae`d`gag`i`g`g`g`w`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`l`g`l`g`l`g`g`g`l`l`l`g`g`l`g`g`g`g`g`g`l`l`l`l`g`g`g`g`g`g`l`g`g`g`g`d`g`d`d`d`g`d`l`d`d`g`d`d`g`g`g`d`d`g`g`g`g`g`g`g`l`l`g`g`l`g`l`g`l`l`g`l`g`l`l`g`g`g`g`g`g`i`l`i`i`i`i`l`l`l`i`i`i`i`i`i", -"`i`i`l`i`i`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`g`g`l`l`g`g`g`l`g`g`l`g`g`ga``f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`k`m``ae`i`i`g`g`va`af`f`f`f`f`f`tab`i`l`w```w`mabab`k`kab`yagaeak`i`l`i`gag`g`g`g`l`g`la`ad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``aeakag`g`i`y`g`g`g`cak`l`gak`g`l`v`f`f`f`q`t`eabab`t`t`k`m``ae`iag`g`l`gag`g`w`g`g`l```g`g`g`g`gae`g`g`g`l`cak`g`d`l`d`daeag`g`g`c`l`g`g`g`g`g`g`g`d`g`y`gae`g`dae`g`iag`d`gagak`g`i```g`g`````l`l`cak`l`g`i`l`g`d`g`d`d`d`d`daeae`gae`lag`l`g`w`g`laeae`d`gae```i`g`wak`l`g`g`g`g`g`g`g`g`g`g`d`l`l`g`g`g`g`g`g`l`g`g`g`g`l`g`g`g`g`g`l`g`g`g`g`g`d`g`g`g`g`g`g`g`g`g`l`g`g`g`g`d`d`d`d`d`g`g`g`g`g`g`g`g`g`g`g`g`d`g`g`g`g`g`d`d`g`d`d`d`g`g`g`g`g`g`g`l`l`l`l`l`l`g`l`l`l`l`l`l`g`g`l`g`l`l`l`l`l`l`i`i`l`i`l`i`i`l`l`l`i`i`i", -"`i`i`i`l`i`i`l`i`l`i`l`i`i`i`i`l`l`l`l`l`l`g`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`lal`j`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`tab`m``ae`i`g`gala`af`f`f`f`f`f`t`t`i`g`iak`y`k`k`k`t`k`m`y`m`m``ak`g`g```c`c`c`w`g`gae`c`r`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`cagae`w`w`l`g`c`c`l`g`g`w`c``ak`g`g`v`f`f`f`aab`c`eababab`k`c`w`w`m`c`c`c`cak`gak`c`cag`w`w`g`gae`c`c`c`l`l`g`g`w`c``ak`g`g`y`y`d`d`c`y`g`d`g`g`g`g`g`g`c`c`gagak`d`y`d`dak`y`cak`g`d`g`i`c`cak`w`w`g`g`w`c``ak`g`g`g`g`d`d`g`dak`y`w`d`c`lak`w`gae`c`c`i`cak`dae`l```c`i`g`l`g`g`g`g`g`g`l`d`g`g`g`d`g`d`g`d`g`g`g`l`l`g`g`l`l`l`g`l`l`g`l`g`g`l`l`l`g`d`g`g`g`g`g`d`g`l`l`g`g`g`g`g`g`g`g`d`d`d`d`d`d`d`d`g`g`g`g`g`g`g`d`d`d`d`d`d`d`d`d`g`g`g`g`g`g`g`g`g`l`l`l`g`l`g`l`g`g`l`g`l`l`g`g`l`g`l`l`l`l`l`i`l`i`i`l`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`l`i`i`l`l`l`l`i`l`l`l`l`l`l`g`l`l`g`g`l`g`l`l`g`g`i`l`g`l`g`l`l`l`g`l`g`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`tab`e`yagak`lal`v`j`f`f`f`f`f`tabagak`i`iae```c`e`k`e`m``agae`i`g`g`g`l`l`g`g`g`g`g`g`g`l`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`yagak`l`g`g`g`g`g`g`g`l`g`g`g`g`g`g`v`f`f`f`o`m```m`kabab`e`y``ak`i`l`g`l`l`g`g`g`g`g`l`g`g`g`l`g`g`g`g`l`g`g`l`l`l`l`g`g`g`g`g`l`g`d`d`d`g`g`d`g`d`g`g`g`d`g`d`d`d`d`g`g`d`g`d`g`g`g`d`g`d`l`l`l`g`g`g`g`g`g`g`g`g`g`d`g`d`d`d`g`g`g`d`g`g`l`l`l`g`g`g`g`g`l`gae`d`g`d`g`g`g`g`l`l`g`l`g`g`g`g`g`g`g`g`g`g`g`d`g`g`d`g`l`g`g`l`l`g`g`g`l`g`g`g`g`g`g`l`l`g`g`g`g`g`g`g`l`g`g`l`l`l`l`g`g`g`g`g`l`g`d`d`g`g`g`d`g`d`g`g`g`g`g`d`d`d`d`g`g`d`g`d`g`g`g`g`g`g`l`l`l`g`l`l`l`g`l`l`l`l`l`g`l`l`g`l`l`l`l`g`l`l`i`l`i`l`i`l`i`i`i`l`i`i", -"`i`i`i`i`i`l`l`i`l`l`i`i`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`g`i`l`l`l`l`g`g`g`g`g`g`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`cagakal`vai`f`f`f`f`q`tab`i`g`lakae```c`e`e`e`c`y`waeak`l`g`g`g`g`l`g`l`l`g`g`g`g`la``f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`k`e```w`l`g`d`g`g`g`g`g`g`l`g`g`l`g`g`l`x`f`f`f`t`````c`e`kab`e`yaeae`i`l`l`g`g`g`g`g`g`g`g`l`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`d`g`g`d`g`g`g`g`g`g`g`g`g`g`d`g`d`d`g`d`d`d`g`i`g`g`g`g`d`g`g`g`l`g`l`l`g`g`g`g`g`g`d`g`g`d`g`d`g`d`d`g`d`d`g`g`g`g`g`g`g`g`g`gae`e`mae`d`d`d`g`g`d`g`g`l`g`g`l`g`g`l`g`g`g`g`g`g`g`g`g`g`l`g`g`d`i`l`g`l`l`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`d`g`g`d`g`g`g`g`g`g`g`g`g`g`d`g`d`d`g`g`d`g`d`i`g`g`l`g`g`l`g`l`l`l`l`l`g`l`l`g`l`g`g`l`g`l`l`g`l`l`l`l`l`l`l`l`i`i`l`i`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`l`l`l`l`i`l`i`l`i`l`i`l`l`l`l`l`l`g`l`l`g`l`l`g`g`l`l`l`g`l`l`l`g`g`g`galaf`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tab`k`m`w`v`vai`f`f`f`f`f`tab`i`l`lakae`w`y`e`e`e`c``agae`i`l`l`l`d`g`l`g`g`l`l`g`l`g`galad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m`waeak`i`g`d`d`gal`g`g`g`g`i`g`l`g`l`l`n`q`q`taeag`y`m`k`k`m``akak`i`l`g`l`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`l`g`l`g`g`g`g`g`g`g`d`d`g`g`g`g`g`g`g`g`g`g`g`g`g`g`d`d`g`g`d`d`d`d`l`g`g`g`g`g`g`l`g`g`l`l`g`l`g`g`g`d`g`d`d`g`g`g`g`g`g`g`d`d`d`g`g`l`g`g`g`g`g`g`l`g`l`l`i`d`g`d`d`d`d`g`g`g`i`g`l`g`l`g`g`l`g`l`g`g`g`g`g`g`l`g`d`l`l`l`g`l`l`g`g`g`g`g`g`l`g`g`g`g`g`g`g`g`l`g`l`g`g`g`g`g`g`g`d`d`g`g`g`g`g`g`l`g`d`g`g`g`d`g`d`g`g`g`g`d`d`g`l`l`g`g`g`g`g`l`g`l`l`l`l`l`l`l`l`l`g`g`l`g`l`l`g`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`l`l`l`i`l`i`l`i`l`l`i`l`l`g`i`l`l`l`l`l`l`l`g`d`g`l`l`l`g`l`g`l`l`l`g`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`k`m`x`vai`f`f`f`f`f`tab`i`g`iakae`w`c`m`e`e`m`yagak`i`i`l`g`g`l`g`g`g`g`l`g`g`g`g`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wae`i`i`g`g`g`vadaia``r`g`l`g`i`g`l`l`g`c`eab`iag```m`e`e`c`wak`g`i`g`l`g`g`g`g`g`l`g`g`d`d`l`g`g`l`g`g`d`g`g`g`l`l`g`g`g`g`g`g`l`g`l`g`g`g`g`g`g`g`d`g`g`d`g`g`g`g`g`g`g`d`d`l`l`l`l`g`g`g`g`g`g`l`g`g`l`g`g`g`d`d`g`g`g`g`g`d`d`g`d`d`d`d`d`g`g`g`g`l`g`g`g`g`l`l`l`i`g`g`g`g`d`d`d`g`g`l`l`l`l`g`l`g`g`d`l`g`g`g`g`g`g`g`g`d`d`l`g`l`g`g`g`g`g`g`g`g`d`d`l`g`g`l`g`g`g`l`l`l`l`l`g`g`g`d`g`d`g`d`g`g`g`g`g`g`g`g`g`g`g`g`g`d`g`d`g`g`g`g`d`l`l`i`l`g`l`g`l`g`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`l`l`l`l`i`l`l`i`l`l`g`g`l`g`g`g`g`g`g`g`g`g`g`l`l`g`l`g`g`g`g`g`g`l`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`x`vai`f`f`f`f`f`tab`i`l`i`iae`w`y`m`e`e`m`y`wae`i`g`d`g`g`g`g`g`g`g`g`g`l`g`g`g`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`m`yagak`i`l`l`lal`vaf`f`f`bak`g`l`g`g`g`g`g`d`g`g`iak`w`c`e`e`y`w`i`l`l`l`g`g`l`d`g`g`g`g`l`l`i`ialal`i`l`g`d`d`l`g`g`l`g`g`lal`v`v`sadad`s`l`g`g`l`g`g`g`g`g`g`g`g`g`d`d`g`i`v`v`vadadad`s`i`l`g`g`g`l`g`g`g`d`g`d`g`g`g`g`d`g`d`g`g`g`g`d`d`d`d`d`g`g`l`d`lal`v`va`adadad`r`i`l`g`g`g`d`d`d`l`l`l`l`lal`lal`l`d`g`g`d`d`d`g`d`d`d`d`l`g`g`g`g`g`g`g`g`g`l`l`l`l`g`lalal`v`vad`sadad`sal`l`l`g`d`d`g`g`g`d`d`g`g`l`g`g`g`g`g`g`g`g`g`d`g`lal`v`va`adadad`sal`i`g`l`g`l`g`l`i`vadada``l`g`l`l`l`g`l`l`g`l`l`l`l`l`l`l`i`i`l`i`i`i`l`i`i", -"`i`i`i`i`i`i`l`i`l`i`i`l`l`l`g`l`l`g`l`l`l`g`l`g`l`l`l`l`g`g`g`g`g`g`d`g`l`l`l`g`g`g`g`l`g`lal`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`b`vai`f`f`f`f`q`tab`r`l`iakae`w`y`m`e`e`m`y`waeak`g`d`d`d`d`d`g`d`g`g`g`g`g`g`g`gal`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tab`k`m``ae`i`i`l`g`lalad`f`f`f`tae`d`d`d`g`g`g`d`d`d`g`iak`w`y`m`m``agak`g`g`g`l`l`l`g`lalalal`v`v`vadadaiafadak`g`d`d`d`g`g`g`v`v`sai`f`f`faf`f`f`n`l`l`g`l`g`g`g`g`d`g`g`g`l`va``naf`f`f`f`f`f`f`nal`g`g`g`g`g`l`g`g`g`g`g`d`g`g`d`g`g`g`d`g`d`d`d`d`d`d`g`i`v`vadai`f`f`f`f`f`faf`s`g`g`g`l`v`v`v`sadadadadadaiaiad`d`g`g`g`d`d`g`g`d`d`d`g`l`l`g`d`g`g`g`g`l`g`gal`va`adaiaf`f`f`f`f`f`f`f`jad`v`g`d`g`d`g`g`g`d`g`l`g`g`g`g`g`g`g`g`l`l`va`ad`j`f`f`f`f`f`f`f`jad`r`l`l`l`l`vadaf`f`fag`l`l`g`l`l`l`l`l`l`g`l`l`l`l`l`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`l`i`l`l`i`i`l`l`l`g`l`g`g`g`l`g`g`g`g`g`l`l`l`g`g`l`g`g`d`g`l`l`g`g`g`d`g`g`galai`f`f`f`f`f`f`f`f`f`f`f`f`f`a`m`vai`f`f`f`f`f`tab`l`l`lakae`w`y`m`e`e`m`yagae`i`i`i`d`d`d`d`d`d`g`d`g`d`g`g`g`g`g`vad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`wae`i`i`g`gal`vaf`f`f`q`t`d`d`d`d`d`d`d`d`d`d`d`lak`w`y`c`c`w`ral`v`v`v`v`vadadadadaiai`j`f`f`f`f`f`f`k`y`g`g`d`d`dal`v`saf`f`f`f`f`f`f`f`f`fafak`l`g`g`g`g`g`g`g`l`va``n`f`f`f`f`f`f`f`f`f`f`f`x`d`g`g`g`g`g`g`g`g`g`g`g`g`d`g`d`g`g`d`d`g`d`d`d`lal`vadaf`f`f`f`f`f`f`f`f`f`f`h`g`g`vad`f`f`f`faf`f`f`f`f`f`u`y`g`g`g`g`g`d`g`g`d`d`d`l`g`g`g`d`d`g`d`lal`v`sai`f`f`f`f`f`f`f`f`f`f`f`f`f`fah`g`g`g`g`g`g`g`g`g`l`l`g`g`g`g`g`l`va``n`f`f`f`f`f`f`f`f`f`f`f`f`fai`sa``v`saf`f`f`a`t`g`l`l`g`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`i`l`l`l`l`l`l`g`g`l`g`g`g`l`g`g`g`g`l`g`g`g`l`d`g`d`l`l`l`l`l`l`l`l`gad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`vad`f`f`f`f`f`tabak`g`l`iae`w`y`m`m`e`m`y`wae`i`i`l`g`l`g`d`d`d`d`d`d`g`d`g`d`g`g`g`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`yagakak`g`l`l`v`n`f`f`f`a`e`d`g`d`g`d`d`d`d`d`d`d`l`iae```y`yag`sai`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`tae`g`l`d`g`v`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`i`l`g`g`g`g`g`l`vadaf`f`f`f`f`f`f`f`f`f`f`f`f`f`b`g`d`g`g`g`g`d`g`g`d`g`g`g`g`d`g`g`g`d`g`d`gal`vadaf`f`f`f`f`f`f`f`f`f`f`f`f`f`u`g`v`j`f`f`f`f`f`f`f`f`f`f`o`y`d`d`d`d`g`d`d`g`g`d`d`d`g`l`g`l`g`lal`v`s`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`j`l`g`g`d`g`g`g`g`g`g`g`g`g`g`l`vadaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`m`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`l`l`l`l`l`l`g`g`i`l`g`g`g`l`g`g`g`g`g`g`d`g`d`d`g`g`g`l`g`l`g`gal`f`f`f`f`f`f`f`f`f`f`f`f`f`f`n`f`f`f`f`f`tab`i`g`i`iae`w`y`m`e`e`m`y``ae`i`l`g`d`l`w`cae`d`d`d`d`d`dak`d`d`d`g`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`t`k`e`yag`i`i`l`l`v`s`f`f`f`f`o`y`g`g`g`l```mak`d`d`i`g`g`iae`w```w`rad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`aab`l`g`l`lala`af`f`f`f`f`f`f`f`f`f`f`f`f`f`f`p`l`iae`i`gal`vad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`w`cak`g`d`g`g`g`g`g`g`g`d`g`g`g`g`g`g`d`gala`ai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`x`v`f`f`f`f`f`f`f`f`f`f`f`tak`d`g`gak`c`w`g`d`d`d`d`d`d`d`g`g`l`va``n`f`f`f`f`f`f`f`q`o`t`tajaf`f`f`f`f`f`f`faf`i`g`g`g`g`g`g`g`l`l`l`l`l`vad`f`f`f`f`f`f`f`f`q`o`t`t`t`o`f`f`f`f`f`f`f`f`f`f`o`m`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`l`l`l`l`l`l`l`l`l`l`g`g`g`l`l`g`l`l`g`g`g`g`g`d`d`d`g`g`g`g`g`l`l`g`l`lai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tae`i`l`iaeag`y`c`e`e`m`y``agak`i`g`d`d`dag`g`d`g`g`d`d`d`i`w`d`g`d`dalad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`c`wae`i`l`l`va`af`f`f`f`f`tak`g`l`i`iakak`w`l`d`d`d`l`i`iagagaeak`x`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`c`l`g`g`va`af`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q```i``ak`i`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`p`e`g`l`l`g`w`m`e`y`g`g`g`d`g`d`d`g`g`g`va`af`f`f`f`f`f`f`f`f`f`a`t`t`taj`f`f`f`zad`f`f`f`f`f`f`f`f`f`f`a`t`l`g`g`l`l`gae`g`d`d`d`d`d`d`g`g`l`vadaf`f`f`f`f`f`f`f`o`t`kag`ialad`f`f`f`f`f`f`f`faj`l`l`l`g`g`g`l`g`l`g`g`v`s`f`f`f`f`f`f`f`f`o`t`m`w`l`l`i```j`f`f`f`f`f`f`f`f`o```l`l`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`i`i`l`i`l`i`i", -"`i`i`i`i`i`i`l`i`l`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`g`g`l`g`l`g`g`l`g`g`l`i`l`g`d`d`g`l`g`g`l`g`l`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`yak`iakaeag`y`c`m`e`m`y`waeak`i`l`d`g`d`dag`g`g`d`g`g`d`d`y`d`d`d`g`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`e`wak`i`r`va`af`f`f`f`f`q`tae`i`lakaeaeae```i`l`g`d`d`l`iakakakak`raa`o`o`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`tae`i`w`va`af`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`kaeak`b`vad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`p`yak`i`l`l`g`gae`g`g`g`g`g`gakaeak`l`vad`f`f`f`f`f`f`f`f`f`f`o`t`cakakagah`f`faiai`f`f`f`f`f`f`f`f`f`f`o`eaeak`i`i`i`l`w`g`g`g`l`g`daeaeal`vad`f`f`f`f`f`f`f`f`o`t`cae`i`i`v`n`f`f`f`f`f`f`f`f`f`eak`l`l`iag`iagae`lal`vaf`f`f`f`f`f`f`f`q`t`w`l`l`rakag`waeai`f`f`f`f`f`f`f`t`w`iaeaeagagae`i`iakakak`iak`i`l`l`l`iakal`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`g`g`l`g`l`g`l`l`g`g`g`l`l`g`g`d`d`g`g`g`g`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`e`waeakaeag```m`m`e`m`y`wagak`i`l`l`g`g`d`dae`g`g`d`g`g`g`g`w`d`d`d`d```vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`magak`v`vadaf`f`f`f`f`f`a`eag`maeag`w`w`w```i`l`l`g`g`d`g`l`l`i`lak`w`c`c`yad`f`f`f`f`f`f`f`f`f`f`f`f`q`takaka`a`af`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`wag`vad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`maeaeak`i`l`lag`g`g`g`g`g`iagag`x`vad`f`f`f`f`f`f`f`f`f`f`t`t`m`wakaeag`b`j`faf`f`f`f`f`f`f`f`f`f`f`f`t`m`y`cakaeakae`w`i`l`g`g`i`mag`r`vai`f`f`f`f`f`f`f`f`o`t`m`w```cala`af`f`f`f`f`f`f`f`f`f`o`m``akak`y`yagag`walad`f`f`f`f`f`f`f`f`t`e`wakakaeag```c`y``af`f`f`f`f`f`f`tagakag`y```w``ae`iakaeakaeakak`i`iakak`iakak`i`i`i", -"`i`i`i`l`i`i`i`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`l`g`l`g`l`l`l`l`l`g`g`g`l`d`d`g`d`g`gal`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tab`m```wag`w`y`m`m`e`m`y`waeak`i`i`l`g`d`g`g`dae`d`g`g`d`g`g`gag`g`g`gakala``f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`e`m`u`b`x`v`v`s`j`f`f`f`f`f`f`f`t```i`i`y`w`y`y```yak`l`g`g`g`g`d`d`g`g`g`g`g`w`l`g`v`f`f`f`f`f`f`f`f`f`f`f`f`o`e`w`ra`af`f`f`f`a`t`oai`f`f`f`f`f`f`f`f`f`f`f`f`t`ya``s`f`f`f`f`a`t`tac`f`f`f`f`f`f`f`f`f`f`f`f`qab`y`wagakak`lag`g`g`g`g`d`l`y```vad`f`f`f`f`f`f`f`f`f`f`t`t`````kag```yahad`f`f`f`f`f`f`f`f`f`f`f`f`q`t`````y`w`w`wag`y`i`l`g`lag`lal`vai`f`f`f`f`f`f`f`f`a`t`e`w`w`w`e`v`n`f`f`f`f`f`f`f`f`f`f`a`eabaeak`w`i`l`gag`vaf`f`f`f`f`f`f`f`f`tae`wag`w```y`c`m`u`cad`f`f`f`f`f`f`t`wag`w`y````ag`wak`iae`lak`l`ial`lakak`i`i`iak`i`i", -"`i`i`i`i`i`l`i`l`i`i`l`i`l`i`i`l`l`l`l`l`l`l`l`l`l`l`g`g`g`g`g`l`l`l`g`l`g`l`g`l`l`l`l`d`d`g`g`l`lad`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`k`e`c`````y`c`e`e`m`y``agak`i`i`l`l`l`g`d`d`gae`d`g`g`g`g`g`lag`l`g`gagalad`f`f`f`f`f`f`f`f`f`f`f`f`f`fad`v`v`v`v`vadad`x`nai`f`f`f`f`f`f`f`f`f`f`tag`iaeaa`yaa`y`````i`i`g`g`g`d`g`g`d`d`g`g`lag`g`g`v`f`f`f`f`f`f`f`f`f`f`f`f`t`m`x`v`j`f`f`f`o`t`caea``f`f`f`f`f`f`f`f`f`f`f`q`t`xa`af`f`f`f`t`taa`iaead`f`f`f`f`f`f`f`f`f`f`f`qab`e`m`y`wak`i`w`g`gag`g`g`w`i`vadaf`f`f`f`f`f`f`f`f`f`o`t```y`y`m`y`c`e`mad`f`f`f`f`f`f`f`f`f`f`f`f`oab`c`m`m`m`c`y`w`yak`i`l`gaeal`vai`f`f`f`f`f`f`f`f`f`t`m`c```y`y`z`v`f`f`f`f`f`f`f`f`f`f`f`qab`e```w``ak`i`lae`s`f`f`f`f`f`f`f`f`f`tae`y```c`m`m`e`k`e`mah`j`f`f`f`f`a`t`y`y`y`m`m`c```wak`iag`lak`l`lak`lakak`iak`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`i`i`l`i`l`i`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`d`g`g`g`l`l`g`l`g`g`g`g`l`l`g`d`g`g`g`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`k`m`m`c`m`e`m`m`y`wagak`i`l`l`g`g`g`g`d`g`dag`d`d`g`l`g`g`g```g`l`l`g`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`iae`c`c`c`m`c`w`y`i`l`g`g`g`g`g`g`g`d`d`d`gag`g`l`v`f`f`f`f`f`f`f`f`f`f`f`a`taa`vai`f`f`q`t`taaak`i`v`f`f`f`f`f`f`f`f`f`f`f`qaa`v`j`f`f`f`tabak`l`ga`ad`f`f`f`f`f`f`f`f`f`f`f`o`tab`e`m`y`wak`w`g`gag`g`g`walad`f`f`f`f`f`f`f`f`f`f`a`t`k`w```y`m`e`kab`zad`f`f`f`f`f`f`f`f`f`f`f`f`tab`k`kab`k`k`m`y`yak`l`l`l`r`vai`f`f`f`f`f`f`f`f`f`tabak`e```w````ad`f`f`f`f`f`f`f`f`f`f`f`a`t`e`m```yak`i`ia`ad`f`f`f`f`f`f`f`f`f`t`w`m`m`e`k`k`e`k`m`m`y`n`f`f`f`f`aab`m`m`e`e`e`m```wak`iag`gak`l`l`i`lakak`i`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`i`i`l`i`l`i`l`l`l`l`l`l`g`l`g`g`l`l`l`l`g`g`g`g`g`g`g`l`g`l`l`g`l`l`g`g`g`d`l`galaf`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`tab`k`e`e`e`e`m`c`waeak`l`g`g`g`g`g`g`g`d`d`dae`g`d`d`g`g`g`g```i`g`g`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`e`m`k`y`c`m`e`p`k`e`m`w`d`d`l`g`g`g`d`d`d`w`c`m`m`xad`f`f`f`f`f`f`f`f`f`f`f`oab`vad`f`f`f`t`t`m`eakaea``f`f`f`f`f`f`f`f`f`f`f`q`vad`f`f`f`t`tag`i`i`ga``n`f`f`f`f`f`f`f`f`f`f`f`o`t`tab`k`m`m`e`m`m`m`c`g`g`va`af`f`f`f`f`f`f`f`f`f`q`t`m```eabab`k`kab`t`bad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`tab`kab`k`e`e`c`l`g`vai`f`f`f`f`f`f`f`f`f`q`tagae`w`eababaaad`f`f`f`f`f`f`f`f`f`f`f`a`tab`e`e`k`makae`xai`f`f`f`f`f`f`f`f`f`o`k`kababababab`k`k`e`y`s`f`f`f`f`o`t`k`kabab`k`m`c``akagag`lak`i`iae`l`l`iakak`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`g`g`l`g`l`l`g`g`d`l`d`l`g`g`l`g`g`l`l`g`g`d`d`l`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`tabab`k`k`e`e`y``agak`l`l`g`l`l`g`l`g`g`d`d`d`wae`i`d`d`d`g`g`g```l`lal`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`wag``aa`m`e`m`yagak`i`l`g`g`d`d`g`g`l`g`d`d`d`d`dal`n`f`f`f`f`f`f`f`f`f`f`f`t`xa``f`f`f`t`t`m``ae`i`vad`f`f`f`f`f`f`f`f`f`f`fad`s`f`f`f`t`t`cagakak`w`v`j`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`e`c`wak`l`g`g`lal`vaf`f`f`f`f`f`f`f`f`f`f`oab`w`c`m`eabababab`kad`j`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tabab`m`yae`i`g`g`vad`f`f`f`f`f`f`f`f`f`f`t`eag```y`m`e`k`ead`f`f`f`f`f`f`f`f`f`f`fab`t`tab`e`m``ag`i`vai`f`f`f`f`f`f`f`f`f`fab`kababab`k`m`y`wagaea``j`f`f`f`o`k`kababab`k`m``aeak`i`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`i`l`i`l`i`l`i`l`l`l`g`l`l`l`l`l`l`l`g`g`g`g`l`l`l`g`g`g`d`l`g`g`l`g`l`g`l`g`d`d`g`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`k`e`c``aeak`i`g`g`g`g`g`g`g`g`d`d`d`g`iag`i`g`g`d`g`g`g`g`g`g`v`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`o`o`o`o`a`q`f`f`f`f`f`f`f`f`f`f`f`f`q`t`w`w`c`e`p`k`m`yaeak`l`g`g`g`g`d`d`d`d`g`g`g`g`d`d`vai`f`f`f`f`f`f`f`f`f`f`q`u`v`j`f`f`t`t`k`c`waeak`v`n`f`f`f`f`f`f`f`f`f`f`f`vaf`f`f`t`t`e`y`wakae`xa``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`k`m``ae`i`g`g`l`vai`f`f`f`f`f`f`f`f`f`f`q`t`c`y`e`kabab`tab`k`e`rai`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c``ae`i`l`va``f`f`f`f`f`f`f`f`f`f`a`tag```c`e`k`kab`k`z`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`k`e`yagakalai`f`f`f`f`f`f`f`f`f`f`aab`tabab`e`c``agaeakak`n`f`f`f`t`k`kab`tab`k`m``aeak`i`i`l`i`i`l`l`i`l`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`i`l`l`l`i`l`i`l`l`l`l`l`g`l`l`g`l`g`l`l`g`g`l`g`g`g`g`l`d`l`g`g`g`g`g`g`g`g`d`dalaf`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`tabab`k`c``agak`l`l`l`g`g`g`g`l`g`d`d`d`l`g`g`g`l`g`d`d`d`g`g`l`g`g`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tabab`o`o`f`f`f`f`f`f`f`f`f`aab```y`e`k`k`k`m``ae`l`g`g`g`g`d`g`d`g`g`g`d`g`d`g`g`v`f`f`f`f`f`f`f`f`f`f`f`a`vad`f`f`o`tab`m`yagakae`v`j`f`f`f`f`f`f`f`f`f`f`n`n`f`f`a`t`t`e`c``aeak`v`n`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`tabab`m``ag`i`g`g`vad`f`f`f`f`f`f`f`f`f`f`f`oab`c`e`kabab`tab`k`e`c`vaf`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wak`i`l`vaf`f`f`f`f`f`f`f`f`f`f`t`e```c`e`kabab`k`e`mai`f`f`f`f`f`f`f`f`f`t`t`t`t`tab`k`c``ae`vai`f`f`f`f`f`f`f`f`f`faf`t`t`t`k`m``agak`i`l`lad`f`f`f`t`c`eababab`k`c`wae`i`i`i`l`l`l`i`i`l`i`l`i`l`i`i`i`i", -"`i`i`i`i`l`i`l`i`l`i`i`i`i`l`i`l`i`l`l`l`l`l`l`g`l`g`l`g`l`g`g`l`g`l`g`g`l`d`g`g`d`i`l`g`l`g`g`g`g`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`k`e`yagak`i`l`g`g`g`g`d`g`d`g`d`d`d`d`l`g`l`g`g`g`d`d`g`g`g`l`l`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`k`c``ag`yaf`f`f`f`f`f`f`f`o`k`m`e`kabab`k`c`wak`i`g`d`g`g`g`d`g`d`d`g`g`d`g`galad`f`f`f`f`f`f`f`f`f`f`fa``s`f`f`q`t`t`k`m``agak`ra``f`f`f`f`f`f`f`f`f`f`fad`f`f`q`t`tab`e`c`wagae`v`j`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`k`e``agak`lala`af`f`f`f`f`f`f`f`f`f`f`q`t`m`m`k`t`t`t`tab`e`cag`v`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`m`yagak`l`v`n`f`f`f`f`f`f`f`f`f`f`q`taa`m`e`kab`tab`k`m``ag`h`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``ae`rai`f`f`f`f`f`f`f`f`f`f`fac`tab`k`m``aeak`i`l`l`l`f`f`q`t`y`m`kabab`e`c`waeak`l`l`i`i`l`l`i`i`l`l`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`l`i`l`i`i`l`i`l`g`l`g`l`l`g`l`l`g`l`g`g`g`l`l`g`g`l`l`g`g`g`d`d`i`l`g`g`g`gala`af`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`k`m`wae`i`l`d`g`g`d`d`d`d`d`d`g`g`g`g`g`l`g`l`l`g`l`d`d`d`g`lalad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`k`m`y``agagai`f`f`f`f`f`f`t`k`kab`tabab`e`c`wak`l`g`g`g`d`g`g`g`d`d`d`g`g`g`dal`n`f`f`f`f`f`f`f`f`f`faf`vaf`f`q`t`tab`e`c`wagae`rad`f`f`f`f`f`f`f`f`f`f`jaf`f`f`t`t`tab`e`y`wag`xa``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`m``ag`i`l`v`n`f`f`f`f`f`f`f`f`f`f`f`tab`eababab`tabab`e`m``a`ad`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m`wae`iala``f`f`f`f`f`f`f`f`f`f`f`oab`m`kabab`tab`k`e`yagae`iaa`a`q`q`q`o`t`t`t`t`t`t`t`tab`m``aealad`f`f`f`f`f`f`f`f`f`f`f`f`p`t`k`m`wae`i`l`i`l`l`i`t`t`k`w`c`e`k`k`e`y`wak`i`i`l`i`l`i`l`l`i`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`g`g`l`g`l`g`g`g`g`l`l`g`l`g`l`g`g`d`d`g`l`g`gal`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`k`m``ak`l`g`d`d`d`g`d`l`g`d`d`g`g`l`g`g`d`l`g`g`l`g`g`g`d`d`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`k`e`c`c`y`yad`f`f`f`f`f`q`tababab`tabab`m`yag`i`g`g`d`g`g`d`d`g`g`g`d`d`d`d`l`v`j`f`f`f`f`f`f`f`f`f`f`n`n`f`f`o`t`tab`m`yagaeag`vai`f`f`f`f`f`f`f`f`f`faf`f`f`a`t`t`tab`e`c`y``a`ad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`tab`k`m``ae`ial`s`f`f`f`f`f`f`f`f`f`f`f`q`t`k`k`t`t`t`tab`k`m`yag`r`n`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wak`i`v`j`f`f`f`f`f`f`f`f`f`f`f`t`e`eab`t`t`tab`e`c`wak`l`d`d`l`c`e`eababab`t`t`t`t`tab`k`m``ae`i`s`f`f`f`f`f`f`f`f`f`f`f`f`f`p`k`m``ae`i`l`g`l`g`l`l`iakag`y`m`k`k`m`yagakak`l`l`i`l`i`l`l`i`l`i`l`i`l`i`i`i", -"`i`l`i`i`i`l`i`l`i`l`i`i`l`i`l`l`i`l`l`l`l`l`g`l`g`l`l`g`l`g`l`l`g`g`g`g`l`g`l`g`l`g`g`d`g`d`g`v`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`tab`k`m``ae`i`g`d`d`d`g`g`g`g`d`g`g`d`l`g`d`d`g`g`g`g`g`g`g`d`d`d`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`t`tab`k`e`m`m`c`cahai`f`f`f`f`o`t`t`t`t`t`t`k`m``ae`i`l`g`g`d`d`d`g`d`d`d`g`g`g`d`g`v`f`f`f`f`f`f`f`f`f`f`fad`f`f`q`t`tab`k`m`y`w`w`b`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`tabab`e`m`y```v`j`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`k`m`wae`r`v`j`f`f`f`f`f`f`f`f`f`f`f`o`t`kab`t`t`tabab`e`c`wak`vai`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yagak`v`s`f`f`f`f`f`f`f`f`f`f`f`a`t`kabab`t`tab`k`m``agak`i`l`g`l`lae`w`c`eab`t`t`t`t`tab`k`c`wak`ial`f`f`f`f`f`f`f`f`f`f`f`f`fafab`e`yag`i`l`g`l`l`l`l`iakae`w`m`e`e`m``agak`i`i`l`l`i`i`l`i`l`i`i`i`l`i`i`l`i", -"`i`i`i`l`i`l`i`i`i`i`l`i`l`l`i`l`l`l`l`l`g`l`l`l`g`l`l`l`g`g`g`l`g`g`g`g`g`l`g`l`g`l`g`d`g`dal`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`m`yae`i`l`g`g`d`g`g`l`g`l`g`g`g`g`g`g`d`g`g`g`l`g`l`g`g`d`la``f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`k`e`m`c`c`c`c```n`f`f`f`f`o`t`t`t`t`tab`e`c`wae`i`g`d`g`g`d`g`g`g`g`d`d`g`d`galad`f`f`f`f`f`f`f`f`f`f`j`j`f`f`t`t`tab`k`c`y`````x`s`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`tab`e`m`c`ba``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wakal`s`f`f`f`f`f`f`f`f`f`f`f`f`tabab`t`t`t`tab`k`c`waeak`v`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`m``aeal`v`j`f`f`f`f`f`f`f`f`f`f`f`tab`k`t`t`t`tab`k`c`wae`i`l`l`g`l`lae`w`c`eab`t`t`t`t`tab`e`c`wak`i`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`k`c``ae`i`l`g`l`l`l`l`iaeag`c`m`e`c``aeak`i`i`i`l`l`l`i`i`l`l`l`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`l`i`l`i`l`l`l`l`i`l`i`l`l`g`l`l`l`g`l`l`g`l`g`g`g`g`g`g`g`l`l`g`l`g`g`d`l`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`fab`tab`e`cagak`l`l`g`g`d`gae`d`l`l`l`d`g`g`d`d`d`l`g`d`g`g`d`g`galad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`tabab`c```w`w`c`xad`f`f`f`q`t`t`t`t`t`tabab`eagak`i`g`g`d`g`g`g`g`d`g`g`g`d`g`d`vai`f`f`f`f`f`f`f`f`f`faf`f`f`a`t`t`tab`e`m``````a``n`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`tabab`e`e`ma``n`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`k`y`wak`v`j`f`f`f`f`f`f`f`f`f`f`f`o`tab`t`t`t`tabab`m`yagakal`s`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m``aeal`s`f`f`f`f`f`f`f`f`f`f`f`f`tabab`t`t`t`t`k`m`yaeak`l`g`g`g`g`lakag`y`m`kabab`tabab`e`m``agak`l`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`fac`m``agak`l`l`g`l`l`l`iakag```c`c`c`wakak`i`l`l`i`i`l`l`l`i`i`i`i`i`i`i`i`i", -"`i`i`i`l`i`i`i`l`i`i`l`l`i`i`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`l`g`g`g`g`g`g`g`g`l`l`l`g`l`vad`f`f`f`f`f`u`j`f`f`f`f`f`f`f`f`f`f`f`f`f`a`tab`k`m`wak`l`g`g`g`g`y`i`g`g`g`g`g`g`g`l`d`d`d`d`g`g`g`g`gag`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tabab`m```waeaeae`waead`f`f`f`q`tabab`t`tabab`e`maeak`l`g`g`g`g`g`g`g`g`d`d`d`g`d`g`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`tabab`e`c`y`y`w`vaf`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`tabab`eab`y`vaf`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`k`e`yag`v`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`k`c`wak`i`v`n`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`cagak`v`n`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`k`c``ak`i`l`g`g`d`l`gakae`w`c`e`k`k`k`k`e`m`yagak`i`l`g`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`faj`c``ae`i`l`l`l`l`l`i`iae`w`y`y``agak`i`i`i`l`l`l`i`i`i`i`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`i`l`i`i`l`l`l`i`l`l`l`l`l`l`g`l`g`g`l`g`l`g`l`l`g`l`g`g`g`g`g`g`g`g`g`l`vad`f`f`f`f`f`t`pad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`m`yae`i`g`g`g`d`y`g`l`l`g`iagae`g`d`gakak`g`lag`i`g`i```v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tabab`m`yaeak`i`w`walad`f`f`f`o`k`k`kab`tab`k`m`cae`i`l`g`g`g`d`d`g`d`iagakag`gaeal`s`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`tab`e`c`y`y`x`s`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`tabab`k`k`b`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`m``ae`v`j`f`f`f`f`f`f`f`f`f`f`f`a`tab`t`t`t`tabab`m`yagak`l`vaf`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e``agal`v`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`e`y`wak`l`g`d`g`d`g`g`l`iag`w`y`c`m`m`m`c`yagae`i`g`g`g`g`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`faj`y`wae`i`l`l`l`l`i`iakae`w`w`waeak`i`i`l`l`i`l`l`l`l`l`i`l`i`i`l`i`l`i", -"`i`i`i`i`i`l`l`i`i`i`l`l`i`l`l`l`i`l`l`l`i`i`l`l`l`l`g`l`g`l`g`g`g`g`g`g`g`l`g`l`g`gal`vad`f`f`f`f`f`o`tag`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`c`wak`l`d`dakak`g`l`g`l`wagag`w`g`gak`w`g`iagae`l`i`x`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`k`m``ak`i`lag`y`lad`f`f`f`t`c`e`e`kabab`e`c`cak`l`l`l`g`l`g`g`g`d`i`y`w`w`yag`xad`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`tabab`k`c`y`v`n`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tabab`k`ma``n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`w`ra``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`k`c`wae`ial`s`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c``aealad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`yae`i`l`g`g`d`g`g`g`l`iakae`w`w`y`````wagakak`g`g`d`d`d`gad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`e``agae`i`l`l`g`l`i`iakaeaeaeak`i`i`l`l`l`l`l`l`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`l`i`i`l`l`i`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`g`l`g`l`g`g`g`g`g`l`g`galad`f`f`f`f`f`o`tag`d`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`k`m`wae`l`g`gae`d`d`g`l`l```m`y`w`d`d`lag`l`d`gag`g`ga``n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`e`wak`i`l`g`laealad`f`f`f`tag`c`m`kab`k`m`y`yak`g`g`g```m`m`m`m```dagag`gae`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`tabababab`c```vaf`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tabab`e`y`vaf`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`y`w`v`n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`e`yagak`l`v`n`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`c`wak`vai`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yagae`i`l`g`g`d`g`g`d`g`g`l`lakaeaeagagaeak`i`i`g`d`g`d`g`d`gai`f`f`f`f`f`f`f`f`f`f`f`f`f`faj`m``ag`i`i`i`l`l`l`i`i`iakak`i`i`l`l`l`l`i`l`l`l`l`i`l`i`l`i`i`l`i`i", -"`i`i`i`i`i`i`i`l`i`i`l`l`l`l`l`i`l`l`l`g`l`l`i`i`l`l`l`g`l`g`g`g`g`g`g`l`g`g`l`g`l`va`af`f`f`f`f`o`tag`g`l`i`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`k`e`yagak`g`gag`g`g`d`dagak`l`l`w`g`g`lag`l`d`gae`g`g`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`e`wak`i`l`l`gag`g`n`f`f`oabae`y`y`e`k`k`m`````i`g`g`d`g`l`l`g`g`g`gaeae`dag`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tabab`k`c`x`s`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`k`e`x`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`e``ae`vaf`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`k`c``ae`i`i`vaf`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yag`i`v`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tabab`m`yae`l`i`l`g`g`g`g`g`g`d`g`g`l`l`l`iak`i`i`i`l`l`g`g`g`g`g`g`g`gaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`p`c`wagak`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`g`g`g`g`g`g`va`af`f`f`f`f`q`t```g`l`iak`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`y`wak`i`g`iag`g`d`g```g`d`i`y`g`g`g```l`lagag`d`l`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`maeak`l`g`g`gag`g`saf`f`o`y`l`````m`e`e`c`w``alalal`g`g`g`g`g`l`g`lagag`gaealad`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`tabab`e`e`y`r`n`f`f`f`f`f`f`f`f`f`f`f`q`o`t`t`t`t`t`tab`k`ca``n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c``a``s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`e`y`wak`lal`s`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`m``ag`r`s`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`c`wae`i`d`g`g`g`d`g`g`g`g`d`l`d`d`g`l`g`l`l`l`l`l`l`g`g`g`g`g`g`l`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`k`y`waeak`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`i`l`l`l`l`l`l`l`l`l`g`g`g`g`g`l`l`l`l`l`l`g`g`g`l`g`l`g`g`l`va`af`f`f`f`f`q`t`m`l`i`l`i`b`b`j`f`f`f`f`f`f`f`f`f`f`f`f`f`p`t`t`k`c``aeak`g`g`y`g`d`d`l`m`mag`w`w`l`l`i`m`mak`makalad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tababab`k`e`y`l`gae`c`m`c`m`y`m`t`k`e`e`k`k`e`m`k`k`ma`ah`j`n`g`d`d`g`l`gae`c```g`c`v`n`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`tab`c```v`j`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`t`k`e```vaf`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`yag`r`n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m``ae`i`l`v`n`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`wae`vad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`cag`i`i`l`d`g`g`g`d`g`d`l`g`g`d`d`d`l`g`g`l`g`g`g`l`g`g`g`g`g`d`d`lad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`m`y`wakak`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`l`i`i`i`i`i", -"`i`i`i`l`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`g`l`g`g`g`l`gala`af`f`f`f`f`q`t`m`l`l`iakag```y`n`f`f`f`f`f`f`f`f`f`f`f`f`f`a`tab`k`e``agak`l`lakak`g`g`g`g`d`g`g`g`d`d`g`g`g`g`g`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`c`wak`l`g`g`d`d`g`d`g`g`d`g`g`iae`w`c`m`c``aeala``j`f`f`m`l`d`g`d`g`g`g`g`g`g`vaf`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`e`uaea``f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`k`c`x`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tabab`m`yag`v`j`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`y`wak`l`la``f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yagakalai`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`yag`i`l`g`l`d`d`l`d`g`d`g`g`g`g`g`d`d`g`d`d`d`g`g`l`l`g`g`g`d`g`g`g`i`n`f`f`f`f`f`f`f`f`f`f`f`f`f`fab`m``agak`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`i`l`i`l`i`l`i`i", -"`i`i`i`i`l`l`i`l`i`l`i`l`l`l`l`l`g`l`l`g`g`l`l`g`l`g`l`g`l`g`l`l`l`g`l`g`lal`vai`f`f`f`f`f`t`m`g`lakakag```y`e`x`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`yagak`i`l`l`d`g`d`g`d`d`g`g`g`d`g`g`d`l`g`g`l`vaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`yagak`l`g`g`d`g`d`d`d`d`d`g`g`iak`w`c`m`c`wak`vai`f`f`q`t`i`d`d`d`g`d`l`d`gala``f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`t`k`m`y`vad`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`t`k`e`y`r`n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wak`v`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`e``ag`i`l`vad`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``ag`i`vai`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`tab`k`m`wae`i`d`g`l`g`g`d`d`d`g`g`g`g`g`g`d`d`d`d`d`g`d`g`d`g`l`l`l`g`g`g`g`g`l`j`f`f`f`f`f`f`f`f`f`f`f`f`f`o`e`m``agak`i`l`g`g`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`l`i`i`i`i", -"`i`i`i`l`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`gal`vai`f`f`f`f`f`tab`d`l`lakag```c`m`eah`j`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tab`e`c`wae`i`l`g`l`g`g`g`g`g`g`d`d`d`d`g`d`g`d`g`l`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`tabab`m``ae`i`i`g`g`d`g`g`g`d`d`g`g`g`iae`w`y`c`yag`vad`f`f`f`o`e`g`g`g`g`l`g`l`g`galad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`e`c`w`v`j`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tabab`k`c```v`j`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`yag`r`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`wae`ial`vaf`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`m``ae`i`v`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tab`e`c`wak`i`d`l`g`g`g`d`d`d`d`l`g`g`d`d`d`d`d`d`d`d`g`d`g`g`g`l`g`l`g`g`g`l`l`r`j`f`f`f`f`f`f`f`f`f`f`f`f`f`t`e`y`wae`i`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`i`i`l`i`l`i`i`i`i", -"`i`i`i`i`i`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`gal`vai`f`f`f`f`q`tab`i`g`lakae```y`m`e`e`cad`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`k`m``ae`i`i`l`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`galad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m`wae`l`g`g`d`g`d`g`g`d`g`g`g`l`lak`w```y```ra`af`f`f`f`o```g`g`l`g`l`d`l`l`l`vai`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`y`xa``f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`t`o`p`e`z`xa``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`e`yaealad`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yagak`ial`n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`y`wak`g`v`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`tab`e`y`wak`l`g`g`l`g`g`g`g`d`g`d`g`d`d`d`g`g`g`d`d`d`vad`v`d`g`g`l`g`l`g`g`g`l`ia`af`f`f`f`f`f`f`f`f`f`f`f`f`t`k`m`yagak`i`l`l`l`l`g`l`l`l`l`l`l`i`l`i`l`l`l`i`l`i`l`i`i`i", -"`i`i`i`i`i`i`l`i`i`i`l`l`l`l`l`l`l`g`g`l`g`l`g`l`g`l`l`l`l`l`l`g`l`lal`vai`f`f`f`f`f`tab`i`l`i`iak`w`y`m`e`m`c```s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`k`e``agak`g`l`l`g`g`g`g`d`g`g`g`g`g`l`g`g`l`g`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`y`wak`g`g`d`d`l`d`g`d`d`g`g`g`l`lakae`w``a``v`j`f`f`f`q`tak`g`g`g`i`i`l`i`gal`v`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`t`k`c`w`rad`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tabab`e`c`w`rad`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`eab`k`c``ae`vad`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`t`k`m``ag`ial`vaf`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tabab`e`yagak`l`v`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`tabab`m``ae`i`i`d`g`g`g`g`g`l`v`g`g`d`d`d`g`d`g`g`d`d`ga``f`f`n`g`g`g`g`l`g`g`g`g`l`iad`f`f`f`f`f`f`f`f`f`f`f`f`oab`k`m``agak`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`l`i", -"`i`i`l`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`g`l`g`l`g`l`l`g`l`v`n`f`f`f`f`f`oab`i`i`i`iae`w`y`m`e`e`c``ag`raf`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tab`e`c`wak`i`g`g`l`g`g`l`g`g`g`g`g`d`l`g`g`l`l`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`yag`i`l`g`d`g`l`d`g`g`g`g`g`g`l`l`lakae`r`vai`f`f`f`f`aab`g`g`l`i`iakakak`lalad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`tab`e`yae`vai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`o`o`k`e`zag`vai`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`k`vadaa`y`wak`rai`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tab`k`c``ae`i`vad`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`m`u`c`wae`i`l`v`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`k`m``akak`g`g`d`g`g`g`laladaf`s`d`d`d`g`d`g`g`g`d`gad`f`f`f`c`g`g`g`g`l`l`g`g`l`iak`n`f`f`f`f`f`f`f`f`f`f`f`q`t`k`e`y`wae`i`i`l`g`g`l`l`l`l`l`l`l`l`l`i`l`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`g`g`g`g`g`l`l`l`vad`f`f`f`f`f`o`tag`l`iakae`w`y`c`m`e`c`yagak`r`n`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`k`m``ag`i`g`d`g`g`g`g`g`g`g`l`l`g`l`g`l`galad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`t`k`c``ae`i`l`d`g`g`g`g`d`g`g`l`g`g`l`l`i`i`r`vai`f`f`f`f`f`t`y`g`l`iakaeaeakak`lal`n`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`k`m``ae`v`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`t`o`k`u``ae`vaf`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`ta``s`f`faaae`i`vai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`e`cagakala`af`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`tab`vadahagak`g`d`v`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`tab`k`c`wak`i`l`g`d`g`g`gala`af`f`f`h`d`d`g`g`g`g`d`d`lad`f`f`f`t`g`g`d`g`g`l`g`g`l`l`i`raf`f`f`f`f`f`f`f`f`f`f`a`t`t`k`m``agak`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`i`i`i`i", -"`i`i`i`i`i`l`i`l`i`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`g`g`l`g`g`g`l`vad`f`f`f`f`f`o`tag`l`i`iae`w`y`m`e`m`m```wak`l`lad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`yagak`i`l`g`g`d`g`g`g`g`l`l`g`g`g`g`g`v`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`c`wak`l`g`g`d`l`l`g`g`d`g`g`g`g`g`l`gal`vai`f`f`f`f`f`f`tak`l`iakae`w`wagak`i`v`j`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`e`y`w`vad`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`tabab`eaa`w`ra``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`z`vaf`f`f`o`y`ialai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`k`e```w`r`v`n`f`f`j`f`f`f`f`f`f`f`f`f`f`t`t`t`t`ta`a``f`f`h`i`g`galaf`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`k`cagak`i`g`g`d`d`gal`v`j`f`f`f`o`m`d`g`g`d`d`d`dal`n`f`f`f`o`i`g`l`g`g`g`g`g`l`l`iakad`f`f`f`f`f`f`f`f`f`f`q`t`tab`e`c`wae`i`l`l`l`g`l`l`l`l`l`l`l`l`l`i`i`l`i`i`i`l`i`i", -"`i`i`i`i`i`i`i`i`l`i`i`l`l`l`g`l`l`l`l`g`l`l`l`g`g`g`l`g`l`g`l`vad`f`f`f`f`f`a`tag`l`iakae`w`y`m`m`e`m```wae`i`g`l`v`f`f`f`f`f`f`f`f`f`f`f`f`f`fab`tab`k`c`wae`i`g`g`g`g`g`g`l`l`l`l`l`g`g`l`g`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`e`cag`i`i`l`l`g`g`g`g`g`d`g`g`g`g`g`g`v`vai`f`f`f`f`f`f`q`t`g`iakag`w`y`y`waeala``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tabab`m`yag`vai`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tabab`m`yag`vad`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`k`v`n`f`f`a`t`w`ialai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`tab`k`m``ae`vad`f`f`n`f`f`f`f`f`f`f`f`f`f`a`t`t`t`tah`vaf`f`f`o`c`l`g`lai`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`e`y`w`i`g`g`g`g`dal`vai`f`f`f`q`t`w`g`g`d`g`g`g`dalai`f`f`f`aag`l`g`l`l`l`g`g`l`l`l`i`vaf`f`f`f`f`f`f`f`f`f`q`t`t`t`k`m``aeak`l`l`g`l`g`g`g`l`l`l`l`l`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`g`l`g`i`vadaf`f`f`f`f`q`t`c`l`i`iae`w`y`c`e`e`m`y`wak`i`l`g`gal`j`f`f`f`f`f`f`f`f`f`f`f`f`f`q`tab`k`m``aeak`i`l`g`l`g`g`g`g`l`g`g`g`g`gala``f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`m`yag`i`l`g`g`l`l`d`d`g`w`cak`l`g`l`va`af`f`f`f`f`f`f`f`o`m`l`iae```y`c`y``aealad`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wak`v`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m``ae`r`n`f`f`f`f`f`f`f`f`f`f`f`o`t`tab`s`s`f`f`f`t`m`i`lalai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`k`c`w`va`af`f`fad`f`f`f`f`f`f`f`f`f`f`a`t`t`t`u`vai`f`f`q`t```g`g`l`n`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`tab`e`cagak`l`g`g`d`g`vad`f`f`f`f`t`e`g`g`g`d`l`l`g`g`v`j`f`f`f`f`m`i`iakak`i`i`l`l`g`l`l`i`n`f`f`f`f`f`f`f`f`f`o`t`t`tab`e`y`wak`i`l`l`l`l`l`l`l`l`i`i`l`l`i`i`l`i`l`i`i`i`i", -"`i`i`i`i`l`i`l`iak`i`i`l`l`l`l`l`l`i`l`l`l`l`g`l`l`g`lak`l`vad`f`f`f`f`f`f`t`k`l`iakaeag```m`m`e`m`y`wae`i`l`g`g`dalai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`tab`e`yagak`i`l`g`d`l`g`g`g`g`l`l`l`g`gal`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``ae`i`i`g`g`g`g`l`g`g`g`lag`l`v`vad`f`f`f`f`f`f`f`f`f`t`wakaeag`c`e`m`yagae`vai`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`yag`v`s`f`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`t`tab`e`c`wak`vai`f`f`f`f`f`f`f`f`f`f`f`t`t`ta`a`af`f`f`o`tag`i`l`l`n`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`tab`e`y`va`af`f`fai`n`f`f`f`f`f`f`f`f`f`f`o`t`t`e`vad`f`f`f`t`e`l`g`d`d`s`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`tab`e`yag`i`l`d`gal`vad`f`f`f`f`oab`i`g`l`l`g`g`l`i`l`v`f`f`f`f`f`o`iakaeaeakak`l`l`g`l`l`l`s`f`f`f`f`f`f`f`f`f`t`t`t`tab`k`c`wae`i`l`l`l`g`l`l`i`l`l`l`l`i`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`l`iak`i`l`l`l`iak`iak`g`l`l`lakak`i`l`l`ia``vad`f`f`f`f`f`f`q`t`iagakaeag`y`c`e`e`m`y`w`w`wae`g`d`dae`rad`f`f`f`f`f`f`f`f`f`f`f`f`f`faj`tab`e`c`wae`i`l`g`g`iaeakag`lag`i`g`g`l`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`c`wae`l`l`iagag`g`g`l`l`g`l`v`v`s`j`f`f`f`f`f`f`f`f`f`q`t`w`w`w`y`eab`e`m`yak`v`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`e``ae`v`n`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`m`yagak`v`j`f`f`f`f`f`f`f`f`f`f`f`taba`a`af`f`f`a`t`yak`l`g`gad`f`f`f`f`f`f`f`f`f`f`f`faf`t`t`tab``a`a`af`f`f`a`vai`f`f`f`f`f`f`f`f`f`f`o`t`e`vad`f`f`f`oabag`l`g`l`galaf`f`f`f`f`f`f`f`f`f`f`f`faf`t`tab`e`yag`i`l`gal`vai`f`f`f`f`o`tag`g`g`l`i`iak`iak`l`v`f`f`f`f`faj`wae`wagagak`i`l`l`l`l`l`v`f`f`f`f`f`f`f`f`f`t`t`t`tab`k`m``agak`l`l`l`l`l`l`l`i`l`i`l`l`i`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`l`lakakakag`l`l`iagakakagak`lal`vai`f`f`f`f`f`f`f`q`k`c``ae`w```c`e`e`m`c`wag`wag`wak`g`gaea`ad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`k`t`k`m``aeak`l`g`g`l```w`w`yag`y`g`g`v`s`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`e`c`wak`i`gagagag`w`g`g`lal`v`s`j`f`f`f`f`f`f`f`f`f`f`f`pab```e`y`m`kab`k`c`w`v`s`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c`wae`vaf`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`c``aeak`v`f`f`f`f`f`f`f`f`f`f`f`f`z`va`af`f`f`f`t`kag`i`l`gak`v`f`f`f`f`f`f`f`f`f`f`f`f`faiahah`v`vadaf`f`f`q`t`v`f`f`f`f`f`f`f`f`f`f`f`h`x`vad`f`f`f`o`t`y`i`l`g`l`lakad`f`f`f`f`f`f`f`f`f`f`f`f`faiaa`e`e`yae`ral`va``j`f`f`f`f`a`t```g`l`i`iaeagagaeakal`s`f`f`f`f`f`f`p`w```y``ae`i`l`l`l`l`i`v`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`m`yaeak`l`l`l`l`g`l`l`l`i`l`i`l`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`iak`i`l`i`l`laeak`l`g`l`laeakakaeak`w`va`ai`f`f`f`f`f`f`f`f`f`mak``ag```c`e`e`e`c``agae`y`c`wag`l`l`l`rad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faf`pab`e`e`e`c`c`c`w`daeae`gag`lag`lal`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`e`eae`i`g`w`c``agal`v`vad`j`f`f`f`f`f`f`f`f`f`f`f`f`f`t`m```y`c`e`k`k`c``ak`v`n`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`yag`r`s`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`k`cagak`i`v`f`f`f`f`f`f`f`f`f`f`f`f`fai`f`f`f`f`t`t``ae`i`l`lakaeai`f`f`f`f`f`f`f`f`f`f`f`f`f`faiai`f`f`f`f`f`t`e`v`f`f`f`f`f`f`f`f`f`f`f`fai`j`f`f`f`q`t`eak`i`l`l`iakaea`af`f`f`f`f`f`f`f`f`f`f`f`f`fafad`s`v`va`ad`j`f`f`f`f`f`q`t`m`l`l`g`iaeag`w``agae`rad`f`f`f`f`f`faf`y`c`c`y`wak`i`l`l`g`v`s`f`f`f`f`f`f`f`f`t`t`t`t`t`t`k`m`yagak`i`l`l`l`l`l`l`l`l`l`i`l`l`l`l`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`l`l`i`l`l`lakae`i`laeakakak`r`v`saf`f`f`f`f`f`f`f`f`f`f`nae`````c`e`e`e`c``agak`w`i`g`iae`g`lal`v`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faf`b`y`y`wae`i`g`g`gaeae`dag`lae`v`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`fafaa`e`t`tab`k`c``aeal`i`r`ral`va`adai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`w`m`k`k`kab`k`y`wak`v`j`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``ae`vad`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`m`yaeak`i`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`m`wak`i`iak`x`wad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`tab`i`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`tab`wakak`lakakae`wagad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`c`i`l`gakae`w```c`y``ae`vad`f`f`f`f`f`f`fac`m`m`c``ak`l`g`l`i`v`j`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`e`yagak`i`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i`l`l`i`i`i", -"`i`i`i`i`l`i`i`iak`l`i`lak`i`l`g`iak`l`iag`v`v`sai`f`f`f`f`f`f`f`f`f`f`f`f`f`jada``x`e`e`m``agak`i`w`gal`v`v`va`ad`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`jada``ral`l`g`gaeaeal`v`va`adaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faf`nad`v`v`v`v`v`v`sadad`naiaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`aab`y`m`kabab`k`k`yag`ra``f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`t`t`k`c`wae`v`j`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`wak`i`lal`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`k`y`wak`iakag`w`````j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tae`gal`j`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t```wakak`iae`w`w```wagah`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`m`d`g`iakaeag```c`c`y``ae`rai`f`f`f`f`f`f`f`f`n`c`m``ag`i`lal`vad`f`f`f`f`f`f`f`o`t`t`t`t`t`tab`k`m``agak`i`l`l`l`l`l`l`l`l`l`i`i`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`iak`i`i`l`iakaeagak`l`g`lal`saf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faf`q`m`y`wak`l`lae`c`vaiaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`j`x`gak`yag`vai`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`oabababab`tabab`m`e`m`xad`f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`y`w`ra``f`f`f`f`f`f`f`f`f`f`f`q`t`t`t`t`t`tab`e`c`w`i`i`g`l`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`tab`m`yagakakae`w```y`wadaf`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`w`g`g`g`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`e`yaeaeakaeag```y`y`waeak`n`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`o`t`m`g`l`gakakag```y`m`c`y`wae`vai`f`f`f`f`f`f`f`f`f`j`s`x`r`v`va``n`f`f`f`f`f`f`f`o`t`k`k`t`t`t`t`tab`m``ag`i`l`l`l`l`l`l`l`l`l`l`l`i`i`i`l`i`i`i`i`i`i", -"`i`i`i`i`l`i`l`i`i`i`i`i`l`i`l`l`l`l`l`l`lad`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`fab``ag`i`l`g`d`g`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`faj```d`d`d`v`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`k`kab`tabab`k`c`wak`vai`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`tab`k`m``ae`v`n`f`f`f`f`f`f`f`f`f`f`f`o`t`t`t`t`t`t`k`e``agak`i`g`galaf`f`f`f`f`f`f`f`f`f`f`f`q`o`t`t`k`m`yagaeae`w`y`y`y`wae`b`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`t`yak`i`i`i`raf`f`f`f`f`f`f`f`f`f`f`f`q`t`tab`m`yagagaeag`w`y`y```wak`i`i`z`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`t`t`w`l`l`i`iaeag```y`m`c`y`waeak`vaf`f`f`f`f`f`f`f`f`f`f`f`faiai`j`f`f`f`f`f`f`f`f`o`t`e`m`k`t`t`t`tab`k`c`waeak`l`l`l`l`l`l`l`l`i`i`l`l`i`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`l`i`l`l`l`l`g`l`l`l`la``f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`t`wak`i`g`g`d`g`g`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`m`l`g`g`g`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`t`kab`t`t`t`k`e`yagae`l`f`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m`wae`i`n`f`f`f`f`f`f`f`f`f`f`f`t`t`t`t`t`tab`k`m``ae`i`l`g`l`g`r`f`f`f`f`f`f`f`f`f`f`a`t`t`t`t`k`e`y`w`w`````y`y``agak`iah`f`f`f`f`f`f`f`f`f`f`f`f`a`t`t`c``agaeaeaeagah`f`f`f`f`f`f`f`f`f`f`o`t`t`tab`e`c`wag`w```y`y`y`wae`i`i`l`i```a`f`f`f`f`f`f`f`f`f`f`f`f`f`f`q`o`t`kae`i`lakakae`w```c`m`m`c``agak`l`v`f`f`f`f`o`o`oaj`f`f`f`f`f`f`f`f`f`f`f`f`f`f`a`tab`````m`kab`t`tabab`e`y`wae`i`l`l`l`l`l`l`l`l`l`l`i`i`l`l`i`l`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`l`i`l`l`l`l`l`l`l`l`l`l`g`lag`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`wae`l`g`g`g`g`g`g`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`e`i`l`l`g`d`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tab`t`t`tab`k`e``agak`l`l`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tab`e`cagak`i`l`m`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tab`k`c`wae`l`l`g`g`l`l`i`a`q`q`f`f`q`a`o`t`t`t`t`t`tab`e`c`c`y`y`c`c```wak`i`i`lak`a`q`f`f`f`f`f`f`q`o`t`t`t`k`m`c```w`w`````y`u`a`f`f`f`f`f`f`a`t`t`t`t`tab`e`m`y`y`y`c`c`y``aeak`i`l`l`lakae`e`o`q`f`f`f`f`f`f`f`f`q`a`o`tab``aeaeaeaeae`w```y`c`m`m`c``agakak`ial`f`f`f`tab```z`mab`o`q`f`f`f`f`f`f`f`f`q`o`t`t`cakae`w`m`k`t`t`tab`k`m``aeak`i`i`l`l`l`l`l`l`i`l`l`l`l`l`l`i`i`l`i`l`i`i", -"`i`i`i`i`i`i`l`i`i`l`l`i`l`l`l`l`g`l`g`l`l`g`l`g`l`l`l`l`i`iakaeag```y`m`kab`t`t`tab`k`m``aeak`i`l`l`g`g`g`g`g`g`g`g`l`l`i`iakaeag`c`eab`t`t`t`t`t`t`t`t`t`t`tab`e`c``agakak`i`l`i`g`l`g`g`g`l`g`gakakag```c`eab`t`t`t`t`t`t`t`t`t`t`tab`e`y`wak`i`i`l`g`l`l`l`i`lakakakakaeag`w`w```y`m`e`kabab`t`t`t`t`t`t`e`c`wae`i`l`l`g`g`l`l`lakag`y`mab`t`t`t`t`t`t`t`k`e`yag`i`l`g`g`g`g`g`l`iak```m`kab`t`t`t`t`t`tab`m`yagak`i`l`g`g`l`g`l`g`z`m`t`t`t`t`t`t`t`t`t`t`tabab`e`m`m`c`c`y`waeak`i`l`i`ial`cab`o`o`o`o`t`t`t`t`t`tab`k`e`m`c`c`c`m`c`caa`k`o`o`o`t`t`t`t`t`t`t`t`t`k`k`m`m`c`c`y``agak`i`l`l`g`l`iae`b`y`k`t`t`o`o`o`o`t`t`t`t`t`k`c`y`````w`````y`c`m`m`m`c``agae`i`l`l`i`x`o`oabak`iae```m`k`t`t`t`o`o`o`o`t`t`t`m```l`lakag`y`eabab`tab`k`e`y`waeak`i`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`i`i`i`i`l`l`i`l`l`l`l`g`l`l`l`l`g`l`l`i`l`iakae`w```c`m`kabab`t`t`tab`k`e`y`wagaeak`i`l`l`g`g`g`g`g`l`l`iakaeaeag```c`kab`t`t`t`t`t`t`t`t`t`t`tabab`e`c`y`wagaeakak`l`i`l`l`l`l`lakakag`w`c`m`kab`t`t`t`t`t`t`t`t`t`t`tab`k`m```waeaeakakakakakaeakaeagag`w`w```y`c`m`e`k`kab`t`t`t`t`t`tabab`e`yagak`i`l`g`l`g`g`l`lakag`c`eabab`t`t`t`t`tab`k`m``ae`i`l`g`g`g`g`g`iakag```m`k`t`t`t`t`t`tab`k`m``ae`i`l`g`l`g`g`l`l`l`iakagaa`eab`t`t`t`t`t`t`t`tabab`e`e`m`y`wagak`i`l`g`g`iakae```cab`t`t`t`t`t`t`t`t`tabab`k`e`e`e`e`c`y``agag`u`e`kab`t`t`t`t`t`t`tabab`k`e`m`c`yagaeak`l`l`g`g`g`iakae``aa`eabab`t`t`t`t`t`t`tab`k`e`e`m`c`m`m`m`e`e`e`m`c``agaeak`i`l`g`g`i`wagae`l`iag```e`kab`tab`k`k`m`c`yak`i`i`i`l`iae`w`c`e`kababab`e`c``ae`i`i`i`l`l`l`l`l`l`g`l`l`l`i`l`l`i`i`l`i`l`i`i`i", -"`i`i`i`l`i`i`l`i`l`l`i`i`l`l`l`l`l`l`l`g`i`l`l`i`g`l`iakaeag`w`y`c`e`kabab`t`t`t`t`tab`k`m`y```wagak`i`l`g`g`g`g`l`iakaeagag```y`c`e`kab`t`t`t`t`t`t`t`t`t`t`t`tab`k`e`c`y```wagaeak`i`i`l`i`iakag`w`y`c`e`kab`t`t`t`t`t`t`t`t`t`t`t`t`t`k`e`m`y```w`wagagag`w`w`w`w```y`y`c`m`e`e`k`kabab`tab`t`t`t`t`t`t`k`m`yaeak`i`l`l`l`g`g`l`lak`w`c`eab`t`t`t`t`t`tab`e`c`wak`i`g`g`g`g`g`l`iakag`y`eabab`t`t`t`t`tab`k`c`wae`i`l`g`g`l`l`g`g`l`lakag```e`k`t`t`t`t`t`t`t`tabab`k`m`c``agak`i`l`g`i`g`l`lakag```m`kab`t`t`t`t`t`t`t`tababab`k`e`m`y``agaeaeag`y`e`k`t`t`t`t`t`t`tabab`k`e`c`y`waeak`i`l`g`g`g`g`g`iakae```c`eabab`t`t`t`t`t`t`t`tab`k`k`k`e`k`k`k`e`e`c``agakak`i`g`l`i`l`l`l`g`g`lakag`y`mababababab`e`u`y`wagaeaeakakae`w`y`m`kabab`k`e`c``agakak`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`i`l`i`i`l`i`l`i`i`l`l`l`g`l`g`l`g`l`l`lakae`w`y`c`e`e`kababababababab`k`k`e`m`c`y`wagak`l`g`g`g`g`i`iakag`w`y`y`m`m`k`kababab`tab`tab`tabababababab`k`k`e`m`c`c```waeak`i`l`iakag```y`c`m`k`kabababab`tab`tab`tababababab`k`k`e`m`c`y`y`y`y`y`y`y`c`c`c`c`m`e`e`k`kababababababababababab`k`e`c`wae`i`g`g`l`g`l`l`l`iae`w`c`e`kabababababab`k`m`yagak`l`g`g`g`g`g`l`iae`w`y`e`kabababababab`k`m`yagak`i`l`g`l`g`l`g`g`g`l`iae```c`eab`t`t`t`t`tababab`e`m`c``agak`i`l`l`g`l`g`l`l`iae`w`y`e`kab`t`t`t`t`t`t`tabab`k`e`m`y`waeak`iakag`w`c`eab`t`t`t`t`t`tab`k`e`m`y`wakak`i`l`g`l`l`g`l`g`l`iaeag```c`m`kabab`t`t`t`t`t`t`tabababab`k`k`e`m`c``agae`i`lak`d`g`l`l`g`l`g`l`iakag`y`e`kabab`k`k`e`e`c`y```wagag`w```y`m`e`k`k`k`e`c``agae`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`i`i`l`i`i", -"`i`i`i`i`i`l`l`l`i`l`l`l`i`l`l`l`l`l`l`g`g`l`g`l`l`l`lakag```y`m`m`e`k`e`k`k`k`k`k`k`e`e`e`m`c`y```wae`i`l`g`g`l`l`iaeag```y`c`m`m`e`e`e`k`k`e`k`e`k`k`k`k`k`k`k`k`e`e`e`m`m`c`y``agak`i`i`iakag```y`m`m`m`e`e`e`k`k`e`k`e`k`e`k`k`k`e`k`e`e`m`m`c`c`c`c`c`c`c`c`c`m`m`m`m`m`m`e`e`e`e`e`k`k`k`k`k`e`k`e`e`m``agak`i`g`g`g`l`g`g`l`iae`w`c`m`e`k`k`k`k`k`e`m`c`waeak`l`g`g`g`d`l`l`iakag`y`m`e`e`k`k`k`e`e`m`c``aeak`l`l`l`l`g`l`l`g`g`l`iakag`y`m`e`kababab`kab`e`e`m`y`wae`i`i`g`l`g`l`g`i`g`i`iakag`w`y`m`k`kababababababab`k`e`m`y``aeak`i`l`iakag`y`m`eababababab`k`k`e`c```wae`i`l`l`i`g`g`g`g`g`l`l`l`iakag`w`y`m`e`k`kabababababababab`k`k`e`m`c`y`wagak`i`l`g`g`g`l`g`l`g`l`g`l`iakag`y`m`e`e`e`e`m`e`e`m`c`c`y`y`y`y`c`m`m`e`e`e`m`y``agae`i`i`l`i`l`l`l`i`l`l`l`l`i`i`l`l`l`l`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`l`l`i`l`l`i`i`l`l`l`l`l`g`l`g`l`l`l`iae`w```y`c`c`c`c`c`c`c`c`c`c`c`c`y`c`y`y`wagak`i`l`g`g`g`l`iakag```y`y`y`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`c`y`y`y```wagak`i`i`iakag`w```y`y`c`c`c`c`y`c`c`c`c`c`c`c`c`m`c`c`c`c`c`c`y`y`y```y`y`y`y`y`y`y`c`c`y`c`m`c`c`c`c`c`c`c`m`c`c`c`y`y``agae`i`l`g`g`l`g`l`l`l`iakag```y`c`c`c`c`c`y`y`y``agak`i`l`g`g`g`g`l`l`lakae`w`y`c`c`c`c`c`c`c`y`wagak`l`l`l`l`l`g`l`l`g`l`l`iakae`w`y`c`m`e`e`e`e`m`c`y```waeak`l`l`g`g`d`d`g`g`l`l`i`iakag`w`y`m`m`e`k`k`k`k`e`e`m`c``agaeak`g`l`g`l`iak`w`y`m`e`k`k`k`k`e`m`y``agae`i`l`l`g`l`g`i`g`g`l`l`l`l`l`iakae`w```y`m`e`e`k`k`k`k`k`k`e`e`m`c`y``agaeak`i`i`g`l`g`g`l`g`l`g`g`g`l`iakag```c`c`c`c`y`y`y`c`c`c`c`c`c`c`y`c`m`m`m`c`y``agaeak`i`l`g`g`l`l`i`l`i`l`l`l`l`l`l`l`l`i`i`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`l`i`l`i`l`l`l`l`l`l`l`i`l`l`l`g`g`g`l`g`l`i`iakaeag`w`w`w`w`w`w`w`wag`w`wag`wag`w`wagaeakakak`g`g`g`g`l`lakakaeagag`wag`w`wag`w`w`w`w`w`w`w`w`w`w`w`w`w`w`w`w`w`wagagaeae`i`i`l`iae`cagag`w`w`wag`w`w`w`w`w`m`c`w`w`wagag`w`w`w``ag`w`w`wag`w``ag`w`w`c`m```m`w`w`w`y`w`w`w`w`w`w```c`w`w`w`wagaeakak`l`l`l`g`g`g`l`l`i`lakae`m``agag`wag`w`wagagaeak`i`l`g`g`g`g`g`g`l`l`i`c`cagagag`w`w`w```cagaeakakak``ak``ak`l`l`l`g`g`l`l`i`iaeag`````y`c`y`y`````waeakak`i`l`l`g`g`g`g`gagag`g`g`g`iakaeag```y`c`m`c`c`c`y`y```wagak`i`w`yak`g`l`lakakag```y`c`m`c`c`y``agaeak`i`i`l`g`g`g`g`l`l`l`g`gak`y`l`g`i`iakaeag`````c`m`c`m`m`c`c`c`y`y`wagaeakak`l`l`l`g`g`g`g`g`g`l`l`l`l`g`lakag`w```````w`wag`w`w```y`y`y`y`y`c`y`y`y`y```wagaeak`i`i`l`g`l`l`g`l`g`g`i`l`l`l`l`i`i`l`l`l`i`l`i`i`i`i`l`i", -"`i`i`i`l`i`i`i`l`i`l`i`l`i`l`l`l`l`l`l`l`l`l`g`g`l`g`g`l`iakakakakakakakakaeakaeakakakak`iakakakak`i```i`l`g`g`l`l`l`i`iakakakakakakakakakakakaeakakakakakakakaeaeakaeakaeakaeakak`i`i`i`l`l`iagakakakakaeakakakakakae`eaeakakakaeakakak`yaeakaeakaeakag``akakak`w`m`w`eakakakak``akak`iakakak``akakakakak`i`i`g`l`g`d`g`l`g`g`g`l`l`l`iak`waeakakakakakagakak`i`l`l`g`g`g`g`g`g`l`l`i`iagakakak`iak`waeak`cag`i`l`l`e`l`eak`g`l`l`l`l`l`l`i`iakakaeagag`w`wagaeaeakak`i`i`l`g`g`g`l`g`l`g`gae`g`l`g`g`l`i`waeag`w```````w`wagaeakak`i`l`l`gae`g`g`g`l`iakaeag`w`w`w`wagagak`i`l`l`g`g`g`g`g`l`g`l`g`g`l`gae`l`l`l`l`i`iakaeagag```c```w```wagagagaeak`i`l`l`g`g`d`g`g`g`g`g`g`l`g`g`g`g`l`lakae`wagaeaeakakakaeaeagag`w`w```w`w`wagagaeaeak`i`l`l`l`l`l`g`l`g`l`i`g`l`l`l`i`l`l`i`i`l`i`l`l`i`l`i`i`i`i", -"`i`i`i`i`i`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`i`i`lak`iak`i`i`l`i`i`i`i`l`l`i`i`i`i`i`l`w`g`g`g`g`laeae`l`l`laeakakaeak`i`iaeakakaeag`l`i`i`l`iaeag`i`l`iaeaeaeaeak`l`l`l`lakae`iae`l`l`l`i`i`i`i`i`i`i`w```i`i`i`i`l`i`i`i```l`i`iak`i`i```i`i`i`iae`yak`m`i`i`i`i`w`i`i`l`i`l`iakag`i`i`i`i`l`l`d`l`l`g`gakak`iaeae`l`i`i`laeaeag`i`i`lak``aeagae`l`gaeakae`iakak`g`l`l`lae`i`i`i`l`gag`i`l`i`i`l`l`g`m`l`y`i`g`l`g`g`g`l`g`l`g`l`i`i`iakakakakak`i`i`l`i`g`l`l`g`l`l`g`g`g`gae`iae`i`l`lak``ag`w`waeaeagag`wagakag`i`i`g`l`gae`g`g`g`l`l`i`iakakae`wag`waeakag`g`l`g`gakae`i`g`g`l`iakae`lae`g`l`l`iaeae`lakakakak``aeaeakaeakakak`i`i`l`l`g`l`g`g`d`g`l`g`g`g`g`l`g`g`l`g`g`iakak`iak`i`i`i`i`i`iakakaeaeaeaeakaeak`iak`i`i`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`i`i`l`i`l`i`i`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`l`l`l`l`l`l`l`l`l`g`g`g`l`g`g`g`g`g`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`g`g`g`l`l`g`lakak`g`g`l`laeaeaeag`g`lae```waeagag`lak`w``aeae```l`lae``aeag```i`lak``agaeagak`g`laeagae`w```i`l`l`l`l`l`l`l`l`l`w`i`l`l`l`l`l`l`gakak`l`i`l`l`i`lag`g`i`l`l`i`w`l`w`l`g`l`g`lag`l`g`g`g`g`lag`l`g`g`g`g`g`g`d`g`g`gak`w``aeae```l`l`l`yaeae```g`gak`waeaeak`g`gae`wae``aeagak`g`l`lae`g`g`g`l`gak``ae`i`g`g`g`l```g`w`l`g`i`g`l`g`l`g`g`g`l`l`i`i`l`i`l`i`l`i`l`l`l`g`l`g`g`g`l`g`l`g`g`wagaeae`i`g`i`wagagagak`iag`yag``aeaeag`l`g`g`gae`g`l`g`g`g`l`l`i`i`iae``ae``aeaeae`g`g`wagae`wae`l`gaeagae`w```g`lae`waeae```i`i`i`iaeae`i`i`i`i`l`l`l`l`g`g`g`g`g`l`g`g`g`g`l`g`g`g`l`g`g`l`l`l`i`i`l`i`l`l`g`l`l`l`i`i`i`i`iak`i`i`i`i`i`l`l`l`g`l`l`g`l`l`l`g`l`l`l`l`l`l`l`l`i`i`i`i`l`l`i`l`i`l`i`i`i", -"`i`i`i`l`i`i`i`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`g`g`g`l`l`g`d`l`l`d`g`l`g`l`g`l`g`g`l`g`g`g`l`g`g`g`gae`g`g`g`g`gag```wag`g`g`gag`g`g`gae`l`gag`l`l`l`iae`l`wakaeaeag`w`l`gae`g`g`lae`l`gag`g`g`lag`l`l`l`l`l`g`l`l`l`g`g`l`g`g`g`g`l`l`lae`l`l`g`l`l`l`lae`l`g`l`g`g`g`l`g`l`l`l`g`gag`l`l`g`l`g`l`iag`g`g`l`g`g`g`g`g`l`g`dag`l`g`l`iak`l`gae`g`gae`g`g`dae`l`g`g`g`g`g```gak`g`lak`l`g`gae`g`l`g`g`g`g`l`gagak`g`l`g`l`l`g`g`g`l`l`l`l`g`g`g`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`g`g`l`g`lak`g`l`lae`l`lae`g`l`i`l`l`l```lae`g`lak`l`g`l`lae`g`g`l`g``````````ak`l```lae`g`gak`gak`i`d`g`gae`g`lag`g`l`gag`g`g`wakaeakag`w`l`g`l`gae`l`l`l`l`l`l`l`g`g`l`g`g`g`g`g`g`l`g`g`l`g`l`g`l`l`g`g`l`l`i`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`i`l`l`l`g`g`l`g`l`g`g`l`g`l`l`g`l`l`l`l`l`l`l`i`l`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`i`l`i`l`l`l`l`l`i`l`l`g`l`g`g`l`g`l`l`l`g`l`l`g`g`g`g`l`g`l`l`l`g`g`g`g`l`l`g`g`gae`g`g`g`lakak`g`gag`g`g`gag`g`g`lae`l`gag`g`g`l`iae`g``aeakaeae`i`l`lae`l`g`gae`g`gae`g`g`lak`g`l`l`g`l`l`g`g`l`g`g`g`g`g`g`l`g`g`lak`g`l`l`l`l`l`lae`g`g`l`g`l`g`l`g`l`l`l`l`g`i`w`g`g`g`g`g`l```g`g`g`g`d`g`g`g`l`g`gag`l`g`g`iae`g`gae`l`lae`g`g`gae`g`l`g`l`g`g```gae`g`lak`l`g`gae`g`g`g`g`g`i`l`g`iae`g`l`g`g`l`l`g`g`l`g`g`l`l`l`l`g`g`l`g`g`g`g`g`g`g`g`l`g`l`g`l`g`l`g`g`g`g`g`gae`g`l`gae`g`gae`g`i`l`l`l`l```lae`g`gae`l`g`l`lae`g`l`g`g`l`g`g`l`g`l`l```gae`g`dak`gae`l`g`g`lae`g`gae`g`l`gae`l`l``akaeakaeak`g`l`g`gae`g`g`g`g`g`g`g`g`g`g`g`l`g`g`g`g`g`g`g`l`g`l`g`g`l`l`g`g`l`g`g`l`l`g`l`g`g`l`g`l`g`g`g`l`g`l`l`l`l`l`g`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`i`l`l`i`i`i`i", -"`i`i`i`i`i`i`l`i`i`l`i`l`l`l`l`g`l`l`l`l`l`g`l`g`g`g`l`l`g`g`g`l`g`l`l`g`g`g`g`g`l`g`g`g`g`l`l`l`l`lae`g`g`gag`g`g`iag`l`l`g`y`i`l`iae`g`g`wag`g`l`w`l`lagag`l`g`l`i`l`gae`l`l`gae`g`g`w`l`gak```l`g`g`l`g`l`g`l`g`l`g`l`g`l`g`g`l`l`l`iak`g`l`l`l`l`lag`l`l`g`l`g`l`l`l`l`g`g`l`l`lag`g`l`g`g`g`gakak`g`g`g`gae`w`g`l`l`gagae`g`iag`g`l`lak`g`gae`g`g`dag`g`l`l`i`g`g`w`gae`g`lak`l`g`gae`g`l`g`l`g`wagagae`l`g`g`l`l`l`g`l`l`g`g`l`l`l`g`l`l`g`l`g`l`g`g`g`l`d`i``ak`g`l`l`g`l`g`l`g`l`g`gae`g`g`lae`l`gae`i`l`l`i`l`g```gae`g`lak`l`l`l`gae`l`l`l`l`g`g`g`g`g`g`g```gak`g`gak`g`g`w`i`gakae`g`g`w`i`gak```g`gagae`g`g`l`i`l`g`lag`g`g`g`g`l`l`g`l`l`l`l`g`g`g`g`g`g`l`g`g`l`g`g`l`l`l`g`l`l`g`l`l`l`g`l`l`i`g`l`g`g`g`g`g`l`d`g`g`g`g`l`l`g`g`l`g`g`l`g`g`l`g`l`l`l`l`l`l`l`l`i`l`i`i`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`i`l`i`i`l`l`l`l`l`l`l`l`l`l`g`g`g`g`l`g`g`g`l`g`g`l`g`g`l`g`g`g`g`g`g`g`g`l`l`l`gag`g`l`g`l```waeaeae`l`lakag`wag`g`g`gakak`w`w`l`l`l`gak`w``ae`l`lae``ae`lae```l`g`gag``aeak`w`l`l`g`l`l`l`l`g`l`g`l`g`l`g`g`g`g`l`lag`l`g`l`l`l`lae`i`g`l`g`g`l`l`l`l`l`l`l`g`l`iag`l`g`g`g`g`g`w`l`g`g`gak`w`g`g`l`lakak``ag`i`l`g```w`g`i```w`g`g`i`w`w`wak`l`w```gaeak`g`w`lak```w```wak`g`g`g`gak`l`l`g`l`g`l`l`l`g`g`l`l`l`l`l`l`l`g`l`g`g`g`g`g`l`g`g`i`wak`g`l`l`l`g`l`g`g`l`lae```i`g`w`wak`g`gag````ae`lag```iakae`gagak`i```w````ae`l`l`l`l`g`g`g`gag`wakakag`lae`i`g`iag``ae`g`l`g`g`w`wagak`w`g`l`i`w`wak`l`l`l`lag`g`g`g`g`g`g`g`g`l`g`g`l`g`l`g`g`g`g`g`l`l`g`l`g`l`l`l`g`g`l`l`l`l`g`l`l`g`l`l`g`l`g`l`g`g`l`l`l`l`g`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`i`i`i`i`l`i`l`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`l`i`i`l`l`i`l`l`l`l`g`l`l`l`g`l`l`g`g`g`g`l`l`l`g`l`g`g`g`l`g`g`l`g`g`g`g`l`l`l`l`g`lakak`g`g`g`l`l`g`l`l`g`lae`g`l`g`g`g`lak`g`l`g`g`g`l`l`l`l`g`l`l`l`l`g`l`g`l`l`g`l`g`g`l`g`g`l`l`g`l`l`l`g`l`l`g`g`g`l`l`l`l`g`l`g`lakak`l`l`l`l`l`lae`g`g`l`g`l`g`l`l`l`l`l`l`g`l`i`l`l`l`l`g`dak`l`l`g`l`l`g`g`g`g`lae`g`g`l`g`g`g`g`l`l`g`g`g`g`l`g`l`l`g`g`l`g`l`g`g`g`l`l`g`l`l`g`g`l`g`l`g`g`gak`g`g`l`g`g`l`l`l`l`l`g`l`l`l`g`g`l`g`l`l`l`l`g`g`l`g`l`l`l`l`l`g`l`l`l`l`l`g`g`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`g`l`g`l`l`g`g`l`l`l`l`g`l`l`g`l`g`l`l`l`l`g`g`g`l`l`g`g`l`g`g`g`g`l`l`l`g`l`g`g`g`g`g`g`l`g`l`g`l`l`g`l`laeak`g`l`l`g`g`l`l`g`l`l`g`l`l`g`l`g`g`l`g`g`g`g`g`g`l`l`l`l`l`g`l`l`l`l`g`l`g`l`g`l`g`g`g`l`g`g`l`l`g`l`l`l`l`g`l`g`g`l`g`l`l`l`l`l`l`l`l`i`l`i`l`i`l`i`l`i`i`l`i`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`l`l`i`l`l`l`l`g`l`l`l`l`l`l`l`g`g`g`g`l`l`g`l`l`g`l`g`l`g`l`g`g`l`g`g`g`g`g`l`g`g`l`g`l`g`g`g`g`g`g`l`w``ag`l`g`l`gae```w`i`l`l`l`l`l`l`l`l`l`g`l`l`g`l`g`l`g`g`g`l`g`g`l`g`l`l`l`g`g`l`g`l`l`l`l`g`g`l`g`l`g`l`g`g`g`l`l`l`l`l`l`l`l`l`g`g`g`g`l`g`l`g`l`g`l`g`l`g`l`g`g`g`g`g`g`l`l`l`l`l`g`g`g`gae`````i`l`g`l`g`l`g`g`l`g`l`g`g`g`l`g`l`l`l`g`l`g`g`l`g`g`g`g`g`l`l`g`l`g`g`l`g`g`g`g`l`l`l`g`l`l`l`l`l`g`g`l`l`g`l`g`g`g`g`g`g`g`g`l`g`l`g`l`g`l`g`g`l`g`l`g`g`l`g`l`g`g`l`g`l`g`l`l`l`l`l`l`g`l`g`g`g`g`g`l`g`l`l`l`g`l`g`l`g`l`g`g`g`g`g`l`l`g`l`l`l`g`g`g`g`g`l`l`g`l`g`l`l`l`g`g`g`g`g`g`g`l`g`g`g`l`l`g`g`g`l`g`l`g`g`g`g`l`g`g`l`l`g`g`l`g`g`l`l`l`l`l`g`l`l`l`l`l`g`l`l`g`l`g`l`g`l`g`g`g`l`g`g`l`l`l`g`g`l`g`l`l`l`g`l`g`l`l`l`g`l`l`l`l`l`i`i`l`i`l`i`l`i`l`i`i`i`i`i", -"`i`i`l`i`i`l`i`l`i`i`i`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`g`g`g`g`l`l`g`l`g`l`g`l`g`g`l`g`g`l`l`l`l`g`l`l`l`g`l`g`l`g`l`g`l`g`l`g`l`l`l`g`g`l`g`l`l`l`g`l`g`g`l`l`l`l`l`g`g`l`l`l`g`g`l`l`l`g`l`l`l`l`l`g`l`l`l`g`l`l`g`l`g`l`g`g`l`g`l`l`g`l`l`g`l`g`l`l`l`l`g`g`l`g`g`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`g`l`l`g`l`l`g`g`g`g`g`l`l`g`l`g`l`g`l`g`g`g`g`l`g`l`l`g`g`l`l`g`l`l`g`g`g`l`g`l`g`g`l`l`l`g`g`l`g`l`l`g`l`l`g`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`l`l`l`l`g`g`g`l`g`l`g`l`l`g`g`g`l`g`l`l`l`l`l`g`l`g`g`g`g`l`l`l`l`l`l`l`l`l`g`l`l`g`g`g`g`l`l`l`l`l`l`g`d`g`g`l`l`l`l`g`g`g`l`l`g`l`g`l`g`l`l`l`g`l`l`l`l`g`l`g`g`l`g`g`l`g`l`l`l`l`g`g`g`l`g`l`g`g`l`g`l`l`l`l`l`l`g`g`l`l`g`l`g`g`l`g`l`l`l`l`l`g`g`l`l`l`g`l`l`l`g`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`l`i`l`l`i`i", -"`i`i`i`i`i`i`i`l`i`l`i`i`l`l`l`l`l`g`l`l`l`l`l`l`l`g`g`g`g`g`g`l`l`l`l`g`g`l`g`g`g`g`g`l`g`l`l`g`g`l`l`l`g`g`l`g`l`l`l`l`g`g`l`g`l`g`g`l`g`g`l`l`g`l`g`g`l`g`l`l`l`l`g`g`g`l`l`g`g`g`l`g`l`l`g`l`l`l`l`l`l`l`g`l`l`l`g`l`l`g`l`g`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`g`l`g`g`l`g`g`l`l`l`g`l`l`l`g`g`g`g`g`g`l`l`l`l`g`l`g`l`g`g`g`g`l`l`g`l`l`g`g`l`l`g`g`l`g`l`l`l`l`l`g`g`g`l`g`g`g`l`g`l`g`g`l`g`g`l`l`l`g`l`l`g`g`l`g`l`g`g`g`g`l`g`l`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`l`g`l`g`l`g`l`l`l`l`l`l`l`g`l`g`l`g`l`l`g`l`g`l`g`g`l`g`g`g`g`l`g`l`l`l`g`g`l`g`g`g`l`g`l`l`l`g`g`l`l`l`g`g`g`l`l`l`l`l`g`g`l`g`g`g`g`l`l`g`l`l`g`l`g`g`l`l`l`g`l`l`g`g`l`g`l`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`l`l`g`g`l`l`l`l`l`i`l`i`i`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`l`i`i`l`i`i`l`i`l`i`l`l`l`l`l`l`l`l`g`g`l`l`l`l`l`g`g`g`l`g`l`g`l`g`l`g`l`g`g`g`l`l`g`l`l`g`g`g`l`l`l`g`l`g`l`g`l`i`g`g`g`g`g`g`l`l`g`l`g`l`l`g`l`g`l`g`l`l`l`g`l`l`g`l`l`g`l`g`l`g`g`l`g`l`g`l`l`l`l`l`l`l`l`l`g`g`l`l`g`g`g`l`l`l`l`l`g`l`l`l`l`l`l`g`l`g`l`g`l`g`g`l`g`l`l`l`l`l`g`l`l`l`g`l`l`g`l`g`l`l`l`l`l`g`g`g`l`g`g`l`g`g`l`g`g`g`l`g`l`l`l`g`l`g`g`l`l`l`l`g`l`g`l`g`l`l`l`g`g`g`g`g`l`l`g`l`l`l`l`l`g`g`g`l`l`l`l`g`l`g`l`l`l`g`g`l`g`l`g`g`g`l`g`l`l`l`l`g`l`l`l`l`g`g`l`g`l`g`g`l`l`l`l`l`l`g`l`l`l`l`l`l`l`g`g`l`g`l`l`g`l`l`g`l`l`l`g`l`l`l`g`l`l`g`g`l`l`l`l`l`l`g`g`g`l`l`g`l`g`g`l`g`g`g`g`g`l`g`l`g`l`g`g`g`l`l`l`g`g`g`l`l`l`l`g`g`g`l`g`g`l`g`l`g`l`l`l`l`g`g`l`g`l`l`l`g`l`g`l`l`g`g`g`l`l`g`g`g`l`l`g`l`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`l`i`l`l`l`l`l`i`i`i`i`l`l`i`l`i`i", -"`i`i`i`i`i`i`i`l`i`i`l`i`l`l`l`l`l`l`l`g`l`l`l`g`l`g`l`l`l`g`g`g`l`g`g`l`g`g`g`g`l`l`g`l`g`g`g`l`l`l`g`g`l`l`l`g`g`l`g`l`l`l`l`g`g`l`g`l`g`l`l`g`l`l`g`l`g`l`g`l`l`l`g`g`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`g`g`l`g`l`g`l`l`l`l`l`g`g`l`l`l`l`l`l`g`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`g`l`g`l`l`g`l`l`l`g`g`l`l`g`g`l`g`g`l`g`l`g`g`l`g`g`l`l`l`g`g`g`l`l`l`g`g`l`g`l`l`l`l`g`g`l`l`g`g`l`g`g`l`g`g`l`g`l`g`l`l`l`g`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`g`g`g`g`l`l`l`l`g`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`g`l`l`g`l`l`l`g`g`g`l`g`g`l`g`l`g`g`l`l`g`l`g`g`l`l`l`l`g`l`g`l`l`g`l`g`l`l`l`l`l`g`g`g`l`l`g`l`l`g`l`l`g`g`l`g`l`l`l`l`g`l`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`g`g`l`g`g`g`g`l`l`l`l`i`l`l`l`i`l`l`i`i`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`i`l`i`l`i`l`i`l`l`g`l`l`l`l`g`l`l`l`l`l`l`g`l`g`l`l`g`l`l`l`g`g`l`g`l`l`l`g`l`l`l`l`l`l`g`g`l`g`l`l`g`l`l`l`l`l`l`g`g`g`l`l`g`l`g`l`l`l`g`l`g`l`l`l`l`g`l`g`l`l`g`g`l`l`l`l`g`l`l`l`l`l`l`l`g`l`g`l`g`l`l`l`g`l`g`g`l`l`l`g`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`g`g`l`l`l`l`l`l`g`g`l`l`g`l`l`g`g`g`l`l`g`l`l`g`g`l`l`l`l`l`g`g`g`l`l`l`g`g`l`l`l`l`l`g`g`l`l`l`g`l`l`l`l`g`l`l`g`l`l`l`l`g`g`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`g`l`g`l`l`l`l`l`g`l`l`l`l`l`g`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`g`l`l`l`l`l`l`g`g`l`l`g`l`l`g`g`l`g`g`l`l`l`g`g`l`g`l`l`l`l`g`l`g`l`g`g`l`l`l`l`l`l`g`g`g`l`l`g`l`g`l`l`g`l`l`g`l`l`l`l`g`g`l`l`l`g`l`l`l`l`g`g`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`g`l`l`l`l`i`l`l`i`l`i`l`i`i`l`l`i`l`i`i`i", -"`i`i`i`i`l`i`i`i`i`i`i`l`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`l`g`l`g`g`l`g`g`l`l`g`l`l`g`g`l`l`g`g`g`l`l`l`g`g`l`g`l`g`l`g`g`l`l`g`l`l`g`g`g`l`l`l`g`l`l`l`l`l`g`g`l`l`l`g`l`l`g`l`l`l`l`l`g`l`l`l`l`g`l`l`l`i`l`l`l`l`l`g`l`l`l`g`l`g`g`l`i`l`l`l`l`l`l`l`l`l`l`g`i`l`l`l`l`l`lak`l`i`l`l`l`g`l`g`g`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`g`g`g`l`g`l`l`l`g`l`l`g`l`l`g`g`g`l`l`l`g`l`g`l`g`l`l`g`i`l`g`l`l`g`g`g`g`l`l`l`g`l`l`l`l`g`l`g`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`l`g`l`l`l`l`l`l`l`l`g`l`g`g`g`l`g`l`l`l`l`l`l`l`l`l`l`l`g`g`g`l`g`l`g`l`l`l`l`g`g`l`l`g`l`g`l`g`l`g`g`l`l`g`l`l`g`l`g`l`g`l`l`g`g`g`l`l`l`g`l`l`l`l`g`l`g`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`g`l`l`l`g`l`g`i`l`l`l`i`i`i`l`i`i`i`l`i`l`i`i`i", -"`i`i`l`i`i`i`i`l`l`i`l`i`i`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`g`g`g`g`l`g`g`l`l`g`l`l`l`l`l`l`l`l`g`l`g`l`l`g`l`g`l`l`l`g`g`l`l`g`l`l`l`l`g`g`l`i`g`l`l`l`l`l`l`g`g`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`lak`l`i`iagaeaeae`l`l`lag`g`g`l`l`l`lae`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`iag`l`g`g`l`g`g`l`g`g`l`l`l`l`l`l`l`l`l`l`g`l`iagak`l`g`l`g`l`lae`i`l`l`l`laeag`iag`g`l`l`l`l`l`i`l`l`l`g`g`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`lagak`l`l`l`l`g`l`l`l`l`l`l`i`l`l`l`i`l`l`l`l`lagag`l`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`lakae`l`l`g`g`l`g`l`g`l`gak`l`l`l`l`l`lak`g`l`l`g`l`g`g`l`g`l`l`g`g`l`l`g`l`l`l`l`g`g`l`l`l`l`l`i`l`l`l`g`g`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`i`i`l`l`i`l`l`i`l`l`i`i`i`i`i`l`i", -"`i`i`i`i`i`l`i`i`i`i`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`g`l`l`g`l`l`l`l`l`l`l`g`l`l`l`l`g`l`g`l`g`l`g`l`g`l`l`g`l`l`g`l`l`g`l`g`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`g`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`lae`i`l`l`lagaeagag`l`l`l`i`i`l`l`l`g`l`lae`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`iak`l`l`l`g`l`g`lak`l`g`l`l`g`l`l`l`l`l`l`l`l`l`lak`l`g`g`l`lae`l`l`w`l`g`lak`wak```l`l`g`l`l`l`l`l`l`l`l`g`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`lak`l`l`l`i`l`lak`g`l`g`l`l`l`l`l`l`l`l`l`l`i`lak`l`l`g`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`lak`g`l`g`g`l`g`l`g`l`lae`l`l`l`g`l`l`iak`l`g`l`l`l`l`g`l`g`l`l`l`g`l`l`l`g`l`g`g`l`l`g`l`l`l`l`l`l`l`l`g`l`g`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`i`l`i`i`l`i`i`i`l`i`l`i`i`i`i", -"`ial`l`i`i`i`l`l`l`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`g`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`l`l`g`l`l`l`l`l`g`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`i`l`i`l`i`l`l`l`l`i`l`l`l`l`l`l`l`l`l`g`l`lag`l`l`i`lagakaeae`l`l`l`lae`l`l`l`l`l`lae`i`l`l`l`l`l`l`l`l`l`l`l`l`lakak`i`l`l`lak`lak`i`g`l`lakaeakak`i`l`iak`iak`lak`i`g`l`l`gak`l`i`l`g`gak`l`l`i`g`l`lakag`i`w`l`l`g`l`l`l`l`l`l`l`l`l`g`l`g`l`l`g`l`g`l`l`l`i`l`i`i`i`l`l`l`l`lakakak`l`l`lakaeakakak`l`lakakak`iakak`l`l`l`lak`l`l`l`l`l`l`l`l`l`l`iakakak`i`iak`l`l`l`lakak`l`l`l`l`lakak`lak`l`g`l`iak`i`l`l`g`g`lae`l`l`l`l`l`lae`l`g`l`g`l`l`l`g`l`l`l`l`l`g`l`l`l`g`l`l`l`l`g`l`l`l`l`l`g`l`l`l`g`l`g`l`l`l`l`g`l`l`l`i`l`i`i`i`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`g`l`l`i`l`i`l`l`i`l`i`l`i`i`i`i`l`i`i", -"`i`i`i`i`l`i`i`i`i`i`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`g`l`g`l`l`l`l`l`l`g`l`l`l`l`g`l`l`l`l`l`g`l`l`l`l`g`l`g`g`g`l`g`l`l`l`l`l`l`l`l`l`g`l`g`l`g`l`l`l`g`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`iak`l`l`i`lae`iakak`l`l`g`l`i`i`l`l`l`l`l`lae`l`l`l`l`l`l`l`l`l`l`l`iagakakaeak`l`lakaeakakak`l`lakaeakak`l`g`iaeaeakaeakae`l`l`l`lak`g`l`l`i`lakaeak`l`l`l`g`lae`lae`g`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`wakakae`l`lakaeakak`i`l`lakagakagakakak`l`i`lak`l`g`l`l`g`l`i`l`l`l`lakagakagakakak`l`iagakakae`i`l`laeakakagae`l`gaeaeakaeae`l`l`g`gak`l`l`l`l`l`g`iak`l`l`l`g`l`i`l`l`g`l`l`g`l`g`l`l`g`l`g`l`l`l`l`l`l`l`i`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`i`i`l`i`l`i`i`l`l`i`i`i`i`i", -"`i`i`i`i`i`i`i`l`l`i`l`l`i`l`l`l`i`i`l`l`l`l`l`i`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`l`l`l`g`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`lak`l`l`i`l`i`l`l`l`l`l`l`l`l`lae`l`l`l`l`l`lak`i`l`l`l`i`l`l`i`l`l`lakakakakakag`g`lak`g`l`lak`l`l`lak`l`l`l`l`gakak`lak`lak`l`l`l`lak`l`l`l`l`l`l`l`lae`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`g`l`l`l`l`l`l`i`l`l`l`l`l`l`lak`l`lak`i`l`lak`i`l`l`l`l`lag`iak`i`lak`l`l`lak`l`l`l`l`iagaeagagag`l`lag`lak`l`lak`lak`l`l`l`iak`lak`i`l`l`gak`l`iaeakakakag`i`l`l`lak`l`g`l`l`l`l`lak`l`l`l`l`l`l`l`l`l`g`l`l`l`g`l`l`l`g`l`l`l`l`l`l`l`l`l`l`g`l`g`l`l`g`g`l`l`g`l`l`l`l`l`l`i`l`l`i`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i", -"`i`i`i`i`i`l`i`i`l`i`l`l`l`l`i`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`i`l`l`l`i`l`i`l`l`l`l`lak`l`l`l`l`i`i`i`l`i`l`i`l`l`lak`i`l`l`l`l`l`iae`l`l`l`l`i`l`l`l`i`laeakakakakak`l`lak`l`l`gak`l`l`lak`l`l`l`l`lakak`gak`lak`l`l`l`lak`l`l`l`lak`l`l`lak`l`g`l`g`l`g`l`l`l`l`l`l`l`l`l`l`g`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`l`l`lak`l`lak`l`i`lak`l`l`l`l`l`lae`lak`i`lak`i`l`lak`l`l`l`l`l`l`l`l`l`l`l`lae`lak`l`iak`lak`l`i`l`lak`lak`l`l`l`lak`g`iaeakakakak`i`l`l`lak`l`l`l`l`l`l`lak`l`l`l`l`l`l`l`i`l`l`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`l`i`i`i`l`i`i`l`i`l`i`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`g`l`l`g`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`i`l`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`iak`i`l`i`l`l`l`i`l`l`l`l`l`l`iak`l`l`l`i`i`lak`l`l`l`i`laeae`i`l`i`iae`i`l`l`i`g`lak`l`l`lak`i`i`lak`l`l`l`l`lakak`l`i`lak`l`l`l`lak`l`l`i`lakakaeakak`g`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`g`l`l`l`lakae`l`l`i`l`l`i`l`l`l`l`l`lak`l`lak`i`l`iak`l`i`l`i`l`lag`lak`l`iak`i`l`lak`l`l`l`l`l`l`l`l`l`l`l`lae`lak`l`lak`lakak`i`lae`i`l`lae`l`lakae`i`lag`i`l`l`i`l`l`l`lak`l`l`l`l`l`lak`l`l`l`l`l`l`i`l`i`l`i`l`l`g`l`l`l`l`g`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`i`l`l`l`l`l`i`l`l`l`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`i`l`i", -"`i`i`i`i`i`i`i`l`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`i`l`l`i`l`l`l`l`g`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`g`l`l`l`l`l`l`i`l`l`i`i`i`i`l`i`l`l`l`i`l`i`l`l`i`i`l`l`l`l`lak`l`l`l`i`i`l`l`i`l`i`l`l`l`iak`i`i`l`l`l`l`iak`l`l`l`laeak`g`l`l`l`iaeaeak`i`l`iaeak`iakaeak`l`lakaeaeak`i`iaeak`lae`l`iak`laeaeaeaeae`l`l`i`lak`l`l`l`l`g`l`g`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`l`l`l`lakae`l`l`l`i`i`i`l`i`i`l`laeae`i`iaeae`l`i`iaeaeae`i`laeae`lakak`lae`lakaeaeaeae`i`l`l`l`l`l`l`l`laeae`lak`i`lae`l`l`iaeae`i`i`i`l`iaeae`iakak`l`lakaeae`i`l`l`l`iak`l`l`l`l`l`lae`l`l`i`l`l`l`i`l`l`i`l`l`i`l`l`g`l`l`l`l`l`l`g`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`i`l`l`l`i`l`i`i`l`l`i`l`l`l`l`l`l`l`l`l`l`i`l`i`l`i`i`i`i`i`i`i", -"`i`i`i`l`i`i`l`i`i`l`i`l`l`i`l`l`l`l`i`l`i`i`i`l`i`i`l`l`l`l`i`l`i`l`i`i`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`i`i`i`l`l`l`l`i`i`i`i`l`l`i`g`l`l`l`l`l`l`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`l`l`i`l`i`i`i`l`i`l`i`l`l`l`l`i`l`l`l`i`i`l`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`l`l`l`l`lak`l`l`l`l`l`l`i`i`i`i`l`l`i`i`i`l`i`l`i`l`i`l`i`i`l`l`l`l`i`l`l`l`l`l`i`l`i`i`l`l`l`l`l`l`i`l`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`l`l`l`i`l`i`i`i`l`i`l`i`i`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`i`l`l`i`l`l`i`l`i`l`i`i`i`l`l`l`i`l`i`l`i`l`i`l`l`l`l`i`i`l`i`i`i`i`l`i`i`l`lae`l`l`l`l`l`lak`i`l`i`l`i`l`l`l`i`i`i`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`l`i`l`l`l`i`l`l`l`l`l`l`l`i`l`l`i`l`l`i`l`l`l`l`i`i`i`l`i`l`i`l`i`l`l`l`i`l`l`l`l`l`l`l`i`l`l`i`l`i`l`i`i`i`i", -"`i`i`i`i`i`i`l`i`l`i`l`i`l`i`i`l`l`l`l`l`l`l`i`l`l`i`l`i`l`l`i`l`l`l`i`l`l`i`l`i`i`l`l`l`l`l`i`l`i`l`i`l`l`l`i`l`i`l`l`l`l`i`l`l`i`l`l`l`l`l`l`i`l`l`i`l`l`l`l`i`l`i`l`i`i`l`l`l`l`l`l`l`i`l`i`i`i`i`l`i`l`i`l`i`l`i`l`i`i`i`l`l`i`l`i`l`i`l`l`l`l`l`l`l`l`l`i`l`i`i`i`i`l`i`i`l`i`l`l`l`i`i`l`l`l`l`l`l`l`i`i`l`l`l`i`l`l`l`i`l`l`l`i`l`i`i`i`l`i`l`l`i`l`l`l`l`l`i`i`i`i`l`l`l`l`i`l`i`i`i`l`l`l`i`l`l`l`l`i`l`l`i`i`l`l`l`l`i`l`i`l`l`l`l`l`l`l`l`l`l`i`i`l`i`i`i`l`l`l`i`l`i`l`l`i`i`l`l`l`i`l`l`l`l`l`l`l`l`l`i`l`i`l`l`i`l`l`l`i`l`l`i`i`l`l`i`l`i`l`i`l`l`l`i`l`i`l`i`l`l`i`l`i`i`l`l`i`l`l`l`l`i`l`l`i`i`l`l`l`l`l`l`l`i`i`i`l`i`l`l`l`l`i`l`l`i`l`i`l`l`i`l`l`l`l`l`i`i`l`l`l`i`l`l`l`i`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`l`i`i`i`i`l`i`l`i`l`i`l`i`l`i`l`i`l`l`i`l`l`l`l`i`l`l`i`l`i`l`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`l`i`l`i`l`l`l`l`i`l`i`i`i`i`i`l`i`l`l`l`l`l`i`l`i`l`i`l`i`i`l`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`i`l`l`i`l`i`i`i`l`i`i`l`i`l`l`l`i`i`l`l`i`l`l`i`l`l`l`l`l`l`l`l`l`l`l`l`l`l`i`l`i`i`l`i`l`i`l`i`l`i`l`i`l`i`l`l`l`l`i`l`i`l`i`l`l`i`i`i`i`l`i`i`i`l`l`l`l`i`l`l`i`l`l`i`l`i`l`l`i`l`i`l`i`i`i`i`l`l`l`i`l`l`l`l`i`l`i`l`i`l`i`l`l`l`l`l`i`l`l`i`i`i`l`i`l`l`l`l`i`l`l`i`l`i`l`i`i`i`i`l`i`l`l`l`i`l`i`l`l`l`l`i`l`l`l`l`l`i`l`l`l`l`l`l`l`l`l`i`l`i`i`l`i`i`l`i`l`i`l`i`i`l`l`i`i`l`i`l`i`i`l`l`l`i`l`i`l`i`l`i`l`l`l`i`l`i`i`l`i`l`l`i`l`l`l`l`l`i`i`l`i`l`i`l`i`l`i`l`l`l`l`l`i`l`i`l`i`l`i`l`i`l`l`i`i`l`l`i`i`i`l`l`i`l`i`i`i`l`l`l`i`l`i`i`l`i`i`i`l`i`l`l`i`l`i`l`l`l`l`l`l`l`l`l`i`l`l`l`i`l`l`l`l`i`l`i`l`l`i`i`l`l`l`l`i`l`i`l`l`i`l`i`l`l`i`l`i`l`i`l`i`i`l`i`l`l`i`l`l`i`l`l`i`i`i", -"`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`l`l`l`l`i`l`i`i`i`i`i`l`i`l`i`l`i`l`l`i`i`l`i`l`i`l`i`l`l`l`i`l`i`i`i`i`i`i`l`i`l`l`i`i`i`l`i`l`i`i`i`l`l`i`l`l`i`l`l`i`i`l`i`l`l`l`l`i`l`i`l`i`i`l`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`i`i`i`i`l`i`l`l`l`l`i`i`l`l`l`l`l`l`l`l`i`i`l`i`i`i`l`i`i`l`i`l`i`l`i`i`l`i`l`l`l`l`i`i`i`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`i`l`l`i`l`l`l`l`i`l`i`i`i`i`i`i`i`l`i`l`l`i`i`l`i`i`l`i`l`i`i`l`l`i`l`i`i`l`i`l`l`i`l`l`l`l`i`l`i`l`i`i`l`i`l`l`i`l`i`l`i`i`l`l`i`i`l`i`i`l`l`i`l`i`l`l`i`l`i`i`i`l`l`l`l`l`i`l`i`l`i`l`i`l`i`l`i`l`i`i`i`i`i`i`l`l`i`l`l`i`l`i`l`i`i`i`l`i`l`i`l`i`l`i`l`i`l`i`l`l`l`i`l`i`l`l`l`i`i`i`i`l`i`i`l`i`i`l`i`l`i`l`i`l`i`l`i`i`l`l`i`l`i`i`l`i`i`l`l`i`l`l`l`l`l`i`l`i`l`l`l`l`i`l`i`l`i`i`i`i`l`i`l`i`i`l`i`l`i`i`l`i`l`l`l`l`i`l`i`l`l`i`l`l`i`i`i`i`i`i`i`i", -"`i`i`i`i`l`i`i`l`i`l`i`l`i`l`i`i`l`i`l`i`i`l`i`l`i`l`l`l`i`l`i`i`i`l`i`i`l`l`i`l`i`l`l`l`i`i`i`l`i`i`i`l`i`l`i`l`l`i`i`i`l`i`i`i`i`i`l`i`i`i`l`i`i`l`i`i`l`l`i`i`i`l`l`l`i`l`l`i`l`l`i`i`i`i`l`i`l`i`l`i`i`l`l`i`i`i`l`l`i`l`i`l`l`i`i`l`i`i`i`i`i`i`i`l`l`i`l`l`i`l`l`l`i`i`l`i`l`i`i`i`i`l`i`i`i`i`l`i`l`l`l`i`l`l`l`l`i`l`i`l`i`l`i`l`l`l`l`i`i`l`i`i`l`i`l`i`l`i`i`l`i`l`i`l`i`i`l`i`i`l`i`i`l`i`i`l`i`i`l`l`i`l`l`i`l`i`i`i`i`l`l`l`i`l`l`i`l`i`l`i`l`i`l`i`l`i`l`i`i`i`l`l`i`l`i`i`i`l`i`l`l`i`l`l`i`l`i`i`i`l`i`l`l`i`l`i`l`i`i`i`l`i`i`i`l`l`i`l`i`l`i`i`i`l`i`l`i`l`i`l`i`l`i`l`i`l`i`i`i`l`i`l`i`l`l`i`i`l`l`i`l`l`i`l`l`i`i`l`i`i`i`l`i`l`i`i`i`i`i`i`l`i`l`i`i`i`l`l`i`l`i`l`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`i`l`i`l`i`i`l`l`i`i`l`i`l`i`l`i`i`l`l`i`l`i`i`i`l`i`i`i`i`i`l`i`l`l`l`l`i`l`i`i`i", -"`i`i`i`i`i`i`i`l`i`i`i`l`i`l`i`i`l`i`l`l`i`l`i`l`i`l`i`l`i`l`l`i`l`i`l`i`l`i`l`l`i`i`i`l`l`l`i`l`l`i`i`l`i`i`i`i`l`i`l`i`i`i`l`i`l`i`l`i`l`i`i`l`i`l`i`i`i`l`i`i`i`i`i`l`i`l`i`l`i`l`l`l`i`i`l`i`l`i`i`l`i`i`i`l`l`i`i`i`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`l`i`l`i`l`i`i`i`i`i`i`i`i`l`l`i`i`l`i`l`i`i`l`i`l`i`i`i`i`i`i`l`i`l`i`i`l`i`i`i`l`i`l`l`i`l`l`i`l`i`l`i`l`i`i`i`i`l`i`i`l`i`l`i`l`i`i`i`l`i`i`i`l`i`i`l`i`i`i`i`l`i`i`i`i`i`i`l`i`l`i`l`i`l`i`l`i`l`i`l`i`l`i`l`l`i`i`i`i`l`i`l`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`l`i`l`l`i`l`l`l`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`l`l`i`l`l`i`l`l`i`l`i`l`l`i`l`i`i`l`i`i`l`l`i`i`l`i`l`i`l`i`i`i`l`i`l`i`i`l`i`i`l`i`l`i`i`l`i`l`i`i`l`i`i`l`i`l`i`i`i`l`i`i`i`i`l`l`l`l`i`l`l`l`l`i`i`i`l`l`i`i`l`i`i`l`i`i`i`l`i`i`i`l`i`l`i`l`i`l`l`i`l`i`i`l`i`l`i`i`l`i`i`i`i`i", -"`i`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`i`i`l`i`i`i`l`i`l`i`i`i`l`i`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`i`i`i`l`i`l`i`l`i`i`l`i`l`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`i`l`l`l`l`i`l`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`l`i`i`i`l`i`i`i`i`i`l`i`i`i`l`i`i`i`l`l`i`i`i`i`i`i`l`l`i`i`i`i`l`i`i`l`i`i`l`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`l`i`l`i`l`i`l`i`i`i`l`i`i`l`i`l`i`i`l`i`i`i`i`i`i`i`l`i`i`i`l`i`l`i`l`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`l`i`l`i`i`l`i`i`i`l`i`i`l`i`i`i`l`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`l`i`i`i`l`i`l`i`i`i`i`i`i`l`i`i`i`l`l`i`i`i`l`i`i`l`i`i`l`i`l`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`l`i`l`l`i`i`l`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`l`i`l`i`i`l`i`l`i`i`l`i`l`i`i`i`i`i`i`l`i`l`i`i`i`i`l`i`i`l`i`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`i`i`i`l`l`i`i`l`i`l`i`i`l`i`i`i`l`i`i`l`i`i`l`i`i`i`l`l`i`i`l`i`l`i`i`i`l`i`i`l`i`l`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`l`i`i`i`i`l`i`l`i`l`i`i`i`i`l`i`i`i`i`i`l`i`l`i`i`l`l`l`i`i`i`i`i`i`i`l`i`l`i`iak`i`l`i`l`i`l`i`l`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`l`i`i`i`l`i`i`i`l`i`i`l`i`i`i`l`i`l`i`i`i`l`i`l`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`l`l`i`l`i`l`i`l`i`l`i`i`i`l`i`i`i`i`i`i`l`i`l`l`i`i`l`i`l`i`i`l`i`l`i`i`i`i`l`i`i`l`l`i`i`l`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`l`i`i`l`i`i`i`l`l`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`i`l`i`i`i`l`i`i`i`l`i`l`i`l`i`i`i`i`l`i`i`l`l`i`i`i`i", -"`i`i`l`i`l`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`l`i`i`i`i`l`l`i`l`i`i`i`i`i`i`l`i`l`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`l`i`l`i`i", -"`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`l`i`l`i`i`l`i`i`i`i`l`l`i`i`i`l`i`i`i`i`l`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`l`i`i`i`iak`l`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i", -"`i`i`l`i`i`i`i`i`i`i`i`i`i`l`i`l`i`l`i`i`l`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`iak`i`i`i`iak`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`l`i`i`iak`iak`i`iak`l`i`i`i`i`i`i`i`i`i`iak`iak`i`i`iak`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`iak`iak`i`i`i`iak`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`l`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`l`i`l`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i", -"`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`l`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`iak`l`i`i`i`i`i`i`i`i`i`iak`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`l`i`i`i`i`i`l`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i" +"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", +"oxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxxoxxoxoxoxoxoxoxxoxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxxoxxoxoxoxoxoxoxxoxxoxxoxxoxxoxxoxoxoxoxxoxxoxxoxxxxoxxoxxxoxxoxxoxxoxxoxoxxoxxxoxxoxxoxxoxxoxoxxoxxoxxxoxxoxxoxoxoxoxxoxxoxoxoxoxxoxoxoxoxoxoxoxxoxx", +"xxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxxoxxxxxxxxxxxoxxxxoxxxxxxoxxxxxoxxxxxxxxoxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxx", +"oxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxoxoxxoxxxoxoxxxoxoxoxoxxxxoxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxoxoxxoxxxoxoxxxoxoxoxoxxxxoxxoxxxxoxoxxxxxoxoxoxxxoxxoxxoxxxoxxoxxxxoxxoxxxxxoxxoxxxxoxxxxxxxxxoxxxxoxxxxxxxoxxxxxoxxxxoxoxoxxxxxoxoxxoxxxxxxxxoxoxoxoxxxxxoxx", +"xxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxoxxxxoxxxxxxxxxoxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxoxxxxoxxxxxxxxxoxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxxxxxxoxxxxxoxxxxxxoxxxxxxxxoxxxxoxxxoxxxoxxoxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxoxoxxxxxxoxxxoxoxxoxxxxxxxxoxoxxxxx", +"xoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxxoxoxxxxxxoxxxoxxoxxoxxxxxxxoxxxxxoxoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxxoxoxxxxxxoxxxoxxoxxoxxxxxxxoxxxxxoxoxxxoxxxxoxoxxxxxxoxoxoxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxxxxxoxxoxxoxxxxoxxxxxxxoxxxxoxxxxxxxxxxoxoxxxxxoxoxxxxoxxxxxxxxxxxxoxxxxxxoxox", +"xxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxoxxxoxoxxoxxxxxxoxxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxoxxxoxoxxoxxxxxxoxxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxoxxxxxxoxxxoxoxxxxxxxxxxoxxoxxxxxoxxxxxoxxxxoxxoxxxxxxxxxxoxxxxxxxxxxxooxoxxxxoxxxxoxxxoxxxxxoxxxoxxxxxxxx", +"xxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxxoxxxxxxxoxoxxxxoxxoxxoxxxxxxxoxxoxxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxxoxxxxxxxoxoxxxxoxxoxxoxxxxxxxoxxoxxxxxoxxxoxxxxoxxxxxoxxoxxxxxxoxxxxoxxxxxxxxoxxxoxxoxxxxoxxxoxxoxxxxxxxoxxxxxoxxxxxxxxxxxoxxxxoxxxxxoxoxxxoxxxoxxxxxoxxxxxxxoxxxxoxx", +"xoxoxxxxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxoxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxoxxxxoxxxoxxxxxoxxoxxxoxxxoxxxxxxxxoxxxxxxxoxxoxoxxxxxxoxxoxxoxxxxxxxoxxxxxxxxxxoxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxoxxxxxxxxxoxxox", +"xxxxxoxoxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxxoxxoxxxxxxxxxxxoxxxxxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxxoxxoxxxxxxxxxxxoxxxxxoxxoxxxoxxxxxxxxoxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxoxoxxoxxoxxoxxxoxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxoxxxxoxxoxxxxxxxxxxxx", +"xxoxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxoxxxoxxoxxxxxxoxxxoxxxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxoxxxoxxoxxxxxxoxxxoxxxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxoxoxxxxxxxxxxxoxxxxxxxoxoxxxoxxxxoxxxxxxxoxxxxxxxoxxx", +"xxxoxxoxuuxoxxxopxxxxxxxxxuuxxxxoxxxoxxxxxxxxxoxuuoxxxoxoxxxoxoxopoxxxxxoxxxooxxxxxxxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxoxoxxxxxxxxxxxxxxpoxoxxxoxxxxxxxxxxpoxxxxxxxoxxxoxxxxxxxxpooxxoxxxoxoxxxoxxoxxxxxxxxoxxxooxxxxxxxxxxxxxxoxxxxxxxoxxxxxxxxxoxxxxxoxoxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxoxxoxxxoxoxxxoxxoxxxxxxxxoxxxooxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxoxoxxxxxoxoxxxxxxxxxxoxx", +"xxxxxxxxxoxxoxxxuxxxxxxxxxxuxxoxxxxxxxxoxxxxxxxxxuxxoxxoxxxxxxxoupxoxxupppxxxxxxxxxoxpptpuuxxxoxxxxotuxotuxxoxxxoxxxxxxoxxxxxxxxxxoxxxuxoxxxxxxxoxxxxxxxuxxxxoxxxxxxxxxoxxxxxxuxxxxoxxoxxxxxxoxxoxxxoxxxxxoxxxxxxxxoxxxoxxxxxxoxxxxxxxoxxxxoxxxxoxxxxxxoxxxxxxxxxxoxxxoxoxxxxxxxoxxxxxxxxxxxoxoxxxxxxxxoxxxxxxxxoxxxoxxoxxxxxoxxoxxxoxxxxxoxxxxxxxxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxoxxoxxxxxxxxx", +"xoxxoxooxoxxxouooxxxxxxxxxxooooxooxouoxxoxxuuxoxxuxouuxxoxxxxoxxtuxxxxxxuxxxxxxouoxxxoxoxxoxxxuuooxxopxuoxxxxxxxxooouxuoxoxouoxxxxxooxuxxxuuoxxxxxxxxxxxuouxxxxxuuoooxxouoxoxxuxuuoxoxxoxxxxxxoxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxoxxxoxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxxxxooxooxxxoxxxxxoxxoxoxoxxxxxxxxoxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxoxxxxxxxxxxxxxoxxxxxoxoxxxoxx", +"xoxxxuoouuoxuuoppxxxxxxxxxopuuuoxxupuppxxopuupooxuxpuoxxxoxxxxxopxxxxoxxuxoxooxouuoxxxxuxxxxxpuuuuxoxuupxxxxxxxxxopuupupxxupuupxxxpuupoxopuupuxxxxxxxxxxtuupxxxpuopuxoupuupxxxuxtuoxoxxoxoxxoxxoxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxooxxoxxoxxxxxxxxoxoxoxxoxxoxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxxx", +"xoxxoxoxxuxxuxxxuxxuptptuxxuxxxuxxuxxxooouxxxxuxxutoxoxoxxoxxxxxxxoxxxxxuxxxxooppuoxxxxoxxxxuuouutxxxotoxxxutptpuxuuxuxuxxuxxoxuxuxxxouxuuuuotxxppptpoxxoxxuxxooxxxuxxuxxoxuxxppoxxoxxxxxxoxxxxxooxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxoxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxooxoxoxxxxxxoxxxxxooxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxooxxxxxoxxxxxoxx", +"xoxxoxxxxoxxoxxxuxxxxxxxxxxuxxxuxxuxoxouxuxoxxuxxuotxoxxxoxxxxxxoxoxxxoxuxxuxxpoxouxxxxuxxxxpuuouuxxxtxpoxxxxxxxxouuxuxuxxuxxxxuxuxxxxuxpuouuuxxxxxxxxxxuxxuxxuxxxxuxxuoxxxuxxpuuxxxooxoxoxxxxxxxxoxoxoxoxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxooxxoxxoxxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxoxxxxxxxxooxooxoxxxxxxxxoxoxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxooxxxoxxxxxxoxoxxox", +"xoxxoooxuuxxuoxotxxxxxxxxxxuxxxuxxpuxopxoopxxpoxxuxopxxxoxxxxxxoxxxoxxxouoouxxuoxuuxxxxuxxxxotoxxoxxpoxotxxxxxxxxxuuouxuxxuuxopoxuuxopuxotoxxxxxxxxxxxxxuxxuxxxpoxopoxpoxotxxxuxuuxxxxxxxxxxxxxoxoxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxoxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxoxxxxx", +"xooxxxuuouuxxppuotxxxxxxxxutoxttoxxpttoxxxuttooxppxxttoxxxoxxxxxoxxoxxutttttxxuttotuxxpttuxxxxptpoxotuxotpxxxxxoxutpxtoupxopttoxxxutpotoxoptpxxxxxxxxxxttxottxxoptpxxxoptpooxtuxotpxxoxoxxoxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxoxoxxxxoxxx", +"xxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxoxxoxxxxxxoxxoxxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxoxxoxxoxxxxxxxoxoxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxoxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxoxxoxxxoxxoxxoxxxxxxxoxoxxoxxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxoxoxxoxx", +"xoxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxooxxxxoxxxxxxxxoxxxxoxxoxxxxoxoxxxxoxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxxooxoxxxxoxoxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxoxxxxooxoxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxoxxox", +"xxxoxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxoxoooxxxxxxxxoooxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxoxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxooxxxxxxxxxoooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxoxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxoxxxoxxoxoxxxxxxxxoooxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxxxxxxxoxxxxxx", +"xoxxoxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxoxoxxooxoxxxxoxoxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxooxxxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxxxooxxoxoxxxoxxxoxxxxoxxxxxxxxxoxoxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoooxxxxxxxxxxxoxoxxxooxxxxxxxxoxxoxxxxxxxxxxxoxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxoxxxxoxxxxoxoxx", +"xxxxxxoxoxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxooxxxxxxxxxxxxxxoxoxxxxxoxoxxxoxoxxoxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxxxxooxxxxxxxxoxxxxxxxxxxooxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxoxoxxoxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxxoxxooxxxxxxxxoxxxxxoxxxxoxoxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxxxxxoxoxxoxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxxxoxxx", +"xoxoxxxxxxxoxxxxxxxooxooxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxoxxxxooxxoxxxxxxxxxxxxxxooxoxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxooxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxoxxxxxoxxoxxxxxxxxxxxxxxxooxooxxoxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxooxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxoxoxxoxxxxox", +"xxxxoxoxxxxxooxooxxxxxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxxooxxxxxxxooxooxxxxxxxxoxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxoxoxxooxxxxxxxooxooxxxxxxxxoxoxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoxxx", +"xoxxxxxoxxxxxxxxxxxxxxoooxoooxoxxoxoxxxxxxxxxxxxxxxxxxxxxxxxooxxxxuxxxiixooxxxxxxxxxoxxxxxovxxxxxxxxxxupxxxxxxxxxxxxxxoxxoxxuxxxxuxxxxoxxxxxxxoxxxxxxxoooxxooxoxooxoxxxxoxxxxxxxxxxxxxxxxxxxooxxxxoxxxooxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoxxxoxxxxxxxoxxxxxxxooxxoooxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxooxooxxoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxoxxoxx", +"xxxoxoxxxxxxxxxooxxoxxxxxoxxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvoxxxxpxxxxoxxoxoxxxxxxxxxuxxxxxxxxxxxuxxxoxxxxoxxxoxxxoxxovoxxxvxoooxoxxxxxxxxooxxxxxxxooxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxoxxxoxxxxxxooxoxxxxxxxxooxxxxxxxoxxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxoxxxxxxoxxxxxxxox", +"xoxxxxooxxxxxxxxoxxxoxxxxxxxxxxoxoxxxxxxxoxxxxxxxxxxxxxoxxxxxxxxxvxxxxxtooxxoxppoxxpupoouxxpxouxxxxxuuxpxxxupuxxxxoxxxxxxxxpuxxxouuxxxxoxxxxxxxxoxxxooxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoooxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxoxxoxxxoxxxxxxxxoxxxooxooxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxoxoxxx", +"xxxxoxxxxxxxxxxoxxxoxoxooooxooxxooxxxxxxxxooxxxxxxxxxxxoxxxxxxxxuoxoxxxpxxxxxuppvoxpipiptuxpvtpixxxvupipxxopptuxxxxoxoxxxxxtxxxxxxtxxxxxxxxxxxoxxxxoxxxooxoxooxxooxxxxxxxoooxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoooooxxooxxxxxxxxooxxxxxxxxxxxoxxxxxxxxxxxoxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxxxx", +"xoxxxxoxoxoxxxxxooxxxxxxxxxxxoxxxxxxxxxxxoxxxxxxxxxxoxoooxxxxxxxpxxxxxxpooxoxuiivxxxixpxxpxpoxxxtxuxxxxtxxxvitpxxxxxxxoooxxpoxoxxopoxoxxxxxxxxxxooxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxooxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxxoxxxxoxxxxxxxxxooxxxoxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxooxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxoxxxoxo", +"xxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxpxxxxxopxoxoovxxtoxoixpxxpxpxxxxpxpxxxxuxxtoxopxxxxxxxxxxxxpoxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxoxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxoxxxx", +"xoxxxoxxoxoxxoxxxxxxoxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxoxpxxxxotxxxxpoxxixoxcxpxxpxpvoxuuxovxxtvxxtxxppxxxxxxxxxoxxtxxxxxopxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxooxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxxxxoxxx", +"xxxoxxoxxxxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxvoxopccccuxxviipixcixvuxcuiociuxxxxicuttxpiioiuxxxxxxxxxxxuvxoxovuoxxxxxxxoxxxxooooouoooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoooxxxxxxxxoxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxoxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxox", +"xoxxxxxoxoxxoxxoxxxoxxxxxxxxxxxxxuururuurrrruururrurururrrrrrrruxuuoxxxxurrrrrrrrrrrrrrrrrrruxxxxxxxxrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrssssssssseaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxoxxxxxooxoxooxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxoxxxxox", +"xxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxrgqggggqgqgggggqggqggggggggggggkxxxxxxxrwgggggggggggggggggggkxxxxxxxrggggggggggggggggggggggggggggggggggggggggggggggqggggggqtxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxoxxxxxxxoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxoxxoxoxxx", +"xxxxoxoxxoxoxxoxoxxxoxxxxxxxxxxxxuggggggggggggggggggggggggggggggnmxxxxxxowgggggggggggggggggggnmxxxxxxogggggggggggggggggggggggggggggggggggggggggggggggggggggndxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxoxxxoxxooxxxxxxxxxxooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxoxxxooxxxxoxxoxxxxoxx", +"xxoxxxxxxxxxoxxoxxxxxxxxoxoxoxxxxxknggggggggggggggggggggggggggnnjmxxxxxxxegnggggggggggggggggnjmxxxxxxxkngggggggggggggggggggggggggggggggggggggggggggggggggggjmoxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxooxxxxxxoxxxxoxxxxoooxxxxxxxxxxxxxoooxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxooxxxxxxxxoxoxxxxxxoxxox", +"xxxxoxoxoxxxxxxxoxxxxxoxxxxoxoxoxoxbfjjgggggggggggggggggggnjddfmmcxoxoxxxximmmqggggggggggnjddfcxoxxxxxxmmjdnqggggggggggggggggggjdddddddjjnnggggggggggggggggjcoooooxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxoxxxoxxxxxxxxooxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxx", +"xxoxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxopclggggggggggggggggjdmtooooouooooooxxxxosgggggggggjdf`ououoooxxxxxxxxueggggggggggggggggndjcpuuuouviimfjngggggggggggggdiuuuuooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxx", +"xxxoxxoxxxxxxoxxxxxoxxxxxxxxxxxxxxxxxoxuokgggggggggggggggjmpppupuppptpuuoxxxxusggggggggdd`ppppppppuuuoxxxxxouwgggggggggggggggdhpppuppppppppppcmnggggggggggndtptpppuoooxoxxxxxooxooxxxxxxxxxxxxxxxxxooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxoxoxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxooxooxxxxxxxxxxxxxxxxxooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxoxxox", +"xoxxxxxxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxourlggggggggggggggdbiiiiiivvvvvtpuoxxxrwggggggnddciiiiiivvvttpuoxxxxorwggggggggggggggndciiviiviiviiiviviimqggggggggjhciciivpuooxxxxxxxxoxooxoxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxooxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxx", +"xxoxxoxxoxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxoptkggggggggggggggjbbbbb`b```ccvppuoxuaggggggndhm`bb`b`b`b`citpoxxxxorwggggggggggggggjjbbbbbb``b``````````bqgggggggjhmbmb`cvpuxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxoxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxoxxoxox", +"xxxoxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoopvaggggggggggggggjhhfhfffmb``cituoxurlgggggnddjhfhfhfffmmb``mbtxxxpurgggggggggggggggdhhfhffffhfbbbbbbbbbmmwqggggggddhhhhf`ipuxxxxxxxxxxxoxxxxxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvtxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxx", +"xoxxxxxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxopvvwgggggggggggggndddhdhfmm`civtuoorkgggggndhfhdhdhdhhhfbbcbpuxxxxuurggggggggggggggndddhddhhfmfb``````bbbmmkggggggdddddhhb`bm`oxxxxxxxxxov``b`bxxooxxoxxmbxxbcxxxxxoxxxxxxxxxxxxxxxxxxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoooxxxxxxooxoooxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxx", +"xxxxoxxxxxoxxxooxxoxxxxxxxxxxxxxxxxxxxxooptsggggggggggggggdddddhfbcivtpuuursgggggndhmmfddddddhfb```bvtxxxttusggggggggggggggjdddddddhfbbi``cvii`bb`bsqggggnddddddfbitvoxxxxxuttxxxtoxvxtxxxpvpoooomxocoxxxxxxxxpopxuoxxxxtuxxxxxppxuxxxotoxxxxxxxxxxpupxtoxxxutuxootxttoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxxooxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxoxx", +"xxxxxoxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoouurggggggggggggggddddhfbcvtppuoouegggggndfbbfhdddddhhfcvii`vpxxxtcrkggggggggggggggjddddddhfbc`tbcippb`cbbiikggggjdddddhfbipvxxxxxxtttioxxxxtxxxocivicxxxuc`xxxxxxxxxxt`t`tvuxx`tpcxxxipt`vxxivtiixxxxxxxxxcvvipcxxuttvuxuicvtcpxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxooooxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxx", +"oxoxxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxoxoxxouwgggggggggggggjdddhf`ituuuooraqggggndmiui`fhdddhhmhvpuuvoooxxxtrlggggggggggggggddddddddfcvcbtooop`vvimvtsggggddddddhf`vpvoxxxxxvbcvxxxxxtxxxucttvbpooo`iooxpc``bcxx`xpxxpxpxxxxpxtoxxxvxucttt`uxvc`ccvxttxvxtxxocbvtxxvoxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxoooooxoxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxox", +"xxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxooxxokgggggggggggggndddhfctpoxxxraqgggggdmovpibfdhdhfm`cpuootoxxxoxarggggggggggggggnddddddhfbvpcp`ooxpcvvtvpueggggdjddddhf`tpvoxotxtpooixxxxxvxxxpcvvttoxxipttxxxxxxxxxx`xpxxpxtxxxxtxtxxxxtxpcttvtoxxxoxxxxptxtotxxvxxxtxxtuxxxvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxoxxxxxxxxxx", +"oxxxxxoxoxoxxxoxoxxxxoxxxxxxxxxxxxxxoxxxoxxxrggggggggggggggdddhmctuooxraqgggggddooicimhdhhh`vttoooxvxxxxxxasggggggggggggggjddddddhmctuvxucxoxbpxouxxrgggndfhdddhmctuvxxxvxixxocxxxxxtxoxobuxxxxxttxx`oxxxxxxxxx`xpxxpxotxxvuxocxoicxxbpooooxxxxxxxxptxtovoovxxtuxxtcoxipoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxoxx", +"xoxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxooxoxooxxxooulgggggggggggggjddhmctoxxuaqggggnddooop`hhhdhm`mmcuooibbbixxtbrkggggggggggggggdddddddfbvpcioxbbxxxibcpoxrgggndbhhddfbcvbbbbbuxubbtiixxtb`booxxibcpxx``xx``xxxxxxxx``xvuxcxxu``pxxxobbpiixxi`cpxxxxxxxxobix`opixvbbubpxpocbuxxoxxxxxxxxxxxxxxxxxxxxxxxoxooxoxxxooxxxxxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxx", +"xxoxxxxoxoxxoxoxxxxxxxxxxxxxxxoxxooxxxooxxxxokgggggggggggggnddhf`vpoorlgggggdjvpoutcbfhfmcvtuxxxooxxxxxxxorqgggggggggggggnddddddhf`vpoxxxxxoxoxxxxxxrgggjmcmhdhfbitooxooxxxxxoxxxxxxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoooxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxtxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxuoxxxooxxxxxoxxxxxxxoxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxoxoxxxoxoxx", +"xxxoxxxxxxxxxxxxoxxoxxxxxxxxxxoxxxooxoxoxxxxxaggggggggggggggdddfbvprrwgggggdjuxoptibfffb`ituoxxxxoxooxxxxoaggggggggggggggndddddddm`voxxxxxxxxoxxoxxoegggdcibfhhf`ttuooxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxpmbpxxxxxxxxoxxoxxxxxxxxxxxxooxxxooxoxoxxxxxxxxxoxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxx", +"xoxxxoxxxxxxxoxoxxoxxxxxoxxxxxxoxxoooxooxxxxxuqgggggggggggggjddhbirrwggggnddoouuti`fffbcvtuooxxxxoxooxoxxrsggggggggggggggjddddddhmivuoxxxxooxxxoxooookngdtv`fhhmcppooxooxxxxxxoxxxoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoooxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxooxxxxxxxxxxoxxxoxxxxxxxxxxxxxxoooxooxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxooxxxxxxxxxxxxxxxxxxxxxoxxxxxxxox", +"xxxoxoxxxxxxxxxoooxooxxxxxoxxxxxxxxxxoxxxxxoxokgggggggggggggnddhmtrwgggggdjuxoutibmffm`vpuooxxoxxxxooxxxxrwggggggggggggggddddddhhbipuoxxxrswarxooooxoxmhdutcmffbipxuxoxxxxxoxxxxxxxoxxxxxxoooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxooxoxxxxxxxxxxxxxxxxxxxxxxoxxoooouoxxxxxxxxxooooxoxxxxxxxxxoxxxxxxoxxxxxoxxxxxxxxxxxoooooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxooxooooxxxxxxxxxxxxxxxxxxoxoxoxxx", +"xoxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxoeggggggggggggggdddsrwgggggdduoopti`mffb`ituxxxxxxoxxxxxxxxxrggggggggggggggnddddddhm`vpuoooorqggipxooxooxxxxupi`ff`vuoooxxxxxxxxoxuuuruoxxxoxxoxxoorreseeoxxxxxxxxxxxxxxxourrssseooxxxoxxxxxxxxxxxxxxxxxxxxxxxoxxourrasssroxxxxxxxoouooouooxxxxxxxxxxxooxxxxxxxxoxooxourrrsssserxxxxxxxxxxxxxxxxxxxxxxxxoorrassserooxxxxxorserxxxxxxxxxxxxxxxxoxxxxxoxx", +"xxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxrggggggggggggggjdirwgggggdjuouuti`mffm`vtuoxxxxxxxxxxoxxxxoeggggggggggggggnddddddhmctuuoxorsgggdtxxxxxxxxxxopibmm`vuxxxouoooururrrsswqsuxxxxxxxrrswggggggkoxoxxxxxxxxxxrakqggggggkrxxxxxxxxxxxxxxxxxxxxxxxxxxxorrswgggqggqexxxxrrressssslksxxxxxxxxxxxxooxxxxoxoxorraswqggggggglsuxxxxxxxxxxxxxxxxxxxxraslgggqggglkrooxorsgggtxxxxxxxxxxxxxxxxoxoxxxox", +"oxxoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxowgggggggggggggnfrwggggnddooopti`mmfm`ippoxxxxxxxxxxxxxxoxrkggggggggggggggdddddddhmituoxxurqggndxxxxxxxxxxxopv`bbiprrrrrrsssswwlggggggjcxxxxxureqgggggggggqpoxxxxxxxorakgggggggggggexxxxxxxxxxxxxxxxxxxxxxxxorrsqggggggggggwxxrsggggggggggqcxxxxxxxxxxxooxxxxxxorrewgggggggggggggqsxxxxxxxxxooxxxxxorakgggggggggggggwsareqggndxxxxxxxxxxxxxxxxxxxxoxxx", +"xxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxsggggggggggggggrsgggggdjuxouti`mffm`ituooxoxxxxxxxxxxxxxxrlggggggggggggggddddddhfbvpuoourkgggnfxxxxxxxxxxxxutc``vewlgggggggggggggggggdtxxxxorwggggggggggggguxoxxxxorsqgggggggggggggixxxxxxxxxxxxxxxxxxxxxxorsqgggggggggggggmxrlggggggggggd`xxxxxxxxxxxxxoxxxxurelgggggggggggggggggloxxxxxxxxxxxxxxrsqggggggggggggggggggggggnmxxxxxxxxxxxxxxxxxxxxxxox", +"xoxoxoxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxrggggggggggggggsgggggdduouuti`mmfm`ituoxxov`pxxxxxxuxxxxxrggggggggggggggnddddddhfctuuooreggggjcxxxxibuxxoxooticipsggggggggggggggggggjhoxxxraqggggggggggggggnootoxureggggggggggggggggvbuxxxxxxxxxxxxxxxxxxrawggggggggggggggggvrgggggggggggduxxxu`vxxxxxxxxxxorakgggggggnjddmqgggggggqoxxxxxxxooooorsggggggggnjdddjggggggggggjmxxxxxxxxxxxxxxxxoxxoxxxx", +"xxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxowggggggggggggggggggjdpooupi`bffm`cvpoxxxxvxxxxxxxovxxxxosggggggggggggggjddddddhmcpuooraqggggdpxxuuupixxxxoouvvtpeggggggggggggggggggjboxxraqgggggggggggggggn`ucpurwgggggggggggggggggjfoxxxibfcxxxxxxxxxxrrqgggggggggndddggggweggggggggggndoxxxoxtxxxxxxxxxorsqqggggggjdhvuusgggggggggoxoxxoooxoxreggggggggjdmvoxuclggggggggjixooooooxxxxxxxxxxxxxxoxx", +"xxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxookgggggggggggggggggjdbpuutv`bmfm`itpuxxxxxtxxxxxxxcxxxxxrwggggggggggggggdddddddhfipupraqggggndvooptttcoxxxxouupuppljjgggggggggggggggdtuiraqggggggggggggggggghtpirsggggggggggggggggggn`uuoooxtxxxxxxutpxrsggggggggggddbppvkggwwggggggggggjhtuuuuovxxxxxxtpursggggggggjdbtourkgggggggggfpuouvuvtoorqgggggggndcoouptvpwgggggggdiopttvpoouoooooxxxoooxxox", +"xxxoxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrggggggggggggggggjdfivptvcbffm`ivpuooxxxxpxxxxxxxixxxxirqggggggggggggggdddddddhmvprreqgggggjfvmtviii`uoxxxxxouuopibb`sggggggggggggndppaaqggggggggggggggggggdivrsgggggggggggggggggggnfttpuoovxxxxxottvrsggggggggggddmiptvilgqgggggggggggdm`bptptiooxxobvarwggggggggjdmicbraqgggggggggjmcpu``vvirsggggggggdfvpptvcbccqggggggdtutciiitoutupuooxouoouxxo", +"xoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxulggggggggggggggjddbcivi`bfmm`itpuooxxxxxpxxxxxxxtxxxpuaggggggggggggggnddddfmbitrrslgggggggjcuu`i``i`uoxxxxxxxxoxxcoxrggggggggggggjhvaaqgggndjwggggggggggggd`reggggnddqggggggggggggnh`ivtuovxxxxxo`creggggggggggdd`chii`ikggggggggggggndcc`iiiv`uoxovourwggggggggjdfiicfrkggggggggggnfhvpiooxvrqggggggggdtivii``fbbsggggggdivv`civvuxtxuxxoxuoooooxx", +"xxoxxxoxooxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxokgggggggggggggnddhfbcc`mmfm`cvpuoooxxxxxtxxxxxxovoxxvusggggggggggggggsrarrrssskwggggggggggdvut``bbc`uooxxxxxxxxxxvxxrggggggggggggdmerlgggjdbtaggggggggggggdsaqgggddbutkgggggggggggndfmcituixxvxxiursggggggggggjdc``b`mmmsggggggggggggjdbmmmb`c`puooturwgggggggggdmbccbcrgggggggggggndmcicpootegggggggggdtccbbfmhmmclggggnd`c`mb`iiuopxuxxoxuoooooxx", +"oxxxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxeggggggggggggggdddhmmbmmfm`itpuooxxxxxxxtxxxxxxxcxooorlggggggggggggggggggggggggggggggggggndupmbbmbicuoxxxxxxxxxxxvoorgggggggggggndbrwgggdd`purgggggggggggnbrlgggddpoxasgggggggggggjdhhm`vpioxvxxirsggggggggggjdhic`mfhj`sggggggggggggdhhhdhhmc`pooxrrwgggggggggdjpfciccsgggggggggggndhb``puoasgggggggggdimbfhhhhmm`sggggndmmmffbcvuotxoxxoxuoxoxxxx", +"xxxxxoxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxuqgggggggggggggjddhhffhfmbitpoxxoxxxxxxxpxxxxxxxcuoxxrgggggggggggggggggggggggggggggggggggjfff`bmmhhfmixxxxxxxxxvbmmesgggggggggggjdrsgggddffptagggggggggggnrsgggddvuoorkgggggggggggjdddhmffmmmmxxraqggggggggggdmcfjhhhddisggggggggggggdddddhhdhfmmoorwgggggggggndvtifjhbsgggggggggggndhhfhmptewgggggggggjhhdjhhjhff`eggggjdhhjdhmbcutpxuoxpxxouoooxo", +"xoxoxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxokgggggggggggggnddddhhfmbcvpooooooxxxxxxvtxxxxxxxioxregggggggggggggggggggggggggggggggggggdivcbfff`vpuxxxxxxxxxxxxxxrkgggggggggggdeaggnddmitursgggggggggggseggndd`vptirlgggggggggggddddhfbipoxxourqggggggggggjdibmhhddhhslgggggggggggjddddddhm`tuxorsggggggggggdfvc`mhhfsgggggggggggdddhfmcturwgggggggggghhhddhm`ivtalgggjhhhdhhmituoxoxxxxxxxxxxxxx", +"xxxxoxxxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxeggggggggggggggddddhhfbitpuoxxxxoxxxxxxuvuxxxxxoooxrkggggggggggggggjdjjjjnnggggggggggggndiibmhfm`tpoxxxxxxxxxxxxxxuwggggggggggnmrlggddhbiturkgggggggggggrqggjdh`iptvaggggggggggggdddddhmctoxxorwggggggggggndb`fhdddhhfawgggggggggggjddddddhmctuoraggggggggggndicbffhjh`ggggggggggnddddhf`iprwggggggggggndddhfbitpuukgggdhhddhhbipuoxxooxxxxxxxoxox", +"oxoxxoxoxxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuqgggggggggggggjddddfmcvpooxxxxxoxxxxxxxxxxxxxxxxxxrlggggggggggggggddddddddjjjgggggggggnjibfhhhmctuxxxxxxxxxxxxxxxrgggggggggggnrsggjdjf`vptrlggggggggggkkggjddfbitpasgggggggggggndddddhm`tpoxrsgggggggggggdhbfhhdddhfbrqgggggggggggdddddddfbvpuorqggggggggggdmcbfhddhfmwgggggggggddddddfmiprwgggggggggggdddhmcvpuoosgggd`fhddfbipoooxxxxxxoxxxxxxx", +"xxxoxxxxoxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxuwgggggggggggggndddhf`vpuoxoxxxxxxxxxxoxoxxxxxxxooorggggggggggggggndddddddfbcv`qgggggggjhmfhjdhbipoxxxxxxxxxxxxxxosgggggggggggaeggnddhmcvppagggggggggggsggndddfbivtrlgggggggggggjdddddhfcvpooaqggggggggggndmfhddddhfbvrgggggggggggnddddddhf`vuorkggggggggggndbmfhddhhmcvqgggggggjddddddhmctpwggggggggggggddhmituooooggndcmhhhfbvpuxxoxxoxxxxxoxxox", +"oxxxxxoxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxraqggggggggggggggdddhmituoxxxxxxxxxxxxxxoxoxxxxxxxorsggggggggggggggjddddddhhm`cvvwggggggdhhdddhfbipoxxxxxxxxxxxxxxrkgggggggggggrqggdddfbivtrsgggggggggglqggdddhf`iveaggggggggggggddddddhmcvuorkgggggggggggjdfhdddddhmcasgggggggggggjddddddhmituragggggggggggjjmhhdddhf`ipobnnnnjddddddddhmctusggggggggggggfdhmipuoooxoddhibfhhf`vpooxoxxxxxxxxxxxxx", +"xxoxxxoxoxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxorwgggggggggggggggjddhbcpoxxxxxxxxxxxxoxxxoxxoxxxxxxuwggggggggggggggddddddddhfbb``sgggggndhddddhf`vuxxxxxxxxxxxxxxxrlggggggggggswggjddhm`vtvrwggggggggggqggnddddfb`ctsggggggggggggddddddhfcturegggggggggggndhhddddhhmcvpsgggggggggggdddddddhbiporlgggggggggggdfhhdddhhbipoxxobffjddddddddhmcpueggggggggggggghhmctoxxxxxouut`mhhm`tuooxxxoxxoxxxxxxxx", +"xxxoxxxxxoxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrrwggggggggggggggggjddhmctoxxxxxxxxxxxxoxxxxoxoxxxxxxrqgggggggggggggnddddddddhfmmbbcwggggjddddddhmctuxxxxxxxxxxxxxxxrgggggggggggsggndddhm`ciirgggggggggggggnddddhfm`crlgggggggggggjddddddhmiturlgggggggggggjdhdddddhfbiprlggggggggggnddddddhf`vpregggggggggggjdhhddddhmcvpuoxootibfdddddddhmiporgggggggggggggghf`vuoxxoxooutibffmcvuooxxoxxxxxoxoxoxx", +"xoxxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxorwggggggggggggggggggddhf`vuxxxxxxxxoxxxxxxxxxxxxxxxxxaggggggggggggggndddddddhfmbbbbckggggdddddddfbituxxxxxxxxxxxxxxosggggggggggllggddddhmciceegggggggggggggjdddddfmbiaggggggggggggjddddddhbipregggggggggggndjddddddhbitprgggggggggggjddddddhfcturlgggggggggggjdhdddddfbituxoxootibfhdddddhfbipookgggggggggggggghbipuxxoxxxopv`mmbituxooxxxoxoxxxxxxxx", +"xxxxxxxxoxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxorwgggggggggggggggggggdddf`vuoxxxxopxoxxxxxxxxoxxxxxxxusggggggggggggggjddddddhdhbcii`vsggggddddddhdfipoxxxxxxxxxxxxxxrwggggggggggqggjdddhfb`ccakggggggggggggndddddhffmakgggggggggggnddddddhf`iprlgggggggggggjdddddddhm`vpuegggggggggggdddddddhbcpregggggggggggndhdddddhm`tpooxoxupv`mhddddhhbcvuoxrggggggggggggggqmcvpoxxoxooutc`b`vpuoxxoxxxxxxxxxxoxx", +"xxoxxoxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxrsgggggmlgggggggggggggnddhmcpoxxxx`uxxoxxxxxxxxxxxxxxvrwggggggggggggggddddddddb`itttiasgggnddddddhmmtpoxxxxxxxxxxxxxxrqgggggggggggggddddhfb``irqggggggggggggjdddddhhj`rqgggggggggggndddddddf`vreggggggggggggddddddddhbiturkgggggggggggdddddddfbvprkgggggggggggndddddddfbcpuoxxxxxutibffhhhhm`vpuoxokggggggggggggggmbipuoxoxooupv`cctpoooxoxxoxoxoxoxxxx", +"oxxxxxxoxoxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxorsgggggjhkgggggggggggggnddhm`tuxxxx`xooxuvtxxxpuxotuxucrggggggggggggggnddddddhdmctpuiiusgggjhfhdddhmbpuoxxxxxxxxtutxtuegggggggggggggndddddhbb`eeggggggggggggnddddddhhhieggggggggggggdddddddhmctrlgggggggggggndddddddhm`vuorqggggggggggjddddddhfcvurggggggggggggjddddddhf`vpoxxxxxoouvi`mmmmb`vtuoxxxrqggggggggggggggf`vpooxoxooptvivpuoxxxxxxxxxxxxxxoxx", +"xxxoxxxxxoxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxorsgggggjdtaggggggggggggggdddfbipoxxupxooxivtixxpiouvvoueeggggggggggggggndddddddhmcpuov`osgggdmffhdhfbbpoooxxxxxxo`ii`tesgggggggggggggdddddhdfb`akggggggggggggjddddddhhmakggggggggggggdddddddfbiraggggggggggggddddddddhbituuegggggggggggjddddddhmctrsggggggggggggdddddddhm`tuoxxxxxxouutvccccivpuoxxxxxsgggggggggggggggfcvpooxxxooupppuooxxoxxxoxooxoxxxox", +"xoxxxxxxxxoxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxrsgggggjdvxrlgggggggggggggjddhbctoxxtxxxoocm`ixxxvxxxvxxakggggggggggggggjddddddhfcpuooovusgggdvbbhhhf``pxxxcmbbbixvvxvxrlggggggggggggjddddddhdbcrqgggggggggggnddddddddf`rqgggggggggggjdddddddf`irkggggggggggggdddddddhf`vporkgggggggggggdddddddfbvprwgggggggggggndddddddf`vtuoxxxxxxxooopttvvtpuoxxxxxxxwgggggggggggggggmctuooxoxoouuuuoxxxxoxxxxxxxxoxxxx", +"xxoxoxoxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxoraqggggjdvxookggggggggggggggddhfcvuxxvxxxxvpoxixxoioxxtxxrlggggggggggggggddddddhffvpoooxvokggjdpb`fhhmc`uxxxxoooxxxttxtorgggggggggggggjdddddhhhbveggggggggggggjdddddddhmseggggggggggggjddddddhm`trqgggggggggggjdddddddhmctuorqggggggggggnddddddhf`vurggggggggggggnddddddhm`touxxxxxxxxxoooouuuuoooxxxxxxxxqggggggggggggggj`ctuooxoxxoooxxxxxxxoxoxoxoxxoxxx", +"oxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxraqggggndcxoopsggggggggggggggdddfbipuxutxxxixxu`xxoixovvxorggggggggggggggnddddddhfmvpoxxxvxeqgjboccmffbicuruxxooxooovtxvosggggggggggggndddddddhm`rkggggggggggggddddddddhbakgggggggggggndddddddhmiaeggggggggggggdddddddhf`vpouegggggggggggjddddddhm`treggggggggggggjddddddhbitoxxxxxxxxxxxxxxoooooooxxxxxxxxrqggggggggggggggh`ituooxxxxxxxxxxxxxxoxxxxxxxxoxx", +"xxoxxoxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxraqggggndmououvvqgggggggggggggjddfmctuxx`xxxobmviixoumbpmprsggggggggggggggjdddddddhhf`oxtmbmb`mdhffhhmmhfmaslkxxxxxopmixbrkggggggggggggjdddddddhmcrlgggggggggggjjddddddhfcrqgggggggggggnddddddhf`vrkggggggggggggdddddddhmctporkgggggggggggdddddddhbctusggggggggggggdddddddfbvuuoxxxxxxxxxxxxxxoxoxxxoxxxxxxxxsggggggggggggggnm`vpuoxoxxxxoxxxxxxxxxoxoxoxxxox", +"oxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuaqggggndmooupvcbsgggggggggggggnddhmcvpoxpuxxxxxxxxxxxxoxxxrwggggggggggggggdddddddhbipuxxxxxxxxxxxutibfbctraqggbxxxxxxooxxrqggggggggggggdddddddhfbtaggggggggggggddddddddhbeeggggggggggggdddddddhm`vrlgggggggggggnddddddhh`ipooagggggggggggnddddddhf`vprwggggggggggggddddddhm`vooxxxxxxxxxxxxxxxxxxxxxoxxxxxxxookgggggggggggggghmcvpoxxxoxxxoxxxxxxoxxxxxxxxxxx", +"xxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxurwgggggdmxoupvc`msggggggggggggggdddf`vpuooxxxxxxxxxxxxxxxxorqggggggggggggggddddddhf`vuoxxxxxxxxxxxoti`m`iprwggnduxxxxxxxxuaggggggggggggjdddddddhm`asgggggggggggndddddddhf`akggggggggggggdddddddhbiprggggggggggggjddddddhfcvuorsgggggggggggjddddddhfcvurwggggggggggggddddddhmctuxxoxxxxxxxxxxxxxxxxxxxxxoxoxxxxxolgggggggggggggjfbctuooxxxxxxxxxxxxxxxoxxxxoxxx", +"oxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxurwggggndhxooptcbmfcqgggggggggggggjdhhbituooxxxxxxxxxxxxxxxxoeggggggggggggggnddddddhmctuoxxxxxxxxxxxuti`b`vrsgggjfxxxxxxoxxusggggggggggggddddddddfbirlgggggggggggjddddddjhbirlgggggggggggjdddddddfbvreggggggggggggdddddddhbipuurqgggggggggggdddddddhbitorggggggggggggnddddddhbipoxoxxxxxxxoxxxxxxxxxxxxxxxoxxxxxooulgggggggggggggdf`vtuxxxxxxxxxoxxxxxxxxoxxxoxx", +"xxoxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxurwgggggdjuxoutc`mfmbsgggggggggggggnddhmituooxxxxxxxxxxxxxxxxrsggggggggggggggjddddddhmitooxxxxxxxxxxoopic`craqgggjixxxooxxoorwggggggggggggdddddddhm`tagggggggggggnddddddjhm`vaggggggggggggdddddddhm`tusgggggggggggndddddddf`iuursggggggggggggdddddddfbiporggggggggggggndddddhf`vpoxxoxxxxxxxxxxxxxxxxxuerxxxoxxxxxouaqggggggggggggdhm`vuooxxxxxxxxxxxxxoxxxxoxxox", +"oxxxoxxoxxxxxxxxxxxxxxxxxxxxoxxxxxorwgggggdhuouupibmfmbcaggggggggggggggddhf`tpooooxxxxxxxxxoxxxxrwggggggggggggggdddddddf`ipxxxxxxxxxxxxoopticarlggggdpxxxououoorggggggggggggjdddddddhbiasgggggggggggnddddddjfbirsggggggggggggdddddmdhmctrkgggggggggggnddddddhmcvuurqgggggggggggnddddddhfcvporggggggggggggndddddhmcvuoxxxxxxxoxxxxxxxxxxxxaggkxxxooxxxxousggggggggggggjdhbctuoxxxxxxxxxoxxxxxxxxxxxxx", +"xxoxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxorkgggggjduooutv`bfmmcvaqgggggggggggggjddfbipoxxxxxxxxxxxxxxooorggggggggggggggnddddddhf`tuoxxxxxxxxxxxoooptprwggggjjxooouppuorsggggggggggggdddddddhf`trwgggggggggggddddddjhf`vrwgggggggggggjddddhrs``ipuwgggggggggggjddddddhbctorsggggggggggggjdddddmmmituorggggggggggggndddddhmipuoxxxxxxrsqaxxxxxxxxxxegggmxxxoxoxxxouwgggggggggggndhf`ipuxxxxxxxxxxxxxxxxxxoxxxx", +"xxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxoorsgggggjdvouppi`bfmmcvprkgggggggggggggjddhm`tuoxxxxxxxxoxxoxoxrsggggggggggggggnddddddhmctuxxxxxxxxoxxxooourrwgggggd`xoupttpporkgggggggggggndddddddhmctrggggggggggggddddddjhmctrqgggggggggggdddddaegg`turwgggggggggggjdddddhf`vpraqggggggggggggdddddjrssiuxxrggggggggggggndddddhbipuxxxxxxraqqgkxxxxxxxxosgggdxxxxxxoxoourqggggggggggnddhmctuoxxxxxxxxxxxxxoxxxxoxox", +"xoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxorsgggggjdvoouti`mfmmcipoosggggggggggggggddhf`vpooxxxxxxxoooxxoxukggggggggggggggjddddddhbiuoxxxxxxxxxxoxooxurwggggggdpouptiivpurlgggggggggggjddddddhh`irsgggggggggggjddddddjf`iaaggggggggggggdddd`rgggjcuuwgggggggggggjdddddhf`vprkgglggggggggggdddddeaggluxxuqggggggggggggdddddhbvuuxxxxxurlgggjbxxxxxxxokgggjoxxoxxxxoxuusggggggggggnddhfbipooxxxxxxxxxxxxxxxoxxxxx", +"xxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxrsgggggjdvoouticmmfmcvtuxorggggggggggggggdddhbipuxxxxxxoooxoxxoxrlggggggggggggggdddddddf`vuooxxxxxxxxxxxxxrrwggggggndxopti``ituaggggggggggggdddddddhm`trwgggggggggggdddddddhf`vrsgggggggggggndddhrkggndiorwgggggggggggjdddddhmctrsggkggggggggggnddddcrqggjbxxowggggggggggggdddddf`iuxxxxxorwgggndvxxxxxxxrwgggnvoxoooxxoooorqgggggggggndddhmctuxxxxxxxxxxxxxooxxxxoxx", +"xoxoxxxoxoxxxxxxxxxxxxxxxxxxxorsgggggndbxuupi`bfmm`ipuoxxulgggggggggggggnddhmctpuxoxxxoxooxxxxuaggggggggggggggnddddddhf`vuoxxxoxxxvbpoxoraqgggggggjmoptc`b`itreggggggggggggdddddddhbiprggggggggggggdddddddhbitrkgggggggggggjdddeegggdmuoowgggggggggggjdddddhbiraqggsggggggggggjdddmrwggndcxxokggggggggggggndddhh`vpxxxxxrsggggdhxxxxxxxxrlggggmuuuuuoooxoousgggggggggjdddhf`vpoxxxxxxxxxxxxxxoxxxxox", +"xxxxxoxxuxxxxxxxxxxxxxxxxxxuorsggggggdfooutvcbffm`ituxxxxowggggggggggggggddhf`vpooxxoxxxoxooxxukggggggggggggggjddddddhmctuooxxxxxxxxvorrkgggggggggdvptv`fm`vprlgggggggggggjddddddhf`vregggggggggggnddddddjfbiprwgggggggggggdddaaqggjdvuookggggggggggggdddddf`raqggwkggggggggggjddfrsgggdfoxxxegggggggggggggdddhf`vuxxxorsggggjjoxxxxxooorgggggjupttppoooxooegggggggggdddddfbipoxxxxxxxxxxxxxxxoxoxxx", +"xoxoxxxxuxxxxxoooxxxxuoxxxxareggggggnduvppicbffm`iiipxxxprsggggggggggggggnddfbituoxxotpvovuoxorlggggggggggggggjddddddhbitoxutvxxxoooarelgggggggggndivi`fhhm`urggggggggggggjddddddhfctrkgggggggggggjddddddhf`vprlgggggggggggddaaqggndbuooxsggggggggggggqdddh`aaqggnrwggggggggggjdfrsgggjdtoxxxoqggggggggggggqdddf`tuoxurwggggjdvxxouuuuuorggggggvtivvpuoooxorgggggggggdddddhbctuoxxxxxxoxoxxoxxxxxoxx", +"xxxxxoxooxxxxuuutxxotuptpxurwgggggggnfbctvcbffmbivivipxxttsggggggggggggggghdhmctuoxxociicvcxxregggggggggggggggjdddddhf`vpuxvvvixxourelgggggggggggjhcf`mhhfbireggggggggggggdddddddhbiprqgggggggggggdddddddhbiturggggggggggggwraqggndhtuoxurgggggggggggggwkcrrsqggndrggggggggggglsrsgggjd`uooooukggggggggggggglbmf`turralggggndcxoouptvtpuegggggghic`ituooooorggggggggjdddddhmctuxxxxxxxxxxoxxxoxoxxxx", +"xoxxxxxoxxxxxpooxxxpuupuvrawgggggggggmpivcbffmbivp`bitxoorsgggggggggggggggqhhfffmbbixptxvovorrlgggggggggggggggjdddddddhmtuxi`cvurrslgggggggggggggdfc`mfhhmcprkgggggggggggnddddddhf`vregggggggggggnddddddhhbvpurgggggggggggggwggggjd`tuouptwggggggggggggggwwgggggdhrggggggggggggwlgggndfpuxoupptqgggggggggggggqserraelgggggndmoooutvccvtrsggggggq`bb`vuooooregggggggnddddddhfctuoxxxxxxxxxxxxxxxxoxox", +"xxoxoxooxxxxxxxopxxtuuprreqggggggggggktccbfffbcvpioxotoorrlggggggggggggggggqk``ipoxxxtpxvoprrwggggggggggggggggqbfdddhbituoprrraswgggggggggggggggndibhhhhh`vprlgggggggggggjddddddhmctrsgggggggggggjddddddhm`vuurgggggggggggggggggjdmvpuoptisggggggggggggggggggggdhurggggggggggggggggndhipuoupvvvsgggggggggggggggggggggggggndmooxupic``ctrsgggggggqbmbcpoxoorlgggggggjddddddhm`tpoxxxxxxxxxoxoxxoxxxxx", +"xxxxxxxooxxxuoxxouxotrrewggggggggggggglsrvffmcvpuixrrrraslggggggggggggggggggglsaruxxxppurrasqggggggggggggggggggqksrrrrrresskwqggggggggggggggggggnj`mhddhh`vpaggggggggggggdddddddhbitrlgggggggggggdddddddhbipooulgggggggggggggggjdh`vpuuvicclggggggggggggggggggjdtxulgggggggggggggggdd`vppppiicivkgggggggggggggggggggggggndmxxoptvcbb`ctrwggggggggwbm`tuxursgggggggjdddddddhfctuoxxxxoxxxxxxxoxxxxoxx", +"xoxxoxoxuoxxouppuxxxoeqggggggggggggggggggqnm`ipoxt`rwqggggggggggggggggggggggggggglexu`vrwgggggggggggggggggggggggggggggggggggggggggggggggggggggggdhhddhdhfmmesgggggggggggnddddddhf`vragggggggggggndddddddfbvuoxokggggggggggggggjddm`vpptic`isqggggggggggggggggjdixxosggggggggggggggddfcvpppvi`citpkgggggggggggggggggggggjdmxxxppvc`mb`vtrwgggggggggletarrakgggggggjdhhdddddhmctoooxxxxxxxxxoxxoxoxxxx", +"xxoxxxxxooxoxxxxxxxxosggggggggggggggggggggghctuoxxxrggggggggggggggggggggggggggggggncxxxrggggggggggggggggggggggggggggggggggggggggggggggggggggggggdhhhddhhbiprwgggggggggggjddddddhmctrkgggggggggggjddddddhfcvpoxxuqggggggggggggjddhmcvttic``ipsgggggggggggggggdd`puoupqgggggggggggnddjf`vttvc``cvpuo`ggggggggggggggggggnddioouupvc`mb`iturqggggggggggggwwlggggggggjdfmhdddddfbitooxxxxxxxoxxxxxxxxoxox", +"oxxxxxoxxoxxxxxxxxxxxagggggggggggggggggggggdipoxxxxxggggggggggggggggggggggggggggggnmxxxxgggggggggggggggggggggggggggggggggggggggggggggggggggggggndhddddhf`vpoggggggggggggdddddddhmitukgggggggggggdddddddhmctuoxoxrggggggggggjddddhf`ivic``cvpucggggggggggggjddbivtptvcggggggggggjdddhf`ivic```ituooucnggggggggggggggnjdhtooupticbmm`cvporggggjjjnggggggggggggggjdj`imhddddhf`vpooxxoxxxxxxoxxxxoxxxxx", +"xxoxoxxxxxxxxxxxxxxxxxtdddddddddddddddddddddipoxxxxxxddddddddddddddddddddddddddddddfooxxxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddhmctpooddddddddddddddddddf`vpoxmdddddddddddddddddfbipooxxoxunngggnnjddddddhhbb`bb`cvpuoopnnggggggnjdddhf`ciicc`bnggggggnddddddhm````b`itpoooouthjnggggggggnnjddctttttvccbmbbcvpuuugggdjccmjjnggggggggnjdd`ppimhddddhbctuooxxxxoxxxxxxxxxxxoxxx", +"oxxxxoxoxoxxxxxxxxxxxxxxxoooooppvc`mhdddddhmctuoxxxxxxxxxxooouppibfdddddddddddddfbcvpuoooxoxxooxoupvcbfjddddddddddddf`ipuuoooooouuppptvvi``mfhhdddddddhbitooxxoooouv`fjdddddddhfcvuoxxxxxoupcmhdddddddhm`vuooxxxoxo`fddddddddddddhfmmbb`ituuxuoubjjjjjddddddjhfmbbbbmbbfjjjdddddddddhfmbbb`cvpuooxoupi`hddjjjjdddddfbcciicc`bmmmbcvtuoooejdhpupcmhdddjjjjdddmcoouvcfhdddhm`ipuoxxxxxxxxxxxxxxxxxxxox", +"xxoxxxxoxxoxxxxxxxxxxxoxxxoouptvc`mhhdddddhmbivppooxxxxxxooupptvcbhhddddddddddddhfbcivppuuooooooppvi`fhdddddddddddddfmcvtppupppppttvvic`bmfhhddddddddhf`vpuoxxxxoouv`fhdddddddhmctuxxxxxxoptcmhdddddddhmctuoxxxxxoooui`fddddddddddhffb`ivpooxxuutcbhddddddddddhhfffmm`cvvmfhdddddddddhhfmbcvpuoxxxxoutibfhdddddddddhhmmmbmmfffmbcvtuoxxouvvtxuvcmhdddhhmb`uuuooutibfhdhhfbituooxoxoxxxxxxxxxxxxxxxxx", +"xxxxxoxxxxxxxxxxxxxxoxxxxxoupti`bfhhdddddddfm`citpuxxxxxxuuptvccbfhddddddddddddddhfm`civtuuoxooptv`bmhhdddddddddddddhfm`civvvvviiic``bmmfhhhdddddddddhm`tuooooxxoopibfdddddddhfbvpoxxxxxoopv`fhddddddhhbitoxxxooxxxouv`mhdddddddddhhmbctuooxoxoouv`mhddddddddddjhhfm`ivtpv`mhdddddddddhfb`ituuxxxxxooptcbfhddddddddddhhhfhhffmbcvupuxooxoxxxouv`fhdjdhfb`ittppppicmhhdhfbcvuuxxxxxxxxxxxxxxxxxoxxoxx", +"xoxxxxxxoxoxoxxxxxxxxxxxxxxuticbmhhdhddhdhhhfmb`itpoxxxxoupvicbbmhhdddddddddddhdhhhfmb`citpoouuvc`bffhhddddddddddhdhhhfmb```````bbbbmffhhhdhhddddddhhfbipuxxxxxooupibfhdddddhhm`vuoxxxxxootv`fhdddddhhm`vpooxxxoxxxoupcbhhddddddhhhmbivpuxoxxxoouti`mhdddddddddhhfm`ituuptcbhhddddddhhfb`vppooxoxxxxoupvcbmhhdddddddddhdhhhfmbivpuxuxxooxoxoopt`mhhhhhhfb`civvvc`mfhhhmbctpuoxoxxxxxxxxxxxxxxxxxxxxx", +"xxoxxxxxxxxxxxxxxxxxxxxxxoouti`mmffhfhfhhhffmmb`cvpoxxxxoupvc`bmmffffffhfhffhfhfhffmmbb`ivpuoupvc`bmffffffhffhfhhhhhffmmbb`b`bbbbbmmmmmffffhffffffhffbcvpoxxxoxxooti`mfffffhfmbitpxxxxxxxupv`bffffffff`cpuooxoxxoxxoopv`mhhhdhdhhfm`ituoxoxxxoxoopti`mfhddddhdhhfm`ituooopvcmhhddddhhfb`vtuoooxxxxxoooopti`mfhdhddddhdhhhfmbcivpuoxxxxxoxoxoopv`mfhfffmmmm```c`bbmffmm`itpooxoxoooxxxxxxxxxxxxoxxoxx", +"xxxxoxxxxxxxxxoxxxxxxxxxxxoutvc```bbbbbbbbbb```civpoxxxxxupvi`c```bbbbbbbbbbbbbbbb`bb`ccitpooouvic```bbbb`bb`bbbbbbb`b````c`c```````b``mbbbbbbmmbbb``ivpuxxxxxxoxopvc`bbbbb```itpoxxxxxxxouti``bbbbb``ivpoxooxxxoxxouupicbfffffmb`cvtuooxxxxxxxooupti`bmffhhhffm`cvtpoxxoopicmffhfhfb`cvpuoxxxxoxxxxxoouutvc`bmffhfhhhffmb`ivtuuxxxxxxxxxxxouptcbbb````bbbbbbb`bmmmb`cvtuooxxxxxxoxxxxoxxxxxxxxxxxox", +"xxoxxxoxxxxxxxxxxxxxxxxxxxoouttiiiviivivvvvvviivtpupxxxxoouptvvivivvvviiiviiviiiiviiiivvtpuuoot`tvviiivvvivmbivvvviiiciivivvcvvv`mcmivi`ivivvii`iiivvtpuooxxxxxoooupbcvvvvivvvtpoxxxxxxxoou`bvvvviicbttpupcucpoxoxxxooupvic````civtpuoxxxxxxxvtxxxoptvi`bbbbb``citpovcpxxoupvi`bmb``cvppooxxxxxxxxxxpcxxouptvc``mbmbbb``civtpuooxxxxxxxxxxxxxuticciivvviccc```````ccitpuooxxxxxxxxooxxxoxxxxoxxoxxxx", +"xxxxoxxxxxxxoxxxxxxxxxxxxxxxouuppppppppppppuupppuuiuxxxxxxouuuupuupppupppppuppuptpppppppuoooooovuupppppppptftppuppuuctpppppvipppvbifpppuippupppippppuuoxxxxxxxxxooouuippppuuvuuuoxxxxxxxxooovuppuuvtp`vooomompxxoxoxoooupttvvvvttpuuooxxxxxxxxpxxxxxuitviiiiivvtpuuooxpxxxooptviiiivtpuooxxxxxxxxxxxxtxooxouutvvibiiiivvtppooxxxxxxxxxxxxxxxooutvvtppppptvviiiiivvttppuoxoxxxxxxxxxxxxxxooxxxxxxoxxx", +"xoxxxxoxxxxxxxxxxxxxxxxxxxxxoooxuouoooouuooxoooooxixxxxotpoxotuptpooppottoooxutvoooppptuoooxututooooooooooviooooooouioouuouioooot`uboooovuooxoouvoooooxxxxxxuuoptooootpvooopitttxxpopxuuxxxotoooootooooxxxmx`oxxxxxxxoxoouupppuuuooooxxxxxxxxxpopoxouivvivtvvvtptooxxxpxxxoxouuppvvvtupxxxxupoxxooptopxxootpouuppcttppppuuooxxxxxxxxxxxxxxxxxxopuuuuoooouupppttpppuuoooxxxxxxxxxxxxxxxxxxxoxxxoxxxox", +"xxoxxxxxoxxxxxxxxxxxxxxxxxxxxoooxxooxoxxoxxxxoxxouuxxxxppttxxtiipvtouictpcoxtiptcoopctttuxxttpicoooooxoxoovuxoxxoxxupoooooovxooooixioxxoxvxxxxxxvxxxxxxxxxxxuiitpcxxx`ptixxuiptuxxpcpittpxxxpxxxxxucpuxxxxcxvxxoxxxxxxxxxoooooooooxxxxxxxxxxxxvtttuxoittvuutcvctttxxxxpxxxxxxxouotctctptxxtvpipoxptpiioxtvppcuoooppouoooooxxxxxxxxxxxxxxxxxxxxouoooxoxooxoooououuooooxoxxxxxxxxxxxxxxxooxxxoxxxxoxxx", +"xxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpxxxxxtcvtxxxtxxxtxxtoxoopovpppvixxpxxopoxtxxxtxxxxxxoxxxxxxxxxoxopxxxooxopoxxxxxxxxoxxxtoxxxxxotxxxxxxxxxxxtxxxopxxpxxpxxxpxxxxxxixpxxpxxxpxxxxxxxxtpxxxxoxxxxoxxxxxxoxxoxxxxxxoxoxxxxxxxxxxpxxxpxxpxooooocxtxxpxxxxpxxxxciccipxixpxxuxuoxxxpxxtxxxtxxvppptvxxxxtxxxoxoxxxxxxxxxxxxxxxxxxoxxxooxoxxxxxoooxoxoxooooxxxxxxxxxxxxxxxoxxxoxoxxoxoxxoxx", +"xoxoxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxpxxxxpuxxtxxxtxxxtxxtxxxopxcpptpuxopxxxpxxpxxxpxoxxxxxxxxxxxxxxxxopxxxxxoxpxxxxxxxxxoxxxovxxxxxxixxxxxxxxxxxtxxxopxxpxxpxxxpxxxxxxixpxxpxxxpxxxxxoxxopxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxpxxxtxxpxoxoxxixpxxpoxoopxxxxxxxxxoxixpxxuxpxxxxpxxpxxxpxxipppppxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxox", +"xxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxxtxxovxxxcoxotxxvtxovoxttxxxoxxpoxxpxxvxxucxxxxxxxxxxxxxxxxxxxopxxooxotxxxxxxoxxxxxoxtxxxxxxuoxxxxuvxxxxvtxovxxxpxxuxxxtxxxoxxvxpxxpxxxuxxxxxvvttxxxxoxxxxxxxxxxoxxxxxxxxxxoiuxxxxxxxxxxxpxxxpxxpoxoooxixpxxpoxxxpxxxxxxxxxxxixuxxuxxvoxutxxvoxucxxttxxxoxxxtxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxoxxxxxoxxoxxoxxxxxx", +"xoxoxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxvxxxxiiptpxxptitxxxuuivooxxuiipoxtipxtixxxtituixxxooxxxxxxxxxxxxxxvxxxooxtoxxxxxooxxoxxxotxxxxxxvxxxxuvxxxxuuivoxxiixuivxxxvivuxiixpuxixpiivvuxxxxuxxxxxxxxxxxoxoxxoxxxxxxxxxxoiuxxxxxxxxxxpiuxiiuxxtiipotiuutxtuoiiiitxxxxxxxxtiuupxpoxxvvtxxxxvituixxovipxooxvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxoxxxxoxxoxxxoxoxx", +"xxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxxxxxpxxxxxxpxxxxxxoxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxuuxoxxxxtxxxxxxxxxxoxxxuxxxxxxoxxxxxxxxxxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuxxxxxoxoxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxoxoxoxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtoxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxox", +"xxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvivxxxxpivoxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxpiioxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxx", +"oxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxoxxxoxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxoxxxxxxxx", +"xxoxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxx", +"oxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxooxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxoxxxxoxxxoxxxxx", +"xxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxoxxxxxxxoxxxxoxox", +"xxxoxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxxxxxxxxoxxxxxoxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxoxxxxxxxxxxxxxoxxxxxooxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxoxxxxoxxxxxxxxxx", +"xoxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxoxooxxxxxxxxxxxxxouxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxoxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxoxoxxoxoxoxxxox", +"xxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxoxuxxxvpppxxxpxxxxxxpoxxxxxxxxxxxxxxxxxxxopxxxxxxxxxxxxxxxxxxxxxxpuxxxxxxpxxxxxupopxxxxxxxxxxxxxxxxxxxxxxxxoxoxxxootuxxxxxxxxxxxoooxoxxoxxtpxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxuuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxoxxxxxxxxxxxxxoxxxoxxxxxxxxxxx", +"xxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxooxoxoxxxxxxxxxxxxxxtoxxxtpttxxxooxxxxxxpxxxxxxxxxxxxxxxxxxxxuxxxxxxxoxxxxxxxxxxxxxxxuxxxxxuxxvxxxuvuixxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxoxuxxxxxxoxxxxxxxxoxxxxxxuxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxuxxxxxxxxxxuxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxoxxxoxxxxxxxxxxxoxxoxxxoxxoxxxxx", +"oxxoxoxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxxxxxxxxxxxxpoxoxtuptxxxxpxxxxxxpooxxxxxxxxxxxxuuoxxxuxoxxxxupooxxxoooxoxxxxxoxxxxxuxxxxxxutxvxxxxxxxxxxxxxxxxxxxxxxxxxoxooxxxouuuxxxupouuxxuuuouuxxoxuxxxxxxxxxxououoooxxxxuuxxxxxuuxoxxxxoxxxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxxxxoxxxxxxxxxxxxxxoxxxoxxoxxoxoxx", +"xoxxxxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxouxxoopoouxxxxouxxxxxxpxxxxxxxxxxxotuupuxxupuuuxxopuuxxoppppupxxxxoxxxxxupuxxxxxpxpxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxtuupxxotuuoxxututupuxoxuxxxxxxxoxxoututupoxotuutoxxpuutuxxupuupxxxxuxxxxxxooxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxoxooxxoxxxxxxxxx", +"xxxxxxoxxxxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxxxxxxxuxoxxxxxoxoxxxxpxxxxxxuoxxxoxxxxxxuuuuutxxoxxxoxxxuxxxxxuoxuxuxxxxuxxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooxxxxxxuxxuxoxuxxxxxxtxuxxuxxxoxxxxopttptxxtxuxxuxuxxxxuxuoxxxuxxpuuupxxxxoxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxoxxxoxxxxxxxxoxxoxxxoxoxxxox", +"xxxoxxxoxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxxxoxxxxxxuxxxoxoxoxxxxxxuoxxoxxopxxxxoxoxxopuuuuuxxoxxxooxxuxxxxxuuxoxuxxxxoxxxxuxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxuxouxxxuxxxxxxpxuxxuxoxuxxxxxxxxxxxxpxuxouxuxoxxuxuxxxxoxopuuuuoxxxuxxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxoxxxxxxoxxoxxxxxxxxxoxoxxxxxxoxxx", +"xoxxxxxxxoxxxxxxoxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxoxxxxxxxxxxoooxxxxxxxoxxxxxuxxxoxxuxxxxxpuoxxopoxxxxxuxxxuxoxuxxxxxuoxuxoxxxxuxxoxoppuoxxxxxxxxxxoxxxxxxxxxxxxxxxupoxxoxxxoxoxxuxxooxxuxoxxxxtxuxouxxxuxxxxxxxxoxxxpxuxxuoouxxpoxouxxupxxpoxxxxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxxxxx", +"xxoxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxooxxxoxoxxoxxxxxxpxxxoxxxxxoxxxxuoxxxxxouxxxxpuxxxxxppuoxopuxupuxxoppuoopuxpxouxpppppxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxopxxxxoxxxxoxppooppxoouppoxppxuoxpxuppppoxxxxxxxxppxuoxpxxoppooxxoppouuxxuppoxxxxuxxxxxxuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxooxxxoxxoxxoxxxxxxxxxoxxxxxxoxxox", +"xxxoxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxxxoxxxxxooxxxxxxxxxxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxoxxoxoxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxoxxxxxxxxoxoxoxxxxxxpxxxxxxuoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxoxxxxxxxxxxxxxxxxxxoxxxoxxx", +"xoxxxoxxoxxxoxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxoxoxxoxxoxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxoxxxxxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxoxxoxxoxxxxxxxxxxoxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxxxxxxxoxxxoxxoxxxxxxxoxxxxxxxox", +"xxxoxxxxxxxxxxoxxxxxoxoxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxxoxxxoxxxxxxxoxxoxxxxoxxxoxoxxxxxxxxxxxxoxxxoxoxxxxxxoxxxxoxxxxxxxxoxxxoxoxxxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxoxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxxoxxoxoxxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxoxxxoxxxxxxxxxoxxxxxxxxxoxxx", +"xxxxxoxxxxoxxxxxoxxxxxxoxxxxxxxxxxoxoxxxxxxxxxxxxoxooxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxoxxxxxoxoxxxoxxxxxxoxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxoxxoxxxxoxxxoxxxxxxxxxxxxxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxoxxxxoxxoxxoxxxxxxxoxoxxxxxxxxxxxxxxxxoxoxxxoxxxxxxxxxxoxoxxxxxxoxxoxxxxxxxxxxxxxooxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxxxxxxoxxxxxoxxxxxxxxxxxxxoxxxxxx", +"oxxoxxoxoxxxoxoxxxxxxxxxxxxxxxxoxxxxxxxxxxxxxxxxxxxxxxoxoxxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxoxxxxoxxxxxoxxxxxxxxxxxoxxxxoxxoxoxxxoxxxxxoxxxxxxxxoxxxxxxxxxxxxxxxxxxoxxoxxxxxxoxoxxxxxxoxxxxxxxxxxxxxxxxxxxxxxxxoxxxxoxxxoxxxxxxxxoxxxxxxxxxxxxoxxxxoxxoxxxxoxoxxoxxoxxxxxxxxoxxxoxxxxxxxxxxxxxxxxoxxxxxxoxxoxxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxxoxxxxxxxxoxoxxxxxxxoxoxx", +"xxxxoxxxxxoxxxxoxxoxxxxxxxxxxxxxxxxxxxxxxxxxxxxoxoxoxxoxxxoxxxoxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxxxoxxxxoxxoxxoxxxxxxxxxxxoxxxxoxxxxxoxxxoxxxxxxxxxxoxxxxoxxxxxxxxxxoxoxxxoxxoxxoxxxxxxxxxxxxoxxxoxxxxxxxxxxxxxxoxxoxxxxoxxxxxxxoxoxxoxxxxxoxoxoxxxxxxxxxxxxxoxxxxxxoxxoxxxxoxxxxxxxoxxxxoxxxxoxxoxxoxxxoxoxoxxxxxxxxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxxxxxoxxxxoxoxxoxxoxxxoxxxxxxoxxxxxxxxxox", +"xoxxxxoxoxxxxxxxxxxoxxxoxxoxoxxxoxoxxxxxxxxxxoxxxxxxoxxxoxxxoxxxxxoxxxoxoxxxoxxxxxxxxxoxxxxxxoxxxxoxxxxxxxxxxxxoxxxxxxxxxoxxxxxoxxxxoxoxxxxoxxxoxxxxxxxoxxoxxxxoxxxxxoxxoxoxxxxxxoxxoxxoxxxxoxoxoxxxxxxxoxxxxoxxxxxxxxxxxxxxxxoxxxxoxxoxxxxxoxxxoxxxxoxxxoxxxxxxxxxoxxxoxoxxxxxxxxoxxxoxxxxxxxxoxxxxoxxxxxxxxxxxxxxxxxoxoxxoxoxoxxxxxxoxoxxxoxxxxxxxxxxxoxxxxoxxxxxoxxxxxxxoxxxoxxxxoxoxxxxxxxxxxxxx", +"xxoxxxxxoxxxoxoxoxxxxoxxxxxxxoxxxxxxoxxxxxoxxxxoxoxxxoxxxxxxxoxoxxxxoxxxxxxxxoxxxxxxxxxxoxxxxxxoxxxoxxoxxoxoxoxxxoxxoxoxxxoxoxxxxxxxxxxoxoxxxxxxxxxxxxxxxxxxxxxxuoxxxxxxxxxxoxxoxxxxxoxxxxouoxxxxoxooxxxxoxxxxoxxxxxxxoxoxxxxxxoxxxxoxxxoxxxxxxxxoxxxxoxxxxxxxoxxoxxxoxxxxxoxxoxxxxxxxxxoxxoxxxxoxxxxxoxxxoxoxxoxoxoxxxxxoxxxxxxoxoxoxxxxxxxxoxxxxxxxxoxxxxxxxoxxoxxxoxxoxxxxoxxxoxxxxxoxoxxxxxxoxxx", +"xxxxxxxxxxoxxxxxxxxxxxxxoxxoxxxxoxoxxoxoxxxxxoxxxxxoxxxoxxoxxxxxxoxxxxoxoxxoxxxxxoxxxoxxxxxxoxxxoxxxoxxxxxxxxxxxxxxxxoxxoxxxxxxxoxxxxxxxxxxoxxxoxxxoxxxoxoxoxoxxxoxoxoxoxxoxxxxxxoxoxxoxoxxxxoxoxxxoxoxoxxxoxxxxoxoxxxxxoxxoxxxoooxxxxxxxxxxoxxoxxxxoxxxoxoxoxxxxxxxxxxxxoxxxxxxxxoxxxxxxoxxxoxxxoxxoxxoxxxxxoxxxxxxoxoxxxxxoxoxxxxxxxoxoxoxxxoxxxoxxxxxxxoxxxxoxxxoxxxxxxxxxxxxxxxxxoxxxxxoxoxxxoxx", +"xoxxoxoxxxxoxxxxxxxoxxoxxxxxxoxxxxxoxxxxoxoxxxoxoxxxoxxxoxxxoxoxxoxxxxxxxoxxxoxxxxxoxxxoxxxxxxxxxxoxxxxoxxoooxxooxxoxxooooooxoxxxooxoxxxxxxxooxoxoxxxoxoxxxxxxooxoxxxooxoxxxoxoxxxxoooxxxoxxoxxxooxoxxxxxooooxxxooxoxoxxooxxxoxxoxxoxoxoxxoxxxxxxxxxxxoxxxxxxoxoxxxxxoxxxxoxoxxxxxxoxxoxxxxoxxxoxxoxxxxxoxxoxxoxoxoxxxxoxxoxxxxoxoxxxxxxxxxoxxxxxxxxoxxxoxxxoxxxxoxxxoxoxxoxoxxoxxoxxxoxoxxxxxoxxxxx", +"xxoxxxxxoxxxxoxxoxxxxxxxoxoxxxoxxoxxoxoxxxxoxxxxxxoxxoxxxxoxxxxxxxoxoxxoxxxoxxoxxxxxxxxxoxxoxoxxoxxxoxxxxxoxooxxxoxooxxxooxoxxxooxooxxoxoxoxxooooooxxxoxooxoxooooxoxooxoxoxoxxxxxoxxoxoxxxoxxoxxxxooxxoxoxoxooxooxooxxxxxoxxxxxxoxxxxxxxoxxxxoxxoxoxoxxxxoxoxxxxxxoxxxoxoxxxxxoxxxxxxxxxoxxxxoxxxxxxoxoxxoxxxxxxxxxoxoxxoxxxxoxxxxoxxoxxoxxxoxoxxxxxxoxxxxxxxxoxxxxoxxxxxxxxxoxxxxxxoxxxxxoxoxxxxoxx", +"xxxxoxoxxxoxxxxxxoxxoxxxxxxoxxxxxxxxxxxoxoxxoxxoxxxoxxoxoxxoxxoxoxxxxoxxoxxxoxxoxxxxxoxxxxxxxxoxxxxxxoxoxxooxoxoxoxxoxoxxxxxoxxoxxxoxxooooooxxxxxxoxooxxoxxxoxxxxoxoxooooxxoooooxxoxoooxoxxxoxxoxxxoxxxxxoxoxxxxoxxxxoxxxoxxoxxxoxoxxoxxxxoxxxoxxxxxxoxoxxxxxoxxoxxoxxxxxxoxxxxoxoxxoxxxxoxxxxxoxoxxxxoxxxoxxoxxoxxxxxoxxoxxxxoxoxxoxxoxxoxxxxxoxoxxxxxoxxoxxxxoxxxxoxxoxoxxxxxoxoxxoxoxoxxxxoxoxxox" }; diff -r e183fc049578 -r fe104dbd9147 lib-src/ChangeLog --- a/lib-src/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/lib-src/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,7 @@ +Fri Mar 14 17:59:57 1997 Steven L Baur + + * update-elc.sh (ignore_dirs): Build VM with `make autoload'. + Wed Mar 5 18:07:57 1997 Steven L Baur * gzip-el.sh: New file. Courtesy of Jeff Miller and Hrvoje Niksic. diff -r e183fc049578 -r fe104dbd9147 lib-src/update-elc.sh --- a/lib-src/update-elc.sh Mon Aug 13 09:18:41 2007 +0200 +++ b/lib-src/update-elc.sh Mon Aug 13 09:19:45 2007 +0200 @@ -99,7 +99,7 @@ # but it depends on nothing (Kyle is like that). ignore_dirs="$ignore_dirs vm" echo "Compiling in lisp/vm"; -(cd lisp/vm && ${MAKE:-make} EMACS=$EMACS) +(cd lisp/vm && ${MAKE:-make} EMACS=$EMACS autoload) echo "lisp/vm done." # Prepare for byte-compiling directories with directory-specific instructions diff -r e183fc049578 -r fe104dbd9147 lisp/ChangeLog --- a/lisp/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,5 +1,76 @@ +Sat Mar 15 15:14:06 1997 Steven L Baur + + * prim/loadup.el: Add prim/auto-customize.elc to dumped files. + + * utils/autoload.el (generated-custom-file): New variable. + (autoload-snarf-defcustom): New function. Grab Customization as + we look for autoload cookies. (based on code by Per Abrahamsen). + (update-file-autoloads): Use it. + (autoload-save-customization): New function (based on code by Per + Abrahamsen). + (batch-update-autoloads): Use it. + +Fri Mar 14 19:59:36 1997 Bob Weiner + + * packages/jka-compr.el (jka-compr-installed-p): Simplify. + +Fri Mar 14 17:24:30 1997 Steven L Baur + + * modes/sendmail.el: Correct vm macro hack. + (query-user-mail-address): New customizable variable. + (user-mail-address): New function, use it. (Courtesy of Per + Abrahamsen ). + +Thu Mar 13 18:49:50 1997 Steven L Baur + + * x11/x-menubar.el (popup-mode-menu): Do something more correct + when combining a global popup menu and a local mode menu. + +Thu Mar 13 08:36:35 1997 Adrian Aichner + + * packages/crypt.el (crypt-unix-to-dos-region): Correct DOC string. + +Wed Mar 12 13:46:21 1997 Steven L Baur + + * prim/obsolete.el (char=): Make alias for common lisp + compatibility. + +Mon Mar 10 09:44:05 1997 Steven L Baur + + * prim/simple.el (set-fill-column): Clean up docstring. + + * x11/x-menubar.el (save-options-non-customized-face-list): Allow + save-options to save faces declared with defface macro. + + * packages/vc.el: diff-switches is autoloaded again in diff.el. + + * packages/diff.el (diff-switches): Default to "-c". + +Sun Mar 9 18:44:59 1997 Tomasz J. Cholewo + + * prim/help.el (describe-function-1): Add missing stream arguments + to terpri and princ. + +Sun Mar 9 15:38:29 1997 Steven L Baur + + * prim/modeline.el (modeline-minor-mode-menu): Evaluate minor + modes in context of correct buffer. + + * prim/help.el (locate-library): Synched with Emacs 19.35. + + * packages/icomplete.el (icomplete-get-keys): Make it work. + + * prim/about.el: Add Jens Lautenbacher's picture. + +Sun Mar 9 12:38:53 1997 Noah Friedman + + * utils/eldoc.el (eldoc-pre-command-refresh-echo-area): Use + eldoc-display-message-p, not eldoc-display-message-no-interference-p. + Sat Mar 8 11:20:47 1997 Steven L Baur + * prim/startup.el (startup-splash-frame-body): More text tweaking. + * x11/x-faces.el (*try-oblique-before-italic-fonts*): New user variable. Allow trying oblique fonts ahead of italic fonts (from Raymond Toy). @@ -10,7 +81,7 @@ Fri Oct 11 14:21:05 1996 Christoph Wedler - * hyper-apropos.el (hypropos-get-doc): Put font names etc in + * packages/hyper-apropos.el (hypropos-get-doc): Put font names etc in parentheses if instantiation uses fallback. (hypropos-face-history): New variable. (hyper-describe-face): New function. @@ -24,7 +95,7 @@ Fri Jul 19 12:01:51 1996 Christoph Wedler - * hyper-apropos.el: Massive changes--the original knew nothing + * packages/hyper-apropos.el: Massive changes--the original knew nothing about buffer-locals and local-bindings. (hypropos-shrink-window): New user option. (hypropos-ref-buffer): New variable. @@ -247,47 +318,49 @@ Wed Feb 19 08:04:02 1997 Noah Friedman - * eldoc.el (eldoc-message-commands): Doc fixes. + * utils/eldoc.el (eldoc-message-commands): Doc fixes. (eldoc-message): Make function, not macro. - * eldoc.el (eldoc-last-message): New internal variable. + * utils/eldoc.el (eldoc-last-message): New internal variable. (eldoc-mode): Initialize it to nil. (eldoc-message): Use it. (eldoc-print-current-symbol-info): Use it. - * eldoc.el (eldoc-pre-command-refresh-echo-area): New function. + * utils/eldoc.el (eldoc-pre-command-refresh-echo-area): New function. (eldoc-mode): Put it on pre-command-hook if in XEmacs or using idle timers in Emacs. - * eldoc.el (eldoc-message-commands-table-size): New constant. + * utils/eldoc.el (eldoc-message-commands-table-size): New constant. (eldoc-add-command): Use it to initialize eldoc-message-commands. - * eldoc.el (eldoc-display-message-no-interference-p): New function. + * utils/eldoc.el (eldoc-display-message-no-interference-p): New + function. (eldoc-display-message-p): Use it. - * eldoc.el (eldoc-print-fnsym-args, eldoc-print-var-docstring): + * utils/eldoc.el (eldoc-print-fnsym-args, eldoc-print-var-docstring): Arg sym no longer optional. Do not initialize arg if nil. - * eldoc.el (eldoc-forward-sexp-safe): Function deleted. + * utils/eldoc.el (eldoc-forward-sexp-safe): Function deleted. (eldoc-beginning-of-sexp): New function. (eldoc-fnsym-in-current-sexp): Use eldoc-beginning-of-sexp. Use eldoc-current-symbol to get symbol at point. - * eldoc.el (eldoc-function-argstring-from-docstring-method-table): - Forge docstrings for `and', `or', `list', `+', and `-'. + * utils/eldoc.el + (eldoc-function-argstring-from-docstring-method-table): Forge + docstrings for `and', `or', `list', `+', and `-'. - * eldoc.el (eldoc-add-command-completions): New function. + * utils/eldoc.el (eldoc-add-command-completions): New function. (eldoc-add-command): Take list of args. No longer interactive. (eldoc-remove-command-completions): New function. (eldoc-remove-command): Take list of args. No longer interactive. - * eldoc.el: Initialize eldoc-message-commands using + * utils/eldoc.el: Initialize eldoc-message-commands using eldoc-add-command-completions. - * eldoc.el (eldoc-display-message-p): New function. + * utils/eldoc.el (eldoc-display-message-p): New function. Return nil if cursor-in-echo-area, or using idle timers and a command is still active. (eldoc-print-current-symbol-info): Use eldoc-display-message-p. diff -r e183fc049578 -r fe104dbd9147 lisp/bytecomp/bytecomp.el --- a/lisp/bytecomp/bytecomp.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/bytecomp/bytecomp.el Mon Aug 13 09:19:45 2007 +0200 @@ -1745,9 +1745,9 @@ (skip-chars-forward (concat (char-to-string 0) "-" (char-to-string 255))) (eq (point) (point-max))) - (setq file-coding-system 'no-conversion) + (setq buffer-file-coding-system 'no-conversion) (insert ";;;###coding system: escape-quoted\n") - (setq file-coding-system 'escape-quoted) + (setq buffer-file-coding-system 'escape-quoted) ;; Lazy loading not yet implemented for MULE files ;; mrb - Fix this someday. (save-excursion diff -r e183fc049578 -r fe104dbd9147 lisp/comint/comint.el --- a/lisp/comint/comint.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/comint/comint.el Mon Aug 13 09:19:45 2007 +0200 @@ -355,6 +355,23 @@ (put 'comint-scroll-show-maximum-output 'permanent-local t) (put 'comint-ptyp 'permanent-local t) +(defface comint-input-face '((((class color) + (background dark)) + (:foreground "red")) + (((class color) + (background light)) + (:foreground "blue")) + (((class mono)) + (:bold t)) + (((class grayscale)) + (:bold t)) + (t + (:bold t))) + "How to display user input for comint shells." + :group 'comint-input-face) + + + (defun comint-mode () "Major mode for interacting with an inferior interpreter. Interpreter name is same as buffer name, sans the asterisks. @@ -1347,7 +1364,9 @@ (set-marker comint-last-input-start pmark) (set-marker comint-last-input-end (point)) (set-marker (process-mark proc) (point)) + (comint-input-done) (funcall comint-input-sender proc input) + (comint-input-setup) ;; XEmacs - A kludge to prevent the delay between insert and ;; process output affecting the display. A case for a ;; comint-send-input-hook? @@ -1355,6 +1374,27 @@ (concat input "\n")) (comint-output-filter proc "") ))))) +(defun comint-input-done () + "Finalized comint-input-extent so nothing more is added." + (if (not comint-input-extent) + (comint-input-setup)) + (set-extent-property comint-input-extent 'start-closed nil) + (set-extent-property comint-input-extent 'end-closed nil) + (set-extent-property comint-input-extent 'detachable t) + ) + +(defun comint-input-setup () + "Insure the comint-input-extent is ready." + (setq comint-input-extent (make-extent (point) (point-max))) + (set-extent-property comint-input-extent 'detachable nil) + (set-extent-property comint-input-extent 'start-closed t) + (set-extent-property comint-input-extent 'end-closed t) + (set-extent-face comint-input-extent 'comint-input-face) + ) + +(defvar comint-input-extent nil + "Current extent used for displaying text in buffer."); +(make-variable-buffer-local 'comint-input-extent) ;; The purpose of using this filter for comint processes ;; is to keep comint-last-input-end from moving forward @@ -1370,6 +1410,9 @@ opoint (point) obeg (point-min) oend (point-max)) + ;; Keep stuff being output (before input) from using input-extent + (if comint-input-extent + (set-extent-property comint-input-extent 'start-closed nil)) (let ((buffer-read-only nil) (nchars (length string)) (ostart nil)) @@ -1394,6 +1437,11 @@ (set-marker comint-last-output-start ostart) (set-marker (process-mark process) (point)) (redraw-modeline)) + ;; Now insure everything inserted after (user input) is in extent + (if (not comint-input-extent) + (comint-input-setup)) + (set-extent-endpoints comint-input-extent (point) (point-max)) + (set-extent-property comint-input-extent 'start-closed t) (narrow-to-region obeg oend) (goto-char opoint) diff -r e183fc049578 -r fe104dbd9147 lisp/custom/ChangeLog --- a/lisp/custom/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,53 @@ +Fri Mar 14 18:03:55 1997 Per Abrahamsen + + * Version 1.63 released. + +Fri Mar 14 18:00:40 1997 Per Abrahamsen + + * custom.el (custom-help-menu): Use :filter to generate menu on + XEmacs. + * cus-edit.el (custom-menu-update): Support use as :filter on + XEmacs, popup menu on Emacs. + +Tue Mar 11 16:27:50 1997 Per Abrahamsen + + * Version 1.62 released. + +Tue Mar 11 11:30:39 1997 Per Abrahamsen + + * cus-face.el (custom-set-face-font-size): Use + `font-set-face-font' instead of `set-face-font'. + (custom-set-face-font-family): Ditto. + + * Version 1.61 released. + +Tue Mar 11 11:27:19 1997 Per Abrahamsen + + * cus-face.el (custom-set-faces): If face already exists, + overwrite it now. + +Mon Mar 10 15:40:29 1997 Per Abrahamsen + + * cus-face.el (custom-face-attributes): Changed default colors to + black and white. + + * wid-edit.el (color-item): Set `:sample-face-get'. + + * cus-face.el (custom-declare-face): Don't initialize an existing + saved face. + + * wid-edit.el (color): Changed default color from "default" to + "black". + + * Version 1.60 released. + +Mon Mar 10 11:32:51 1997 Per Abrahamsen + + * widget.el (:tab-order): New keyword. + * wid-edit.el (widget-move): Use it. + * widget.texi (Basic Types): Documented it. + Patch by "William M. Perry" . + Sat Mar 08 17:21:12 1997 Per Abrahamsen * Version 1.59 released. diff -r e183fc049578 -r fe104dbd9147 lisp/custom/cus-edit.el --- a/lisp/custom/cus-edit.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/cus-edit.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -1835,17 +1835,23 @@ item))) ;;;###autoload -(defun custom-menu-update () +(defun custom-menu-update (event) "Update customize menu." - (interactive) + (interactive "e") (add-hook 'custom-define-hook 'custom-menu-reset) - (let ((menu `(,(car custom-help-menu) - ,(widget-apply '(custom-group) :custom-menu 'emacs) + (let* ((emacs (widget-apply '(custom-group) :custom-menu 'emacs)) + (menu `(,(car custom-help-menu) + ,emacs ,@(cdr (cdr custom-help-menu))))) (if (fboundp 'add-submenu) - (add-submenu '("Options") menu) - (define-key global-map [menu-bar help-menu customize-menu] - (cons (car menu) (easy-menu-create-keymaps (car menu) (cdr menu))))))) + (progn + (add-submenu '("Options") menu) + (cdr emacs)) + (let ((map (easy-menu-create-keymaps (car menu) (cdr menu)))) + (define-key global-map [menu-bar help-menu customize-menu] + (cons (car menu) map)) + (when (fboundp 'x-popup-menu) + (x-popup-menu event map)))))) ;;; Dependencies. diff -r e183fc049578 -r fe104dbd9147 lisp/custom/cus-face.el --- a/lisp/custom/cus-face.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/cus-face.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -207,8 +207,7 @@ (unless (get face 'factory-face) (put face 'factory-face spec) (when (fboundp 'facep) - (unless (and (custom-facep face) - (not (get face 'saved-face))) + (unless (custom-facep face) ;; If the user has already created the face, respect that. (let ((value (or (get face 'saved-face) spec)) (frames (custom-relevant-frames)) @@ -243,9 +242,11 @@ Control whether the text should be underlined.") set-face-underline-p) (:foreground (color :tag "Foreground" + :value "black" :help-echo "Set foreground color.") set-face-foreground) (:background (color :tag "Background" + :value "white" :help-echo "Set background color.") set-face-background) (:invert (const :format "Invert Face\n" @@ -308,14 +309,14 @@ (let* ((font (apply 'face-font-name face args)) (fontobj (font-create-object font))) (set-font-size fontobj size) - (apply 'set-face-font face fontobj args))) + (apply 'font-set-face-font face fontobj args))) (defun custom-set-face-font-family (face family &rest args) "Set the font of FACE to FAMILY" (let* ((font (apply 'face-font-name face args)) (fontobj (font-create-object font))) (set-font-family fontobj family) - (apply 'set-face-font face fontobj args))) + (apply 'font-set-face-font face fontobj args))) (nconc custom-face-attributes '((:family (editable-field :format "Font Family: %v" @@ -461,7 +462,8 @@ (now (nth 2 entry))) (put face 'saved-face spec) (when now - (put face 'force-face t) + (put face 'force-face t)) + (when (or now (custom-facep face)) (when (fboundp 'copy-face) (copy-face 'custom-face-empty face)) (custom-face-display-set face spec)) diff -r e183fc049578 -r fe104dbd9147 lisp/custom/custom.el --- a/lisp/custom/custom.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/custom.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, faces -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -297,8 +297,10 @@ ;;; Menu support -(defconst custom-help-menu '("Customize" - ["Update menu..." custom-menu-update t] +(defconst custom-help-menu `("Customize" + ,(if (string-match "XEmacs" emacs-version) + '("Emacs" :filter custom-menu-update) + ["Update menu..." custom-menu-update t]) ["Group..." customize t] ["Variable..." customize-variable t] ["Face..." customize-face t] diff -r e183fc049578 -r fe104dbd9147 lisp/custom/wid-browse.el --- a/lisp/custom/wid-browse.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/wid-browse.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: extensions -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: diff -r e183fc049578 -r fe104dbd9147 lisp/custom/wid-edit.el --- a/lisp/custom/wid-edit.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/wid-edit.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: extensions -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -733,7 +733,11 @@ (button (goto-char button)) (field (goto-char field)) (t - (error "No buttons or fields found"))))))))) + (error "No buttons or fields found")))))) + (setq button (widget-at (point))) + (if (and button (widget-get button :tab-order) + (< (widget-get button :tab-order) 0)) + (setq arg (1+ arg)))))) (while (< arg 0) (if (= (point-min) (point)) (forward-char 1)) @@ -767,7 +771,11 @@ (cond ((and button field) (goto-char (max button field))) (button (goto-char button)) - (field (goto-char field))))) + (field (goto-char field))) + (setq button (widget-at (point))) + (if (and button (widget-get button :tab-order) + (< (widget-get button :tab-order) 0)) + (setq arg (1- arg))))) (widget-echo-help (point)) (run-hooks 'widget-move-hook)) @@ -2328,7 +2336,7 @@ (define-widget 'color-item 'choice-item "A color name (with sample)." :format "%v (%{sample%})\n" - :button-face-get 'widget-color-item-button-face-get) + :sample-face-get 'widget-color-item-button-face-get) (defun widget-color-item-button-face-get (widget) ;; We create a face from the value. @@ -2341,7 +2349,7 @@ "Choose a color name (with sample)." :format "%[%t%]: %v" :tag "Color" - :value "default" + :value "black" :value-create 'widget-color-value-create :value-delete 'widget-children-value-delete :value-get 'widget-color-value-get diff -r e183fc049578 -r fe104dbd9147 lisp/custom/widget-example.el --- a/lisp/custom/widget-example.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/widget-example.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ (require 'widget) diff -r e183fc049578 -r fe104dbd9147 lisp/custom/widget.el --- a/lisp/custom/widget.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/custom/widget.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; ;; Author: Per Abrahamsen ;; Keywords: help, extensions, faces, hypermedia -;; Version: 1.59 +;; Version: 1.63 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ ;;; Commentary: @@ -41,7 +41,7 @@ :must-match :type-error :value-inline :inline :match-inline :greedy :button-face-get :button-face :value-face :keymap :entry-from :entry-to :help-echo :documentation-property :hide-front-space - :hide-rear-space) + :hide-rear-space :tab-order) ;; These autoloads should be deleted when the file is added to Emacs. (unless (fboundp 'load-gc) diff -r e183fc049578 -r fe104dbd9147 lisp/ediff/ediff-wind.el --- a/lisp/ediff/ediff-wind.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/ediff/ediff-wind.el Mon Aug 13 09:19:45 2007 +0200 @@ -535,8 +535,12 @@ (if use-same-frame (let ((window-min-height 1)) - ;; avoid dedicated and non-splittable windows - (ediff-skip-unsuitable-frames) + (if (and (eq frame-A frame-B) + (eq frame-B frame-C) + (frame-live-p frame-A)) + (select-frame frame-A) + ;; avoid dedicated and non-splittable windows + (ediff-skip-unsuitable-frames)) (delete-other-windows) (setq merge-window-lines (max 2 (round (* (window-height) merge-window-share)))) @@ -698,8 +702,10 @@ (if use-same-frame (let (wind-width-or-height) ; this affects 3way setups only - ;; avoid dedicated and non-splittable windows - (ediff-skip-unsuitable-frames) + (if (and (eq frame-A frame-B) (frame-live-p frame-A)) + (select-frame frame-A) + ;; avoid dedicated and non-splittable windows + (ediff-skip-unsuitable-frames)) (delete-other-windows) (switch-to-buffer buf-A) (setq wind-A (selected-window)) diff -r e183fc049578 -r fe104dbd9147 lisp/efs/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/efs/README Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,28 @@ +This version of EFS was modified for integration with XEmacs by +Mike Sperber . +He is the current maintainer of this version of EFS. + +A Few Things That You Should Know About EFS: +-------------------------------------------- + +For documentation, see the first page of the file efs.el. If you +access FTP via a gateway, then be sure to read the documentation in +efs.el on how to configure efs to use a gateway. To find the section +on user customization variables in efs.el, search for the first +occurrence of the string ">>>>". TeXinfo documentation is +forthcoming. + +The file CHANGES contains a description of changes to EFS from the +previous release to this release. It also tells you where you can get +the latest version of efs. + +The file LISTS contains a description of mailing lists relevant to +efs. It too tells you where you can get the latest version of efs. +We encourage users to join these lists. + +EFS and archie.el: +------------------ + +To use archie.el (by Jack Repenning) with efs, you need at least +archie.el V3.0.1. Problems using efs with archie may be posted to the +efs mailing lists. diff -r e183fc049578 -r fe104dbd9147 lisp/egg/egg-keymap.el --- a/lisp/egg/egg-keymap.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/egg/egg-keymap.el Mon Aug 13 09:19:45 2007 +0200 @@ -65,7 +65,7 @@ ;;; Key bindings for X11 terminals(x11term) ;;; -(define-key global-map [f1] 'set-file-coding-system) +(define-key global-map [f1] 'set-buffer-file-coding-system) (define-key global-map [f2] 'edit-dict-item) (define-key global-map [f3] 'jis-code-input) (define-key global-map [f4] 'toroku-region) @@ -95,7 +95,7 @@ (define-key global-map "\e[" 'sun-fprefix) (define-key sun-fkeymap "[" 'backward-paragraph) ; old "\e[" assignment -(define-key sun-fkeymap "11~" 'set-file-coding-system) ; F1 92.4.16 by K.Handa +(define-key sun-fkeymap "11~" 'set-buffer-file-coding-system) ; F1 92.4.16 by K.Handa (define-key sun-fkeymap "12~" 'edit-dict-item) ; F2 (define-key sun-fkeymap "13~" 'jis-code-input) ; F3 (define-key sun-fkeymap "14~" 'toroku-region) ; F4 diff -r e183fc049578 -r fe104dbd9147 lisp/egg/egg.el --- a/lisp/egg/egg.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/egg/egg.el Mon Aug 13 09:19:45 2007 +0200 @@ -403,12 +403,12 @@ ;; 97.2.4 Created by J.Hein to simulate Mule-2.3 (defun read-event () "Cheap 'n cheesy event filter to facilitate translation from Mule-2.3" - (setq event (make-event)) - (while (progn - (next-event event) - (not (key-press-event-p event))) - (dispatch-event event)) - (event-key event)) + (let ((event (make-event))) + (while (progn + (next-event event) + (not (key-press-event-p event))) + (dispatch-event event)) + (event-key event))) (eval-when-compile (require 'egg-jsymbol)) @@ -880,36 +880,6 @@ ;;; ;;;---------------------------------------------------------------------- -(defvar ascii-char "[\40-\176]") - -(defvar ascii-space "[ \t]") -(defvar ascii-symbols "[\40-\57\72-\100\133-\140\173-\176]") -(defvar ascii-numeric "[\60-\71]") -(defvar ascii-English-Upper "[\101-\132]") -(defvar ascii-English-Lower "[\141-\172]") - -(defvar ascii-alphanumeric "[\60-\71\101-\132\141-\172]") - -(defvar kanji-char "\\cj") -(defvar kanji-space "$B!!(B") -(defvar kanji-symbols "\\cS") -(defvar kanji-numeric "[$B#0(B-$B#9(B]") -(defvar kanji-English-Upper "[$B#A(B-$B#Z(B]") -(defvar kanji-English-Lower "[$B#a(B-$B#z(B]") -;;; Bug fixed by Yoshida@CSK on 88-AUG-24 -(defvar kanji-hiragana "\\cH") -(defvar kanji-katakana "\\cK") -;;; -(defvar kanji-Greek-Upper "[$B&!(B-$B&8(B]") -(defvar kanji-Greek-Lower "[$B&A(B-$B&X(B]") -(defvar kanji-Russian-Upper "[$B'!(B-$B'A(B]") -(defvar kanji-Russian-Lower "[$B'Q(B-$B'q(B]") -(defvar kanji-Kanji-1st-Level "[$B0!(B-$BOS(B]") -(defvar kanji-Kanji-2nd-Level "[$BP!(B-$Bt$(B]") - -(defvar kanji-kanji-char "\\(\\cH\\|\\cK\\|\\cC\\)") - -(defvar aletter (concat "\\(" ascii-char "\\|" kanji-char "\\)")) ;;; ;;; $B$R$i$,$JJQ49(B @@ -1680,13 +1650,13 @@ (defun fence-self-insert-command () (interactive) - (setq ch (event-to-character last-command-event)) - (cond((or (not egg:*input-mode*) - (null (get-next-map its:*current-map* ch))) - (insert ch)) - (t - (insert ch) - (its:translate-region (1- (point)) (point) t)))) + (let ((ch (event-to-character last-command-event))) + (cond((or (not egg:*input-mode*) + (null (get-next-map its:*current-map* ch))) + (insert ch)) + (t + (insert ch) + (its:translate-region (1- (point)) (point) t))))) ;;; ;;; its: completing-read system @@ -2193,15 +2163,31 @@ (not (eq new (minibuffer-window)))) (save-excursion (set-buffer (window-buffer (minibuffer-window))) - (setq minibuffer-preprompt nil - egg:*mode-on* (default-value 'egg:*mode-on*) + (set-minibuffer-preprompt nil) + (setq egg:*mode-on* (default-value 'egg:*mode-on*) egg:*input-mode* (default-value 'egg:*input-mode*) egg:*in-fence-mode* (default-value 'egg:*in-fence-mode*)))) (if (eq new (minibuffer-window)) (setq minibuffer-window-selected t) (setq minibuffer-window-selected nil))) -(setq select-window-hook 'egg:select-window-hook) +(defun egg:minibuffer-entry-hook () + (setq minibuffer-window-selected t)) + +(defun egg:minibuffer-exit-hook () + "Call upon exit from minibufffer" + (set-minibuffer-preprompt nil) + (setq minibuffer-window-selected nil) + (save-excursion + (set-buffer (window-buffer (minibuffer-window))) + (setq egg:*mode-on* (default-value 'egg:*mode-on*) + egg:*input-mode* (default-value 'egg:*input-mode*) + egg:*in-fence-mode* (default-value 'egg:*in-fence-mode*)))) + +(if (boundp 'select-window-hook) + (add-hook 'select-window-hook 'egg:select-window-hook) + (add-hook 'minibuffer-exit-hook 'egg:minibuffer-exit-hook) + (add-hook 'minibuffer-entry-hook 'egg:minibuffer-entry-hook)) ;;; ;;; @@ -2257,8 +2243,10 @@ str) (aset (nth 2 egg:minibuffer-preprompt) 0 (if its:*previous-map* ?\> ?\])) - (setq minibuffer-preprompt - egg:minibuffer-preprompt)) + (set-minibuffer-preprompt (concat + (car egg:minibuffer-preprompt) + (car (nthcdr 1 egg:minibuffer-preprompt)) + (car (nthcdr 2 egg:minibuffer-preprompt))))) (setq display-minibuffer-mode t mode-line-egg-mode-in-minibuffer str)) (setq display-minibuffer-mode nil diff -r e183fc049578 -r fe104dbd9147 lisp/games/mine.el --- a/lisp/games/mine.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/games/mine.el Mon Aug 13 09:19:45 2007 +0200 @@ -6,7 +6,7 @@ ;; Version: 1.17 (defconst mine-version-number "1.17" "Emacs Mine version number.") -(defconst mine-version (format "Emacs Mine v%s by Jacques Duthen © 1997" +(defconst mine-version (format "XEmacs Mine v%sx by Jacques Duthen © 1997" mine-version-number) "Full Emacs Mine version number.") @@ -484,7 +484,7 @@ (defun mine-mouse-hit (event) "Move point to the position clicked on with the mouse and hit this point." (interactive "@e") - (if (mine-goto-point (event-point event)) + (if (mine-goto-point (event-closest-point event)) (mine-hit-curpoint) (mine-message 'mine-msg-click-precisely))) diff -r e183fc049578 -r fe104dbd9147 lisp/gnats/gnats-admin.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/gnats/gnats-admin.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,912 @@ +;; gnats administration code +;; display the pr's in a buffer, +;; dired-style commands to edit & view them. + +;; this version is known to work in XEmacs. + +;; author: Roger Hayes, roger.hayes@sun.com + +;; copyright: You are welcome to use this software as you see fit. +;; Neither the author nor his employer make any representation about +;; the suitability of this software for any purpose whatsoever. + +(defconst gnats-admin-copyright +"Copyright (c) 1996 Roger Hayes. + +Permission to use, copy, modify and distribute this software and +documentation for any purpose and without fee is hereby granted in +perpetuity, provided that this COPYRIGHT AND LICENSE NOTICE appears in +its entirety in all copies of the software and supporting +documentation. + +The names of the author or Sun Microsystems, Inc. shall not be used in +advertising or publicity pertaining to distribution of the software +and documentation without specific, written prior permission. + +ANY USE OF THE SOFTWARE AND DOCUMENTATION SHALL BE GOVERNED BY +CALIFORNIA LAW. THE AUTHOR AND SUN MICROSYSTEMS, INC. MAKE NO +REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE OR +DOCUMENTATION FOR ANY PURPOSE. THEY ARE PROVIDED *AS IS* WITHOUT +EXPRESS OR IMPLIED WARRANTY OF ANY KIND. THE AUTHOR AND SUN +MICROSYSTEMS, INC. SEVERALLY AND INDIVIDUALLY DISCLAIM ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE AND DOCUMENTATION, INCLUDING THE +WARRANTIES OF MERCHANTABILITY, DESIGN, FITNESS FOR A PARTICULAR +PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL +THE AUTHOR OR SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, +INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER IN +ACTION ARISING OUT OF CONTRACT, NEGLIGENCE, PRODUCT LIABILITY, OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE OR DOCUMENTATION." + +"Copyright and disclaimer notice") + +;; magic words are highlighted using font-lock + +;; data structures: a pr is represented as an alist +;; the list of known pr's is represented as a vector +;; pr references are often done by number +;; (pr N) takes either a number, and returns the pr assoc list, +;; or the pr assoc list, returning the same. +;; regions are tagged with the number of the pr; the indirection lets +;; updates to pr's happen without disturbing the region. + +(defvar pr-list nil "Vector of parsed problem reports.") + +(require 'cl) + +;;; (require 'match-string) +;;; inline match-string +(if (not (fboundp 'match-string)) + (defun match-string (n &optional target) + "Return the text of the NTH match in optional TARGET." + (let* ((m-data (match-data)) + (idx (* 2 n)) + (m-beg (elt m-data idx)) + (m-end (elt m-data (1+ idx)))) + (cond + ((markerp m-beg) + (buffer-substring m-beg m-end)) + ((integerp m-beg) + (substring target m-beg m-end)) + (t + (error "Bad argument N to match-string")))))) + +;;; (require 'edit-expr) +;; edit-expr -- pop up a buffer to edit an expression +(if (not (fboundp 'edit-expr)) + (defun edit-expr (e &optional explain) + "Pop up a buffer to edit the EXPRESSION; return the edited value. +Buffer gets optional EXPLANATION." + (with-output-to-temp-buffer "*expr-buffer*" + (let ((buffer standard-output) + (val nil) + emark) + + (save-excursion + (pop-to-buffer (buffer-name buffer)) + (emacs-lisp-mode) + (delete-region (point-min) (point-max)) + (insert (or explain ";; Edit this value")) + (insert "\n") + (setq emark (point-marker)) + (prin1 e) + (goto-char emark) + (message "recursive edit -- M-C-c when done") + (recursive-edit) + (goto-char emark) + (setq val (read buffer))) + val)))) + +;; (require 'regret) ;; creates regression tests in my environment [rh] + +(provide 'gnats-admin) + +;; add stuff for font-lock; harmless if you don't use font-lock. +;; beware -- font-lock uses the first match; hence longer words must +;; precede shorter words, if they both match. +(defconst gnats-admin::font-lock-keywords + '(;; severity + ("non-critical" . non-critical) + ("critical" . critical) + ("serious" . serious) + + ;; priority + ("high" . high) + ("medium" . medium) + ("low" . low) + + ;; state + ("open" . open) + ("analyzed" . analyzed) + ("suspended" . suspended) + ("feedback" . feedback) + ("closed\\*" . closed*) + ("closed\\?" . closed?) + ("closed" . closed) + + ;; class + ("sw-bug" . sw-bug) + ("doc-bug" . doc-bug) + ("support" . support) + ("change-request" . change-request) + ("mistaken" . mistaken) + ("duplicate" . duplicate))) + +(defvar gnats-admin::popup-menu + '("Gnats-Admin" + ["Edit" 'gnats-admin:pr-edit t] + ["View" 'gnats-admin:pr-view t] + ) + "Local popup menu.") + +(defvar gnats-admin-query-hook nil + "Hooklist for post-query processing in gnats-admin mode.") +(defvar gnats-admin:query-list nil + "Results of one query -- may be altered by query hook to change results of query.") +(defvar gnats-admin-refresh-hook nil + "Hooklist for post-refresh processing in gnats-admin mode. +Run after a refresh -- gnats-admin::dirty-list may contain list of re-read pr numbers") + +(defvar gnats-admin::selector nil + "Function of one argument that governs if a PR should be diplayed.") + +(add-hook 'gnats-admin-refresh-hook + (function (lambda () + (font-lock-fontify-buffer)))) + +;;; +;; first, how do we get & parse the pr's? +(defun gnats-admin::run-query () + "Run a default query, setting pr-list to the result." + (setq pr-list (apply 'vector (gnats-admin::query))) + (length pr-list)) + +(defun trim (s) + "trim the leading & trailing blanks from a string" + (if (string-match "^\\s-*\\(\\S-.*\\S-\\|\\S-\\)\\s-*$" s) + (substring s (match-beginning 1) (match-end 1)) + "") + ) + +;; parse one pr -- moves point. +(defun gnats-admin::parse-pr () + "parse one pr, moving point" + (let ((pr nil)) + (let ((flv (make-vector 13 nil)) + (lim 0) + (bol 0) + (index 0)) + (end-of-line) + (setq lim (point)) + (beginning-of-line) + (setq bol (point)) + (while (and (< (point) lim) + (re-search-forward "\\([^|]*\\)|" lim t)) + (aset flv index (trim (match-string 1))) + (setq index (1+ index))) + (if (not (= index 13)) + (error "Bad PR inquiry: %s" (buffer-substring bol lim))) + (setq pr (gnats-admin::vec->pr flv))) + (if (not (bolp)) + (forward-line 1)) + pr)) + +(defun gnats-admin::query (&rest args) + (let ((prl (list)) + (buf (get-buffer-create "**gnats-query*"))) + (save-excursion + (set-buffer buf) + (delete-region (point-min) (point-max)) + (message "Running query") + (setq args + (mapcar (function (lambda (x) (format "%s" x))) args)) + (apply 'call-process "query-pr" nil t nil "--sql" args) + (message "Query completed") + ;; now parse the output + (goto-char (point-min)) + (while (not (eobp)) + (setq prl (cons (gnats-admin::parse-pr) prl))) + ) + (message "Result parsed") + ;; lots of stuff to apply the proper hook + (setq gnats-admin:query-list prl) + (run-hooks 'gnats-admin-query-hook) + (setq prl gnats-admin:query-list) + (setq gnats-admin:query-list nil) + (nreverse prl))) + +;; +;; +(defun gnats-admin::vec->pr (v) + "massage a 13-element vector into the internal pr representation. +fields are as described in query-pr documentation." + (if (not (and (vectorp v) + (= (length v) 13))) + (error "Not a valid PR intermediate form")) + + ;;; 0 - pr number + (aset v 0 (read (aref v 0))) + ;;; 1 - category + (aset v 1 (read (aref v 1))) + ;;; 2 - synopsis + ; leave as string + ;;; 3 - confidential + (aset v 3 (if (equal "no" (aref v 3)) nil (aref v 3))) + ;;; 4 - severity + (let ((num (read (aref v 4)))) + (aset v 4 (aref + [null critical serious non-critical] + num))) + ;;; 5 - priority + (let ((num (read (aref v 5)))) + (aset v 5 (aref + [null high medium low] + num))) + ;;; 6 - responsible + ; leave as string + ;;; 7 - state + (let ((num (read (aref v 7)))) + (aset v 7 (aref + [null open analyzed suspended feedback closed] + num))) + ;;; 8 - class + (let ((num (read (aref v 8)))) + (aset v 8 (aref + [null sw-bug doc-bug support change-request mistaken duplicate] + num))) + ;;; 9 - submitter-id + ; leave as string + ;;; 10 - arrival-date + ; leave as string + ;;; 11 - originator + ; leave as string + ;;; 12 - release + ; leave as string + + ;; the fields of v have been transformed; now map them into an alist + (do + ((vx 0 (1+ vx)) ; v index + (an ; field names (in order!) + (gnats-admin::pr-field-names) + (cdr an)) + (al nil) ; assoc list + ) + ((null an) (nreverse al)) ; <- here's where the result comes from + (setq al (cons (cons (car an) (aref v vx)) al)) + )) + +(defun gnats-admin::pr-get (pr field) + "Get, from PR, value of slot named FIELD (a symbol)." + (let ((p (assq field (gnats-admin:pr pr)))) + (if p + (cdr p) + nil))) + +(defun nset-assq (alist key val) + "destructively set key'v association in the alist to val. returns the original +list, unless it was null" + (let ((p (assq key alist))) + (if p + (progn + (setcdr p val) + alist) + (nconc alist (list (cons key val)))))) + +(defun gnats-admin::pr-set! (pr field val) + "Set, in PR, slot named FIELD to VAL. Slot name is a symbol." + (nset-assq pr field val)) + +;; fast version of field name->index mapper +;; also tests if a symbol is a field name present in sql report. +(defun gnats-admin::pr-field-index (feild) + (case feild + (Number 0) + (Category 1) + (Synopsis 2) + (Confidential 3) + (Severity 4) + (Priority 5) + (Responsible 6) + (State 7) + (Class 8) + (Submitter-Id 9) + (Arrival-Date 10) + (Originator 11) + (Release 12))) + +;; next is for completing-read +;; order must be the same as indices +;; content is (name index type width) +;; width is field width, not counting space +(defconst gnats-admin::pr-field-alist + '(("Number" 0 integer 3) + ("Category" 1 symbol 15) + ("Synopsis" 2 string 80) + ("Confidential" 3 boolean 1) + ("Severity" 4 symbol 12) + ("Priority" 5 symbol 6) + ("Responsible" 6 string 7) + ("State" 7 symbol 8) + ("Class" 8 symbol 14) + ("Submitter-Id" 9 string 7) + ("Arrival-Date" 10 string 14) + ("Originator" 11 string 32) + ("Release" 12 string 48)) + "Alist that maps field-name->(name index type width)") + +(defun gnats-admin::pr-field-names () + "List of symbols that are field keys in pr. Must be in order." + (mapcar (function (lambda (pr) (intern (car pr)))) + gnats-admin::pr-field-alist)) + +;; format control template for PR display +(defconst gnats-admin::pr-long-format + '((4 Category Class) (35 Priority Severity) (60 Responsible) (70 State ) nl + 4 "Synopsis:" Synopsis + )) +(defconst gnats-admin::pr-short-format + '((4 Category Class) (35 Priority Severity) (60 Responsible) (70 State ))) + +(defvar gnats-admin::pr-format gnats-admin::pr-short-format + "Format list for printing a pr.") + +;; hook that sets extent etc for Lucid emacs +(defun gnats-admin::pr-display-hook (b e pr buf) + "Set extent around pr." + (let ((ext (make-extent b e buf))) + (set-extent-layout ext 'outside-margin) + (set-extent-property ext 'pr pr) + (set-extent-property ext 'start-open t) + (set-extent-property ext 'end-open t) + (set-extent-property ext 'highlight t))) + +;; gnats uses one face for each element of the enumerated fields, +;; to give maximum flexibility in display. + +;;; symbol->(face foreground background) alist +(defvar gnats-admin::face-color + '((critical "firebrick" nil) + (serious "goldenrod" nil) + (non-critical "blue3" nil) + + (high "firebrick" nil) + (medium "goldenrod" nil) + (low "blue3" nil) + + (open "firebrick" nil) + (analyzed "goldenrod" nil) + (suspended "turquoise" nil) + (feedback "blue3" nil) + (closed "ForestGreen" nil) + (closed* "HotPink" nil) + (closed? "blue3" nil) + + (sw-bug nil nil) + (doc-bug nil nil) + (support nil nil) + (change-request nil nil) + (mistaken nil nil) + (duplicate nil nil)) + "Alist of font properties") + +(defun gnats-admin::field-display (pr fld buf) + "Display value field on specified stream." + (let + ((fv (gnats-admin::pr-get pr fld))) + (princ fv buf))) + +(defun gnats-admin::pr-print-func (f pr buf) + "Printer for pr. Depends on free variable pr-did-indent." + (cond + ((eq 'nl f) + (princ "\n " buf) + (setq pr-did-indent t)) + ((listp f) + (do + ((fmt f (cdr fmt))) + ((null fmt)) + (gnats-admin::pr-print-func (car fmt) pr buf))) + ((numberp f) + (indent-to-column f 1) + (setq pr-did-indent t)) + ((symbolp f) + (if (not pr-did-indent) + (princ " " buf)) + (gnats-admin::field-display pr f buf) + (setq pr-did-indent nil)) + ((stringp f) + (if (not pr-did-indent) + (princ " " buf)) + (princ f buf) + (setq pr-did-indent nil)) + ) + t) + +(defun gnats-admin::display-pr (pr &optional buf) + ;; always print the number first + (if (not buf) + (setq buf (current-buffer))) + (let + ((b (point)) + (buffer-read-only nil) + (pr-did-indent nil)) + (princ (gnats-admin::pr-number pr) buf) + ;; now print according to the pr-format list + (do + ((fmt gnats-admin::pr-format (cdr fmt))) + ((null fmt)) + (gnats-admin::pr-print-func (car fmt) pr buf)) + (gnats-admin::pr-display-hook + b + (point) + (gnats-admin::pr-number pr) + buf) + (newline))) + +(defun gnats-admin::pr-buffer-extent (pr) + "Find the extent for this PR." + (extent-at (1+ (gnats-admin::pr-buffer-begin pr)) + (gnats-admin::pr-buffer pr) + 'pr)) + +(defun gnats-admin::pr-reread (pr) + "Rerun query for one PR in the pr-list." + (let + ((num (gnats-admin::pr-number pr))) + (let + ((repl (gnats-admin::query num))) + (if (and (listp repl) + (= (length repl) 1) + (= (gnats-admin::pr-get (car repl) 'Number) num)) + (gnats-admin::pr-replace! num (car repl)) + (error "Query failed for pr %s" num))) + )) + +(defun gnats-admin::selection (loprs) + "Return the elements of LOPRS (list of PR's) which satify PREDicate." + (let ((pred gnats-admin::selector)) + (if (not pred) + loprs + ;; else use the common-lisp loop appropriate to the type of loprs + (cond + ((arrayp loprs) + (loop + for pr across loprs + if (apply pred pr '()) + collect pr + )) + ((listp loprs) + (loop + for pr in loprs + if (apply pred pr '()) + collect pr + )) + (t + (error "Bad type for PR collection"))) + ))) + +(defun gnats-admin::selected? (pr) + "Test to see if one pr meets the selection criterion." + (or (null gnats-admin::selector) + (apply gnats-admin::selector pr '()))) + +(defun gnats-admin::pr-replace! (oldpr newpr) + "Replace the old pr with the new one" + (if (not (consp newpr)) + (error "Replacement pr must be a full PR value")) + (let ((pr-num (gnats-admin::pr-number newpr))) + (if (not (= (gnats-admin::pr-number oldpr) + pr-num)) + (error "Cannot replace PR with one of different number")) + (if (< (length pr-list) pr-num) + (setq pr-list + (vconcat pr-list (make-vector (- pr-num (length pr-list)) nil)))) + (aset pr-list (1- pr-num) newpr))) + +(defvar gnats-admin::dirty-list nil + "List of PRs which may be out of date and need refreshing.") + +(defun gnats-admin:reset () + "Reset the cached data for gnats-admin." + (setq pr-list nil) + (setq gnats-admin::dirty-list nil) ; it's everything now + ) + +(defun gnats-admin:regret () + "Create or edit the regression test for the current problem report." + (interactive) + (let* ((pr (gnats-admin::pr-at (point))) + (num (gnats-admin::pr-number pr))) + (pr-regret num))) + +(defun gnats-admin:refresh (&optional force) + (interactive "P") + (if force + (gnats-admin:reset)) + (if (not pr-list) + (progn + (gnats-admin::run-query)) + (progn + (mapc (function (lambda (p) (gnats-admin::pr-reread p))) + gnats-admin::dirty-list))) + (setq gnats-admin::dirty-list nil) + (set-buffer (gnats-admin::buffer)) + (let ((standard-output (current-buffer)) + (buffer-read-only nil) + (this-pr-num (gnats-admin::pr-num-at (point)))) + ; is this overkill; could we save our extents unless force? + (if nil + (map-extents (function (lambda (ext data) (delete-extent ext) nil)) + (current-buffer))) + (delete-region (point-min) (point-max)) + (beginning-of-buffer) + (message "Redisplay") + (mapc (function (lambda (pr) + (if (gnats-admin::selected? pr) + (gnats-admin::display-pr pr)))) + pr-list) + (message nil) + ;; catch search errors in case the current pr no longer exists-- + ;; if so, go to end of buffer + (condition-case err + (if (numberp this-pr-num) + (gnats-admin:goto-pr this-pr-num)) + (search-failed + (goto-char (point-max))))) + (run-hooks 'gnats-admin-refresh-hook) + t) + +(defun gnats-admin::pr-number (pr) + "Get the number of this pr -- which can be either a pr datum or a number." + (or (and (numberp pr) pr) + (gnats-admin::pr-get pr 'Number))) + +;; this must not depend on pr-at, because that depends on this. +(defun gnats-admin::pr-num-at (pos) + "Find the pr number for the pr at POS" + (let* + ((ext (extent-at pos nil 'pr)) + (pr-prop (and ext (extent-property ext 'pr)))) + (if pr-prop + (gnats-admin::pr-number pr-prop) + (save-excursion + (goto-char pos) + (if (not (looking-at "^\\s-*[0-9]")) + (backward-paragraph)) + (if (looking-at "\\s-*[0-9]+[^0-9]") + (read (match-string 0)) + nil))))) + +(defun gnats-admin::pr-by-number (num) + "Find the pr numbered N." + ;; first try the easy way + (let + ((pr (elt pr-list (1- num)))) + (if (and pr (= num (gnats-admin::pr-number pr))) + pr + ;; easy way didnt work; scan the list + (loop + for prx across pr-list + if (= num (gnats-admin::pr-number prx)) + return prx)))) + +;; use face alist to set face colors +(defun gnats-admin::setup-faces () + "Set up the faces for gnats admin mode." + (mapc + (function (lambda (l) (make-face (car l)))) + gnats-admin::face-color) + (if (memq (device-class) '(color grayscale)) + (mapc + (function (lambda (l) + (if (cadr l) + (set-face-foreground (car l) (cadr l))) + (if (caddr l) + (set-face-background (car l) (caddr l))))) + gnats-admin::face-color)) + (setq font-lock-keywords gnats-admin::font-lock-keywords) + ;; this is too slow -- instead, do explicit fontification after modify + ; (turn-on-font-lock) + ) + +(defvar gnats-admin::pr-mark-glyph nil + "Glyph used to mark the current PR in display.") + +(defun gnats-admin::buffer () + "Find or create gnats admin buffer." + (or (get-buffer "*gnats*") + (let ((buf (get-buffer-create "*gnats*"))) + (set-buffer buf) + (make-local-variable 'paragraph-start) + (make-local-variable 'paragraph-separate) + (setq paragraph-start "^\\(\\S-\\|[ \t\n]*$\\)") + (setq paragraph-separate "^[ \t\n]*$") + (setq buffer-read-only t) + (setq buffer-undo-list t) ; disable undo info + (setq gnats-admin::pr-mark-glyph (make-pixmap "target")) + (gnats-admin::setup-faces) + buf) + )) + +(defun gnats-admin:pr (pr-or-num) + "If PR-OR-NUM is a pr, return it; if it's a number, +return the pr with that number." + (cond + ((numberp pr-or-num) + (gnats-admin::pr-by-number pr-or-num)) + ((consp pr-or-num) + pr-or-num) + (t + (error "Not a valid PR: %s" pr-or-num)) + )) + +(defun gnats-admin::pr-at (pos) + "PR at POSITION" + (or + (let ((ext (extent-at pos nil 'pr))) + (if ext (extent-property ext 'pr))) + (gnats-admin::pr-num-at pos))) + +;; next should, ideally, run a 1-pr query then splice that into +;; pr-list to update the current pr. +;; however, there's a race condition with gnats; so put the edited +;; pr on the dirty list to be inquired later. +(defun gnats-admin:pr-edit () + (interactive) + (let* + ((pr (gnats-admin::pr-at (point))) + (num (gnats-admin::pr-number pr)) + (num-str (format "%d" num))) + (pr-edit num-str) + (setq gnats-admin::dirty-list (cons pr gnats-admin::dirty-list)))) + +(defun gnats-admin:pr-view () + (interactive) + (pr-view (format "%d" (gnats-admin::pr-num-at (point))))) +(defun gnats-admin:pr-synopsis () + (interactive) + (let* + ((pr (gnats-admin::pr-at (point))) + (syn (gnats-admin::pr-get pr 'Synopsis))) + (message "Synopsis: %s" syn))) + +(defun gnats-admin:pr-originator () + (interactive) + (let* + ((pr (gnats-admin::pr-at (point))) + (syn (gnats-admin::pr-get pr 'Originator))) + (message "Originator: %s" syn))) + +(defun gnats-admin:pr-field (fld) + "Show any pr field FLD of current pr." + (interactive + (list (completing-read "Field: " gnats-admin::pr-field-alist + nil t))) + (let* + ((pr (gnats-admin::pr-at (point))) + (val (gnats-admin::pr-get pr (intern fld)))) + (message "%s: %s" fld val))) + +(defvar gnats-admin::current-pr nil "Current pr") +(defun gnats-admin::highlight (pr) + "Hilight the current PR -- may unhilight the previous." + (condition-case err + (progn + (if gnats-admin::current-pr + (highlight-extent + (gnats-admin::pr-buffer-extent gnats-admin::current-pr) + nil)) + (highlight-extent (gnats-admin::pr-buffer-extent pr) t) + (setq gnats-admin::current-pr pr)) + (error (setq gnats-admin::current-pr nil)))) + +(defun gnats-admin::highlight-point () + "Highlight the pr at point" + ;; make point visible + (or + (pos-visible-in-window-p) + (recenter '(t))) + (gnats-admin::highlight (gnats-admin::pr-at (point)))) + +(defun gnats-admin:next () + "Next pr" + (interactive) + (forward-paragraph) + (gnats-admin::highlight-point)) +(defun gnats-admin:prev () + "Prev pr." + (interactive) + (backward-paragraph) + (gnats-admin::highlight-point)) +(defun gnats-admin:this () + "Activate pr at point." + (interactive) + (end-of-line) + (backward-paragraph) + (gnats-admin::highlight-point)) + +(defun gnats-admin:mouse-set (ev) + (interactive "e") + (mouse-set-point ev) + (gnats-admin::highlight-point)) + +(defun gnats-admin:mouse-synopsis (ev) + (interactive "e") + (gnats-admin:mouse-set ev) + (gnats-admin:pr-synopsis)) + +(defun gnats-admin:mouse-menu (ev) + (interactive "e") + (gnats-admin:mouse-set ev) + (popup-mode-menu)) + +(defun gnats-admin:refresh-this-pr () + "Reread and refresh the display of the current PR." + (interactive) + (let* ((pr (gnats-admin::pr-at (point))) + (buffer-read-only nil) + (b (gnats-admin::pr-buffer-begin pr)) + (e (gnats-admin::pr-buffer-end pr))) + (goto-char b) + (save-excursion + (gnats-admin::pr-buffer-delete pr) + (gnats-admin::pr-reread pr) + (gnats-admin::display-pr pr (current-buffer)) + ;; had to dive pretty deep into font-lock to get this one... + (let ((font-lock-mode t)) + (font-lock-after-change-function b e 1))) + (gnats-admin::highlight-point))) + +(defun gnats-admin:goto-pr (n) + "Make pr number N the current pr." + (interactive "nPR: ") + (goto-char (gnats-admin::pr-n-pos n)) + (gnats-admin::highlight-point)) + +(defun gnats-admin::pr-n-pos (n) + "Find the buffer position of pr numbered N in current buffer." + (save-excursion + (goto-char (point-min)) + (let ((re (format "^%s\\s-" n))) + (re-search-forward re) + (point) + ))) + +(defun gnats-admin::pr-buffer-delete (pr) + "Delete the display of the PR." + (let* ((b (gnats-admin::pr-buffer-begin pr)) + (e (gnats-admin::pr-buffer-end pr)) + (mbuf (gnats-admin::pr-buffer pr)) + (pr-ext (gnats-admin::pr-buffer-extent pr))) + (set-buffer mbuf) + (let ((buffer-read-only nil)) + (delete-region b e) + (if (extentp pr-ext) + (delete-extent pr-ext))) + )) + +(defun gnats-admin:quit () + "Quit out of gnats admin mode." + (interactive) + (if (get-buffer "**gnats-query*") + (kill-buffer "**gnats-query*")) + (kill-buffer nil)) + +(defvar gnats-admin-mode-map nil "Key map for gnats admin mode.") + +(defun gnats-admin::setup-keymap () + (if (not (keymapp gnats-admin-mode-map)) + (progn + (setq gnats-admin-mode-map (make-keymap)) + (suppress-keymap gnats-admin-mode-map) + (define-key gnats-admin-mode-map "e" 'gnats-admin:pr-edit) + (define-key gnats-admin-mode-map "v" 'gnats-admin:pr-view) + (define-key gnats-admin-mode-map "s" 'gnats-admin:pr-synopsis) + (define-key gnats-admin-mode-map "o" 'gnats-admin:pr-originator) + (define-key gnats-admin-mode-map "f" 'gnats-admin:pr-field) + (define-key gnats-admin-mode-map "\C-l" 'gnats-admin:refresh) + (define-key gnats-admin-mode-map "n" 'gnats-admin:next) + (define-key gnats-admin-mode-map "p" 'gnats-admin:prev) + (define-key gnats-admin-mode-map " " 'gnats-admin:this) + (define-key gnats-admin-mode-map "q" 'gnats-admin:quit) + (define-key gnats-admin-mode-map "g" 'gnats-admin:goto-pr) + (define-key gnats-admin-mode-map "r" 'gnats-admin:refresh-this-pr) + (define-key gnats-admin-mode-map "S" 'gnats-admin:edit-selection) + (define-key gnats-admin-mode-map "R" 'gnats-admin:regret) + (define-key gnats-admin-mode-map 'button1 'gnats-admin:mouse-set) + (define-key gnats-admin-mode-map 'button2 'gnats-admin:mouse-synopsis) + (define-key gnats-admin-mode-map 'button3 'gnats-admin:mouse-menu) + )) + ) + +(defun gnats-admin-mode () + "Major mode for looking at a summary of gnats reports. +Stomps to gnats admin buffer! +Commands: \\{gnats-admin-mode-map}." + (interactive) + (switch-to-buffer (gnats-admin::buffer)) + (setq major-mode 'gnats-admin-mode) + (setq mode-name "Gnats Admin") + (gnats-admin::setup-keymap) + (use-local-map gnats-admin-mode-map) + (setq mode-popup-menu gnats-admin::popup-menu) + (gnats-admin:refresh) + ) + +(put 'gnats-admin-mode 'mode-class 'special) + +(defvar gnats-admin::pr-mark-glyph nil "marker for current PR.") + +(defun gnats-admin::pr-buffer (pr) + "The buffer in which this pr is displayed." + (gnats-admin::buffer)) + +(defun gnats-admin::pr-buffer-begin (pr) + "Return the position of beginning of this PR." + (let + ((pr-num (gnats-admin::pr-number pr))) + (save-excursion + (set-buffer (gnats-admin::pr-buffer pr)) + ;; first try locally, then thru whole buffer + (or + (and (progn (backward-paragraph 1) + (re-search-forward (format "^%d " pr-num) nil t)) + (progn + (beginning-of-line 1) + (point))) + (and (progn (goto-char (point-min)) + (re-search-forward (format "^%d " pr-num) nil t)) + (progn + (beginning-of-line 1) + (point))))))) + +(defun gnats-admin::pr-buffer-end (pr) + "Return the position of the end of the PR." + (save-excursion + (set-buffer (gnats-admin::pr-buffer pr)) + (goto-char (gnats-admin::pr-buffer-begin pr)) + (forward-paragraph 1) + (point))) + +(defun gnats-admin::unclosed (pr) + "A selector that chooses unclosed PR's." + (not (eq 'closed (gnats-admin::pr-get pr 'State)))) + +(defvar gnats-admin:selexpr nil + "Selection expression -- see eval-selexpr.") + +(defun gnats-admin::eval-selexpr (pr) + "Evaluate the selection expression, in an environment with +pr bound to the pr, and the field names bound to their value." + (let + ((Number (gnats-admin::pr-get pr 'Number)) + (Category (gnats-admin::pr-get pr 'Category)) + (Synopsis (gnats-admin::pr-get pr 'Synopsis)) + (Confidential (gnats-admin::pr-get pr 'Confidential)) + (Severity (gnats-admin::pr-get pr 'Severity)) + (Priority (gnats-admin::pr-get pr 'Priority)) + (Responsible (gnats-admin::pr-get pr 'Responsible)) + (State (gnats-admin::pr-get pr 'State)) + (Class (gnats-admin::pr-get pr 'Class)) + (Submitter-Id (gnats-admin::pr-get pr 'Submitter-Id)) + (Arrival-Date (gnats-admin::pr-get pr 'Arrival-Date)) + (Originator (gnats-admin::pr-get pr 'Originator)) + (Release (gnats-admin::pr-get pr 'Release))) + (or (not gnats-admin:selexpr) + (eval gnats-admin:selexpr)))) + +(defun gnats-admin:edit-selection () + "Edit the selection criteria." + (interactive) + (setq gnats-admin::selector 'gnats-admin::eval-selexpr) + (setq gnats-admin:selexpr + (edit-expr gnats-admin:selexpr +";; Selection expression. This is evaluated with Number, Category, Synopsis, +;; Confidential, Severity, Priority, Responsible, State, Class, Submitter-Id, +;; Arrival-Date, Originator, and Release set from the PR; if it's a non-null +;; expression that evaluates true, then that record is displayed. Free-form +;; fields are strings, others are symbols or other atoms. +" +)) + (gnats-admin:refresh)) diff -r e183fc049578 -r fe104dbd9147 lisp/gnats/gnats.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/gnats/gnats.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,2034 @@ +;;;; -*-emacs-lisp-*- +;;;; EMACS interface for GNATS. +;;;; Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. +;;;; Contributed by Brendan Kehoe (brendan@cygnus.com) +;;;; based on an original version by Heinz G. Seidl (hgs@ide.com). +;;;; +;;;; This file is part of GNU GNATS. +;;;; +;;;; GNU GNATS 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. +;;;; +;;;; GNU GNATS 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 GNU GNATS; see the file COPYING. If not, write to +;;;; the Free Software Foundation, 59 Temple Place - Suite 330, +;;;; Boston, MA 02111, USA. */ + +;;;; This file provides `edit-pr', `view-pr' `query-pr', for changing and +;;;; searching problem reports that are part of the GNATS database. See the +;;;; gnats(1) man page or the GNATS documentation for further information. + +(provide 'gnats) +(require 'send-pr) ;Shared stuff defined there + +;;;;--------------------------------------------------------------------------- +;;;; Customization: put the following forms into your default.el file +;;;; (or into your .emacs) and the whole file into your EMACS library. +;;;;--------------------------------------------------------------------------- + +;(autoload 'edit-pr "gnats" +; "Command to edit a problem report." t) + +;(autoload 'view-pr "gnats" +; "Command to view a problem report." t) + +;(autoload 'gnats-mode "gnats" +; "Major mode for editing of problem reports." t) + +;(autoload 'query-pr "gnats" +; "Command to query information about problem reports." t) + +;(autoload 'summ-pr "gnats" +; "Command to display a summary listing of problem reports." t) + +;;;;--------------------------------------------------------------------------- +;;;; To reply by mail within gnats-mode +;;;;--------------------------------------------------------------------------- + +(defvar gnats-mailer 'mail + "*Specifiles either `mail' or `mhe' as mailer for GNATS") + +;; Provides mail reply and mail other window command using usual mail +;; interface and mh-e interface. +;; +;; To use MAIL: set the variable +;; `gnats-mailer' to `mail' +;; +;; To use MH-E: set the variable +;; `gnats-mailer' to `mhe' + +(autoload 'mail "sendmail") +(autoload 'mail-other-window "sendmail") +(autoload 'mail-fetch-field "mail-utils") +(autoload 'rmail-dont-reply-to "mail-utils") +(autoload 'mail-strip-quoted-names "mail-utils") +(autoload 'mail-send "sendmail") +(autoload 'mail-send-and-exit "sendmail") + +(autoload 'mh-send "mh-e") +(autoload 'mh-send-other-window "mh-e") +(autoload 'mh-find-path "mh-e") +(autoload 'mh-get-field "mh-e") +(autoload 'mh-insert-fields "mh-e") +(defvar mh-show-buffer nil) +(defvar mh-sent-from-folder nil) +(defvar mh-sent-from-msg nil) + +;;; User options + +(defvar gnats:keep-edited-buffers t + "*If non-nil, then PR buffers are kept with distinct names after +editing. Otherwise, only the the most recently edited PR is kept.") + +(defvar gnats:keep-sent-messages 1 + "*Non-nil value N causes GNATS to keep the last N messages sent from GNATS. +A value of 0 or nil causes GNATS never to keep such buffers. A value of t +causes GNATS to keep all such buffers.") + +(defvar gnats:network-server nil + "*If non-nil, names the GNATS network server for remote queries and editing.") + +(defvar gnats:run-in-background t + "*If non-nil, make GNATS programs run in the background allowing the emacs to continue to other things.") + +(defvar gnats:bury-edited-prs t + "*If non-nil, then PR buffers are buried after editing. Otherwise, they are left at the top of the buffer list.") + +;;; emacs 19 uses compile-internal, emacs 18 uses compile1 +(if gnats::emacs-19p + (autoload 'compile-internal "compile") + (autoload 'compile1 "compile") + (fset 'compile-internal 'compile1)) + +;;; Misc constants. + +;;(defvar gnats:root "/usr/share/gnats/gnats-db" +;; "*The top of the tree containing the GNATS database.") + +(defvar gnats:libdir (or (gnats::get-config "LIBDIR") "/usr/lib") + "*Where the `gnats' subdirectory lives for things like pr-edit.") + +(defvar gnats:addr (or (gnats::get-config "GNATS_ADDR") "bugs") + "*Where bug reports are sent.") + +(defvar gnats::version + (concat "Version " (or (gnats::get-config "VERSION") "3.101"))) + +(defvar gnats::diffopt (or (gnats::get-config "DIFFOPT") "-u") + "How to get human-friendly output from diff(1).") + +(defvar gnats::categories nil + "List of GNATS categories; computed at runtime.") + +(defvar gnats::responsibles nil + "List of GNATS responsibles; Computed at runtime.") + +(defvar gnats::submitters nil + "List of GNATS submitters; Computed at runtime.") + +;;;###autoload +(defvar gnats::mode-name nil + "Name of the GNATS mode.") + +(defconst gnats::err-buffer "*gnats-error*" + "Name of the temporary buffer, where gnats error messages appear.") + +;;(defconst gnats::indent 17 "Indent for formatting the value.") + +(defvar gnats:::pr-locked nil + "Buffer local flag representing whether the associated pr is locked.") + +(defvar gnats:::pr-errors nil + "Buffer local buffer holding any errors from attempting to file this pr.") + +(defvar gnats:::buffer-pr nil + "Buffer local name of this pr.") + +(defvar gnats:::current-pr nil + "Buffer local value of the current pr.") + +(defvar gnats:::do-file-pr nil + "Buffer local value; if T, file the current pr.") + +(defvar gnats:::force nil + "Buffer local value; if T, ignore errors unlocking the current pr.") + +(defvar gnats:::pr-buffer nil + "Buffer local value of the buffer containing the pr.") + +(defvar gnats:::audit-trail nil + "Buffer local audit trail for the current pr.") + +(defvar gnats:::backupname nil + "Buffer local name of the backup file for this pr.") + +(defvar gnats:::start-of-PR-fields nil + "Buffer position of the beginning of the PR fields.") + +(defvar gnats:::newfile nil + "File used to store the results of npr-edit.") + +(defvar gnats:::query-pr "query-pr" + "The program name used to query problem reports.") + +(defvar gnats:::nquery-pr "nquery-pr" + "The program name used to query problem reports over the network.") + +(defvar gnats:::query-regexp "n?query-pr:" + "The regular expression to use to recognize a message from the query program.") + +;; For example: +;; (setq gnats:::types '( ( "Games" ( "/gnats/games" "/usr/gamesdb/H-sun4/lib ") +;; ( "Tools" ( "/usr/toolsdb" "/usr/local/lib" )))) +(defvar gnats:::types nil + "Alist of each type of GNATS database and its root and libdir settings.") + +(defconst gnats::fields + (let (fields) + (setq + fields + ;; Duplicate send-pr::fields, don't just include it. + ;; is there a better way than this? + (append (read (prin1-to-string send-pr::fields)) + '(("Arrival-Date" nil nil text) + ("Customer-Id") + ("Number" nil nil number) + ("Responsible" gnats::set-responsibles nil enum + gnats::update-audit-trail) + ("State" + (("open") ("analyzed") ("feedback") ("suspended") ("closed")) + (lambda (x) (or (cdr (assoc x gnats::state-following)) "")) + enum gnats::update-audit-trail)))) + ;; (setf (second (assoc "Category" fields)) 'gnats::set-categories) + (setcar (cdr (assoc "Category" fields)) 'gnats::set-categories) + (setcdr (nthcdr 3 (assoc "Category" fields)) + '(gnats::update-responsible)) + (setcar (cdr (assoc "Class" fields)) + '(("sw-bug") ("doc-bug") ("change-request") ("support") + ("mistaken") ("duplicate"))) + (setcdr (assoc "Submitter-Id" fields) '(gnats::set-submitters t enum)) + (setcdr (assoc "Customer-Id" fields) (cdr (assoc "Submitter-Id" fields))) + fields) + "AList of one-line PR fields and their possible values.") + +(defconst gnats::state-following + '(("open" . "analyzed") + ("analyzed" . "feedback") + ("feedback" . "closed") + ("suspended" . "analyzed")) + "A list of states and possible following states (does not describe all +possibilities).") + +(defvar gnats::query-pr-history nil + "Past arguments passed to the query-pr program.") + +(defvar gnats::tmpdir (or (getenv "TMPDIR") "/tmp/") + "Directory to use for temporary files.") + +;;;;--------------------------------------------------------------------------- +;;;; hooks +;;;;--------------------------------------------------------------------------- + +;; we define it here in case it's not defined +(or (boundp 'text-mode-hook) (setq text-mode-hook nil)) +(defvar gnats-mode-hook text-mode-hook "Called when gnats mode is switched on.") + +;;;;--------------------------------------------------------------------------- +;;;; Error conditions +;;;;--------------------------------------------------------------------------- + +(put 'gnats::error 'error-conditions '(error gnats::error)) +(put 'gnats::error 'error-message "GNATS error") + +;; pr-edit --check was unhappy +(put 'gnats::invalid-fields 'error-conditions + '(error gnats::error gnats::invalid-fields)) +(put 'gnats::invalid-fields 'error-message "invalid fields in PR") +(put 'gnats::invalid-date 'error-conditions + '(error gnats::error gnats::invalid-date)) +(put 'gnats::invalid-date 'error-message "invalid date value") + +;; pr-addr couldn't find an appropriate address +(put 'gnats::invalid-name 'error-conditions + '(error gnats::error gnats::invalid-name)) +(put 'gnats::invalid-name 'error-message "could not find the requested address") + +;; what pr? +(put 'gnats::no-such-pr 'error-conditions '(error gnats::error gnats::no-such-pr)) +(put 'gnats::no-such-pr 'error-message "PR does not exist") + +;; +(put 'gnats::no-such-category 'error-conditions + '(error gnats::error gnats::no-such-category)) +(put 'gnats::no-such-category 'error-message "No such category") + +;; there is no lock on that pr +(put 'gnats::pr-not-locked 'error-conditions + '(error gnats::error gnats::pr-not-locked)) +(put 'gnats::pr-not-locked 'error-message "No one is locking the PR") + +;; there is a lock on that pr +(put 'gnats::locked-pr 'error-conditions '(error gnats::error gnats::locked-pr)) +(put 'gnats::locked-pr 'error-message "PR locked by") + +;; GNATS is locked +(put 'gnats::locked 'error-conditions '(error gnats::error gnats::locked)) +(put 'gnats::locked 'error-message "GNATS is locked by another process---try again later.") + +;; We can't lock GNATS. +(put 'gnats::cannot-lock 'error-conditions '(error gnats::error gnats::locked)) +(put 'gnats::cannot-lock 'error-message "cannot lock GNATS; try again later.") + +;;;;--------------------------------------------------------------------------- +;;;; GNATS mode +;;;;--------------------------------------------------------------------------- + +(defvar gnats-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\M-n" 'gnats:next-field) + (define-key map "\M-p" 'gnats:previous-field) + (define-key map "\C-\M-b" 'gnats:backward-field) + (define-key map "\C-\M-f" 'gnats:forward-field) + (define-key map "\C-c\C-a" 'gnats:mail-reply) + (define-key map "\C-c\C-c" 'gnats:submit-pr) + (define-key map "\C-c\C-e" 'gnats:edit-pr) + (define-key map "\C-c\C-f" 'gnats:change-field) + (define-key map "\C-c\C-m" 'gnats:mail-other-window) + (define-key map "\C-c\C-q" 'gnats:unlock-buffer-force) + (define-key map "\C-c\C-r" 'gnats:responsible-change-from-to) + (define-key map "\C-c\C-s" 'gnats:state-change-from-to) + (define-key map "\C-c\C-t" 'gnats:category-change-from-to) + (define-key map "\C-c\C-u" 'gnats:unlock-pr) + (or gnats::emacs-19p + (define-key map "\C-xk" 'gnats:kill-buffer)) + map) + "Keymap for gnats mode.") + +(defsubst gnats::get-header (field) + "Fetch the contents of mail header FIELD." + (funcall (nth 4 (assoc gnats-mailer gnats::mail-functions)) field)) + +(defun gnats:submit-pr () + "Save the current PR into the database and unlock it. + +This function has no effect if the PR is not locked. + +Three cases: + State change + Responsibility change + Other change (only interesting if the PR was changed by somebody + other than the Reponsible person) + +State changes are sent to the originator +Responsibility changes are sent to the new responsible person +Other changes are sent to the responsible person." + ;; + (interactive) + (cond ((not (eq major-mode 'gnats:gnats-mode)) + (error "edit-pr: not in GNATS mode.")) + (gnats:::pr-locked + (gnats::check-pr-background t) + (if gnats:run-in-background (bury-buffer))) + ;; If not locked, do nothing + (t + (message "edit-pr: PR not locked.")))) + +;;;###autoload +(setq gnats::mode-name 'gnats:gnats-mode) + +(defun gnats::rename-buffer () + (let ((category (gnats::field-contents "Category")) + (number (gnats::field-contents "Number")) + buf) + (setq gnats:::buffer-pr (format "%s/%s" category number)) + (and (setq buf (get-buffer gnats:::buffer-pr)) + (save-excursion + (set-buffer buf) + (set-buffer-modified-p nil) + (kill-buffer buf))) + (rename-buffer gnats:::buffer-pr))) + +;; FIXME allow re-lock of unlocked PR +;; FIXME too many assumptions -- make more independent of edit-pr +;;;###autoload +(fset 'gnats-mode gnats::mode-name) +;;;###autoload +(defun gnats:gnats-mode () + "Major mode for editing problem reports. +For information about the form see gnats(1) and pr_form(5). + +When you are finished editing the buffer, type \\[gnats:submit-pr] to commit +your changes to the PR database. To abort the edit, type +\\[gnats:unlock-buffer]. + +Special commands: +\\{gnats-mode-map} +Turning on gnats-mode calls the value of the variable gnats-mode-hook, +if it is not nil." + (gnats::patch-exec-path) ;Why is this necessary? --jason + (gnats::set-categories) + (gnats::set-responsibles) + (gnats::set-submitters) + (put gnats::mode-name 'mode-class 'special) + (kill-all-local-variables) + (setq major-mode gnats::mode-name) + (setq mode-name "gnats") + (use-local-map gnats-mode-map) + (set-syntax-table text-mode-syntax-table) + (setq local-abbrev-table text-mode-abbrev-table) + (make-local-variable 'gnats:::start-of-PR-fields) + (make-local-variable 'gnats:::pr-errors) + (make-local-variable 'gnats:::buffer-pr) + (gnats::rename-buffer) + + ;; we do this in gnats:edit-pr for the network version + (if (not gnats:network-server) + (progn + (setq gnats:::backupname (gnats::make-temp-name)) + (copy-file (format "%s/%s" gnats:root gnats:::buffer-pr) + gnats:::backupname))) + + ;; edit-pr locks it for us + (make-local-variable 'gnats:::pr-locked) + (setq gnats:::pr-locked t) + + (cond (gnats::emacs-19p + (make-local-variable 'kill-buffer-hook) + (add-hook 'kill-buffer-hook 'gnats::kill-buffer-hook))) + + ; If they do C-x C-c, unlock all of the PRs they've edited. + (if (fboundp 'add-hook) + (add-hook 'kill-emacs-hook 'gnats::unlock-all-buffers) + (setq kill-emacs-hook 'gnats::unlock-all-buffers)) + + (make-local-variable 'paragraph-separate) + (setq paragraph-separate (concat (default-value 'paragraph-separate) + "\\|" gnats::keyword "$")) + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat (default-value 'paragraph-start) + "\\|" gnats::keyword)) + (make-local-variable 'gnats:::audit-trail) + (goto-char (point-min)) + (search-forward "\n>Number:") + (beginning-of-line) + (setq gnats:::start-of-PR-fields (point-marker)) + (run-hooks 'gnats-mode-hook)) + +;;;;--------------------------------------------------------------------------- +;;;; Mail customization +;;;;--------------------------------------------------------------------------- + +(or (string-match mail-yank-ignored-headers "X-mode:") + (setq mail-yank-ignored-headers + (concat "^X-mode:" "\\|" mail-yank-ignored-headers))) + +(defconst gnats::mail-functions + '((mail gnats::mail-other-window-using-mail + gnats::mail-reply-using-mail + gnats::mail-PR-changed-mail-setup + gnats::get-header-using-mail-fetch-field) + (mhe gnats::mail-other-window-using-mhe + gnats::mail-reply-using-mhe + gnats::mail-PR-changed-mhe-setup + gnats::get-header-using-mhe)) + "An association list of mailers and the functions that use them. +The functions are supposed to implement, respectively: +gnats::mail-other-window +gnats::mail-reply +gnats::mail-PR-changed-setup +gnats::get-header") + +;;;;--------------------------------------------------------------------------- +;;;; Toplevel functions and vars, to reply with mail within gnats-mode +;;;;--------------------------------------------------------------------------- + +(defun gnats:mail-other-window () + "Compose mail in other window. +Customize the variable `gnats-mailer' to use another mailer." + ;; + (interactive) + (funcall (nth 1 (assoc gnats-mailer gnats::mail-functions)))) + +(defun gnats:mail-reply (&optional just-sender) + "Reply mail to PR Originator. +Customize the variable `gnats-mailer' to use another mailer. +If optional argument JUST-SENDER is non-nil, send response only to +original submitter of problem report." + ;; + (interactive "P") + (funcall (nth 2 (assoc gnats-mailer gnats::mail-functions)) just-sender)) + +;;;; common (and suppport) functions + +(defun gnats::isme (addr) + (setq addr (mail-strip-quoted-names addr)) + (or (string= addr (user-login-name)) + (string= addr (concat (user-login-name) "@" (system-name))))) + +(defsubst gnats::mail-PR-changed-setup (to subject cc buffer) + (funcall (nth 3 (assoc gnats-mailer gnats::mail-functions)) + to subject cc buffer)) + +(defun gnats::mail-PR-changed-mail-setup (to subject cc buffer) + (or (gnats::vmish-mail + (format "notification of changes to PR %s" gnats:::buffer-pr) + nil to subject nil cc buffer) + (error "Submit aborted; PR is still locked."))) + +(defun gnats::mail-PR-changed-mhe-setup (to subject cc buffer) + (let ((config (current-window-configuration)) + (pop-up-windows t) + draft) + (mh-find-path) + (let ((pop-up-windows t)) + (mh-send-sub to (or cc "") subject config)) + (switch-to-buffer (current-buffer)) + (setq mh-sent-from-folder buffer + mh-sent-from-msg 1 + mh-show-buffer buffer))) + +(defun gnats::mail-PR-changed (user responsible resp-change state-change notify) + "- Send mail to the responsible person if the PR has been changed + by someone else +- Send mail to the originator when the state is changed. +- Send mail to old and new responsible people when the responsibility is + transferred. + `resp-change' is the list (old-resp new-resp start end) +- Send mail to any other parties in NOTIFY." + ;; This function is really ugly ! + ;; + (let ((to nil) + (cc nil) + (subn nil) (subm nil) + (subject (gnats::get-reply-subject)) + (buffer (current-buffer)) + (pr-change (not (or resp-change state-change))) + (pr-backupname gnats:::backupname) + ) + ;; Here we find out where to send the mail to + (let (to-resp to-new-resp to-submitter to-bugs resp-addr new-resp-addr) + (if pr-change (setq to-resp t to-bugs t) + (if resp-change (setq to-resp t to-new-resp t)) + (if state-change (setq to-submitter t to-resp t))) + (cond (to-new-resp + (setq new-resp-addr (gnats::pr-addr (car resp-change))) + (if (gnats::isme new-resp-addr) + (setq to-new-resp nil)))) + (cond (to-resp + (setq resp-addr (gnats::pr-addr responsible)) + (if (gnats::isme resp-addr) + (setq to-resp nil)))) + (cond (to-submitter + (setq cc to) + (setq to (list (gnats::get-reply-to))))) + (if to-resp (gnats::push resp-addr to)) + (if to-new-resp (gnats::push new-resp-addr to)) + (setq subm (or (gnats::field-contents "Customer-Id") + (gnats::field-contents "Submitter-Id"))) + (if subm + (progn + (setq subn (nth 5 (assoc subm gnats::submitters))) + (if (not (string= subn "")) + (gnats::push subn cc)))) + (if to-bugs (gnats::push gnats:addr cc)) + (if notify (gnats::push notify cc)) + (setq to (mapconcat 'identity to ", ") + cc (mapconcat 'identity cc ", ")) + (if (string= cc "") (setq cc nil))) + (gnats::mail-PR-changed-setup to subject cc buffer) + ;; now we assume that the current buffer is the mail buffer + (goto-char (point-max)) + (if pr-change + (progn + (insert + (format "\n\t`%s' made changes to this PR.\n\n" (user-full-name))) + (if (and pr-backupname (file-readable-p pr-backupname)) + (let ((file (gnats::make-temp-name)) + (default-directory (gnats::find-safe-default-directory))) + (save-excursion + (set-buffer buffer) + (write-region (point-min) (point-max) file)) + (call-process "diff" nil t t gnats::diffopt + pr-backupname file) + (delete-file file)))) + (if resp-change + (progn + (insert (format "\n\t`%s' changed the responsibility to `%s'.\n" + (user-full-name) responsible)) + (insert-buffer-substring buffer + (nth 2 resp-change) + (nth 3 resp-change))) + (if state-change + (progn + (insert (format "\n\t`%s' changed the state to `%s'.\n" + (user-full-name) (nth 1 state-change))) + (insert-buffer-substring buffer + (nth 2 state-change) + (nth 3 state-change)))))) + )) + +(defsubst gnats::bm (num) + (buffer-substring (match-beginning num) (match-end num))) + +(defun gnats::real-pr-addr (name) + (if (zerop (length name)) + nil + (let ((buf (generate-new-buffer gnats::err-buffer))) + (unwind-protect + (save-excursion + (let ((default-directory (gnats::find-safe-default-directory))) + (call-process (format "%s/gnats/pr-addr" gnats:libdir) + nil buf nil "-F" name)) + (set-buffer buf) + (goto-char (point-min)) + (cond ((looking-at "pr-addr: could not find the requested address") + nil) + ((looking-at "^\\([^:]*\\):\\([^:]*\\):\\([^:]*\\)\n") + (list (gnats::bm 1) (gnats::bm 2) (gnats::bm 3))) + (t (signal 'gnats::error + (list (buffer-substring (point-min) + (1- (point-max)))))))) + (kill-buffer buf))))) + +(defun gnats::pr-addr (name) + "Find the e-mail address corresponding to maintainer NAME." + (let (entry addr) + (or (setq entry (assoc name gnats::responsibles)) + (and (setq entry (gnats::real-pr-addr name)) + (gnats::push entry gnats::responsibles)) + (signal 'gnats::invalid-name (list name))) + (setq addr (if (zerop (length (nth 2 entry))) + name + (nth 2 entry))) + (if (zerop (length (nth 1 entry))) + addr + (concat (nth 1 entry) " <" addr ">")))) + +(defun gnats::get-header-using-mail-fetch-field (field) + (save-excursion + (save-restriction + (goto-char (point-min)) + (re-search-forward "^$" nil 'move) + (narrow-to-region (point-min) (point)) + (mail-fetch-field field)))) + +(defun gnats::get-header-using-mhe (field) + (save-excursion + (let ((ret (mh-get-field (concat field ":")))) + (if (string= ret "") + nil + ret)))) + +(defun gnats::get-reply-to () + (or (gnats::get-header "Reply-To") + (gnats::get-header "From"))) + +(defun gnats::get-reply-subject () + (save-excursion + (save-restriction + (widen) + (let ((category (gnats::field-contents "Category")) + (number (gnats::field-contents "Number")) + (synopsis (gnats::field-contents "Synopsis" 0)) + (subject)) + (goto-char (point-min)) + (narrow-to-region (point-min) + (progn (search-forward "\n\n" nil 'move) + (point-marker))) + (setq subject (mail-fetch-field "subject")) + (if (and synopsis (not (equal synopsis ""))) + (format "Re: %s/%s: %s" category number synopsis) + (format "Re: %s/%s: %s" category number subject)))))) + +(defun gnats::make-in-reply-to-field (from date msg-id) + (concat + (substring from 0 (string-match " *at \\| *@ \\| *(\\| *<" from)) + "'s message of " date + (if (not (equal msg-id "")) + (concat "\n " msg-id) + ""))) + +;;;; Send mail using sendmail mail mode. + +(defun gnats::mail-reply-using-mail (just-sender) + ;; + "Mail a reply to the originator of the PR. +Normally include CC: to all other recipients of original message; +argument means ignore them. +While composing the reply, use \\[mail-yank-original] to yank the +original message into it." + ;; + (let (from cc subject date to reply-to msg-id) + (save-excursion + (save-restriction + (widen) + (narrow-to-region (point-min) (progn (goto-char (point-min)) + (search-forward "\n\n") + (- (point) 1))) + (setq from (mail-fetch-field "from" nil t) + subject (gnats::get-reply-subject) + reply-to (or (mail-fetch-field "reply-to" nil t) + from) + date (mail-fetch-field "date" nil t) + cc (cond (just-sender nil) + (t (mail-fetch-field "cc" nil t))) + to (or (mail-fetch-field "to" nil t) + (mail-fetch-field "apparently-to" nil t) + "") + msg-id (mail-fetch-field "message-id") + ))) + (gnats::vmish-mail-other-window + (format "reply to PR %s" gnats:::buffer-pr) + nil (mail-strip-quoted-names reply-to) subject + (gnats::make-in-reply-to-field from date msg-id) + (if just-sender + nil + (let* ((cc-list (rmail-dont-reply-to (mail-strip-quoted-names + (if (null cc) to + (concat to ", " cc)))))) + (if (string= cc-list "") nil cc-list))) + (current-buffer)))) + +(defun gnats::mail-other-window-using-mail () + "Send mail in another window. +While composing the message, use \\[mail-yank-original] to yank the +original message into it." + (gnats::vmish-mail-other-window + (format "mail regarding PR %s" gnats:::buffer-pr) + nil nil (gnats::get-reply-subject) nil nil (current-buffer))) + +;; This must be done in two toplevel forms because of a 19.19 byte-compiler +;; bug. +(defun gnats::generate-new-buffer-name (prefix) + (let ((name prefix) (n 1)) + (while (get-buffer name) + (setq name (format "%s<%d>" prefix n)) + (setq n (1+ n))) + name)) + +(if (fboundp 'generate-new-buffer-name) + (fset 'gnats::generate-new-buffer-name 'generate-new-buffer-name)) + +(defvar gnats::kept-mail-buffers nil + "Sent mail buffers waiting to be killed.") + +(defun gnats::vmish-rename-after-send () + (or (string-match "^sent " (buffer-name)) + (rename-buffer (gnats::generate-new-buffer-name + (format "sent %s" (buffer-name))))) + + ;; Mostly lifted from vm-reply.el 5.35 + (setq gnats::kept-mail-buffers + (cons (current-buffer) gnats::kept-mail-buffers)) + (if (not (eq gnats:keep-sent-messages t)) + (let ((extras (nthcdr (or gnats:keep-sent-messages 0) + gnats::kept-mail-buffers))) + (mapcar (function (lambda (b) (and (buffer-name b) (kill-buffer b)))) + extras) + (and gnats::kept-mail-buffers extras + (setcdr (memq (car extras) gnats::kept-mail-buffers) nil))))) + +(if gnats::emacs-19p + (defun gnats::vmish-mail-bindings ()) + (defun gnats::vmish-mail-send () + (interactive) + (gnats::vmish-rename-after-send) + (mail-send)) + (defun gnats::vmish-mail-send-and-exit (arg) + (interactive "P") + (gnats::vmish-rename-after-send) + (mail-send-and-exit arg)) + (defun gnats::vmish-mail-bindings () + (use-local-map (copy-keymap (current-local-map))) + (local-set-key "\C-c\C-s" 'gnats::vmish-mail-send) + (local-set-key "\C-c\C-c" 'gnats::vmish-mail-send-and-exit)) + (defun string-to-number (str) (string-to-int str))) + +;; ignore 'free variable' warnings about buf. +(defsubst gnats::vmish-rename-mail-buffer (buf) + (save-excursion + (set-buffer buf) + (setq buf (gnats::generate-new-buffer-name "*not mail*")) + (rename-buffer buf))) + +;; ignore 'free variable' warnings about buf. +(defsubst gnats::vmish-restore-mail-buffer (buf) + (save-excursion + (let ((mbuf (get-buffer "*mail*"))) + (cond (mbuf ;maybe left over from m-o-w failure + (set-buffer mbuf) + (set-buffer-modified-p nil) + (kill-buffer mbuf)))) + (cond (buf + (set-buffer buf) + (rename-buffer "*mail*"))))) + +(defun gnats::vmish-mail-other-window + (&optional buffer-name noerase to subject in-reply-to cc replybuffer actions) + (let ((buf (get-buffer "*mail*"))) + (if buf (gnats::vmish-rename-mail-buffer buf)) + (or buffer-name (setq buffer-name "GNATS mail")) + (unwind-protect + (prog1 + (if gnats::emacs-19p + (mail-other-window + noerase to subject in-reply-to cc replybuffer + (cons '(gnats::vmish-rename-after-send) actions)) + (prog1 + (mail-other-window noerase to subject in-reply-to + cc replybuffer) + (gnats::vmish-mail-bindings))) + (rename-buffer (gnats::generate-new-buffer-name buffer-name))) + (gnats::vmish-restore-mail-buffer buf)))) + +(defun gnats::vmish-mail + (&optional buffer-name noerase to subject in-reply-to cc replybuffer actions) + (let (buf (get-buffer "*mail*")) + (if buf (gnats::vmish-rename-mail-buffer buf)) + (or buffer-name (setq buffer-name "GNATS mail")) + (unwind-protect + (prog1 + (if gnats::emacs-19p + (mail noerase to subject in-reply-to cc replybuffer + (cons '(gnats::vmish-rename-after-send) actions)) + (prog1 + (mail noerase to subject in-reply-to cc replybuffer) + (gnats::vmish-mail-bindings))) + (rename-buffer (gnats::generate-new-buffer-name buffer-name))) + (gnats::vmish-restore-mail-buffer buf)))) + +;;;; Send mail using mh-e. + +(defun gnats::mail-other-window-using-mhe () + "Compose mail other window using mh-e. +While composing the message, use \\[mh-yank-cur-msg] to yank the +original message into it." + (let ((subject (gnats::get-reply-subject))) + (setq mh-show-buffer (current-buffer)) + (mh-find-path) + (mh-send-other-window "" "" subject) + (setq mh-sent-from-folder (current-buffer)) + (setq mh-sent-from-msg 1))) + + +(defun gnats::mail-reply-using-mhe (just-sender) + "Compose reply mail using mh-e. +The command \\[mh-yank-cur-msg] yanks the original message into current buffer. +If optional argument JUST-SENDER is non-nil, send response only to +original submitter of problem report." + ;; First of all, prepare mhe mail buffer. + (let (from cc subject date to reply-to (buffer (current-buffer)) msg-id) + (save-restriction + (setq from (mh-get-field "From:") + subject (gnats::get-reply-subject) + reply-to (or (mh-get-field "Reply-To:") from) + to (or (mh-get-field "To:") + (mh-get-field "Apparently-To:") + "") + cc (mh-get-field "Cc:") + date (mh-get-field "Date:") + msg-id (mh-get-field "Message-Id:") + ) + (setq mh-show-buffer buffer) + (mh-find-path) + (mh-send reply-to (or (and just-sender "") + (if (null cc) to + (concat to ", " cc))) + subject) + (save-excursion + (mh-insert-fields + "In-Reply-To:" (gnats::make-in-reply-to-field from date msg-id))) + (setq mh-sent-from-folder buffer) + (setq mh-sent-from-msg 1) + ))) + + +;;;;--------------------------------------------------------------------------- +;;;; Functions to change specific fields +;;;;--------------------------------------------------------------------------- + +(defun gnats:state-change-from-to () + "Change the value of the `>State:' field and update the audit trail." + (interactive) + (gnats:change-field "State")) + +(defun gnats:responsible-change-from-to () + "Change the value of the `>Responsible:' field and update the audit trail." + (interactive) + (gnats:change-field "Responsible")) + +(defun gnats:category-change-from-to () + "Change the value of the `>Category:' field and the responsible party." + (interactive) + (gnats:change-field "Category")) + +(defun gnats::update-audit-trail (field old new) + (if (gnats::position-on-field "Audit-Trail") + (let (start end) + (gnats::forward-eofield) + (setq start (point-marker)) + (if (eq old t) (setq old "????")) + (if (string= field "Responsible") + (insert (format "\n\n%s-Changed-From-To: %s->%s" field + (gnats::nth-word old) + (gnats::nth-word new))) + (insert (format "\n\n%s-Changed-From-To: %s-%s" field + (gnats::nth-word old) + (gnats::nth-word new)))) + (insert (format "\n%s-Changed-By: %s" field (user-login-name))) + (insert (format "\n%s-Changed-When: %s" field (current-time-string))) + (insert (format "\n%s-Changed-Why:\n" field)) + (save-excursion + (gnats::before-keyword t) + (setq end (point-marker))) + ;; here we record the changes in a assoc list + (setq gnats:::audit-trail (cons (list field + (gnats::nth-word old) + (gnats::nth-word new) + start end) + gnats:::audit-trail))) + (error "Field `>Audit-Trail:' missing."))) + +(defun gnats::category-responsible (category) + (let ((entry (assoc category gnats::categories))) + (if entry + (nth 2 entry) + (signal 'gnats::no-such-category (list category))))) + +(defun gnats::update-responsible (ignore1 ignore2 new) + "Modify the responsible field of the current PR to match the new category." + (and (y-or-n-p "Update the >Responsible: field? ") + (gnats:change-field "Responsible" (gnats::category-responsible new)))) + +;;;;--------------------------------------------------------------------------- + +(defsubst gnats::rw (buf retval) + (or + retval ; call-process is broken under 19.19.2 + (save-excursion (set-buffer buf) (buffer-size)))) + +(defun gnats::handle-results (pr exit-status) + "Handle the results of running pr-edit or npr-edit, giving a signal +if needed." + (cond + ((looking-at "n?pr-edit: cannot create lock file") + (signal 'gnats::cannot-lock nil)) + ((looking-at "n?pr-edit: lock file exists") + (signal 'gnats::locked nil)) + ((or (looking-at "n?pr-edit: no such PR") + (looking-at "n?pr-edit: couldn.t find PR.*")) + (signal 'gnats::no-such-pr nil)) + ((looking-at "n?pr-edit: PR \\(.*\\) locked by \\(.*\\)") + (let* ((msg (gnats::bm 2)) + (pr-path + (buffer-substring-no-properties (match-beginning 1) (match-end 1))) + (pr-name (progn (if (string-match gnats:root pr-path) + (substring pr-path (1+ (match-end 0))) + pr-path))) + (buf (get-buffer pr-name)) + win) + (if buf + ;; If we're already editing the PR, just go to that + ;; buffer and be done with it. + (progn + (if (setq win (get-buffer-window buf)) + (select-window win) + (switch-to-buffer buf)) + (message "Already editing PR %s." pr-name)) + ;; kick it to the next level + (signal 'gnats::locked-pr (list msg))))) + ((looking-at "n?pr-edit: PR is not locked") + (if (not gnats:::force) (signal 'gnats::pr-not-locked nil) + t)) + ((looking-at "n?pr-edit: invalid fields") + (signal 'gnats::invalid-fields nil)) + ((looking-at "n?pr-edit: cannot parse the date") + (signal 'gnats::invalid-date nil)) + ((looking-at "n?pr-edit: lock file .* does not exist")) + (t (signal 'gnats::error + (list (if (eq (point-min) (point-max)) + (format "unknown error (exit status %d)" + exit-status) + (buffer-substring (point-min) (- (point-max) 1)))))))) + +(if gnats::emacs-19p + (require 'env)) +(defun gnats::start-background (pr proctype sentinel &optional outfile filep args) + (let ((buf (get-buffer-create gnats::err-buffer)) + inbuf proc-name proc-action proc-send-buffer) + (save-excursion + (setq inbuf (current-buffer)) + (set-buffer buf) + (erase-buffer) + (make-variable-buffer-local 'gnats:::force) + (setq gnats:::force nil) + (cond ((eq proctype 'check) + (progn + (setq proc-name "check-pr" + proc-action "Checking" + proc-send-buffer t) + (setq args (append (list "--check") args)) + (make-variable-buffer-local 'gnats:::pr-buffer) + (setq gnats:::pr-buffer inbuf) + (make-variable-buffer-local 'gnats:::do-file-pr) + (setq gnats:::do-file-pr filep))) + ((eq proctype 'file) + (setq proc-name "file-pr" + proc-action "Filing" + proc-send-buffer t)) + ((eq proctype 'unlock) + (progn + (setq proc-name "unlock-pr" + proc-action "Unlocking") + (make-variable-buffer-local 'gnats:::current-pr) + (setq gnats:::current-pr pr) + (setq args (append (list "--unlock" pr) args)))) + ((eq proctype 'unlock-force) + (progn + (setq proc-name "unlock-pr" + proc-action "Unlocking" + gnats:::force t) + (make-variable-buffer-local 'gnats:::current-pr) + (setq gnats:::current-pr pr) + (setq args (append (list "--unlock" pr) args)))) + ((eq proctype 'edit) + (progn + (setq proc-name "edit-pr" + proc-action "Fetching") + (make-variable-buffer-local 'gnats:::current-pr) + (setq gnats:::current-pr pr) + (make-variable-buffer-local 'gnats:::newfile) + (setq gnats:::newfile outfile))) + (t + (error "Invalid PROCTYPE for background GNATS process."))) + (let ((process-environment + (if gnats::emacs-19p (copy-sequence process-environment))) + proc) + (setq proc + (apply 'start-process + (concat " *" proc-name "-" (random t)) + buf + (format (if gnats:network-server + "%s/gnats/npr-edit" + "%s/gnats/pr-edit") + gnats:libdir) +; (if gnats:network-server (list "--host" gnats:network-server)) + args + )) + + ;; Only set up the sentinel if they want stuff done in the background. + (if gnats:run-in-background + (progn + (set-process-sentinel proc sentinel) + (message "%s PR %s in background." proc-action pr)) + (message "%s PR %s..." proc-action pr)) + (if proc-send-buffer + (progn + (set-buffer inbuf) + (goto-char (point-min)) + (process-send-region proc (point-min) (point-max)) + (if (and (/= (point-min) (point-max)) + (/= (char-after (- (point-max) 1)) ?\n)) + (process-send-string proc "\n")) + (process-send-eof proc))) + ;; if they don't want it in the background, just sit and twiddle... + (if (not gnats:run-in-background) + (save-excursion + (set-buffer (process-buffer proc)) + (while (memq (process-status proc) '(run open)) + (accept-process-output proc)) + (funcall sentinel proc nil))))))) + +(defun gnats::handle-pr-edit (process event) + (let ((buf (process-buffer process)) + result pr newfile nbuf) + (if (null (buffer-name buf)) ;; deleted buffer + (set-process-buffer process nil) + (save-excursion + (set-buffer buf) + (setq pr gnats:::current-pr) + (setq result (process-exit-status process)) + (and (/= 0 result) + (goto-char (point-min)) + (gnats::handle-results gnats:::current-pr result)) + (setq nbuf (generate-new-buffer + (concat "*edit-pr " gnats:::current-pr "*"))) + (setq newfile gnats:::newfile) + (set-buffer nbuf) + (insert-file-contents newfile) + (make-local-variable 'gnats:::backupname) + (put 'gnats:::backupname 'permanent-local t) + ;; we do this in gnats:gnats-mode for non-network + (if gnats:network-server (setq gnats:::backupname newfile)) + (set-buffer-modified-p nil) + (setq buffer-undo-list nil) ;flush undo list + (gnats:gnats-mode) + (make-variable-buffer-local 'gnats:::current-pr) + (setq gnats:::current-pr pr) + (goto-char gnats:::start-of-PR-fields)) + (message "Fetching PR %s done." pr) + (if gnats:run-in-background + (display-buffer nbuf 'not-this-window) + (switch-to-buffer nbuf))))) + +(defun gnats::pr-edit-background (pr outfile args) + (gnats::start-background pr 'edit 'gnats::handle-pr-edit outfile nil args)) + +(defun gnats::handle-check-pr (process event) + (let ((buf (process-buffer process)) + result pr) + (if (null (buffer-name buf)) ;; deleted buffer + (set-process-buffer process nil) + (save-excursion + (set-buffer buf) + (setq result (process-exit-status process)) + (and (/= 0 result) + (goto-char (point-min)) + (gnats::handle-results gnats:::current-pr result)) + (message "Checked PR %s." gnats:::current-pr) + (if gnats:::do-file-pr + (progn + (set-buffer gnats:::pr-buffer) + (gnats::file-pr-background))))))) + +(defun gnats::check-pr-background (&optional filep) + (gnats::start-background gnats:::current-pr 'check + 'gnats::handle-check-pr nil filep)) + +(defun gnats::finish-filing () + (let (responsible user resp-change state-change buf) + (if gnats:network-server (setq gnats:::pr-locked nil)) + (setq buf (current-buffer)) + (set-buffer-modified-p nil) + (setq responsible (gnats::field-contents "Responsible") + user (user-login-name) + resp-change (cdr (assoc "Responsible" gnats:::audit-trail)) + state-change (cdr (assoc "State" gnats:::audit-trail))) + (if (or state-change + resp-change + (not (equal user responsible))) + (gnats::mail-PR-changed user responsible + resp-change state-change + (gnats::get-header "X-GNATS-Notify"))) + (gnats:unlock-buffer buf))) + +(defun gnats::handle-file-pr (process event) + (let ((buf (process-buffer process)) + result pr prbuf) + (if (null (buffer-name buf)) ;; deleted buffer + (set-process-buffer process nil) + (save-excursion + (set-buffer buf) + (setq result (process-exit-status process)) + (and (/= 0 result) + (goto-char (point-min)) + (gnats::handle-results gnats:::current-pr result)) + (message "Filed PR %s." gnats:::current-pr) + (set-buffer gnats:::pr-buffer) + (gnats::finish-filing))))) + +(defun gnats::file-pr-background () + (gnats::start-background gnats:::current-pr 'file 'gnats::handle-file-pr)) + +(defun gnats::lock (pr &optional outfile) + (let ((lockl (list "--lock" + (format "%s@%s" (user-login-name) (system-name)) + "-p" + (if (fboundp 'emacs-pid) + (concat "emacs pid " (int-to-string (emacs-pid))) + "emacs18") + pr))) + (if gnats:network-server + (setq lockl (append lockl (list "-o" outfile "--get-lists" + "--host" gnats:network-server)))) + (gnats::pr-edit-background pr outfile lockl))) + +(fset 'unlock-pr 'gnats:unlock-pr) +(fset 'gnats-unlock 'gnats:unlock-pr) ;backward compatibility +(defun gnats::handle-unlock-pr (process event) + (let ((buf (process-buffer process)) + result pr newfile nbuf) + (if (null (buffer-name buf)) ;; deleted buffer + (set-process-buffer process nil) + (save-excursion + (set-buffer buf) + (setq pr gnats:::current-pr) + (setq result (process-exit-status process)) + (and (/= 0 result) + (goto-char (point-min)) + (gnats::handle-results gnats:::current-pr result)) + (message "PR %s unlocked." gnats:::current-pr))))) + +(defun gnats:unlock-pr-force (pr) + (gnats::start-background pr 'unlock-force 'gnats::handle-unlock-pr)) + +(defun gnats:unlock-pr (pr) + (interactive "sPR number: ") + (gnats::start-background pr 'unlock 'gnats::handle-unlock-pr)) + +(defsubst gnats::buffer-major-mode (buffer) + (save-excursion (set-buffer buffer) major-mode)) + +(defun gnats::unlock-all-buffers () + (save-excursion + (mapcar + (function + (lambda (buffer) + (let ((gnats:run-in-background nil)) + (if (and (eq (gnats::buffer-major-mode buffer) gnats::mode-name)) + (progn (set-buffer buffer) + (gnats:unlock-buffer-force buffer)))))) + (buffer-list)))) + +(if gnats::emacs-19p + ;; Emacs 19 has kill-buffer-hook, v18 doesn't. + (defun gnats::kill-buffer-hook () + "Unlock a GNATS buffer that is being killed." + (gnats:unlock-buffer nil)) + (defun gnats:kill-buffer (buf) + "Safely kill a GNATS buffer." + (interactive "bKill buffer: ") + (if (equal buf (buffer-name)) + (gnats:unlock-buffer (get-buffer buf))) + (kill-buffer buf))) + +(defun gnats:unlock-buffer-force (&optional buf) + "Force a buffer to be unlocked, even if it isn't." + (interactive) + (if (null buf) + (setq buf (current-buffer)) + (set-buffer buf)) + (gnats:unlock-buffer buf t)) + +(defun gnats::delete-file (filename) + (if (file-readable-p filename) (delete-file filename))) + +(defun gnats:unlock-buffer (&optional buf force) + "Safely take a GNATS buffer out of gnats-mode." + (interactive) + (save-excursion + (if (null buf) + (setq buf (current-buffer)) + (set-buffer buf)) + (cond ((or force + (not (buffer-modified-p buf)) + (not gnats:::pr-locked) + (y-or-n-p "Buffer modified; still unlock? ")) + (if gnats:::pr-locked + (gnats:unlock-pr-force gnats:::buffer-pr)) + (if gnats:::pr-errors + (kill-buffer gnats:::pr-errors)) + (if gnats:::backupname + (progn + (gnats::delete-file gnats:::backupname) + (if gnats:network-server + (progn + (gnats::delete-file (concat gnats:::backupname ".cat")) + (gnats::delete-file (concat gnats:::backupname ".res")) + (gnats::delete-file (concat gnats:::backupname ".sub")))))) + (save-excursion + (set-buffer buf) + (let ((pr gnats:::buffer-pr)) + (kill-all-local-variables) + (text-mode) + (make-local-variable 'gnats:::buffer-pr) + (setq gnats:::buffer-pr pr) + (use-local-map (copy-keymap (current-local-map))) + (local-set-key + "e" (function (lambda () (interactive) + (gnats:edit-pr gnats:::buffer-pr)))) + (set-visited-file-name nil) + (setq buffer-read-only t) + ;; When GNATS:KEEP-EDITED-BUFFERS is nil, we always put the + ;; most recent PR in the *edited-pr* buffer. + (or gnats:keep-edited-buffers + (let ((old-buf (get-buffer (concat "*edited-pr*")))) + (cond (old-buf + (set-buffer old-buf) + (set-buffer-modified-p nil) + (kill-buffer old-buf))) + (set-buffer buf) + (rename-buffer (concat "*edited-pr*")))))) + (and gnats:bury-edited-prs + (if (get-buffer-window buf) + (let ((win (selected-window))) + (select-window (get-buffer-window buf)) + (bury-buffer) + (select-window win)) + (bury-buffer buf)))) + (t (error "PR unlock aborted."))))) + +(defun gnats::delete-backups (filename) + (let ((l (file-name-all-completions + (concat (file-name-nondirectory filename) ".~") + (file-name-directory filename))) + (dir (file-name-directory filename))) + (while l + (delete-file (concat dir (car l))) + (setq l (cdr l))))) + +(defun gnats::reset-variables () + (setq gnats::submitters nil + gnats::responsibles nil + gnats::categories nil)) + +(defun gnats::set-responsibles (&optional arg) + (or (and (null arg) gnats::responsibles) + (setq gnats::responsibles + (gnats::get-list-from-file + (if gnats:network-server + "res" + "responsible") "responsible"))) + 'gnats::try-responsible-completion) + +(defun gnats::try-responsible-completion (string predicate do-list) + (let (entry) + (and (not (assoc string gnats::responsibles)) + (setq entry (gnats::real-pr-addr string)) + (gnats::push entry gnats::responsibles))) + (let* ((completion-ignore-case t)) + (if do-list + (all-completions string gnats::responsibles predicate) + (try-completion string gnats::responsibles predicate)))) + +(defun gnats::set-categories (&optional arg) + (or (and (null arg) gnats::categories) + (setq gnats::categories + (gnats::get-list-from-file + (if gnats:network-server + "cat" + "categories") "categories")))) + +(defun gnats::set-submitters (&optional arg) + (or (and (null arg) gnats::submitters) + (setq gnats::submitters + (gnats::get-list-from-file + (if gnats:network-server + "sub" + "submitters") "submitters")))) + +(defun gnats::get-list (buffer) + (let (result) + (save-excursion + (set-buffer buffer) + (goto-char (point-min)) + (while (re-search-forward "^[^#:]+" nil t) + (gnats::push (list (gnats::bm 0)) result))) + (reverse result))) + +(defun gnats::parse-line () + (let ((end (progn (end-of-line) (point))) + (p (match-beginning 0)) + l) + (goto-char p) + (while (search-forward ":" end 'move) + (gnats::push (buffer-substring p (match-beginning 0)) l) + (skip-chars-forward " " end) + (setq p (point))) + (gnats::push (buffer-substring p end) l) + (reverse l))) + +(defun gnats::get-alist (buffer) + (let (result) + (save-excursion + (set-buffer buffer) + (goto-char (point-min)) + (while (re-search-forward "^[^#]" nil t) + (gnats::push (gnats::parse-line) result))) + (reverse result))) + +(defun gnats::get-list-from-file (filename desc) + (let ((buf nil) + (result nil)) + (message "Parsing the %s file..." desc) + (save-excursion + (let ((bn gnats:::backupname)) + (setq buf (get-buffer-create " *gnats-grok*")) + (set-buffer buf) + (setq buffer-read-only nil) + (erase-buffer) + (insert-file-contents + (if gnats:network-server + (concat bn "." filename) + (format "%s/gnats-adm/%s" gnats:root filename))) + (setq result (gnats::get-alist buf)) + (kill-buffer buf)) + (message "Parsing the %s file...done." desc) + result))) + +(defun gnats::get-pr-category (number) + "Return the category for the problem report NUMBER." + (let ((buf nil) + (result nil)) + (save-excursion + (setq buf (get-buffer-create " *gnats-index*")) + (set-buffer buf) + (setq buffer-read-only nil) + (erase-buffer) + (insert-file-contents (format "%s/gnats-adm/index" gnats:root)) + (goto-char (point-min)) + (setq result + (catch 'res + (while (search-forward (format "/%s:" number) nil t) + (beginning-of-line) + (if (looking-at (format "\\([^/]+\\)/%s:" number)) + (throw 'res (gnats::bm 1)) + (end-of-line))) + nil)) + (kill-buffer buf)) + (or result (signal 'gnats::no-such-pr (list number))))) + +(defsubst gnats::has-slash (string) + (memq t (mapcar (function (lambda (char) (= char ?/))) string))) + +(or (boundp 'view-hook) (setq view-hook nil)) + +;;;###autoload +(fset 'view-pr 'gnats:view-pr) +;;;###autoload +(defun gnats:view-pr (&optional id) + "Visit the problem report named by the string ID. While viewing, press +'e' to edit the currently viewed PR." + (interactive "sPR number: ") + (let (pr category temp-name buffer) + (if (string= id "") + (message "view-pr: must specify a PR") + (if (or (gnats::has-slash id) gnats:network-server) + (setq pr id) + (and (setq category (gnats::get-pr-category id)) + (setq pr (format "%s/%s" category id)))) + (let ((view-hook (default-value 'view-hook)) + buf func) + (if (and pr + (or gnats:network-server + (setq buf (get-buffer pr)) + (file-exists-p (format "%s/%s" gnats:root pr)))) + (if buf + (save-excursion + (set-buffer buf) + (goto-char (point-min)) + (view-buffer buf)) + (setq func + (function + (lambda () + (and gnats::emacs-19p (rename-buffer pr)) + (setq mode-line-buffer-identification + (format "Viewing %s" pr)) + (make-local-variable 'gnats:::buffer-pr) + (setq gnats:::buffer-pr pr) + (use-local-map (copy-keymap (current-local-map))) + (local-set-key + "e" + (function (lambda () (interactive) + (gnats:edit-pr gnats:::buffer-pr))))))) + (if (fboundp 'add-hook) + (add-hook 'view-hook func) + (setq view-hook func)) + (if gnats:network-server + (gnats:net-view-pr id buf) + (view-file (format "%s/%s" gnats:root pr)))) + (signal 'gnats::no-such-pr (list id))))))) + +(defun gnats:net-view-pr (id buf) + "Use the network query to view problem report ID." + (require 'view) + (let ((result nil) + (curr (current-buffer))) + (unwind-protect + (if (not buf) + (progn + ;; XXX fix this to include the category + (setq buf (get-buffer-create (concat "*view-pr " id "*"))) + (setq buffer-read-only nil))) + (let ((command (append (list 'funcall) + (list ''call-process) + (list gnats:::nquery-pr nil buf nil) + (list id "--full" "--host" + gnats:network-server)))) + (save-excursion + (set-buffer buf) + (erase-buffer)) + (let ((default-directory (gnats::find-safe-default-directory))) + (setq result (gnats::rw buf (eval command)))) + (save-excursion + (set-buffer buf) + (and (/= 0 result) + (goto-char (point-min)) + (cond + ((or (looking-at (concat gnats:::query-regexp " no PRs matched")) + (looking-at (concat gnats:::query-regexp " couldn.t find PR.*"))) + (signal 'gnats::no-such-pr nil)) + (t (signal 'gnats::error + (list (buffer-substring (point-min) + (- (point-max) 1))))) + )))) + (switch-to-buffer buf) + (if (fboundp 'view-mode-enter) + (view-mode-enter curr 'kill-buffer) + (view-mode curr 'kill-buffer)) + (set-buffer-modified-p nil) + (make-local-variable 'gnats:::buffer-pr) + (if (not (gnats::has-slash id)) (gnats::rename-buffer)) + (setq buffer-read-only t) + (setq buffer-undo-list nil) ;flush undo list + (goto-char (point-min))) + (zerop result))) + +(fset 'change-gnats 'gnats:change-type) +(fset 'gnats-change-type 'gnats:change-type) +(defun gnats:change-type (type) + "Change the GNATS database type in use." + (interactive + (list + (progn + (if (not gnats:::types) + (error "Value of gnats:::types has to be non-nil.")) + (let* ((completion-ignore-case t)) + (completing-read "Use GNATS database type: " gnats:::types nil t))))) + (let ((newlist (car (cdr (assoc type gnats:::types))))) + (setq gnats:root (car newlist) + gnats:libdir (car (cdr newlist)) + gnats:::query-pr (car (cdr (cdr newlist))) + gnats:::nquery-pr (car (cdr (cdr (cdr newlist)))) + gnats:::query-regexp (car (cdr (cdr (cdr (cdr newlist))))) + ) + (gnats::reset-variables))) + +(defun gnats::find-pr-buffer (pr) +"*Find the buffer currently editing PR, returning the buffer or nil." + (if (gnats::has-slash pr) + ;; return the buffer if it exists + (get-buffer pr) + (let (buflist buf + (name (concat "/" pr "$"))) + (setq buflist + (delq nil + (mapcar + (function (lambda (buf) + (if (string-match name (buffer-name buf)) + buf))) + (buffer-list)))) + ;; If we found one---and only one---then sanity-check some things + ;; about it before we try to use it. + (if (eq (length buflist) 1) + (progn + (setq buf (car buflist)) + (save-excursion + (set-buffer buf) + ;; We make sure that we have a value for the PR, it's in + ;; the right mode, and that the buffer's writable. If so, + ;; we'll return the buffer, otherwise the result of the if + ;; gets kicked back up to return nil. + (if (and gnats:::buffer-pr + (eq major-mode 'gnats:gnats-mode) + (eq buffer-read-only nil)) + buf))))))) + +;;;###autoload +(fset 'edit-pr 'gnats:edit-pr) +;;;###autoload +(defun gnats:edit-pr (&optional id) + "Edit the problem report named by the string ID." + (interactive "sPR number: ") + (if (string= id "") + (message "edit-pr: must specify a PR to edit") + (let (pr category newfile + (buf (gnats::find-pr-buffer id))) + (if buf + (progn + (switch-to-buffer buf) + (message "Already editing PR %s." id)) + (progn + (if (or (gnats::has-slash id) gnats:network-server) + (setq pr id) + (and (setq category (gnats::get-pr-category id)) + (setq pr (format "%s/%s" category id))))) + (if (and pr (or gnats:network-server + (file-exists-p (format "%s/%s" gnats:root pr)))) + (progn + (setq newfile (if gnats:network-server + (gnats::make-temp-name) + (format "%s/%s" gnats:root pr))) + (gnats::lock pr newfile)) + (signal 'gnats::no-such-pr (list id))))))) + +(defvar gnats:query-pr-default-options nil + "*Default options to pass to query-pr.") +(defsubst gnats::query-pr-default-options () + (or gnats:query-pr-default-options + (if (not gnats:network-server) + (concat " --directory=" gnats:root " --print-path ") + ""))) + +;;;###autoload +(fset 'query-pr 'gnats:query-pr) +;;;###autoload +(defun gnats:query-pr (options) + "Run query-pr, with user-specified args, and collect output in a buffer. +While query-pr runs asynchronously, you can use the \\[next-error] command +to find the text that the hits refer to." + (interactive + (list (apply + 'read-from-minibuffer "Run query-pr (with args): " + (if gnats::emacs-19p + (list (cons (gnats::query-pr-default-options) 1) + nil nil 'gnats::query-pr-history) + (list (gnats::query-pr-default-options) nil nil))))) + (require 'compile) + (compile-internal (concat + (if gnats:network-server + (format (concat gnats:::nquery-pr " --host %s ") + gnats:network-server) + (concat gnats:::query-pr " ")) + options) + "No more query-pr hits" (concat gnats:::query-pr " "))) + +(defun gnats::tr (string from to) + (let ((s (copy-sequence string)) + (len (length string))) + (while (>= (setq len (1- len)) 0) + (if (eq (aref s len) (string-to-char from)) + (aset s len (string-to-char to)))) + s)) + +;; Redefine so that buffers with, say, g++/1234 embedded in them can be +;; autosaved. This was mostly copied from the Emacs 19.19 version. +(defun gnats::make-auto-save-file-name () + "Return file name to use for auto-saves of current buffer. +Does not consider `auto-save-visited-file-name' as that variable is checked +before calling this function. You can redefine this for customization. +See also `auto-save-file-name-p'." + ; Since the user may have his own make-auto-save-file-name, try not to + ; use our custom one unless we have to. + (if (or (eq major-mode gnats::mode-name) + ; Heuristic for noticing a mail buffer based on a PR + (string-match " PR .*/" (buffer-name))) + (if buffer-file-name + (concat (file-name-directory buffer-file-name) + "#" + (file-name-nondirectory buffer-file-name) + "#") + ;; For non-file bfr, use bfr name and Emacs pid. + (expand-file-name (format "#%s#%s#" + (gnats::tr (buffer-name) "/" ":") + (make-temp-name "")))) + (gnats::real-make-auto-save-file-name))) + +(if (not (fboundp 'gnats::real-make-auto-save-file-name)) + (progn (fset 'gnats::real-make-auto-save-file-name + (symbol-function 'make-auto-save-file-name)) + (fset 'make-auto-save-file-name 'gnats::make-auto-save-file-name))) + +(defun gnats::make-temp-name () + (make-temp-name + (concat (expand-file-name (file-name-as-directory gnats::tmpdir)) "gnats"))) + +;; Below this is the GNATS summary mode I've written. Not quite 100% +;; integrated yet. + +;; Temporary variables which are made buffer-local, but which the byte +;; compiler complaints about if the defvars aren't here. +(defvar gnats:::PRs nil + "List of problem reports to be summarized. This variable is buffer local.") +(make-variable-buffer-local 'gnats:::PRs) +(defvar gnats::options nil + "Options used for nquery-pr in the current GNATS summary buffer. +This variable is buffer local.") +(make-variable-buffer-local 'gnats::options) + +;; Note: "release" stays out of this list. The "release" field is +;; unrestricted; the customer could put any old junk in there, and +;; often does. +(defvar gnats:::limited-fields '(category confidential severity priority responsible state class customer-id) + "PR fields for which the possible values are limited in range.") + +(defvar gnats::summary-sort-function nil + "Holds a function used to filter and sort PRs before displaying a report. +This filtering does not affect the stored PR information, so an invocation +of gnats:summary-redisplay after changing this variable will do the right thing.") + +(defun gnats:::prompt-for-pr-number (default) + (let ((val (read-input (if default + (format "PR number (default %d): " default) + "PR number: ")))) + (if (and default (string= val "")) + default + (setq val (string-to-number val)) + (if (and (integerp val) + (> val 0)) + val + (error "PR number must be a positive integer."))))) + +(defun gnats:summary-edit (num) + "Edit the PR referenced by the current text, or get a PR number from user. +If a numeric prefix is given, it is used as the PR number. +If a non-numeric prefix is given, or the text at (point) doesn't have the +gnats::pr-number property, the user is prompted for a PR number." + (interactive (list + (let ((x (get-text-property (point) 'gnats::pr-number))) + (cond ((numberp current-prefix-arg) current-prefix-arg) + (current-prefix-arg (gnats:::prompt-for-pr-number x)) + (x x) + (t (gnats:::prompt-for-pr-number nil)))))) + (message "Editing PR %d..." num) + (gnats:edit-pr (number-to-string num))) + +(defun gnats:summary-view (num) + "View the PR referenced by the current text, or get a PR number from user. +If a numeric prefix is given, it is used as the PR number. +If a non-numeric prefix is given, or the text at (point) doesn't have the +gnats::pr-number property, the user is prompted for a PR number." + (interactive (list + (let ((x (get-text-property (point) 'gnats::pr-number))) + (cond ((numberp current-prefix-arg) current-prefix-arg) + (current-prefix-arg (gnats:::prompt-for-pr-number x)) + (x x) + (t (gnats:::prompt-for-pr-number nil)))))) + (message "Viewing PR %d..." num) + (gnats:view-pr (number-to-string num))) + +(defun gnats:summary-quit nil + "Quit GNATS summary mode." + (interactive) + (kill-buffer nil)) + +(defun gnats:summary-revert nil + "Fetch PR data from server and rebuild the summary." + (interactive) + (gnats:summ-pr gnats::options)) + +;; Fetch field value from a PR. +(defsubst gnats:::fieldval (pr field) + (let ((x (assq field pr))) + (if x (cdr x) nil))) + +;; Taken from gnus-parse-simple-format in (ding)Gnus 0.88. +;; Extended to handle width-1 fields more efficiently. +;; Extended to permit "*" to flag truncation. +;; Modified to call kqpr* functions instead of gnus-*. +(defun gnats:::parse-summary-format (format spec-alist) + ;; This function parses the FORMAT string with the help of the + ;; SPEC-ALIST and returns a list that can be eval'ed to return the + ;; string. The list will consist of the symbol `format', a format + ;; specification string, and a list of forms depending on the + ;; SPEC-ALIST. + (let ((max-width 0) + spec flist fstring b newspec max-width elem beg trunc-noisy) + (save-excursion + (set-buffer (get-buffer-create " *qpr work*")) + (erase-buffer) + (insert format) + (goto-char (point-min)) + (while (re-search-forward "%-?[0-9]*\\([,*]-?[0-9]*\\)*\\(.\\)\\(.\\)?" nil t) + (setq spec (string-to-char (buffer-substring (match-beginning 2) + (match-end 2)))) + ;; First check if there are any specs that look anything like + ;; "%12,12A", ie. with a "max width specification". These have + ;; to be treated specially. + (if (setq beg (match-beginning 1)) + (setq max-width + (string-to-int + (buffer-substring (1+ (match-beginning 1)) (match-end 1))) + trunc-noisy (= ?* (char-after beg))) + (setq max-width 0) + (setq beg (match-beginning 2)) + (setq trunc-noisy nil)) + ;; Find the specification from `spec-alist'. + (if (not (setq elem (cdr (assq spec spec-alist)))) + (setq elem '("*" ?s))) + ;; Treat user defined format specifiers specially + (and (eq (car elem) 'user-defined) + (setq elem + (list + (list (intern (concat "gnats:user-format-function-" + (buffer-substring + (match-beginning 3) + (match-end 3)))) + 'pr) + ?s)) + (delete-region (match-beginning 3) (match-end 3))) + (if (not (zerop max-width)) + (if (and (= max-width 1) + (memq (car (cdr elem)) '(?c ?s))) + (let ((el (car elem))) + (cond ((= (car (cdr elem)) ?c) + (setq newspec ?c) + (setq flist (cons el flist))) + ((= (car (cdr elem)) ?s) + (setq newspec ?c) + (setq flist (cons (list 'string-to-char el) flist))) + (t + (error "eep!")))) + (let ((el (car elem))) + (cond ((= (car (cdr elem)) ?c) + (setq el (list 'char-to-string el))) + ((= (car (cdr elem)) ?d) + (numberp el) (setq el (list 'int-to-string el)))) + (setq flist (cons (list 'gnats:::format-max-width + el max-width trunc-noisy) + flist)) + (setq newspec ?s))) + (setq flist (cons (car elem) flist)) + (setq newspec (car (cdr elem)))) + ;; Remove the old specification (and possibly a ",12" string). + (delete-region beg (match-end 2)) + ;; Insert the new specification. + (goto-char beg) + (insert newspec)) + (setq fstring (buffer-substring 1 (point-max))) + (kill-buffer nil)) + (cons 'format (cons fstring (nreverse flist))))) + +;; Try to keep this list similar to the command-line options for nquery-pr, +;; just to avoid confusing people. If there are differences, it won't break +;; anything. +(defvar gnats::summary-format-alist + (list (list ?r '(symbol-name (gnats:::fieldval pr 'responsible)) ?s) + (list ?c '(symbol-name (gnats:::fieldval pr 'category)) ?s) + (list ?C '(symbol-name (gnats:::fieldval pr 'confidential)) ?s) + (list ?e '(symbol-name (gnats:::fieldval pr 'severity)) ?s) + (list ?O '(gnats:::fieldval pr 'originator) ?s) + (list ?p '(symbol-name (gnats:::fieldval pr 'priority)) ?s) + (list ?L '(symbol-name (gnats:::fieldval pr 'class)) ?s) + (list ?S '(symbol-name (gnats:::fieldval pr 'customer-id)) ?s) ; == submitter + (list ?s '(symbol-name (gnats:::fieldval pr 'state)) ?s) + + (list ?n '(gnats:::fieldval pr 'number) ?d) + (list ?R '(gnats:::fieldval pr 'release) ?s) + (list ?j '(gnats:::fieldval pr 'synopsis) ?s) + (list ?y '(gnats:::fieldval pr 'synopsis) ?s) + (list ?u 'user-defined ?s) + )) + +(defun gnats:::format-max-width (str len noisy) + (if (> (length str) (if gnats::emacs-19p (abs len) len)) + (if noisy + (if (< len 0) + (concat "*" (substring str (1+ len))) + (concat (substring str 0 (- len 1)) "*")) + (if (< len 0) + (substring str len) + (substring str 0 len))) + str)) + +;; Redisplay the summary in the current buffer. +(defvar gnats::format-string + "%5n %-4,4c %,1e%,1p %-8,8r %,2s %-10*10S %-10*-10R %j\n" + "Format string for PR summary text. + +If you've used format strings in (ding)Gnus, this will be familiar. + +Most text is copied straight through verbatim. Use \"%\" to indicate a +non-fixed field. + +It can be followed by a number, indicating minimum width, a separator character +(\",\" or \"*\"), and another number, indicating maximum width. These fields +are optional, except that the separator must be present if the maximum width is +specified. Whitespace padding will be on the left unless the first number is +negative. Truncation of the field will be done on the right, unless the second +number is negative. If the separator character is \"*\", a \"*\" will be used +to indicate that truncation has been done; otherwise, it will be done silently. + +After the \"%\" and optional width parameters, a letter is expected. Most of +the letters are chosen to match the command-line options of `nquery-pr'. + +%r \"Responsible\" field. +%c \"Category\" field. +%C \"Confidential\" field. +%e \"Severity\" field. +%O \"Originator\" field. +%p \"Priority\" field. +%L \"Class\" field. +%S \"Customer-id\" (\"submitter\") field. +%s \"State\" field. +%n \"Number\" field. +%R \"Release\" field. +%j, %y \"Synopsis\" field. (\"j\" as in \"subJect\") +%u Special: The next character is examined, and the function + gnats:user-format-function- is invoked. One argument, the list + of (FIELD . VALUE) pairs, is passed. + +Any newlines you wish to have used must be included in this string; no +additional ones will be provided. + +If the value is not a string, it is assumed to be a function which can +be funcalled to return a format string, to be interpreted as above.") + +(defun gnats:summary-redisplay nil + "Redisplay summary of stored GNATS data. +This is useful if you change your filtering criteria or format string but +do not wish to update the GNATS data by contacting the server." + (interactive) + (let (prs + (buffer-read-only nil) + format-form fmt) + ;; Do this early, so if we're in the wrong buffer we blow up without + ;; trashing the user's data. + (setq prs (if gnats::summary-sort-function + (funcall gnats::summary-sort-function + (apply 'list gnats:::PRs)) + gnats:::PRs)) + ;; No wrapping -- ick! + (if gnats::emacs-19p + (buffer-disable-undo) + (buffer-flush-undo (current-buffer))) + (erase-buffer) + (setq fmt (if (stringp gnats::format-string) + gnats::format-string + (funcall gnats::format-string))) + (setq format-form (gnats:::parse-summary-format fmt + gnats::summary-format-alist)) + (mapcar (function + (lambda (pr) + (let ((start (point))) + (insert (eval format-form)) + ;; Magic. + (put-text-property start (point) 'gnats::pr-number + (gnats:::fieldval pr 'number)) + ))) + prs) + (goto-char (point-min)) + (buffer-enable-undo) + (set-buffer-modified-p nil) + )) + +(defvar gnats-summary-mode-map + (let ((map (copy-keymap text-mode-map))) + (if gnats::emacs-19p (suppress-keymap map)) + ;; basic mode stuff + (define-key map "g" 'gnats:summary-revert) + (define-key map "q" 'gnats:summary-quit) + (define-key map "r" 'gnats:summary-redisplay) + ;; do stuff to PRs + (define-key map "e" 'gnats:summary-edit) + (define-key map "v" 'gnats:summary-view) + ;; navigation + (define-key map "n" 'next-line) + (define-key map "p" 'previous-line) + map) + "Keymap for GNATS summary mode.") + +(defun gnats-summary-mode nil + "Major mode for problem report summary. + +You can use \\[gnats:summary-view] to view the PR specified by the +current line, or \\[gnats:summary-edit] to edit it. Typing +\\[gnats:summary-revert] will update the PR list. + +Special commands: +\\{gnats-summary-mode-map} + +Entering GNATS summary mode will invoke any hooks listed in the variable +gnats-summary-mode-hook. It will also use text-mode-hook, since the summary +mode is built on top of text mode." + (interactive) + (text-mode) +; (make-local-variable 'gnats:::PRs) +; (make-local-variable 'gnats::options) + (setq buffer-read-only t) + (setq truncate-lines t) + (setq major-mode 'gnats-summary-mode) + (setq mode-name "GNATS Summary") + (use-local-map gnats-summary-mode-map) + (run-hooks 'gnats-summary-mode-hook) + ) + +;;;###autoload +(fset 'summ-pr 'gnats:summ-pr) +;;;###autoload +(defun gnats:summ-pr (options) + "Run query-pr, with user-specified args, and display a pretty summary. +Well, display a summary, at least." + (interactive + (list + (if (not gnats::emacs-19p) + (error "GNATS summary mode will only work with emacs 19.") + (apply + 'read-from-minibuffer "Run query-pr (with args): " + (if gnats::emacs-19p + (list (cons (gnats::query-pr-default-options) 1) + nil nil 'gnats::query-pr-history) + (list (gnats::query-pr-default-options) nil nil)))))) + (let ((buf (get-buffer-create "*gnats-summ-pr-temp*")) + (prs nil) + pr fieldname value p) +; (save-excursion + (set-buffer buf) + (if gnats::emacs-19p + (buffer-disable-undo) + (buffer-flush-undo buf)) + (erase-buffer) + ;; calling nquery-pr directly would be better, but I'd need a "split" + ;; function of some sort to break apart the options string. + (message "Fetching GNATS data...") + (call-process "sh" nil buf nil "-c" + (concat + (if gnats:network-server + (format (concat gnats:::nquery-pr " --host %s ") + gnats:network-server) + (concat gnats:::query-pr " ")) + options)) + ;; um, okay, how to i check for errors? + (goto-char (point-min)) + (setq pr nil) + (while (looking-at "ld.so: warning:") + (forward-line 1)) + (while (not (eobp)) + (while (looking-at ">\\([a-zA-Z-]+\\):") + (setq fieldname (intern + (downcase + (buffer-substring (match-beginning 1) + (match-end 1))))) + (goto-char (match-end 0)) + (while (looking-at "[ \t]") + (forward-char 1)) + (setq p (point)) + (setq value (buffer-substring p (progn (end-of-line) (point)))) + (cond ((eq fieldname 'number) + (setq value (string-to-number value))) + ((memq fieldname gnats:::limited-fields) + (setq value (intern value)))) + (setq pr (cons (cons fieldname value) pr)) + (forward-char 1)) + (if (looking-at "\n") + (progn + (setq prs (cons (nreverse pr) prs) + pr nil) + (forward-char 1))) + ;; could be the result of --print-path + (if (looking-at "/.*:0:$") + (next-line 1)) + (if (looking-at gnats:::query-regexp) + ;; error message + (progn + (goto-char (match-end 0)) + (while (looking-at "[ \t]") + (forward-char 1)) + (setq p (point)) + (end-of-line) + (setq value (buffer-substring p (point))) + (error "Database query failed: %s" value))) + ) + (if pr + (setq prs (cons (nreverse pr) prs))) + (setq prs (nreverse prs)) + + ;; okay, now display it + (pop-to-buffer (get-buffer-create "*gnats:summ-pr*")) + (gnats-summary-mode) + (setq gnats:::PRs prs) + (setq gnats::options options) + (gnats:summary-redisplay) + (message "Fetching GNATS data...done.") +; ) + (kill-buffer buf) + )) + +;;;; end of gnats.el diff -r e183fc049578 -r fe104dbd9147 lisp/gnats/send-pr.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/gnats/send-pr.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,804 @@ +;;;; -*-emacs-lisp-*- +;;;;--------------------------------------------------------------------------- +;;;; EMACS interface for send-pr (by Heinz G. Seidl, hgs@cygnus.com) +;;;; Slightly hacked by Brendan Kehoe (brendan@cygnus.com). +;;;; +;;;; This file is part of the Problem Report Management System (GNATS) +;;;; Copyright 1992, 1993 Cygnus Support +;;;; +;;;; 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 Library General Public +;;;; License along with this program; if not, write to the Free +;;;; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;;;; +;;;;--------------------------------------------------------------------------- +;;;; +;;;; This file contains the EMACS interface to the Problem Report Management +;;;; System (GNATS): +;;;; +;;;; - The `send-pr' command and the `send-pr-mode' for sending +;;;; Problem Reports (PRs). +;;;; +;;;; For more information about how to send a PR see send-pr(1). +;;;; +;;;;--------------------------------------------------------------------------- +;;;; +;;;; Configuration: the symbol `DEFAULT-RELEASE' can be replaced by +;;;; site/release specific strings during the configuration/installation +;;;; process. +;;;; +;;;; Install this file in your EMACS library directory. +;;;; +;;;;--------------------------------------------------------------------------- + +(provide 'send-pr) + +;;;;--------------------------------------------------------------------------- +;;;; Customization: put the following forms into your default.el file +;;;; (or into your .emacs) +;;;;--------------------------------------------------------------------------- + +;(autoload 'send-pr-mode "send-pr" +; "Major mode for sending problem reports." t) + +;(autoload 'send-pr "send-pr" +; "Command to create and send a problem report." t) + +;;;;--------------------------------------------------------------------------- +;;;; End of Customization Section +;;;;--------------------------------------------------------------------------- + +(autoload 'server-buffer-done "server") +(defvar server-buffer-clients nil) +(defvar mail-self-blind nil) +(defvar mail-default-reply-to nil) + +(defconst send-pr::version "3.101") + +(defvar gnats:root "" + "*The top of the tree containing the GNATS database.") + +;;;;--------------------------------------------------------------------------- +;;;; hooks +;;;;--------------------------------------------------------------------------- + +(defvar text-mode-hook nil) ; we define it here in case it's not defined +(defvar send-pr-mode-hook text-mode-hook "Called when send-pr is invoked.") + +;;;;--------------------------------------------------------------------------- +;;;; Domains and default values for (some of) the Problem Report fields; +;;;; constants and definitions. +;;;;--------------------------------------------------------------------------- + +(defconst gnats::emacs-19p + (not (or (and (boundp 'epoch::version) epoch::version) + (string-lessp emacs-version "19"))) + "Is this emacs v19?") + +;;; This has to be here rather than at the bottom of this file with +;;; the other utility functions because it is used by +;;; gnats::get-config, which is called when send-pr.el is being +;;; loaded (see the "defconst" below), before the whole file has been +;;; loaded. + +(defun gnats::find-safe-default-directory (&optional buffer) +"If the directory referred to by `default-directory' for the current +buffer (or for optional argument BUFFER) does not exist, set it to the home +directory of the current user if that exists, or to `/'. + +Returns the final value of default-directory in the buffer." + (let ((homedir (expand-file-name "~/"))) + (save-excursion + (if buffer (set-buffer buffer)) + (if (not (file-exists-p default-directory)) + (if (file-exists-p homedir) + (setq default-directory homedir) + (setq default-directory "/"))) + default-directory))) + +;;; These may be changed during configuration/installation or by the individual +;;; user in his/her .emacs file. +;;; +(defun gnats::get-config (var) + (let ((shell-file-name "/bin/sh") + (buf (generate-new-buffer " *GNATS config*")) + ret) + (save-excursion + (set-buffer buf) + (shell-command-on-region + (point-min) (point-max) + (concat ". " gnats:root "/gnats-adm/config; echo $" var ) t) + (goto-char (point-min)) + ; We have to use get-buffer, since shell-command-on-region will wipe + ; out the buffer if there's no output from the command. + (if (or (not (get-buffer "*Shell Command Output*")) + (looking-at "/bin/sh:\\|\.:\\|\n")) + (setq ret nil) + (setq ret (buffer-substring (point-min) (- (point-max) 1))))) + (if (and ret (string-equal ret "")) (setq ret nil)) + (kill-buffer buf) + ret)) + +;; const because it must match the script's value +(defconst send-pr:datadir (or (gnats::get-config "DATADIR") "/usr/local/share") + "*Where the `gnats' subdirectory containing category lists lives.") + +(defvar send-pr::sites nil + "List of GNATS support sites; computed at runtime.") +(defvar send-pr:default-site + (or (gnats::get-config "GNATS_SITE") "cygnus") + "Default site to send bugs to.") +(defvar send-pr:::site send-pr:default-site + "The site to which a problem report is currently being submitted, or NIL +if using the default site (buffer local).") + +(defvar send-pr:::categories nil + "Buffer local list of available categories, derived at runtime from +send-pr:::site and send-pr::category-alist.") +(defvar send-pr::category-alist nil + "Alist of GNATS support sites and the categories supported at each; computed +at runtime.") + +;;; Ideally we would get all the following values from a central database +;;; during runtime instead of having them here in the code. +;;; +(defconst send-pr::fields + (` (("Category" send-pr::set-categories + (, (or (gnats::get-config "DEFAULT_CATEGORY") nil)) enum) + ("Class" (("sw-bug") ("doc-bug") ("change-request") ("support")) + (, (or (gnats::get-config "DEFAULT_CLASS") 0)) enum) + ("Confidential" (("yes") ("no")) + (, (or (gnats::get-config "DEFAULT_CONFIDENTIAL") 1)) enum) + ("Severity" (("non-critical") ("serious") ("critical")) + (, (or (gnats::get-config "DEFAULT_SEVERITY") 1)) enum) + ("Priority" (("low") ("medium") ("high")) + (, (or (gnats::get-config "DEFAULT_PRIORITY") 1)) enum) + ("Release" nil + (, (or (gnats::get-config "DEFAULT_RELEASE") "gnats-3.101")) + text) + ("Submitter-Id" nil + (, (or (gnats::get-config "SUBMITTER") "xSUBMITTERx")) text) + ("Synopsis" nil nil text + (lambda (a b c) (gnats::set-mail-field "Subject" c))))) + "AList, keyed on the name of the field, of: +1) The field name. +2) The list of completions. This can be a list, a function to call, or nil. +3) The default value. +4) The type of the field. +5) A sub-function to call when changed.") + +(defvar gnats::fields nil) + +(defmacro gnats::push (i l) + (` (setq (, l) (cons (,@ (list i l)))))) + +(defun send-pr::set-categories (&optional arg) + "Get the list of categories for the current site out of +send-pr::category-alist if there or from send-pr if not. With arg, force +update." + ;; + (let ((entry (assoc send-pr:::site send-pr::category-alist))) + (or (and entry (null arg)) + (let ((oldpr (getenv "GNATS_ROOT")) cats) + (send-pr::set-sites arg) + (setenv "GNATS_ROOT" gnats:root) + (setq cats (gnats::get-value-from-shell + "send-pr" "-CL" send-pr:::site)) + (setenv "GNATS_ROOT" oldpr) + (if entry (setcdr entry cats) + (setq entry (cons send-pr:::site cats)) + (gnats::push entry send-pr::category-alist)))) + (setq send-pr:::categories (cdr entry)))) + +(defun send-pr::set-sites (&optional arg) + "Get the list of sites (by listing the contents of DATADIR/gnats) and assign +it to send-pr::sites. With arg, force update." + (or (and (null arg) send-pr::sites) + (progn + (setq send-pr::sites nil) + (mapcar + (function + (lambda (file) + (or (memq t (mapcar (function (lambda (x) (string= x file))) + '("." ".." "pr-edit" "pr-addr"))) + (not (file-readable-p file)) + (gnats::push (list (file-name-nondirectory file)) + send-pr::sites)))) + (directory-files (format "%s/gnats" send-pr:datadir) t)) + (setq send-pr::sites (reverse send-pr::sites))))) + +(defconst send-pr::pr-buffer-name "*send-pr*" + "Name of the temporary buffer, where the problem report gets composed.") + +(defconst send-pr::err-buffer-name "*send-pr-error*" + "Name of the temporary buffer, where send-pr error messages appear.") + +(defvar send-pr:::err-buffer nil + "The error buffer used by the current PR buffer.") + +(defvar send-pr:::spawn-to-send nil + "Whether or not send-pr-mode should spawn a send-pr process to send the PR.") + +(defconst gnats::indent 17 "Indent for formatting the value.") + +;;;;--------------------------------------------------------------------------- +;;;; `send-pr' - command for creating and sending of problem reports +;;;;--------------------------------------------------------------------------- + +;;;###autoload +(fset 'send-pr 'send-pr:send-pr) +;;;###autoload +(defun send-pr:send-pr (&optional site) + "Create a buffer and read in the result of `send-pr -P'. +When finished with editing the problem report use \\[send-pr:submit-pr] +to send the PR with `send-pr -b -f -'." + ;; + (interactive + (if current-prefix-arg + (list (completing-read "Site: " (send-pr::set-sites 'recheck) nil t + send-pr:default-site)))) + (or site (setq site send-pr:default-site)) + (let ((buf (get-buffer send-pr::pr-buffer-name))) + (if (or (not buf) + (progn (switch-to-buffer buf) + (cond ((or (not (buffer-modified-p buf)) + (y-or-n-p "Erase previous problem report? ")) + (erase-buffer) t) + (t nil)))) + (send-pr::start-up site)))) + +(defun send-pr::start-up (site) + (switch-to-buffer (get-buffer-create send-pr::pr-buffer-name)) + (setq default-directory (expand-file-name "~/")) + (auto-save-mode auto-save-default) + (let ((oldpr (getenv "GNATS_ROOT")) + (case-fold-search nil)) + (setenv "GNATS_ROOT" gnats:root) + (send-pr::insert-template site) + (setenv "GNATS_ROOT" oldpr) + (goto-char (point-min)) + (if (looking-at "send-pr:") + (cond ((looking-at "send-pr: .* does not have a categories list") + (setq send-pr::sites nil) + (error "send-pr: the GNATS site %s does not have a categories list" site)) + (t (error (buffer-substring (point-min) (point-max))))) + (save-excursion + ;; Clear cruft inserted by bdamaged .cshrcs + (goto-char 1) + (re-search-forward "^SEND-PR:") + (delete-region 1 (match-beginning 0))))) + (set-buffer-modified-p nil) + (send-pr:send-pr-mode) + (setq send-pr:::site site) + (setq send-pr:::spawn-to-send t) + (send-pr::set-categories) + (if (null send-pr:::categories) + (progn + (and send-pr:::err-buffer (kill-buffer send-pr:::err-buffer)) + (kill-buffer nil) + (message "send-pr: no categories found")) + (or (stringp mail-default-reply-to) + (setq mail-default-reply-to (getenv "REPLYTO"))) + (and mail-default-reply-to + (gnats::set-mail-field "Reply-To" mail-default-reply-to)) + (and mail-self-blind + (gnats::set-mail-field "BCC" (user-login-name))) + (mapcar 'send-pr::maybe-change-field send-pr::fields) + (gnats::position-on-field "Description") + (message (substitute-command-keys + "To send the problem report use: \\[send-pr:submit-pr]")))) + +(defvar send-pr::template-alist nil + "An alist containing the output of send-pr -P for various sites.") + +(defun send-pr::insert-template (site) + (let ((elt (assoc site send-pr::template-alist))) + (if elt + (save-excursion (insert (cdr elt))) + (call-process "send-pr" nil t nil "-P" site) + (save-excursion + (setq send-pr::template-alist + (cons (cons site (buffer-substring (point-min) (point-max))) + send-pr::template-alist)))))) + +(fset 'do-send-pr 'send-pr:submit-pr) ;backward compat +(defun send-pr:submit-pr () + "Pipe the contents of the buffer *send-pr* to `send-pr -f -.' unless this +buffer was loaded with emacsclient, in which case save the buffer and exit." + ;; + (interactive) + (cond + ((and (boundp 'server-buffer-clients) + server-buffer-clients) + (let ((buffer (current-buffer)) + (version-control nil) (buffer-backed-up nil)) + (save-buffer buffer) + (kill-buffer buffer) + (server-buffer-done buffer))) + (send-pr:::spawn-to-send + (or (and send-pr:::err-buffer + (buffer-name send-pr:::err-buffer)) + (setq send-pr:::err-buffer + (get-buffer-create send-pr::err-buffer-name))) + (let ((err-buffer send-pr:::err-buffer) mesg ok) + (save-excursion (set-buffer err-buffer) (erase-buffer)) + (message "running send-pr...") + (let ((oldpr (getenv "GNATS_ROOT"))) + (setenv "GNATS_ROOT" gnats:root) + (call-process-region (point-min) (point-max) "send-pr" + nil err-buffer nil send-pr:::site + "-b" "-f" "-") + (setenv "GNATS_ROOT" oldpr)) + (message "running send-pr...done") + ;; stupidly we cannot check the return value in EMACS 18.57, thus we need + ;; this kluge to find out whether send-pr succeeded. + (if (save-excursion + (set-buffer err-buffer) + (goto-char (point-min)) + (setq mesg (buffer-substring (point-min) (- (point-max) 1))) + (search-forward "problem report sent" nil t)) + (progn (message mesg) + (kill-buffer err-buffer) + (delete-auto-save-file-if-necessary) + (set-buffer-modified-p nil) + (bury-buffer)) + (pop-to-buffer err-buffer)) + )) + (t + (save-buffer) + (message "Exit emacs to send the PR.")))) + +;;;;--------------------------------------------------------------------------- +;;;; send-pr:send-pr-mode mode +;;;;--------------------------------------------------------------------------- + +(defvar send-pr-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-c" 'send-pr:submit-pr) + (define-key map "\C-c\C-f" 'gnats:change-field) + (define-key map "\M-n" 'gnats:next-field) + (define-key map "\M-p" 'gnats:previous-field) + (define-key map "\C-\M-f" 'gnats:forward-field) + (define-key map "\C-\M-b" 'gnats:backward-field) + map) + "Keymap for send-pr mode.") + +(defconst gnats::keyword "^>\\([-a-zA-Z]+\\):") +(defconst gnats::before-keyword "[ \t\n\f]*[\n\f]+>\\([-a-zA-Z]+\\):") +(defconst gnats::after-keyword "^>\\([-a-zA-Z]+\\):[ \t\n\f]+") + +;;;###autoload +(fset 'send-pr-mode 'send-pr:send-pr-mode) +;;;###autoload +(defun send-pr:send-pr-mode () + "Major mode for submitting problem reports. +For information about the form see gnats(1) and send-pr(1). +Special commands: \\{send-pr-mode-map} +Turning on send-pr-mode calls the value of the variable send-pr-mode-hook, +if it is not nil." + (interactive) + (gnats::patch-exec-path) + (put 'send-pr:send-pr-mode 'mode-class 'special) + (kill-all-local-variables) + (setq major-mode 'send-pr:send-pr-mode) + (setq mode-name "send-pr") + (use-local-map send-pr-mode-map) + (set-syntax-table text-mode-syntax-table) + (setq local-abbrev-table text-mode-abbrev-table) + (setq buffer-offer-save t) + (make-local-variable 'send-pr:::site) + (make-local-variable 'send-pr:::categories) + (make-local-variable 'send-pr:::err-buffer) + (make-local-variable 'send-pr:::spawn-to-send) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate (concat (default-value 'paragraph-separate) + "\\|" gnats::keyword "[ \t\n\f]*$")) + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat (default-value 'paragraph-start) + "\\|" gnats::keyword)) + (run-hooks 'send-pr-mode-hook) + t) + +;;;;--------------------------------------------------------------------------- +;;;; Functions to read and replace field values. +;;;;--------------------------------------------------------------------------- + +(defun gnats::position-on-field (field &optional quiet) + (goto-char (point-min)) + (if (not (re-search-forward (concat "^>" field ":") nil t)) + (if quiet + nil + (error "Field `>%s:' not found." field)) + (re-search-forward "[ \t\n\f]*") + (if (looking-at gnats::keyword) + (backward-char 1)) + t)) + +(defun gnats::mail-position-on-field (field) + (let (end + (case-fold-search t)) + (goto-char (point-min)) + (re-search-forward "^$") + (setq end (match-beginning 0)) + (goto-char (point-min)) + (if (not (re-search-forward (concat "^" field ":") end 'go-to-end)) + (insert field ": \n") + (re-search-forward "[ \t\n\f]*")) + (skip-chars-backward "\n") + t)) + +(defun gnats::field-contents (field &optional elem move) + (let (pos) + (unwind-protect + (save-excursion + (if (not (gnats::position-on-field field t)) + nil + (setq pos (point-marker)) + (if (or (looking-at "<.*>$") (eolp)) + t + (looking-at ".*$") ; to set match-{beginning,end} + (gnats::nth-word + (buffer-substring (match-beginning 0) (match-end 0)) + elem)))) + (and move pos (goto-char pos))))) + +(defun gnats::functionp (thing) + (or (and (symbolp thing) (fboundp thing)) + (and (listp thing) (eq (car thing) 'lambda)))) + +(defun gnats::field-values (field) + "Return the possible (known) values for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 1))) + (cond ((gnats::functionp thing) (funcall thing)) + ((listp thing) thing) + (t (error "ACK"))))) + +(defun gnats::field-default (field) + "Return the default value for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 2))) + (cond ((stringp thing) thing) + ((null thing) "") + ((numberp thing) (car (elt (gnats::field-values field) thing))) + ((gnats::functionp thing) + (funcall thing (gnats::field-contents field))) + ((eq thing t) (gnats::field-contents field)) + (t (error "ACK"))))) + +(defun gnats::field-type (field) + "Return the type of field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 3))) + thing)) + +(defun gnats::field-action (field) + "Return the extra handling function for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 4))) + (cond ((null thing) 'ignore) + ((gnats::functionp thing) thing) + (t (error "ACK"))))) + +;;;;--------------------------------------------------------------------------- +;;;; Point movement functions +;;;;--------------------------------------------------------------------------- + +(or (fboundp 'defsubst) (fset 'defsubst 'defun)) + +(defun send-pr::maybe-change-field (field) + (setq field (car field)) + (let ((thing (gnats::field-contents field))) + (and thing (eq t thing) + (not (eq 'multi-text (gnats::field-type field))) + (gnats:change-field field)))) + +(defun gnats:change-field (&optional field default) + "Change the value of the field containing the cursor. With arg, ask the +user for the field to change. From a program, the function takes optional +arguments of the field to change and the default value to use." + (interactive) + (or field current-prefix-arg (setq field (gnats::current-field))) + (or field + (setq field + (completing-read "Field: " + (if (eq major-mode 'gnats:gnats-mode) + gnats::fields + send-pr::fields) + nil t))) + (gnats::position-on-field field) + (sit-for 0) + (let* ((old (gnats::field-contents field)) + new) + (if (null old) + (error "ACK") + (if (or (interactive-p) t) + (let ((prompt (concat ">" field ": ")) + (domain (gnats::field-values field)) + (type (gnats::field-type field))) + (or default (setq default (gnats::field-default field))) + (setq new + (if (eq type 'enum) + (completing-read prompt domain nil t + (if gnats::emacs-19p (cons default 0) + default)) + (read-string prompt (if gnats::emacs-19p (cons default 1) + default))))) + (setq new default)) + (gnats::set-field field new) + (funcall (gnats::field-action field) field old new) + new))) + +(defun gnats::set-field (field value) + (save-excursion + (gnats::position-on-field field) + (delete-horizontal-space) + (looking-at ".*$") + (replace-match + (concat (make-string (- gnats::indent (length field) 2) ?\40 ) value) t))) + +(defun gnats::set-mail-field (field value) + (save-excursion + (gnats::mail-position-on-field field) + (delete-horizontal-space) + (looking-at ".*$") + (replace-match (concat " " value) t))) + +(defun gnats::before-keyword (&optional where) + "Returns t if point is in some white space before a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword, otherwise it is moved to the beginning +of the white space it was in." + ;; + (if (looking-at gnats::before-keyword) + (prog1 t + (cond ((eq where t) + (re-search-forward "^>") (backward-char)) + ((not (eq where nil)) + (re-search-backward "[^ \t\n\f]") (forward-char)))) + nil)) + +(defun gnats::after-keyword (&optional where) + "Returns t if point is in some white space after a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword, otherwise it is moved to the end of the white +space it was in." + ;; + (if (gnats::looking-after gnats::after-keyword) + (prog1 t + (cond ((eq where t) + (re-search-backward "^>")) + ((not (eq where nil)) + (re-search-forward "[^ \t\n\f]") (backward-char)))) + nil)) + +(defun gnats::in-keyword (&optional where) + "Returns t if point is within a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword." + ;; + (let ((old-point (point-marker))) + (beginning-of-line) + (cond ((and (looking-at gnats::keyword) + (< old-point (match-end 0))) + (prog1 t + (if (eq where t) + t + (goto-char old-point)))) + (t (goto-char old-point) + nil)))) + +(defun gnats::forward-bofield () + "Moves point to the beginning of a field. Assumes that point is in the +keyword." + ;; + (if (re-search-forward "[ \t\n\f]+[^ \t\n\f]" (point-max) '-) + (backward-char) + t)) + +(defun gnats::backward-eofield () + "Moves point to the end of a field. Assumes point is in the keyword." + ;; + (if (re-search-backward "[^ \t\n\f][ \t\n\f]+" (point-min) '-) + (forward-char) + t)) + +(defun gnats::forward-eofield () + "Moves point to the end of a field. Assumes that point is in the field." + ;; + ;; look for the next field + (if (re-search-forward gnats::keyword (point-max) '-) + (progn (beginning-of-line) (gnats::backward-eofield)) + (re-search-backward "[^ \t\n\f][ \t\n\f]*" (point-min) '-) + (forward-char))) + +(defun gnats::backward-bofield () + "Moves point to the beginning of a field. Assumes that point is in the +field." + ;; + ;;look for previous field + (if (re-search-backward gnats::keyword (point-min) '-) + (gnats::forward-bofield) + t)) + + +(defun gnats:forward-field () + "Move point forward to the end of the field or to the beginning of the next +field." + ;; + (interactive) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::forward-bofield) + (gnats::forward-eofield))) + +(defun gnats:backward-field () + "Move point backward to the beginning/end of a field." + ;; + (interactive) + (backward-char) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::backward-eofield) + (gnats::backward-bofield))) + +(defun gnats:next-field () + "Move point to the beginning of the next field." + ;; + (interactive) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::forward-bofield) + (if (re-search-forward gnats::keyword (point-max) '-) + (gnats::forward-bofield) + t))) + +(defun gnats:previous-field () + "Move point to the beginning of the previous field." + ;; + (interactive) + (backward-char) + (if (or (gnats::after-keyword t) (gnats::in-keyword t) + (gnats::before-keyword t)) + (progn (re-search-backward gnats::keyword (point-min) '-) + (gnats::forward-bofield)) + (gnats::backward-bofield))) + +(defun gnats:beginning-of-field () + "Move point to the beginning of the current field." + (interactive) + (cond ((gnats::in-keyword t) + (gnats::forward-bofield)) + ((gnats::after-keyword 0)) + (t + (gnats::backward-bofield)))) + +(defun gnats::current-field () + (save-excursion + (if (cond ((or (gnats::in-keyword t) (gnats::after-keyword t)) + (looking-at gnats::keyword)) + ((re-search-backward gnats::keyword nil t))) + (buffer-substring (match-beginning 1) (match-end 1)) + nil))) + +;;;;--------------------------------------------------------------------------- +;;;; Support functions +;;;;--------------------------------------------------------------------------- + +(defun gnats::looking-after (regex) + "Returns t if point is after regex." + ;; + (let* ((old-point (point)) + (start (if (eobp) + old-point + (forward-char) (point)))) + (cond ((re-search-backward regex (point-min) t) + (goto-char old-point) + (cond ((eq (match-end 0) start) + t)))))) + +(defun gnats::nth-word (string &optional elem) + "Returns the elem-th word of the string. +If elem is nil, then the first wort is returned, if elem is 0 then +the whole string is returned." + ;; + (if (integerp elem) + (cond ((eq elem 0) string) + ((eq elem 1) (gnats::first-word string)) + ((equal string "") "") + ((>= elem 2) + (let ((i 0) (value "")) + (setq string ; strip leading blanks + (substring string (or (string-match "[^ \t]" string) 0))) + (while (< i elem) + (setq value + (substring string 0 + (string-match "[ \t]*$\\|[ \t]+" string))) + (setq string + (substring string (match-end 0))) + (setq i (+ i 1))) + value))) + (gnats::first-word string))) + +(defun gnats::first-word (string) + (setq string + (substring string (or (string-match "[^ \t]" string) 0))) + (substring string 0 (string-match "[ \t]*$\\|[ \t]+" string))) + +;;;;--------------------------------------------------------------------------- + +(defun gnats::patch-exec-path () + ;; + "Replaces `//' by `/' in `exec-path'." + ;; + ;(make-local-variable 'exec-path) + (let ((err-buffer (get-buffer-create " *gnats::patch-exec-path*")) + (ret)) + (setq exec-path (save-excursion (set-buffer err-buffer) + (prin1 exec-path err-buffer) + (goto-char (point-min)) + (while (search-forward "//" nil t) + (replace-match "/" nil t)) + (goto-char (point-min)) + (setq ret (read err-buffer)) + (kill-buffer err-buffer) + ret + )))) + +(defun gnats::get-value-from-shell (&rest command) + "Execute shell command to get a list of valid values for `variable'." + ;; + (let ((err-buffer (get-buffer-create " *gnats::get-value-from-shell*"))) + (save-excursion + (set-buffer err-buffer) + (unwind-protect + (condition-case var + (progn + (apply 'call-process + (car command) nil err-buffer nil (cdr command)) + (goto-char (point-min)) + (if (looking-at "[-a-z]+: ") + (error (buffer-substring (point-min) (point-max)))) + (read err-buffer)) + (error nil)) + (kill-buffer err-buffer))))) + +(or (fboundp 'setenv) + (defun setenv (variable &optional value) + "Set the value of the environment variable named VARIABLE to VALUE. +VARIABLE should be a string. VALUE is optional; if not provided or is +`nil', the environment variable VARIABLE will be removed. +This function works by modifying `process-environment'." + (interactive "sSet environment variable: \nsSet %s to value: ") + (if (string-match "=" variable) + (error "Environment variable name `%s' contains `='" variable) + (let ((pattern (concat "\\`" (regexp-quote (concat variable "=")))) + (case-fold-search nil) + (scan process-environment)) + (while scan + (cond + ((string-match pattern (car scan)) + (if (eq nil value) + (setq process-environment (delq (car scan) + process-environment)) + (setcar scan (concat variable "=" value))) + (setq scan nil)) + ((null (setq scan (cdr scan))) + (setq process-environment + (cons (concat variable "=" value) + process-environment))))))))) + +;;;; end of send-pr.el diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/ChangeLog --- a/lisp/gnus/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,130 @@ +Fri Mar 14 20:11:01 1997 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.4.26 is released. + +Fri Mar 14 19:57:41 1997 Lars Magne Ingebrigtsen + + * gnus-setup.el (gnus-use-sc): Changed default. + +Fri Mar 14 19:53:05 1997 Kurt Swanson + + * gnus-art.el (gnus-article-goto-next-page): Place point. + +Fri Mar 14 18:46:54 1997 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-article-mode-syntax-table): Make "-" + word-constituant. + + * gnus-sum.el (gnus-article-sort-by-author): Don't bug out on + Froms without names. + + * messagexmas.el (message-xmas-make-caesar-translation-table): Use + char-int. + +Fri Mar 14 18:44:33 1997 Per Abrahamsen + + * message.el (message-faces): New group. + +Fri Mar 14 18:43:16 1997 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-limit-to-unread): Also exclude souped + articles. + +Fri Mar 14 18:35:06 1997 Matt Armstrong + + * gnus-score.el (gnus-all-score-files): Remove duplicates. + +Fri Mar 14 18:21:07 1997 Andy Norman + + * gnus-xmas.el (gnus-xmas-switch-horizontal-scrollbar-off): Check + whether we have a scrollbar first. + +Fri Mar 14 18:15:32 1997 Lars Magne Ingebrigtsen + + * nnfolder.el (nnfolder-save-mail): Don't fold case when doing + From_. + +Wed Mar 12 06:51:49 1997 Lars Magne Ingebrigtsen + + * nnfolder.el (nnfolder-possibly-change-group): Accept a + dont-check param. + (nnfolder-request-group): Don't load folder. + + * gnus.el (gnus-home-directory): New variable. + +Tue Mar 11 17:25:46 1997 Lars Magne Ingebrigtsen + + * gnus-async.el (gnus-async-prefetch-article): Raise the level of + the message. + +Mon Mar 10 06:30:59 1997 Lars Magne Ingebrigtsen + + * gnus-score.el (gnus-score-find-trace): Would clobber the score + of other articles. + + * nneething.el (nneething-create-mapping): Make sure + nneething-directory exists. + + * nnfolder.el (nnfolder-adjust-min-active): New function. + (nnfolder-request-expire-articles): Use it. + (nnfolder-request-move-article): Ditto. + (nnfolder-request-scan): Switch to the right server first. + +Mon Mar 10 06:28:58 1997 Joev Dubach + + * nnfolder.el (nnfolder-generate-active-file): Didn't work. + +Fri Mar 14 12:07:12 1997 Steven L Baur + + * gnus-msg.el (gnus-extended-version): Add XEmacs beta # to + default X-Mailer/X-Newsreader. + +Sun Mar 9 18:38:37 1997 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.4.25 is released. + +Sun Mar 9 04:11:02 1997 Lars Magne Ingebrigtsen + + * gnus.el: Inlined and defsubsts various functions. + + * nnmail.el (nnmail-search-unix-mail-delim): Made into subst. + + * nnfolder.el (nnfolder-request-scan): Don't do anything when not + getting mail. + + * nnmh.el (nnmh-request-accept-article): Return the correct + value. + + * gnus-group.el (gnus-group-kill-all-zombies): Touch dribble. + + * gnus-score.el (gnus-score-find-trace): Message default score. + +Sat Mar 8 18:17:53 1997 Steven L Baur + + * gnus-util.el (gnus-byte-code): Use better (and still compatible) + name of `compiled-function-p'. + +Sat Mar 8 18:17:53 1997 Steven L Baur + + * messagexmas.el (message-xmas-make-caesar-translation-table): + char-int is a braindamaged and stupid name for a conversion + function. + +Sun Mar 9 01:51:16 1997 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.4.24 is released. + +Sun Mar 9 00:52:47 1997 Lars Magne Ingebrigtsen + + * gnus-sum.el (gnus-summary-set-local-parameters): Ignore errors. + +Sat Mar 8 08:55:52 1997 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-article-prev-page): Return a proper value. + + * gnus-sum.el (gnus-summary-prev-page-or-article): New command. + * gnus-xmas.el (gnus-summary-toolbar): Use it. + Sat Mar 8 08:34:22 1997 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.4.23 is released. diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/dgnushack.el --- a/lisp/gnus/dgnushack.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/dgnushack.el Mon Aug 13 09:19:45 2007 +0200 @@ -48,7 +48,7 @@ (fset 'read-color 'ignore))) (setq byte-compile-warnings - '(free-vars unresolved callargs redefine)) + '(free-vars unresolved callargs redefine obsolete)) (defun dgnushack-compile () ;;(setq byte-compile-dynamic t) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-art.el --- a/lisp/gnus/gnus-art.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-art.el Mon Aug 13 09:19:45 2007 +0200 @@ -419,10 +419,10 @@ (defface gnus-header-from-face '((((class color) (background dark)) - (:foreground "spring green" :bold t :italic t)) + (:foreground "spring green" :bold t)) (((class color) (background light)) - (:foreground "indianred" :bold t :italic t)) + (:foreground "red3" :bold t)) (t (:bold t :italic t))) "Face used for displaying from headers." @@ -432,10 +432,10 @@ (defface gnus-header-subject-face '((((class color) (background dark)) - (:foreground "SeaGreen3" :bold t :italic t)) + (:foreground "SeaGreen3" :bold t)) (((class color) (background light)) - (:foreground "firebrick" :bold t :italic t)) + (:foreground "red4" :bold t)) (t (:bold t :italic t))) "Face used for displaying subject headers." @@ -510,7 +510,7 @@ (defvar gnus-article-mode-syntax-table (let ((table (copy-syntax-table text-mode-syntax-table))) - ;;(modify-syntax-entry ?_ "w" table) + (modify-syntax-entry ?- "w" table) table) "Syntax table used in article mode buffers. Initialized from `text-mode-syntax-table.") @@ -2039,6 +2039,7 @@ "Show the next page of the article." (interactive) (when (gnus-article-next-page) + (goto-char (point-min)) (gnus-article-read-summary-keys nil (gnus-character-to-event ?n)))) (defun gnus-article-goto-prev-page () @@ -2089,8 +2090,10 @@ (recenter -1)) (let ((scroll-in-place nil)) (prog1 - (ignore-errors - (scroll-down lines)) + (condition-case () + (scroll-down lines) + (beginning-of-buffer + (goto-char (point-min)))) (move-to-window-line 0))))) (defun gnus-article-refer-article () diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-async.el --- a/lisp/gnus/gnus-async.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-async.el Mon Aug 13 09:19:45 2007 +0200 @@ -196,7 +196,7 @@ (nntp-server-buffer (get-buffer gnus-async-prefetch-article-buffer))) (when do-message - (gnus-message 7 "Prefetching article %d in group %s" + (gnus-message 9 "Prefetching article %d in group %s" article group)) (gnus-request-article article group)))))))))) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-cache.el --- a/lisp/gnus/gnus-cache.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-cache.el Mon Aug 13 09:19:45 2007 +0200 @@ -134,8 +134,7 @@ (when (and (or force (not (eq gnus-use-cache 'passive))) (numberp article) (> article 0) - (vectorp headers)) - ; This might be a dummy article. + (vectorp headers)) ; This might be a dummy article. ;; If this is a virtual group, we find the real group. (when (gnus-virtual-group-p group) (let ((result (nnvirtual-find-group-art diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-group.el --- a/lisp/gnus/gnus-group.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-group.el Mon Aug 13 09:19:45 2007 +0200 @@ -2623,6 +2623,7 @@ (interactive) (setq gnus-killed-list (nconc gnus-zombie-list gnus-killed-list)) (setq gnus-zombie-list nil) + (gnus-dribble-touch) (gnus-group-list-groups)) (defun gnus-group-kill-region (begin end) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-int.el --- a/lisp/gnus/gnus-int.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-int.el Mon Aug 13 09:19:45 2007 +0200 @@ -201,7 +201,7 @@ "Check whether a connection to METHOD has been opened." (when (stringp method) (setq method (gnus-server-to-method method))) - (funcall (gnus-get-function method 'server-opened) (nth 1 method))) + (funcall (inline (gnus-get-function method 'server-opened)) (nth 1 method))) (defun gnus-status-message (method) "Return the status message from METHOD. @@ -219,10 +219,10 @@ (defun gnus-request-group (group &optional dont-check method) "Request GROUP. If DONT-CHECK, no information is required." - (let ((method (or method (gnus-find-method-for-group group)))) + (let ((method (or method (inline (gnus-find-method-for-group group))))) (when (stringp method) - (setq method (gnus-server-to-method method))) - (funcall (gnus-get-function method 'request-group) + (setq method (inline (gnus-server-to-method method)))) + (funcall (inline (gnus-get-function method 'request-group)) (gnus-group-real-name group) (nth 1 method) dont-check))) (defun gnus-list-active-group (group) @@ -243,7 +243,7 @@ (defun gnus-close-group (group) "Request the GROUP be closed." - (let ((method (gnus-find-method-for-group group))) + (let ((method (inline (gnus-find-method-for-group group)))) (funcall (gnus-get-function method 'close-group) (gnus-group-real-name group) (nth 1 method)))) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-load.el --- a/lisp/gnus/gnus-load.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-load.el Mon Aug 13 09:19:45 2007 +0200 @@ -99,7 +99,7 @@ (put 'gnus-article 'custom-loads '("gnus-cite" "gnus-art")) (put 'gnus-group-foreign 'custom-loads '("gnus-group")) (put 'programming 'custom-loads '("cus-edit")) -(put 'mesage-sending 'custom-loads '("message")) +(put 'message-sending 'custom-loads '("message")) (put 'nnmail-prepare 'custom-loads '("nnmail")) (put 'picons 'custom-loads '("gnus-picon")) (put 'gnus-article-signature 'custom-loads '("gnus-art")) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-msg.el --- a/lisp/gnus/gnus-msg.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-msg.el Mon Aug 13 09:19:45 2007 +0200 @@ -530,11 +530,17 @@ (concat "Emacs " (substring emacs-version (match-beginning 1) (match-end 1)))) - ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)" emacs-version) + ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" + emacs-version) (concat (substring emacs-version (match-beginning 1) (match-end 1)) - (format " %d.%d" emacs-major-version emacs-minor-version))) + (format " %d.%d" emacs-major-version emacs-minor-version) + (if (match-beginning 3) + (substring emacs-version + (match-beginning 3) + (match-end 3)) + ""))) (t emacs-version)))) ;; Written by "Mr. Per Persson" . diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-nocem.el --- a/lisp/gnus/gnus-nocem.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-nocem.el Mon Aug 13 09:19:45 2007 +0200 @@ -48,7 +48,7 @@ "clewis@ferret.ocunix.on.ca;" ; Chris Lewis "jem@xpat.com;" ; Despammer from Korea "snowhare@xmission.com" ; Benjamin "Snowhare" Franz - "red@redpoll.mrfs.oh.us (Richard E. Depew)" + "red@redpoll.mrfs.oh.us (Richard E. Depew)" ; ARMM! ARMM! ) "List of NoCeM issuers to pay attention to." :group 'gnus-nocem @@ -75,7 +75,7 @@ (defcustom gnus-nocem-liberal-fetch nil "*If t try to fetch all messages which have @@NCM in the subject. -Otherwise don't fetch messages which have references or whose messsage-id +Otherwise don't fetch messages which have references or whose message-id matches an previously scanned and verified nocem message." :group 'gnus-nocem :type 'boolean) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-score.el --- a/lisp/gnus/gnus-score.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-score.el Mon Aug 13 09:19:45 2007 +0200 @@ -2181,24 +2181,29 @@ (defun gnus-score-find-trace () "Find all score rules that applies to the current article." (interactive) - (let ((gnus-newsgroup-headers - (list (gnus-summary-article-header))) - (gnus-newsgroup-scored nil) - trace) - (save-excursion - (nnheader-set-temp-buffer "*Score Trace*")) - (setq gnus-score-trace nil) - (gnus-possibly-score-headers 'trace) - (if (not (setq trace gnus-score-trace)) - (gnus-error 1 "No score rules apply to the current article.") - (set-buffer "*Score Trace*") - (gnus-add-current-to-buffer-list) - (while trace - (insert (format "%S -> %s\n" (cdar trace) - (file-name-nondirectory (caar trace)))) - (setq trace (cdr trace))) - (goto-char (point-min)) - (gnus-configure-windows 'score-trace)))) + (let ((old-scored gnus-newsgroup-scored)) + (let ((gnus-newsgroup-headers + (list (gnus-summary-article-header))) + (gnus-newsgroup-scored nil) + trace) + (save-excursion + (nnheader-set-temp-buffer "*Score Trace*")) + (setq gnus-score-trace nil) + (gnus-possibly-score-headers 'trace) + (if (not (setq trace gnus-score-trace)) + (gnus-error + 1 "No score rules apply to the current article (default score %d)." + gnus-summary-default-score) + (set-buffer "*Score Trace*") + (gnus-add-current-to-buffer-list) + (while trace + (insert (format "%S -> %s\n" (cdar trace) + (file-name-nondirectory (caar trace)))) + (setq trace (cdr trace))) + (goto-char (point-min)) + (gnus-configure-windows 'score-trace))) + (set-buffer gnus-summary-buffer) + (setq gnus-newsgroup-scored old-scored))) (defun gnus-score-find-favourite-words () "List words used in scoring." @@ -2616,9 +2621,9 @@ (pop score-files)) (let ((files score-files)) (while (cdr files) - (when (member (cadr files) (cddr files)) - (setcdr files (cddr files))) - (pop files))) + (if (member (cadr files) (cddr files)) + (setcdr files (cddr files)) + (pop files)))) ;; Do the scoring if there are any score files for this group. score-files)) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-setup.el --- a/lisp/gnus/gnus-setup.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-setup.el Mon Aug 13 09:19:45 2007 +0200 @@ -75,7 +75,7 @@ "Set this if you want to use SENDMAIL for mail reading") (defvar gnus-use-vm nil "Set this if you want to use the VM package for mail reading") -(defvar gnus-use-sc t +(defvar gnus-use-sc nil "Set this if you want to use Supercite") (defvar gnus-use-mailcrypt t "Set this if you want to use Mailcrypt for dealing with PGP messages") diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-soup.el --- a/lisp/gnus/gnus-soup.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-soup.el Mon Aug 13 09:19:45 2007 +0200 @@ -34,10 +34,11 @@ ;;; User Variables: -(defvar gnus-soup-directory "~/SoupBrew/" +(defvar gnus-soup-directory (nnheader-concat gnus-home-directory "SoupBrew/") "*Directory containing an unpacked SOUP packet.") -(defvar gnus-soup-replies-directory (concat gnus-soup-directory "SoupReplies/") +(defvar gnus-soup-replies-directory + (nnheader-concat gnus-soup-directory "SoupReplies/") "*Directory where Gnus will do processing of replies.") (defvar gnus-soup-prefix-file "gnus-prefix" @@ -53,7 +54,7 @@ "*Format string command for unpacking a SOUP packet. The SOUP packet file name will be inserted at the %s.") -(defvar gnus-soup-packet-directory "~/" +(defvar gnus-soup-packet-directory gnus-home-directory "*Where gnus-soup will look for REPLIES packets.") (defvar gnus-soup-packet-regexp "Soupin" diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-start.el --- a/lisp/gnus/gnus-start.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-start.el Mon Aug 13 09:19:45 2007 +0200 @@ -33,13 +33,13 @@ (require 'gnus-util) (require 'message) -(defcustom gnus-startup-file "~/.newsrc" +(defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc") "Your `.newsrc' file. `.newsrc-SERVER' will be used instead if that exists." :group 'gnus-start :type 'file) -(defcustom gnus-init-file "~/.gnus" +(defcustom gnus-init-file (nnheader-concat gnus-home-directory ".gnus") "Your Gnus elisp startup file. If a file with the .el or .elc suffixes exist, it will be read instead." @@ -1290,12 +1290,35 @@ (> (cdr cache-active) (cdr active)) (setcdr active (cdr cache-active))))))) +(defun gnus-activate-group (group &optional scan dont-check method) + ;; Check whether a group has been activated or not. + ;; If SCAN, request a scan of that group as well. + (let ((method (or method (inline (gnus-find-method-for-group group)))) + active) + (and (inline (gnus-check-server method)) + ;; We escape all bugs and quit here to make it possible to + ;; continue if a group is so out-there that it reports bugs + ;; and stuff. + (progn + (and scan + (gnus-check-backend-function 'request-scan (car method)) + (gnus-request-scan group method)) + t) + (condition-case () + (inline (gnus-request-group group dont-check method)) + (error nil) + (quit nil)) + (gnus-set-active group (setq active (gnus-parse-active))) + ;; Return the new active info. + active))) + (defun gnus-get-unread-articles-in-group (info active &optional update) (when active ;; Allow the backend to update the info in the group. (when (and update (gnus-request-update-info - info (gnus-find-method-for-group (gnus-info-group info)))) + info (inline (gnus-find-method-for-group + (gnus-info-group info))))) (gnus-activate-group (gnus-info-group info) nil t)) (let* ((range (gnus-info-read info)) (num 0)) @@ -1400,9 +1423,10 @@ ;; newsgroup to t. This means that Gnus thinks that there are ;; unread articles, but it has no idea how many. (if (and (setq method (gnus-info-method info)) - (not (gnus-server-equal - gnus-select-method - (setq method (gnus-server-get-method nil method)))) + (not (inline + (gnus-server-equal + gnus-select-method + (setq method (gnus-server-get-method nil method))))) (not (gnus-secondary-method-p method))) ;; These groups are foreign. Check the level. (when (<= (gnus-info-level info) foreign-level) @@ -1462,28 +1486,6 @@ (while list (gnus-sethash (car list) (pop list) gnus-killed-hashtb))))) -(defun gnus-activate-group (group &optional scan dont-check method) - ;; Check whether a group has been activated or not. - ;; If SCAN, request a scan of that group as well. - (let ((method (or method (gnus-find-method-for-group group))) - active) - (and (gnus-check-server method) - ;; We escape all bugs and quit here to make it possible to - ;; continue if a group is so out-there that it reports bugs - ;; and stuff. - (progn - (and scan - (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan group method)) - t) - (condition-case () - (gnus-request-group group dont-check method) - (error nil) - (quit nil)) - (gnus-set-active group (setq active (gnus-parse-active))) - ;; Return the new active info. - active))) - (defun gnus-parse-active () "Parse active info in the nntp server buffer." (save-excursion @@ -1589,10 +1591,12 @@ (gmethod (gnus-server-get-method nil method)) groups info) (while (setq info (pop newsrc)) - (when (gnus-server-equal - (gnus-find-method-for-group - (gnus-info-group info) info) - gmethod) + (when (inline + (gnus-server-equal + (inline + (gnus-find-method-for-group + (gnus-info-group info) info)) + gmethod)) (push (gnus-group-real-name (gnus-info-group info)) groups))) (when groups @@ -2253,7 +2257,7 @@ ;; Don't write foreign groups to .newsrc. (when (or (null (setq method (gnus-info-method info))) (equal method "native") - (gnus-server-equal method gnus-select-method)) + (inline (gnus-server-equal method gnus-select-method))) (insert (gnus-info-group info) (if (> (gnus-info-level info) gnus-level-subscribed) "!" ":")) @@ -2393,9 +2397,11 @@ (narrow-to-region (point-min) (point))) ;; If these are groups from a foreign select method, we insert the ;; group prefix in front of the group names. - (and method (not (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method nil gnus-select-method))) + (and method (not (inline + (gnus-server-equal + (gnus-server-get-method nil method) + (gnus-server-get-method + nil gnus-select-method)))) (let ((prefix (gnus-group-prefixed-name "" method))) (goto-char (point-min)) (while (and (not (eobp)) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-sum.el --- a/lisp/gnus/gnus-sum.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-sum.el Mon Aug 13 09:19:45 2007 +0200 @@ -2449,7 +2449,7 @@ (symbolp (car elem)) ; Has to be a symbol in there. (not (memq (car elem) '(quit-config to-address to-list to-group))) - (progn ; So we set it. + (ignore-errors ; So we set it. (make-local-variable (car elem)) (set (car elem) (eval (nth 1 elem)))))))) @@ -3190,11 +3190,11 @@ (let ((extract (funcall gnus-extract-address-components (mail-header-from h1)))) - (or (car extract) (cdr extract))) + (or (car extract) (cadr extract) "")) (let ((extract (funcall gnus-extract-address-components (mail-header-from h2)))) - (or (car extract) (cdr extract))))) + (or (car extract) (cadr extract) "")))) (defun gnus-thread-sort-by-author (h1 h2) "Sort threads by root author." @@ -5387,7 +5387,7 @@ (gnus-set-global-variables) (let ((article (gnus-summary-article-number)) (article-window (get-buffer-window gnus-article-buffer t)) - (endp nil)) + endp) (gnus-configure-windows 'article) (if (eq (cdr (assq article gnus-newsgroup-reads)) gnus-canceled-mark) (if (and (eq gnus-summary-goto-unread 'never) @@ -5416,13 +5416,16 @@ (gnus-summary-recenter) (gnus-summary-position-point))) -(defun gnus-summary-prev-page (&optional lines) +(defun gnus-summary-prev-page (&optional lines move) "Show previous page of selected article. -Argument LINES specifies lines to be scrolled down." +Argument LINES specifies lines to be scrolled down. +If MOVE, move to the previous unread article if point is at +the beginning of the buffer." (interactive "P") (gnus-set-global-variables) (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer t))) + (article-window (get-buffer-window gnus-article-buffer t)) + endp) (gnus-configure-windows 'article) (if (or (null gnus-current-article) (null gnus-article-current) @@ -5433,9 +5436,24 @@ (gnus-summary-recenter) (when article-window (gnus-eval-in-buffer-window gnus-article-buffer - (gnus-article-prev-page lines))))) + (setq endp (gnus-article-prev-page lines))) + (when (and move endp) + (cond (lines + (gnus-message 3 "Beginning of message")) + ((null lines) + (if (and (eq gnus-summary-goto-unread 'never) + (not (gnus-summary-first-article-p article))) + (gnus-summary-prev-article) + (gnus-summary-prev-unread-article)))))))) (gnus-summary-position-point)) +(defun gnus-summary-prev-page-or-article (&optional lines) + "Show previous page of selected article. +Argument LINES specifies lines to be scrolled down. +If at the beginning of the article, go to the next article." + (interactive "P") + (gnus-summary-prev-page lines t)) + (defun gnus-summary-scroll-up (lines) "Scroll up (or down) one line current article. Argument LINES specifies lines to be scrolled up (or down if negative)." @@ -5650,7 +5668,7 @@ gnus-killed-mark gnus-kill-file-mark gnus-low-score-mark gnus-expirable-mark gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark - gnus-duplicate-mark) + gnus-duplicate-mark gnus-souped-mark) 'reverse))) (defalias 'gnus-summary-delete-marked-with 'gnus-summary-limit-exclude-marks) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-topic.el --- a/lisp/gnus/gnus-topic.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-topic.el Mon Aug 13 09:19:45 2007 +0200 @@ -236,8 +236,8 @@ result found) (while (and topology (not (setq found (equal (caaar topology) topic))) - (not (setq result (gnus-topic-parent-topic topic - (car topology))))) + (not (setq result (gnus-topic-parent-topic + topic (car topology))))) (setq topology (cdr topology))) (or result (and found parent)))) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-util.el --- a/lisp/gnus/gnus-util.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-util.el Mon Aug 13 09:19:45 2007 +0200 @@ -145,7 +145,7 @@ (defun gnus-byte-code (func) "Return a form that can be `eval'ed based on FUNC." (let ((fval (symbol-function func))) - (if (byte-code-function-p fval) + (if (compiled-function-p fval) (let ((flist (append fval nil))) (setcar flist 'byte-code) flist) @@ -458,7 +458,7 @@ (let ((ids (inline (gnus-split-references references)))) (car (last ids (or n 1)))))) -(defun gnus-buffer-live-p (buffer) +(defsubst gnus-buffer-live-p (buffer) "Say whether BUFFER is alive or not." (and buffer (get-buffer buffer) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-uu.el --- a/lisp/gnus/gnus-uu.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-uu.el Mon Aug 13 09:19:45 2007 +0200 @@ -1206,7 +1206,6 @@ (defun gnus-uu-grab-articles (articles process-function &optional sloppy limit no-errors) (let ((state 'first) - (gnus-asynchronous nil) has-been-begin article result-file result-files process-state gnus-summary-display-article-function gnus-article-display-hook gnus-article-prepare-hook diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus-xmas.el --- a/lisp/gnus/gnus-xmas.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus-xmas.el Mon Aug 13 09:19:45 2007 +0200 @@ -142,7 +142,8 @@ This is ugly, but it works around a bug in `window-displayed-height'.") (defun gnus-xmas-switch-horizontal-scrollbar-off () - (set-specifier scrollbar-height (cons (current-buffer) 0))) + (when (featurep 'scrollbar) + (set-specifier scrollbar-height (cons (current-buffer) 0)))) (defun gnus-xmas-summary-recenter () "\"Center\" point in the summary window. @@ -597,9 +598,9 @@ (defvar gnus-summary-toolbar '([gnus-summary-prev-unread - gnus-summary-prev-unread-article t "Prev unread article"] + gnus-summary-prev-page-or-article t "Page up"] [gnus-summary-next-unread - gnus-summary-next-unread-article t "Next unread article"] + gnus-summary-next-page t "Page down"] [gnus-summary-post-news gnus-summary-post-news t "Post an article"] [gnus-summary-followup-with-original diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/gnus.el --- a/lisp/gnus/gnus.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/gnus.el Mon Aug 13 09:19:45 2007 +0200 @@ -226,7 +226,7 @@ :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.4.23" +(defconst gnus-version-number "5.4.26" "Version number for this version of Gnus.") (defconst gnus-version (format "Gnus v%s" gnus-version-number) @@ -711,7 +711,14 @@ (require 'gnus-util) (require 'nnheader) -(defcustom gnus-directory (or (getenv "SAVEDIR") "~/News/") +(defcustom gnus-home-directory "~/" + "Directory variable that specifies the \"home\" directory. +All other Gnus path variables are initialized from this variable." + :group 'gnus-files + :type 'directory) + +(defcustom gnus-directory (or (getenv "SAVEDIR") + (nnheader-concat gnus-home-directory "News/")) "Directory variable from which all other Gnus file variables are derived." :group 'gnus-files :type 'directory) @@ -2378,18 +2385,6 @@ (memq option (assoc (format "%s" (car method)) gnus-valid-select-methods))) -(defun gnus-server-extend-method (group method) - ;; This function "extends" a virtual server. If the server is - ;; "hello", and the select method is ("hello" (my-var "something")) - ;; in the group "alt.alt", this will result in a new virtual server - ;; called "hello+alt.alt". - (if (or (not (gnus-similar-server-opened method)) - (not (cddr method))) - method - `(,(car method) ,(concat (cadr method) "+" group) - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method)))) - (defun gnus-similar-server-opened (method) (let ((opened gnus-opened-servers)) (while (and method opened) @@ -2399,6 +2394,18 @@ (pop opened)) (not method))) +(defun gnus-server-extend-method (group method) + ;; This function "extends" a virtual server. If the server is + ;; "hello", and the select method is ("hello" (my-var "something")) + ;; in the group "alt.alt", this will result in a new virtual server + ;; called "hello+alt.alt". + (if (or (not (inline (gnus-similar-server-opened method))) + (not (cddr method))) + method + `(,(car method) ,(concat (cadr method) "+" group) + (,(intern (format "%s-address" (car method))) ,(cadr method)) + ,@(cddr method)))) + (defun gnus-server-status (method) "Return the status of METHOD." (nth 1 (assoc method gnus-opened-servers))) @@ -2426,9 +2433,9 @@ gnus-select-method (setq method (cond ((stringp method) - (gnus-server-to-method method)) + (inline (gnus-server-to-method method))) ((stringp (cadr method)) - (gnus-server-extend-method group method)) + (inline (gnus-server-extend-method group method))) (t method))) (cond ((equal (cadr method) "") @@ -2438,7 +2445,7 @@ (t (gnus-server-add-address method))))))) -(defun gnus-check-backend-function (func group) +(defsubst gnus-check-backend-function (func group) "Check whether GROUP supports function FUNC. GROUP can either be a string (a group name) or a select method." (ignore-errors diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/message.el --- a/lisp/gnus/message.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/message.el Mon Aug 13 09:19:45 2007 +0200 @@ -93,6 +93,11 @@ "Composing Mail Messages" :group 'message) +(defgroup message-faces nil + "Faces used for message composing." + :group 'message + :group 'faces) + (defcustom message-directory "~/Mail/" "*Directory from which all other mail file variables are derived." :group 'message-various @@ -398,7 +403,7 @@ (t '(nnspool ""))) "Method used to post news." :group 'message-news - :group 'mesage-sending + :group 'message-sending ;; This should be the `gnus-select-method' widget, but that might ;; create a dependence to `gnus.el'. :type 'sexp) @@ -614,7 +619,7 @@ (t (:bold t :italic t))) "Face used for displaying From headers." - :group 'message-headers) + :group 'message-faces) (defface message-header-cc-face '((((class color) @@ -626,7 +631,7 @@ (t (:bold t))) "Face used for displaying Cc headers." - :group 'message-headers) + :group 'message-faces) (defface message-header-subject-face '((((class color) @@ -638,7 +643,7 @@ (t (:bold t))) "Face used for displaying subject headers." - :group 'message-headers) + :group 'message-faces) (defface message-header-newsgroups-face '((((class color) @@ -650,7 +655,7 @@ (t (:bold t :italic t))) "Face used for displaying newsgroups headers." - :group 'message-headers) + :group 'message-faces) (defface message-header-other-face '((((class color) @@ -662,7 +667,7 @@ (t (:bold t :italic t))) "Face used for displaying newsgroups headers." - :group 'message-headers) + :group 'message-faces) (defface message-header-name-face '((((class color) @@ -674,7 +679,7 @@ (t (:bold t))) "Face used for displaying header names." - :group 'message-headers) + :group 'message-faces) (defface message-header-xheader-face '((((class color) @@ -686,7 +691,7 @@ (t (:bold t))) "Face used for displaying X-Header headers." - :group 'message-headers) + :group 'message-faces) (defface message-separator-face '((((class color) @@ -698,7 +703,7 @@ (t (:bold t))) "Face used for displaying the separator." - :group 'message-headers) + :group 'message-faces) (defface message-cited-text-face '((((class color) @@ -710,7 +715,7 @@ (t (:bold t))) "Face used for displaying cited text names." - :group 'message-headers) + :group 'message-faces) (defvar message-font-lock-keywords (let* ((cite-prefix "A-Za-z") diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nndir.el --- a/lisp/gnus/nndir.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nndir.el Mon Aug 13 09:19:45 2007 +0200 @@ -63,8 +63,6 @@ server)) (unless (assq 'nndir-directory defs) (push `(nndir-directory ,server) defs)) - ;(when (equal server "") - ; (setq server (cadr (assq 'nndir-directory defs)))) (push `(nndir-current-group ,(file-name-nondirectory (directory-file-name nndir-directory))) defs) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nneething.el --- a/lisp/gnus/nneething.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nneething.el Mon Aug 13 09:19:45 2007 +0200 @@ -188,69 +188,70 @@ (defun nneething-create-mapping () ;; Read nneething-active and nneething-map. - (let ((map-file (nneething-map-file)) - (files (directory-files nneething-directory)) - touched map-files) - (when (file-exists-p map-file) - (ignore-errors - (load map-file nil t t))) - (unless nneething-active - (setq nneething-active (cons 1 0))) - ;; Old nneething had a different map format. - (when (and (cdar nneething-map) - (atom (cdar nneething-map))) - (setq nneething-map - (mapcar (lambda (n) - (list (cdr n) (car n) - (nth 5 (file-attributes - (nneething-file-name (car n)))))) - nneething-map))) - ;; Remove files matching the exclusion regexp. - (when nneething-exclude-files - (let ((f files) + (when (file-exists-p nneething-directory) + (let ((map-file (nneething-map-file)) + (files (directory-files nneething-directory)) + touched map-files) + (when (file-exists-p map-file) + (ignore-errors + (load map-file nil t t))) + (unless nneething-active + (setq nneething-active (cons 1 0))) + ;; Old nneething had a different map format. + (when (and (cdar nneething-map) + (atom (cdar nneething-map))) + (setq nneething-map + (mapcar (lambda (n) + (list (cdr n) (car n) + (nth 5 (file-attributes + (nneething-file-name (car n)))))) + nneething-map))) + ;; Remove files matching the exclusion regexp. + (when nneething-exclude-files + (let ((f files) + prev) + (while f + (if (string-match nneething-exclude-files (car f)) + (if prev (setcdr prev (cdr f)) + (setq files (cdr files))) + (setq prev f)) + (setq f (cdr f))))) + ;; Remove deleted files from the map. + (let ((map nneething-map) prev) - (while f - (if (string-match nneething-exclude-files (car f)) - (if prev (setcdr prev (cdr f)) - (setq files (cdr files))) - (setq prev f)) - (setq f (cdr f))))) - ;; Remove deleted files from the map. - (let ((map nneething-map) - prev) - (while map - (if (and (member (cadar map) files) - ;; We also remove files that have changed mod times. - (equal (nth 5 (file-attributes - (nneething-file-name (cadar map)))) - (caddar map))) - (progn - (push (cadar map) map-files) - (setq prev map)) + (while map + (if (and (member (cadar map) files) + ;; We also remove files that have changed mod times. + (equal (nth 5 (file-attributes + (nneething-file-name (cadar map)))) + (caddar map))) + (progn + (push (cadar map) map-files) + (setq prev map)) + (setq touched t) + (if prev + (setcdr prev (cdr map)) + (setq nneething-map (cdr nneething-map)))) + (setq map (cdr map)))) + ;; Find all new files and enter them into the map. + (while files + (unless (member (car files) map-files) + ;; This file is not in the map, so we enter it. (setq touched t) - (if prev - (setcdr prev (cdr map)) - (setq nneething-map (cdr nneething-map)))) - (setq map (cdr map)))) - ;; Find all new files and enter them into the map. - (while files - (unless (member (car files) map-files) - ;; This file is not in the map, so we enter it. - (setq touched t) - (setcdr nneething-active (1+ (cdr nneething-active))) - (push (list (cdr nneething-active) (car files) - (nth 5 (file-attributes - (nneething-file-name (car files))))) - nneething-map)) - (setq files (cdr files))) - (when (and touched - (not nneething-read-only)) - (nnheader-temp-write map-file - (insert "(setq nneething-map '") - (gnus-prin1 nneething-map) - (insert ")\n(setq nneething-active '") - (gnus-prin1 nneething-active) - (insert ")\n"))))) + (setcdr nneething-active (1+ (cdr nneething-active))) + (push (list (cdr nneething-active) (car files) + (nth 5 (file-attributes + (nneething-file-name (car files))))) + nneething-map)) + (setq files (cdr files))) + (when (and touched + (not nneething-read-only)) + (nnheader-temp-write map-file + (insert "(setq nneething-map '") + (gnus-prin1 nneething-map) + (insert ")\n(setq nneething-active '") + (gnus-prin1 nneething-active) + (insert ")\n")))))) (defun nneething-insert-head (file) "Insert the head of FILE." diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nnfolder.el --- a/lisp/gnus/nnfolder.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nnfolder.el Mon Aug 13 09:19:45 2007 +0200 @@ -193,9 +193,8 @@ (point) (progn (end-of-line) (point))))))))))) (deffoo nnfolder-request-group (group &optional server dont-check) - (nnfolder-possibly-change-group group server) + (nnfolder-possibly-change-group group server t) (save-excursion - (nnmail-activate 'nnfolder) (if (not (assoc group nnfolder-group-alist)) (nnheader-report 'nnfolder "No such group: %s" group) (if dont-check @@ -217,22 +216,24 @@ (car range) (cdr range) group)))))))) (deffoo nnfolder-request-scan (&optional group server) - (nnfolder-possibly-change-group group server t) - (nnmail-get-new-mail - 'nnfolder - (lambda () - (let ((bufs nnfolder-buffer-alist)) - (save-excursion - (while bufs - (if (not (buffer-name (nth 1 (car bufs)))) - (setq nnfolder-buffer-alist - (delq (car bufs) nnfolder-buffer-alist)) - (set-buffer (nth 1 (car bufs))) - (nnfolder-save-buffer) - (kill-buffer (current-buffer))) - (setq bufs (cdr bufs)))))) - nnfolder-directory - group)) + (nnfolder-possibly-change-group nil server) + (when nnfolder-get-new-mail + (nnfolder-possibly-change-group group server) + (nnmail-get-new-mail + 'nnfolder + (lambda () + (let ((bufs nnfolder-buffer-alist)) + (save-excursion + (while bufs + (if (not (buffer-name (nth 1 (car bufs)))) + (setq nnfolder-buffer-alist + (delq (car bufs) nnfolder-buffer-alist)) + (set-buffer (nth 1 (car bufs))) + (nnfolder-save-buffer) + (kill-buffer (current-buffer))) + (setq bufs (cdr bufs)))))) + nnfolder-directory + group))) ;; Don't close the buffer if we're not shutting down the server. This way, ;; we can keep the buffer in the group buffer cache, and not have to grovel @@ -320,19 +321,7 @@ (unless nnfolder-inhibit-expiry (nnheader-message 5 "Deleting articles...done")) (nnfolder-save-buffer) - ;; Find the lowest active article in this group. - (let* ((active (cadr (assoc newsgroup nnfolder-group-alist))) - (marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - (activemin (cdr active))) - (goto-char (point-min)) - (while (and (search-forward marker nil t) - (re-search-forward number nil t)) - (setq activemin (min activemin - (string-to-number (buffer-substring - (match-beginning 0) - (match-end 0)))))) - (setcar active activemin)) + (nnfolder-adjust-min-active newsgroup) (nnmail-save-active nnfolder-group-alist nnfolder-active-file) (nconc rest articles)))) @@ -362,7 +351,9 @@ (goto-char (point-min)) (when (search-forward (nnfolder-article-string article) nil t) (nnfolder-delete-mail)) - (and last (nnfolder-save-buffer)))) + (when last + (nnfolder-save-buffer) + (nnfolder-adjust-min-active group)))) result)) (deffoo nnfolder-request-accept-article (group &optional server last) @@ -452,6 +443,21 @@ ;;; Internal functions. +(defun nnfolder-adjust-min-active (group) + ;; Find the lowest active article in this group. + (let* ((active (cadr (assoc group nnfolder-group-alist))) + (marker (concat "\n" nnfolder-article-marker)) + (number "[0-9]+") + (activemin (cdr active))) + (goto-char (point-min)) + (while (and (search-forward marker nil t) + (re-search-forward number nil t)) + (setq activemin (min activemin + (string-to-number (buffer-substring + (match-beginning 0) + (match-end 0)))))) + (setcar active activemin))) + (defun nnfolder-article-string (article) (if (numberp article) (concat "\n" nnfolder-article-marker (int-to-string article) " ") @@ -473,7 +479,7 @@ (point)) (point-max)))))) -(defun nnfolder-possibly-change-group (group &optional server scanning) +(defun nnfolder-possibly-change-group (group &optional server dont-check) ;; Change servers. (when (and server (not (nnfolder-server-opened server))) @@ -489,35 +495,36 @@ (push (list group (cons 1 0)) nnfolder-group-alist) (nnmail-save-active nnfolder-group-alist nnfolder-active-file)) - (let (inf file) - ;; If we have to change groups, see if we don't already have the - ;; folder in memory. If we do, verify the modtime and destroy - ;; the folder if needed so we can rescan it. - (when (setq inf (assoc group nnfolder-buffer-alist)) - (setq nnfolder-current-buffer (nth 1 inf))) - - ;; If the buffer is not live, make sure it isn't in the alist. If it - ;; is live, verify that nobody else has touched the file since last - ;; time. - (when (and nnfolder-current-buffer - (not (gnus-buffer-live-p nnfolder-current-buffer))) - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) - nnfolder-current-buffer nil)) + (unless dont-check + (let (inf file) + ;; If we have to change groups, see if we don't already have the + ;; folder in memory. If we do, verify the modtime and destroy + ;; the folder if needed so we can rescan it. + (when (setq inf (assoc group nnfolder-buffer-alist)) + (setq nnfolder-current-buffer (nth 1 inf))) - (setq nnfolder-current-group group) + ;; If the buffer is not live, make sure it isn't in the alist. If it + ;; is live, verify that nobody else has touched the file since last + ;; time. + (when (and nnfolder-current-buffer + (not (gnus-buffer-live-p nnfolder-current-buffer))) + (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) + nnfolder-current-buffer nil)) + + (setq nnfolder-current-group group) - (when (or (not nnfolder-current-buffer) - (not (verify-visited-file-modtime nnfolder-current-buffer))) - (save-excursion - (setq file (nnfolder-group-pathname group)) - ;; See whether we need to create the new file. - (unless (file-exists-p file) - (gnus-make-directory (file-name-directory file)) - (nnmail-write-region 1 1 file t 'nomesg)) - (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) - (set-buffer nnfolder-current-buffer) - (push (list group nnfolder-current-buffer) - nnfolder-buffer-alist))))))) + (when (or (not nnfolder-current-buffer) + (not (verify-visited-file-modtime nnfolder-current-buffer))) + (save-excursion + (setq file (nnfolder-group-pathname group)) + ;; See whether we need to create the new file. + (unless (file-exists-p file) + (gnus-make-directory (file-name-directory file)) + (nnmail-write-region 1 1 file t 'nomesg)) + (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) + (set-buffer nnfolder-current-buffer) + (push (list group nnfolder-current-buffer) + nnfolder-buffer-alist)))))))) (defun nnfolder-save-mail (group-art-list) "Called narrowed to an article." @@ -532,9 +539,10 @@ (goto-char (point-min))) ;; Quote all "From " lines in the article. (forward-line 1) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert "> ")) + (let (case-fold-search) + (while (re-search-forward "^From " nil t) + (beginning-of-line) + (insert "> "))) (setq save-list group-art-list) (nnmail-insert-lines) (nnmail-insert-xref group-art-list) @@ -712,12 +720,17 @@ (while (setq file (pop files)) (when (and (not (backup-file-name-p file)) (message-mail-file-mbox-p - (concat nnfolder-directory file))) - (nnheader-message 5 "Adding group %s..." file) - (push (list file (cons 1 0)) nnfolder-group-alist) - (nnfolder-possibly-change-group file) - (nnfolder-close-group file)) - (message "")))) + (nnheader-concat nnfolder-directory file))) + (let ((oldgroup (assoc file nnfolder-group-alist))) + (if oldgroup + (nnheader-message 5 "Refreshing group %s..." file) + (nnheader-message 5 "Adding group %s..." file)) + (setq nnfolder-group-alist (remove oldgroup nnfolder-group-alist)) + (push (list file (cons 1 0)) nnfolder-group-alist) + (nnfolder-possibly-change-folder file) + (nnfolder-possibly-change-group file) + (nnfolder-close-group file)))) + (message ""))) (defun nnfolder-group-pathname (group) "Make pathname for GROUP." diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nnmail.el --- a/lisp/gnus/nnmail.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nnmail.el Mon Aug 13 09:19:45 2007 +0200 @@ -771,7 +771,7 @@ (setq end (point-max)))) (goto-char end)))) -(defun nnmail-search-unix-mail-delim () +(defsubst nnmail-search-unix-mail-delim () "Put point at the beginning of the next Unix mbox message." ;; Algorithm used to find the the next article in the ;; brain-dead Unix mbox format: @@ -987,7 +987,7 @@ (save-excursion (run-hooks 'nnmail-prepare-incoming-hook)) ;; Handle both babyl, MMDF and unix mail formats, since movemail will ;; use the former when fetching from a mailbox, the latter when - ;; fetches from a file. + ;; fetching from a file. (cond ((or (looking-at "\^L") (looking-at "BABYL OPTIONS:")) (nnmail-process-babyl-mail-format func artnum-func)) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nnmh.el --- a/lisp/gnus/nnmh.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nnmh.el Mon Aug 13 09:19:45 2007 +0200 @@ -291,18 +291,19 @@ (nnmh-possibly-change-directory group server) (nnmail-check-syntax) (nnmail-cache-insert (nnmail-fetch-field "message-id")) - (if (stringp group) - (and - (nnmail-activate 'nnmh) - (car (nnmh-save-mail - (list (cons group (nnmh-active-number group))) - noinsert))) - (and - (nnmail-activate 'nnmh) - (car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number) - noinsert)))) - (when last - (nnmail-cache-close))) + (prog1 + (if (stringp group) + (and + (nnmail-activate 'nnmh) + (car (nnmh-save-mail + (list (cons group (nnmh-active-number group))) + noinsert))) + (and + (nnmail-activate 'nnmh) + (car (nnmh-save-mail (nnmail-article-group 'nnmh-active-number) + noinsert)))) + (when last + (nnmail-cache-close)))) (deffoo nnmh-request-replace-article (article group buffer) (nnmh-possibly-change-directory group) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nnoo.el --- a/lisp/gnus/nnoo.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nnoo.el Mon Aug 13 09:19:45 2007 +0200 @@ -207,7 +207,7 @@ (pop defs)) (nconc bstate (list (cons current state)))))) -(defun nnoo-current-server-p (backend server) +(defsubst nnoo-current-server-p (backend server) (equal (nnoo-current-server backend) server)) (defun nnoo-current-server (backend) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nntp.el --- a/lisp/gnus/nntp.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nntp.el Mon Aug 13 09:19:45 2007 +0200 @@ -172,6 +172,158 @@ +;;; Internal functions. + +(defsubst nntp-send-string (process string) + "Send STRING to PROCESS." + (process-send-string process (concat string nntp-end-of-line))) + +(defsubst nntp-wait-for (process wait-for buffer &optional decode discard) + "Wait for WAIT-FOR to arrive from PROCESS." + (save-excursion + (set-buffer (process-buffer process)) + (goto-char (point-min)) + (while (or (not (memq (following-char) '(?2 ?3 ?4 ?5))) + (looking-at "480")) + (when (looking-at "480") + (erase-buffer) + (funcall nntp-authinfo-function)) + (nntp-accept-process-output process) + (goto-char (point-min))) + (prog1 + (if (looking-at "[45]") + (progn + (nntp-snarf-error-message) + nil) + (goto-char (point-max)) + (let ((limit (point-min))) + (while (not (re-search-backward wait-for limit t)) + ;; We assume that whatever we wait for is less than 1000 + ;; characters long. + (setq limit (max (- (point-max) 1000) (point-min))) + (nntp-accept-process-output process) + (goto-char (point-max)))) + (nntp-decode-text (not decode)) + (unless discard + (save-excursion + (set-buffer buffer) + (goto-char (point-max)) + (insert-buffer-substring (process-buffer process)) + ;; Nix out "nntp reading...." message. + (when nntp-have-messaged + (setq nntp-have-messaged nil) + (message "")) + t))) + (unless discard + (erase-buffer))))) + +(defsubst nntp-find-connection (buffer) + "Find the connection delivering to BUFFER." + (let ((alist nntp-connection-alist) + (buffer (if (stringp buffer) (get-buffer buffer) buffer)) + process entry) + (while (setq entry (pop alist)) + (when (eq buffer (cadr entry)) + (setq process (car entry) + alist nil))) + (when process + (if (memq (process-status process) '(open run)) + process + (when (buffer-name (process-buffer process)) + (kill-buffer (process-buffer process))) + (setq nntp-connection-alist (delq entry nntp-connection-alist)) + nil)))) + +(defsubst nntp-find-connection-entry (buffer) + "Return the entry for the connection to BUFFER." + (assq (nntp-find-connection buffer) nntp-connection-alist)) + +(defun nntp-find-connection-buffer (buffer) + "Return the process connection buffer tied to BUFFER." + (let ((process (nntp-find-connection buffer))) + (when process + (process-buffer process)))) + +(defsubst nntp-retrieve-data (command address port buffer + &optional wait-for callback decode) + "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS." + (let ((process (or (nntp-find-connection buffer) + (nntp-open-connection buffer)))) + (if (not process) + (nnheader-report 'nntp "Couldn't open connection to %s" address) + (unless (or nntp-inhibit-erase nnheader-callback-function) + (save-excursion + (set-buffer (process-buffer process)) + (erase-buffer))) + (when command + (nntp-send-string process command)) + (cond + ((eq callback 'ignore) + t) + ((and callback wait-for) + (save-excursion + (set-buffer (process-buffer process)) + (unless nntp-inside-change-function + (erase-buffer)) + (setq nntp-process-decode decode + nntp-process-to-buffer buffer + nntp-process-wait-for wait-for + nntp-process-callback callback + nntp-process-start-point (point-max) + after-change-functions + (list 'nntp-after-change-function-callback))) + t) + (wait-for + (nntp-wait-for process wait-for buffer decode)) + (t t))))) + +(defsubst nntp-send-command (wait-for &rest strings) + "Send STRINGS to server and wait until WAIT-FOR returns." + (when (and (not nnheader-callback-function) + (not nntp-inhibit-output)) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer))) + (nntp-retrieve-data + (mapconcat 'identity strings " ") + nntp-address nntp-port-number nntp-server-buffer + wait-for nnheader-callback-function)) + +(defun nntp-send-command-nodelete (wait-for &rest strings) + "Send STRINGS to server and wait until WAIT-FOR returns." + (nntp-retrieve-data + (mapconcat 'identity strings " ") + nntp-address nntp-port-number nntp-server-buffer + wait-for nnheader-callback-function)) + +(defun nntp-send-command-and-decode (wait-for &rest strings) + "Send STRINGS to server and wait until WAIT-FOR returns." + (when (and (not nnheader-callback-function) + (not nntp-inhibit-output)) + (save-excursion + (set-buffer nntp-server-buffer) + (erase-buffer))) + (nntp-retrieve-data + (mapconcat 'identity strings " ") + nntp-address nntp-port-number nntp-server-buffer + wait-for nnheader-callback-function t)) + +(defun nntp-send-buffer (wait-for) + "Send the current buffer to server and wait until WAIT-FOR returns." + (when (and (not nnheader-callback-function) + (not nntp-inhibit-output)) + (save-excursion + (set-buffer (nntp-find-connection-buffer nntp-server-buffer)) + (erase-buffer))) + (nntp-encode-text) + (process-send-region (nntp-find-connection nntp-server-buffer) + (point-min) (point-max)) + (nntp-retrieve-data + nil nntp-address nntp-port-number nntp-server-buffer + wait-for nnheader-callback-function)) + + + ;;; Interface functions. (nnoo-define-basics nntp) @@ -561,78 +713,6 @@ ;;; Internal functions. -(defun nntp-send-command (wait-for &rest strings) - "Send STRINGS to server and wait until WAIT-FOR returns." - (when (and (not nnheader-callback-function) - (not nntp-inhibit-output)) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer))) - (nntp-retrieve-data - (mapconcat 'identity strings " ") - nntp-address nntp-port-number nntp-server-buffer - wait-for nnheader-callback-function)) - -(defun nntp-send-command-nodelete (wait-for &rest strings) - "Send STRINGS to server and wait until WAIT-FOR returns." - (nntp-retrieve-data - (mapconcat 'identity strings " ") - nntp-address nntp-port-number nntp-server-buffer - wait-for nnheader-callback-function)) - -(defun nntp-send-command-and-decode (wait-for &rest strings) - "Send STRINGS to server and wait until WAIT-FOR returns." - (when (and (not nnheader-callback-function) - (not nntp-inhibit-output)) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer))) - (nntp-retrieve-data - (mapconcat 'identity strings " ") - nntp-address nntp-port-number nntp-server-buffer - wait-for nnheader-callback-function t)) - -(defun nntp-send-buffer (wait-for) - "Send the current buffer to server and wait until WAIT-FOR returns." - (when (and (not nnheader-callback-function) - (not nntp-inhibit-output)) - (save-excursion - (set-buffer (nntp-find-connection-buffer nntp-server-buffer)) - (erase-buffer))) - (nntp-encode-text) - (process-send-region (nntp-find-connection nntp-server-buffer) - (point-min) (point-max)) - (nntp-retrieve-data - nil nntp-address nntp-port-number nntp-server-buffer - wait-for nnheader-callback-function)) - -(defun nntp-find-connection (buffer) - "Find the connection delivering to BUFFER." - (let ((alist nntp-connection-alist) - (buffer (if (stringp buffer) (get-buffer buffer) buffer)) - process entry) - (while (setq entry (pop alist)) - (when (eq buffer (cadr entry)) - (setq process (car entry) - alist nil))) - (when process - (if (memq (process-status process) '(open run)) - process - (when (buffer-name (process-buffer process)) - (kill-buffer (process-buffer process))) - (setq nntp-connection-alist (delq entry nntp-connection-alist)) - nil)))) - -(defun nntp-find-connection-entry (buffer) - "Return the entry for the connection to BUFFER." - (assq (nntp-find-connection buffer) nntp-connection-alist)) - -(defun nntp-find-connection-buffer (buffer) - "Return the process connection buffer tied to BUFFER." - (let ((process (nntp-find-connection buffer))) - (when process - (process-buffer process)))) - (defun nntp-make-process-buffer (buffer) "Create a new, fresh buffer usable for nntp process connections." (save-excursion @@ -731,82 +811,6 @@ (funcall callback (buffer-name (get-buffer nntp-process-to-buffer)))))))))) -(defun nntp-retrieve-data (command address port buffer - &optional wait-for callback decode) - "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS." - (let ((process (or (nntp-find-connection buffer) - (nntp-open-connection buffer)))) - (if (not process) - (nnheader-report 'nntp "Couldn't open connection to %s" address) - (unless (or nntp-inhibit-erase nnheader-callback-function) - (save-excursion - (set-buffer (process-buffer process)) - (erase-buffer))) - (when command - (nntp-send-string process command)) - (cond - ((eq callback 'ignore) - t) - ((and callback wait-for) - (save-excursion - (set-buffer (process-buffer process)) - (unless nntp-inside-change-function - (erase-buffer)) - (setq nntp-process-decode decode - nntp-process-to-buffer buffer - nntp-process-wait-for wait-for - nntp-process-callback callback - nntp-process-start-point (point-max) - after-change-functions - (list 'nntp-after-change-function-callback))) - t) - (wait-for - (nntp-wait-for process wait-for buffer decode)) - (t t))))) - -(defun nntp-send-string (process string) - "Send STRING to PROCESS." - (process-send-string process (concat string nntp-end-of-line))) - -(defun nntp-wait-for (process wait-for buffer &optional decode discard) - "Wait for WAIT-FOR to arrive from PROCESS." - (save-excursion - (set-buffer (process-buffer process)) - (goto-char (point-min)) - (while (or (not (memq (following-char) '(?2 ?3 ?4 ?5))) - (looking-at "480")) - (when (looking-at "480") - (erase-buffer) - (funcall nntp-authinfo-function)) - (nntp-accept-process-output process) - (goto-char (point-min))) - (prog1 - (if (looking-at "[45]") - (progn - (nntp-snarf-error-message) - nil) - (goto-char (point-max)) - (let ((limit (point-min))) - (while (not (re-search-backward wait-for limit t)) - ;; We assume that whatever we wait for is less than 1000 - ;; characters long. - (setq limit (max (- (point-max) 1000) (point-min))) - (nntp-accept-process-output process) - (goto-char (point-max)))) - (nntp-decode-text (not decode)) - (unless discard - (save-excursion - (set-buffer buffer) - (goto-char (point-max)) - (insert-buffer-substring (process-buffer process)) - ;; Nix out "nntp reading...." message. - (when nntp-have-messaged - (setq nntp-have-messaged nil) - (message "")) - t))) - (unless discard - (erase-buffer))))) - (defun nntp-snarf-error-message () "Save the error message in the current buffer." (let ((message (buffer-string))) diff -r e183fc049578 -r fe104dbd9147 lisp/gnus/nnvirtual.el --- a/lisp/gnus/nnvirtual.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/gnus/nnvirtual.el Mon Aug 13 09:19:45 2007 +0200 @@ -579,7 +579,7 @@ )) -(defun nnvirtual-reverse-map-sequence (group articles) +(defsubst nnvirtual-reverse-map-sequence (group articles) "Return list of virtual article numbers for all ARTICLES in GROUP. The ARTICLES should be sorted, and can be a compressed sequence. If any of the article numbers has no corresponding virtual article, diff -r e183fc049578 -r fe104dbd9147 lisp/hyperbole/hsite-ex.el --- a/lisp/hyperbole/hsite-ex.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/hyperbole/hsite-ex.el Mon Aug 13 09:19:45 2007 +0200 @@ -37,6 +37,9 @@ (message "Initializing Hyperbole, please wait...") +;; The following line must not be deleted. +(require 'hyperbole) + ;;; ************************************************************************ ;;; TIMEZONE SETTING ;;; ************************************************************************ @@ -304,10 +307,9 @@ (let ((nextstep-suffixes '(("\\.\\(adaptor\\|app\\|bshlf\\|clr\\|concur\\|create\\|diagram\\|dp\\|e?ps\\|frame\\|gif\\|locus\\|Mesa\\|nib\\|project\\|rtf\\|sense\\|tiff\\|tree\\)$" . "open"))) (x-suffixes '(("\\.e?ps$" . "ghostview") ("\\.ps\\.g?[zZ]$" . "zcat %s | ghostview -") - ("\\.\\(gif\\|tiff?\\|xbm\\|pm\\|pbm\\|jpe?g\\)" . "xv") + ("\\.\\(gif\\|tiff?\\|xpm\\|xbm\\|pm\\|pbm\\|jpe?g\\)" . "xv") ("\\.xwd$" . "xwud -noclick -in") ("\\.ra?s$" . "snapshot -l") - ("\\.xpm$" . "sxpm") ("\\.\\(fm\\|frame\\|mif\\)$" . "frame.pl -vn -preader -c -f%s") ;; was "msgfm_driver" ("\\.\\(doc\\|boo\\)$" . "ileaf") diff -r e183fc049578 -r fe104dbd9147 lisp/mel/mel-g.el --- a/lisp/mel/mel-g.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mel/mel-g.el Mon Aug 13 09:19:45 2007 +0200 @@ -7,7 +7,7 @@ ;; modified by MORIOKA Tomohiko ;; Maintainer: Shuhei KOBAYASHI ;; Created: 1995/10/25 -;; Version: $Id: mel-g.el,v 1.4 1997/03/08 23:26:22 steve Exp $ +;; Version: $Id: mel-g.el,v 1.5 1997/03/16 03:05:14 steve Exp $ ;; Keywords: Gzip64, base64, gzip, MIME ;; This file is not part of MEL (MIME Encoding Library) yet. @@ -37,14 +37,14 @@ ;;; (defvar gzip64-external-encoder - (let ((file (file-installed-p "mmencode" exec-path))) + (let ((file (exec-installed-p "mmencode"))) (and file (` ("sh" "-c" (, (concat "gzip -c | " file)))) )) "*list of gzip64 encoder program name and its arguments.") (defvar gzip64-external-decoder - (let ((file (file-installed-p "mmencode" exec-path))) + (let ((file (exec-installed-p "mmencode"))) (and file (` ("sh" "-c" (, (concat file " -u | gzip -dc")))) )) diff -r e183fc049578 -r fe104dbd9147 lisp/mel/mel-u.el --- a/lisp/mel/mel-u.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mel/mel-u.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,58 +1,57 @@ -;;; ;;; mel-u.el: uuencode encoder/decoder for GNU Emacs -;;; -;;; Copyright (C) 1995 Free Software Foundation, Inc. -;;; Copyright (C) 1995,1996 MORIOKA Tomohiko -;;; -;;; Author: MORIOKA Tomohiko -;;; Maintainer: MORIOKA Tomohiko -;;; Created: 1995/10/25 -;;; Version: -;;; $Id: mel-u.el,v 1.2 1996/12/28 21:02:57 steve Exp $ -;;; Keywords: uuencode -;;; -;;; This file is part of MEL (MIME Encoding Library). -;;; -;;; 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, 675 Mass Ave, Cambridge, MA 02139, USA. -;;; + +;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Created: 1995/10/25 +;; Version: $Id: mel-u.el,v 1.3 1997/03/16 03:05:15 steve Exp $ +;; Keywords: uuencode + +;; This file is part of MEL (MIME Encoding Library). + +;; 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 GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + ;;; Code: (require 'emu) +(require 'mel) ;;; @ variables ;;; -(defvar mime/tmp-dir (or (getenv "TM_TMP_DIR") "/tmp/")) - (defvar uuencode-external-encoder '("uuencode" "-") "*list of uuencode encoder program name and its arguments.") (defvar uuencode-external-decoder - (list "sh" "-c" (format "(cd %s; uudecode)" mime/tmp-dir)) + (list "sh" "-c" (format "(cd %s; uudecode)" mime-temp-directory)) "*list of uuencode decoder program name and its arguments.") ;;; @ uuencode encoder/decoder for region ;;; -(defun uuencode-external-encode-region (beg end) +(defun uuencode-external-encode-region (start end) + "Encode current region by unofficial uuencode format. +This function uses external uuencode encoder which is specified by +variable `uuencode-external-encoder'." (interactive "*r") (save-excursion (as-binary-process (apply (function call-process-region) - beg end (car uuencode-external-encoder) + start end (car uuencode-external-encoder) t t nil (cdr uuencode-external-encoder)) ) ;; for OS/2 @@ -63,13 +62,16 @@ ) )) -(defun uuencode-external-decode-region (beg end) +(defun uuencode-external-decode-region (start end) + "Decode current region by unofficial uuencode format. +This function uses external uuencode decoder which is specified by +variable `uuencode-external-decoder'." (interactive "*r") (save-excursion (let ((filename (save-excursion (save-restriction - (narrow-to-region beg end) - (goto-char beg) + (narrow-to-region start end) + (goto-char start) (if (re-search-forward "^begin [0-9]+ " nil t) (if (looking-at ".+$") (buffer-substring (match-beginning 0) @@ -78,17 +80,10 @@ (if filename (as-binary-process (apply (function call-process-region) - beg end (car uuencode-external-decoder) + start end (car uuencode-external-decoder) t nil nil (cdr uuencode-external-decoder)) - (setq filename (expand-file-name filename mime/tmp-dir)) - (let ((file-coding-system-for-read *noconv*) ; for Mule - kanji-fileio-code ; for NEmacs - (emx-binary-mode t) ; for OS/2 - jka-compr-compression-info-list ; for jka-compr - jam-zcat-filename-list ; for jam-zcat - require-final-newline) - (insert-file-contents filename) - ) + (setq filename (expand-file-name filename mime-temp-directory)) + (as-binary-input-file (insert-file-contents filename)) (delete-file filename) )) ))) @@ -101,6 +96,9 @@ ;;; (defun uuencode-insert-encoded-file (filename) + "Insert file encoded by unofficial uuencode format. +This function uses external uuencode encoder which is specified by +variable `uuencode-external-encoder'." (interactive (list (read-file-name "Insert encoded file: "))) (call-process (car uuencode-external-encoder) filename t nil (file-name-nondirectory filename)) diff -r e183fc049578 -r fe104dbd9147 lisp/mel/mel.el --- a/lisp/mel/mel.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mel/mel.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,11 +1,11 @@ ;;; mel.el : a MIME encoding/decoding library -;; Copyright (C) 1995,1996 Free Software Foundation, Inc. +;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko ;; modified by Shuhei KOBAYASHI ;; Created: 1995/6/25 -;; Version: $Id: mel.el,v 1.2 1996/12/28 21:02:57 steve Exp $ +;; Version: $Id: mel.el,v 1.3 1997/03/16 03:05:15 steve Exp $ ;; Keywords: MIME, Base64, Quoted-Printable, uuencode, gzip64 ;; This file is part of MEL (MIME Encoding Library). @@ -27,13 +27,26 @@ ;;; Code: +;;; @ variable +;;; + +(defvar mime-temp-directory (or (getenv "MIME_TMP_DIR") + (getenv "TM_TMP_DIR") + "/tmp/") + "*Directory for temporary files.") + + ;;; @ region ;;; -(autoload 'base64-encode-region "mel-b" nil t) -(autoload 'quoted-printable-encode-region "mel-q" nil t) -(autoload 'uuencode-encode-region "mel-u" nil t) -(autoload 'gzip64-encode-region "mel-g" nil t) +(autoload 'base64-encode-region + "mel-b" "Encode current region by base64." t) +(autoload 'quoted-printable-encode-region + "mel-q" "Encode current region by Quoted-Printable." t) +(autoload 'uuencode-encode-region + "mel-u" "Encode current region by unofficial uuencode format." t) +(autoload 'gzip64-encode-region + "mel-g" "Encode current region by unofficial x-gzip64 format." t) (defvar mime-encoding-method-alist '(("base64" . base64-encode-region) @@ -47,13 +60,17 @@ "Alist of encoding vs. corresponding method to encode region. Each element looks like (STRING . FUNCTION) or (STRING . nil). STRING is content-transfer-encoding. -FUNCTION is region encoder and nil means not to encode. [mel.el]") +FUNCTION is region encoder and nil means not to encode.") -(autoload 'base64-decode-region "mel-b" nil t) -(autoload 'quoted-printable-decode-region "mel-q" nil t) -(autoload 'uuencode-decode-region "mel-u" nil t) -(autoload 'gzip64-decode-region "mel-g" nil t) +(autoload 'base64-decode-region + "mel-b" "Decode current region by base64." t) +(autoload 'quoted-printable-decode-region + "mel-q" "Decode current region by Quoted-Printable." t) +(autoload 'uuencode-decode-region + "mel-u" "Decode current region by unofficial uuencode format." t) +(autoload 'gzip64-decode-region + "mel-g" "Decode current region by unofficial x-gzip64 format." t) (defvar mime-decoding-method-alist '(("base64" . base64-decode-region) @@ -65,11 +82,11 @@ "Alist of encoding vs. corresponding method to decode region. Each element looks like (STRING . FUNCTION). STRING is content-transfer-encoding. -FUNCTION is region decoder. [mel.el]") +FUNCTION is region decoder.") -(defun mime-encode-region (beg end encoding) - "Encode region BEG to END of current buffer using ENCODING. [mel.el]" +(defun mime-encode-region (start end encoding) + "Encode region START to END of current buffer using ENCODING." (interactive (list (region-beginning) (region-end) (completing-read "encoding: " @@ -78,11 +95,11 @@ ) (let ((f (cdr (assoc encoding mime-encoding-method-alist)))) (if f - (funcall f beg end) + (funcall f start end) ))) -(defun mime-decode-region (beg end encoding) - "Decode region BEG to END of current buffer using ENCODING. [mel.el]" +(defun mime-decode-region (start end encoding) + "Decode region START to END of current buffer using ENCODING." (interactive (list (region-beginning) (region-end) (completing-read "encoding: " @@ -91,17 +108,21 @@ ) (let ((f (cdr (assoc encoding mime-decoding-method-alist)))) (if f - (funcall f beg end) + (funcall f start end) ))) ;;; @ file ;;; -(autoload 'base64-insert-encoded-file "mel-b" nil t) -(autoload 'quoted-printable-insert-encoded-file "mel-q" nil t) -(autoload 'uuencode-insert-encoded-file "mel-u" nil t) -(autoload 'gzip64-insert-encoded-file "mel-g" nil t) +(autoload 'base64-insert-encoded-file + "mel-b" "Insert file encoded by base64." t) +(autoload 'quoted-printable-insert-encoded-file + "mel-q" "Insert file encoded by quoted-printable." t) +(autoload 'uuencode-insert-encoded-file + "mel-u" "Insert file encoded by unofficial uuencode format." t) +(autoload 'gzip64-insert-encoded-file + "mel-g" "Insert file encoded by unofficial gzip64 format." t) (defvar mime-file-encoding-method-alist '(("base64" . base64-insert-encoded-file) @@ -115,11 +136,10 @@ "Alist of encoding vs. corresponding method to insert encoded file. Each element looks like (STRING . FUNCTION). STRING is content-transfer-encoding. -FUNCTION is function to insert encoded file. [mel.el]") - +FUNCTION is function to insert encoded file.") (defun mime-insert-encoded-file (filename encoding) - "Encode region BEG to END of current buffer using ENCODING. [mel.el]" + "Insert file FILENAME encoded by ENCODING format." (interactive (list (read-file-name "Insert encoded file: ") (completing-read "encoding: " diff -r e183fc049578 -r fe104dbd9147 lisp/modes/cc-mode.el --- a/lisp/modes/cc-mode.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/modes/cc-mode.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,13 +1,13 @@ ;;; cc-mode.el --- major mode for editing C, C++, Objective-C, and Java code -;; Copyright (C) 1985, 87, 92, 93, 94, 95, 96 Free Software Foundation, Inc. - -;; Authors: 1992-1996 Barry A. Warsaw +;; Copyright (C) 1985,87,92,93,94,95,96,97 Free Software Foundation, Inc. + +;; Authors: 1992-1997 Barry A. Warsaw ;; 1987 Dave Detlefs and Stewart Clamen ;; 1985 Richard M. Stallman ;; Created: a long, long, time ago. adapted from the original c-mode.el -;; Version: 4.322 -;; Last Modified: 1996/10/04 20:28:14 +;; Version: 4.379 +;; Last Modified: 1997/03/10 00:59:10 ;; Keywords: c languages oop ;; NOTE: Read the commentary below for the right way to submit bug reports! @@ -32,58 +32,51 @@ ;;; Commentary: -;; This package provides modes in GNU Emacs for editing C, C++, +;; This package provides modes in GNU Emacs for editing C, C++, ;; Objective-C, and Java code. It is intended to be a replacement for -;; c-mode.el (a.k.a. BOCM -- Boring Old C-Mode), and c++-mode.el -;; (a.k.a cplus-md.el and cplus-md1.el), both of which are ancestors -;; of this file. A number of important improvements have been made, -;; briefly: complete K&R C, ANSI C, `ARM' C++, Objective-C, and Java -;; support with consistent indentation across all modes, more +;; c-mode.el (a.k.a. BOCM -- Boring Old C-Mode), c++-mode.el, +;; cplus-md.el, and cplus-md1.el, all of which are in some way +;; ancestors of this file. A number of important improvements have +;; been made, briefly: complete K&R C, ANSI C, `ARM' C++, Objective-C, +;; and Java support with consistent indentation across all modes, more ;; intuitive indentation controlling variables, compatibility across ;; all known Emacsen, nice new features, and tons of bug fixes. This -;; package is called "cc-mode" to distinguish it from its ancestors, -;; but there really is no top-level cc-mode. Usage and programming -;; details are contained in an accompanying texinfo manual. +;; package is called "CC Mode" to distinguish it from its ancestors, +;; but there is no cc-mode command. Usage and programming details are +;; contained in an accompanying texinfo manual. ;; NOTE: This mode does not perform font-locking (a.k.a syntactic -;; coloring, keyword highlighting, etc.). Typically this is done by a -;; package called font-lock.el which I do *not* maintain. You should -;; contact the Emacs maintainer for questions about coloring or -;; highlighting in any language mode. +;; coloring, keyword highlighting, etc.) for any of the supported +;; modes. Typically this is done by a package called font-lock.el +;; which I do *not* maintain. You should contact the Emacs +;; maintainers for questions about coloring or highlighting in any +;; language mode. ;; To submit bug reports, type "C-c C-b". These will be sent to ;; bug-gnu-emacs@prep.ai.mit.edu as well as cc-mode-help@python.org, ;; and I'll read about them there (the former is mirrored as the ;; Usenet newsgroup gnu.emacs.bug). Questions can sent to -;; help-gnu-emacs@prep.ai.mit.edu (mirrored as gnu.emacs.help) or +;; help-gnu-emacs@prep.ai.mit.edu (mirrored as gnu.emacs.help) and/or ;; cc-mode-help@python.org. Please do not send bugs or questions to ;; my personal account. ;; YOU CAN IGNORE ALL BYTE-COMPILER WARNINGS. They are the result of -;; the multi-Emacsen support. Emacs 19 (from the FSF), XEmacs 19 -;; (formerly Lucid Emacs), and GNU Emacs 18 all do things differently -;; and there's no way to shut the byte-compiler up at the necessary -;; granularity. Let me say this again: YOU CAN IGNORE ALL +;; the cross-Emacsen support. GNU Emacs 19 (from the FSF), GNU XEmacs +;; 19 (formerly Lucid Emacs), and GNU Emacs 18 all do things +;; differently and there's no way to shut the byte-compiler up at the +;; necessary granularity. Let me say this again: YOU CAN IGNORE ALL ;; BYTE-COMPILER WARNINGS (you'd be surprised at how many people don't ;; follow this advice :-). -;; If your Emacs is dumped with c-mode.el and/or c++-mode.el, you will -;; need to add the following to your .emacs file before any other -;; reference to c-mode or c++-mode: -;; -;; (fmakunbound 'c-mode) -;; (makunbound 'c-mode-map) -;; (fmakunbound 'c++-mode) -;; (makunbound 'c++-mode-map) -;; (makunbound 'c-style-alist) - -;; If your Emacs comes with cc-mode already (and as of 5-Jul-1996 -;; XEmacs 19.14 and Emacs 19.31 both do), you only need to add the -;; following to use the latest version of cc-mode: -;; -;; (load "cc-mode") -;; -;; Make sure the new version is earlier on your load-path. +;; As of this writing (24-Feb-1997), CC Mode comes with the latest +;; Emacs and XEmacs distributions (19.34 and 19.14 respectively), but +;; is no longer pre-loaded by default. To use the latest version of +;; CC Mode, you need only make sure that this copy of cc-mode.el is +;; found first on your load-path. + +;; If your Emacs is pre-loaded with any version of cc-mode.el, +;; c-mode.el, or c++-mode.el, you will need to consult the +;; cc-mode.texinfo manual for details on upgrading your Emacs. ;; There are four major mode entry points provided by this package, ;; one for editing C++ code, one for editing C code (both K&R and @@ -91,30 +84,11 @@ ;; code. The commands are M-x c-mode, M-x c++-mode, M-x objc-mode, ;; and M-x java-mode. -;; If you are using an old version of Emacs which does not come -;; with cc-mode.el, you will need to do these things -;; to use it: -;; -;; (autoload 'c++-mode "cc-mode" "C++ Editing Mode" t) -;; (autoload 'c-mode "cc-mode" "C Editing Mode" t) -;; (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t) -;; (autoload 'java-mode "cc-mode" "Java Editing Mode" t) -;; (setq auto-mode-alist -;; (append '(("\\.C$" . c++-mode) -;; ("\\.cc$" . c++-mode) -;; ("\\.c$" . c-mode) -;; ("\\.h$" . c-mode) -;; ("\\.m$" . objc-mode) -;; ("\\.java$" . java-mode) -;; ) auto-mode-alist)) -;; -;; You do not need these changes in Emacs versions that come with cc-mode. - ;; Many, many thanks go out to all the folks on the beta test list. ;; Without their patience, testing, insight, code contributions, and -;; encouragement cc-mode.el would be a far inferior package. - -;; You can get the latest version of cc-mode, including PostScript +;; encouragement CC Mode would be a far inferior package. + +;; You can get the latest version of CC Mode, including PostScript ;; documentation and separate individual files from: ;; ;; http://www.python.org/ftp/emacs/ @@ -142,7 +116,7 @@ (defvar c-basic-offset 4 "*Amount of basic offset used by + and - symbols in `c-offsets-alist'.") -(defvar c-offsets-alist +(defconst c-offsets-alist '((string . -1000) (c . c-lineup-C-comments) (defun-open . 0) @@ -152,7 +126,7 @@ (class-close . 0) (inline-open . +) (inline-close . 0) - (ansi-funcdecl-cont . +) + (func-decl-cont . +) (knr-argdecl-intro . +) (knr-argdecl . 0) (topmost-intro . 0) @@ -204,7 +178,7 @@ (SYNTACTIC-SYMBOL . OFFSET) -When a line is indented, cc-mode first determines the syntactic +When a line is indented, CC Mode first determines the syntactic context of the line by generating a list of symbols called syntactic elements. This list can contain more than one syntactic element and the global variable `c-syntactic-context' contains the context list @@ -214,7 +188,7 @@ syntactic symbols may not have a relative indent point associated with them. -After the syntactic context list for a line is generated, cc-mode +After the syntactic context list for a line is generated, CC Mode calculates the absolute indentation for the line by looking at each syntactic element in the list. First, it compares the syntactic element against the SYNTACTIC-SYMBOL's in `c-offsets-alist'. When it @@ -223,8 +197,8 @@ list is the absolute offset for line being indented. If the syntactic element does not match any in the `c-offsets-alist', -an error is generated if `c-strict-syntax-p' is non-nil, otherwise -the element is ignored. +an error is generated if `c-strict-syntax-p' is non-nil, otherwise the +element is ignored. Actually, OFFSET can be an integer, a function, a variable, or one of the following symbols: `+', `-', `++', `--', `*', or `/'. These @@ -245,8 +219,10 @@ class-close -- brace that closes a class definition inline-open -- brace that opens an in-class inline method inline-close -- brace that closes an in-class inline method - ansi-funcdecl-cont -- the nether region between an ANSI function - declaration and the defun opening brace + func-decl-cont -- the nether region between a function + declaration and the defun opening brace. + In C++ and Java, this can include `throws' + declarations knr-argdecl-intro -- first line of a K&R C argument declaration knr-argdecl -- subsequent lines in a K&R C argument declaration topmost-intro -- the first line in a topmost construct definition @@ -299,9 +275,9 @@ If t, hitting TAB always just indents the current line. If nil, hitting TAB indents the current line if point is at the left margin or in the line's indentation, otherwise it insert a `real' tab character -\(see note\). If other than nil or t, then tab is inserted only within -literals -- defined as comments and strings -- and inside preprocessor -directives, but line is always reindented. +\(see note\). If other than nil or t, then tab is inserted only +within literals -- defined as comments and strings -- and inside +preprocessor directives, but line is always reindented. Note: The value of `indent-tabs-mode' will determine whether a real tab character will be inserted, or the equivalent number of space. @@ -333,37 +309,20 @@ according to syntactic analysis via `c-offsets-alist', even when \\[indent-for-comment] is used.") -(defvar c-block-comments-indent-p nil - "*Specifies how to re-indent C style block comments. - -Examples of the supported styles of C block comment indentation are -shown below. When this variable is nil, block comments are indented -as shown in styles 1 through 4. If this variable is non-nil, block -comments are indented as shown in style 5. - -Note that cc-mode does not automatically insert any stars or block -comment delimiters. You must type these in manually. This variable -only controls how the lines within the block comment are indented when -you hit ``\\[c-indent-command]''. - - style 1: style 2 (GNU): style 3: style 4: style 5: - /* /* Blah /* /* /* - blah blah. */ * blah ** blah blah - blah * blah ** blah blah - */ */ */ */") - (defvar c-cleanup-list '(scope-operator) "*List of various C/C++/ObjC constructs to \"clean up\". -These clean ups only take place when the auto-newline feature is turned -on, as evidenced by the `/a' or `/ah' appearing next to the mode name. -Valid symbols are: +These clean ups only take place when the auto-newline feature is +turned on, as evidenced by the `/a' or `/ah' appearing next to the +mode name. Valid symbols are: brace-else-brace -- cleans up `} else {' constructs by placing entire - construct on a single line. This clean up only - takes place when there is nothing but white - space between the braces and the `else'. Clean - up occurs when the open-brace after the `else' - is typed. + construct on a single line. This clean up + only takes place when there is nothing but + white space between the braces and the `else'. + Clean up occurs when the open-brace after the + `else' is typed. + brace-elseif-brace -- similar to brace-else-brace, but cleans up + `} else if {' constructs. empty-defun-braces -- cleans up empty defun braces by placing the braces on the same line. Clean up occurs when the defun closing brace is typed. @@ -440,9 +399,17 @@ then no newline is inserted.") (defvar c-hanging-comment-ender-p t - "*If nil, `c-fill-paragraph' leaves C block comment enders on their own line. -Default value is t, which inhibits leaving block comment ending string -`*/' on a line by itself. This is BOCM's sole behavior.") + "*Controls what \\[fill-paragraph] does to C block comment enders. +When set to nil, C block comment enders are left on their own line. +When set to t, block comment enders will be placed at the end of the +previous line (i.e. they `hang' on that line).") + +(defvar c-hanging-comment-starter-p t + "*Controls what \\[fill-paragraph] does to C block comment starters. +When set to nil, C block comment starters are left on their own line. +When set to t, text that follows a block comment starter will be +placed on the same line as the block comment starter (i.e. the text +`hangs' on that line).") (defvar c-backslash-column 48 "*Column to insert backslashes when macroizing a region.") @@ -460,7 +427,7 @@ (defvar c-progress-interval 5 "*Interval used to update progress status during long re-indentation. If a number, percentage complete gets updated after each interval of -that many seconds. Set to nil to inhibit updating. This is only +that many seconds. Set to nil to inhibit updating. This is only useful for Emacs 19.") (defconst c-style-alist @@ -524,12 +491,11 @@ (c-hanging-braces-alist . ((substatement-open before after))) (c-offsets-alist . ((topmost-intro . 0) (topmost-intro-cont . 0) - (substatement . 3) + (substatement . +) (substatement-open . 0) - (statement-case-intro . 0) (case-label . +) - (access-label . -3) - (inclass . 6) + (access-label . -) + (inclass . ++) (inline-open . 0) )) ) @@ -547,6 +513,18 @@ (statement-cont . +) )) ) + ("python" + (indent-tabs-mode . t) + (c-basic-offset . 8) + (c-offsets-alist . ((substatement-open . 0) + )) + (c-hanging-braces-alist . ((brace-list-open) + (brace-list-intro) + (brace-list-close) + (substatement-open after) + (block-close . c-snug-do-while) + )) + ) ("java" (c-basic-offset . 2) (c-comment-only-line-offset . (0 . 0)) @@ -559,6 +537,7 @@ (arglist-intro . c-lineup-arglist-intro-after-paren) (arglist-close . c-lineup-arglist) (access-label . 0) + (inher-cont . c-lineup-java-inher) )) ) @@ -569,7 +548,7 @@ (STYLE-STRING (VARIABLE . VALUE) [(VARIABLE . VALUE) ...]) where STYLE-STRING is a short descriptive string used to select a -style, VARIABLE is any cc-mode variable, and VALUE is the intended +style, VARIABLE is any CC Mode variable, and VALUE is the intended value for that variable when using the selected style. There is one special case when VARIABLE is `c-offsets-alist'. In this @@ -587,7 +566,7 @@ (defvar c-file-style nil "*Variable interface for setting style via File Local Variables. In a file's Local Variable section, you can set this variable to a -string suitable for `c-set-style'. When the file is visited, cc-mode +string suitable for `c-set-style'. When the file is visited, CC Mode will set the style of the file to this value automatically. Note that file style settings are applied before file offset settings @@ -597,7 +576,7 @@ "*Variable interface for setting offsets via File Local Variables. In a file's Local Variable section, you can set this variable to an association list similar to the values allowed in `c-offsets-alist'. -When the file is visited, cc-mode will institute these offset settings +When the file is visited, CC Mode will institute these offset settings automatically. Note that file offset settings are applied after file style settings @@ -606,11 +585,35 @@ (defvar c-site-default-style "gnu" "Default style for your site. To change the default style at your site, you can set this variable to -any style defined in `c-style-alist'. However, if cc-mode is usually +any style defined in `c-style-alist'. However, if CC Mode is usually loaded into your Emacs at compile time, you will need to set this -variable in the `site-init.el' file before cc-mode is loaded, then +variable in the `site-init.el' file before CC Mode is loaded, then re-dump Emacs.") +(defvar c-style-variables-are-local-p t + "*Whether style variables should be buffer local by default. +If non-nil, then all indentation style related variables will be made +buffer local by default. If nil, they will remain global. Variables +are made buffer local when this file is loaded, and once buffer +localized, they cannot be made global again. + +The list of variables to buffer localize are: + c-offsets-alist + c-basic-offset + c-file-style + c-file-offsets + c-comment-only-line-offset + c-cleanup-list + c-hanging-braces-alist + c-hanging-colons-alist + c-hanging-comment-starter-p + c-hanging-comment-ender-p + c-backslash-column + c-label-minimum-indentation + c-special-indent-hook + c-indentation-style") + + (defvar c-mode-hook nil "*Hook called by `c-mode'.") (defvar c++-mode-hook nil @@ -621,7 +624,7 @@ "*Hook called by `java-mode'.") (defvar c-mode-common-hook nil - "*Hook called by all cc-mode modes for common initializations.") + "*Hook called by all CC Mode modes for common initializations.") (defvar c-mode-menu '(["Comment Out Region" comment-region (mark)] @@ -637,50 +640,51 @@ ["Backward Statement" c-beginning-of-statement t] ["Forward Statement" c-end-of-statement t] ) - "XEmacs 19 menu for C/C++/ObjC/Java modes.") - -;; Sadly we need this for a macro in Emacs 19. -(eval-when-compile - ;; Imenu isn't used in XEmacs, so just ignore load errors. - (condition-case () - (require 'imenu) - (error nil))) - + "Basic XEmacs 19 menu for C/C++/ObjC/Java modes.") + + +;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT + +;; imenu integration (defvar cc-imenu-c++-generic-expression (` ((nil (, (concat - "^" ; beginning of line is required - "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>" - "\\([a-zA-Z0-9_:]+[ \t]+\\)?" ; type specs; there can be no - "\\([a-zA-Z0-9_:]+[ \t]+\\)?" ; more than 3 tokens, right? + "^" ; beginning of line is required + "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>" + "\\([a-zA-Z0-9_:]+[ \t]+\\)?" ; type specs; there can be no + "\\([a-zA-Z0-9_:]+[ \t]+\\)?" ; more than 3 tokens, right? - "\\(" ; last type spec including */& + "\\(" ; last type spec including */& "[a-zA-Z0-9_:]+" - "\\([ \t]*[*&]+[ \t]*\\|[ \t]+\\)" ; either pointer/ref sign or whitespace - "\\)?" ; if there is a last type spec - "\\(" ; name; take that into the imenu entry - "[a-zA-Z0-9_:~]+" ; member function, ctor or dtor... - ; (may not contain * because then - ; "a::operator char*" would become "char*"!) + "\\([ \t]*[*&]+[ \t]*\\|[ \t]+\\)" ; either ptr/ref sign or ws + "\\)?" ; if there is a last type spec + "\\(" ; name, take into the imenu entry + "[a-zA-Z0-9_:~]+" ; member func, ctor or dtor... + ; (may not contain * because then + ; "a::operator char*" would + ; become "char*"!) "\\|" "\\([a-zA-Z0-9_:~]*::\\)?operator" - "[^a-zA-Z1-9_][^(]*" ; ...or operator + "[^a-zA-Z1-9_][^(]*" ; ...or operator " \\)" - "[ \t]*([^)]*)[ \t\n]*[^ ;]" ; require something other than a ; after - ; the (...) to avoid prototypes. Can't - ; catch cases with () inside the parentheses - ; surrounding the parameters - ; (like "int foo(int a=bar()) {...}" + "[ \t]*([^)]*)[ \t\n]*[^ ;]" ; require something other than + ; a `;' after the (...) to + ; avoid prototypes. Can't + ; catch cases with () inside + ; the parentheses surrounding + ; the parameters. e.g.: + ; "int foo(int a=bar()) {...}" )) 6) ("Class" (, (concat - "^" ; beginning of line is required + "^" ; beginning of line is required "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>" "class[ \t]+" - "\\([a-zA-Z0-9_]+\\)" ; this is the string we want to get + "\\([a-zA-Z0-9_]+\\)" ; the string we want to get "[ \t]*[:{]" )) 2))) "Imenu generic expression for C++ mode. See `imenu-generic-expression'.") @@ -689,10 +693,31 @@ cc-imenu-c++-generic-expression "Imenu generic expression for C mode. See `imenu-generic-expression'.") +;(defvar cc-imenu-objc-generic-expression +; ()) +; Please contribute one! + +(defvar cc-imenu-java-generic-expression + (` + ((nil + (, + (concat + "^\\([ \t]\\)*" + "\\([A-Za-z0-9_-]+[ \t]+\\)?" ; type specs; there can be + "\\([A-Za-z0-9_-]+[ \t]+\\)?" ; more than 3 tokens, right? + "\\([A-Za-z0-9_-]+[ \t]*[[]?[]]?\\)" + "\\([ \t]\\)" + "\\([A-Za-z0-9_-]+\\)" ; the string we want to get + "\\([ \t]*\\)+(" + "\\([a-zA-Z,_1-9\n \t]*[[]?[]]?\\)*" ; arguments + ")[ \t]*" + "[^;(]" + "[,a-zA-Z_1-9\n \t]*{" + )) 6))) + "Imenu generic expression for Java mode. See `imenu-generic-expression'.") + + -;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -;; NO USER DEFINABLE VARIABLES BEYOND THIS POINT - ;; Shut the byte-compiler up. Requires Emacs 19 or JWZ's improved ;; byte-compiler. Otherwise, comment this line out and ignore ;; any warnings. @@ -705,7 +730,7 @@ (minor (and (boundp 'emacs-minor-version) emacs-minor-version)) (re-suite 'old-re) - flavor comments) + flavor comments infodock-p) ;; figure out version numbers if not already discovered (and (or (not major) (not minor)) (string-match "\\([0-9]+\\).\\([0-9]+\\)" emacs-version) @@ -724,7 +749,8 @@ ((= major 19) (setq major 'v19 ;Emacs 19 flavor (if (or (string-match "Lucid" emacs-version) (string-match "XEmacs" emacs-version)) - 'XEmacs 'FSF))) + 'XEmacs 'FSF) + infodock-p (boundp 'infodock-version))) ((= major 20) (setq major 'v20 ;XEmacs 20 flavor 'XEmacs)) ;; I don't know @@ -768,8 +794,8 @@ (print (format "The version of Emacs that you are running, %s, has known bugs in its syntax.c parsing routines which will affect the -performance of cc-mode. You should strongly consider upgrading to the -latest available version. cc-mode may continue to work, after a +performance of CC Mode. You should strongly consider upgrading to the +latest available version. CC Mode may continue to work, after a fashion, but strange indentation errors could be encountered." emacs-version)))) ;; Emacs 18, with no patch is not too good @@ -786,9 +812,9 @@ experience performance degradations. Emacs 19 has some new built-in routines which will speed things up for you. -Because of these inherent problems, cc-mode is no longer being +Because of these inherent problems, CC Mode is no longer being actively maintained for Emacs 18, however, until you can upgrade to -Emacs 19, you may want to look at cc-mode-18.el in the cc-mode +Emacs 19, you may want to look at cc-mode-18.el in the CC Mode distribution. THIS FILE IS COMPLETELY UNSUPPORTED! If you use it, you are on your own, although patch contributions will be folded into the main release." @@ -801,11 +827,13 @@ "You are running a syntax patched Emacs 18 variant. While this should work for you, you may want to consider upgrading to Emacs 19. The syntax patches are no longer supported either for syntax.c or -cc-mode.")))) - (list major comments re-suite)) +CC Mode.")))) + (if infodock-p + (list major comments re-suite 'infodock) + (list major comments re-suite))) "A list of features extant in the Emacs you are using. There are many flavors of Emacs out there, each with different -features supporting those needed by cc-mode. Here's the current +features supporting those needed by CC Mode. Here's the current supported list, along with the values for this variable: Emacs 18/Epoch 4: (v18 no-dual-comments RS) @@ -816,7 +844,10 @@ RS is the regular expression suite to use. XEmacs versions after 19.13, and Emacs versions after 19.29 use the `new-re' regex suite. -All other Emacsen use the `old-re' suite.") +All other Emacsen use the `old-re' suite. + +Infodock (based on XEmacs) has an additional symbol on this list: +'infodock") (defvar c++-mode-abbrev-table nil "Abbrev table in use in c++-mode buffers.") @@ -835,8 +866,8 @@ (define-abbrev-table 'java-mode-abbrev-table ()) (defun c-mode-fsf-menu (name map) - ;; Add menu to a keymap. FSF menus suck. Don't add them for - ;; XEmacs. This feature test will fail on other than Emacs 19. + ;; Add menu to a keymap, but don't add them for XEmacs. This + ;; feature test will fail on other than Emacs 19. (condition-case nil (progn (define-key map [menu-bar] (make-sparse-keymap)) @@ -854,6 +885,8 @@ '("Indent Line" . c-indent-command)) (define-key map [menu-bar c fill] '("Fill Comment Paragraph" . c-fill-paragraph)) + (define-key map [menu-bar c separator2] + '("----")) (define-key map [menu-bar c up] '("Up Conditional" . c-up-conditional)) (define-key map [menu-bar c backward] @@ -897,7 +930,7 @@ (define-key c-mode-map "\ea" 'c-beginning-of-statement) (define-key c-mode-map "\ee" 'c-end-of-statement) ;; Emacs 19.30 introduces fill-paragraph-function, but it's not in - ;; every version of Emacs cc-mode supports. + ;; every version of Emacs CC Mode supports. (if (not (boundp 'fill-paragraph-function)) ;; I'd rather use an adaptive fill program instead of this. (define-key c-mode-map "\eq" 'c-fill-paragraph)) @@ -920,19 +953,23 @@ (define-key c-mode-map "\C-c\C-o" 'c-set-offset) (define-key c-mode-map "\C-c\C-s" 'c-show-syntactic-information) (define-key c-mode-map "\C-c\C-t" 'c-toggle-auto-hungry-state) + (define-key c-mode-map "\C-c." 'c-set-style) ;; conflicts with OOBR ;;(define-key c-mode-map "\C-c\C-v" 'c-version) ;; - ;; Emacs 19 defines menus in the mode map. This call will return - ;; t on Emacs 19, otherwise no-op and return nil. - (if (and (not (c-mode-fsf-menu "CC-Mode" c-mode-map)) - ;; in XEmacs 19, we want the menu to popup when the 3rd - ;; button is hit. In Lucid Emacs 19.10 and beyond this is - ;; done automatically if we put the menu on mode-popup-menu - ;; variable, see c-common-init. Emacs 19 uses C-Mouse-3 for - ;; this, and it works with no special effort. - (boundp 'current-menubar) - (not (boundp 'mode-popup-menu))) + (if (and + ;; Infodock has it's own menu + (not (memq 'infodock c-emacs-features)) + ;; Emacs 19 defines menus in the mode map. This call will + ;; return t on Emacs 19, otherwise no-op and return nil. + (not (c-mode-fsf-menu "CC Mode" c-mode-map)) + ;; In XEmacs 19, we want the menu to popup when the 3rd button + ;; is hit. In Lucid Emacs 19.10 and beyond this is done + ;; automatically if we put the menu on mode-popup-menu + ;; variable, see c-common-init. Emacs 19 uses C-Mouse-3 for + ;; this, and it works with no special effort. + (boundp 'current-menubar) + (not (boundp 'mode-popup-menu))) (define-key c-mode-map 'button3 'c-popup-menu))) (defvar c++-mode-map () @@ -1138,7 +1175,12 @@ ;; defconst'd instead of defvar'd to override any old pre-loaded versions (defconst c-recognize-knr-p t "Non-nil means K&R style argument declarations are valid.") - +(defvar c-indentation-style c-site-default-style + "Name of style installed in the current buffer.") + +;; these variables should always be buffer local. they do not affect +;; indentation styles. +;; ;; minor mode variables (make-variable-buffer-local 'c-auto-newline) (make-variable-buffer-local 'c-hungry-delete-key) @@ -1157,10 +1199,10 @@ ;; cmacexp is lame because it uses no preprocessor symbols. ;; It isn't very extensible either -- hardcodes /lib/cpp. ;; [I add it here only because c-mode has it -- BAW] -;(autoload 'c-macro-expand "cmacexp" -; "Display the result of expanding all C macros occurring in the region. -;The expansion is entirely correct because it uses the C preprocessor." -; t) +(autoload 'c-macro-expand "cmacexp" + "Display the result of expanding all C macros occurring in the region. +The expansion is entirely correct because it uses the C preprocessor." + t) ;; constant regular expressions for looking at various constructs @@ -1230,17 +1272,19 @@ ;; since it is considered the end of //-comments. "[ \t\n]*" c-symbol-key) "Regexp describing a Java method intro.") -(defconst c-Java-access-key - (concat c-protection-key) - "Regexp describing access specification keywords for Java.") +(defconst c-Java-access-key nil + "Regexp describing access labels for Java.") (defconst c-Java-class-key (concat + "\\(" c-protection-key "\\s +\\)?" "\\(interface\\|class\\)\\s +" c-symbol-key ;name of the class "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass ;;"\\(\\s *implements *[^{]+{\\)?" ;and maybe the adopted protocols list ) "Regexp describing a class or protocol declaration for Java.") +(defconst c-Java-special-key "\\(implements\\|extends\\|throws\\)[^_]" + "Regexp describing Java inheritance and throws clauses.") (defconst c-Java-conditional-key (concat "\\b\\(" (mapconcat 'identity @@ -1248,6 +1292,9 @@ c-C-conditionals) "\\|") "\\)\\b[^_]") "Regexp describing a conditional control for Java.") +(defconst c-Java-defun-prompt-regexp + "^[ \t]*\\(\\(\\(public\\|protected\\|private\\|const\\|abstract\\|synchronized\\|final\\|static\\|threadsafe\\|transient\\|native\\|volatile\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f]*\\)+\\)?\\s-*" + "Regexp describing the beginning of a Java top-level definition.") ;; KLUDGE ALERT. We default these variables to their `C' values so ;; that non-cc-mode-ized modes that depend on c-mode will still work @@ -1269,7 +1316,7 @@ information already added. You just need to add a description of the problem, including a reproducible test case and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `c-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the hook `c-mode-common-hook' is @@ -1306,7 +1353,7 @@ of the problem, including a reproducible test case, and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `c++-mode-hook' is run with no args, if that variable is bound and has a non-nil value. Also the hook @@ -1345,7 +1392,7 @@ of the problem, including a reproducible test case, and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `objc-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the hook `c-mode-common-hook' @@ -1384,7 +1431,7 @@ of the problem, including a reproducible test case and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `java-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the common hook @@ -1412,7 +1459,10 @@ c-double-slash-is-comments-p t c-baseclass-key nil c-recognize-knr-p nil - c-access-key c-Java-access-key) + c-access-key c-Java-access-key + ;defun-prompt-regexp c-Java-defun-prompt-regexp + imenu-generic-expression cc-imenu-java-generic-expression + ) (c-set-style "java") (run-hooks 'c-mode-common-hook) (run-hooks 'java-mode-hook)) @@ -1425,7 +1475,9 @@ (defun c-common-init () ;; Common initializations for c++-mode and c-mode. - ;; make local variables + ;; + ;; these variables should always be buffer local; they do not affect + ;; indentation style. (make-local-variable 'paragraph-start) (make-local-variable 'paragraph-separate) (make-local-variable 'paragraph-ignore-fill-prefix) @@ -1461,7 +1513,11 @@ outline-level 'c-outline-level comment-column 32 comment-start-skip "/\\*+ *\\|// *" - adaptive-fill-regexp nil) + ;; For all but XEmacs 19.13, the default should be nil + adaptive-fill-regexp (and (memq 'v19 c-emacs-features) + (= emacs-minor-version 13) + "[ \t]*\\([#;>*]+ +\\)?") + ) ;; we have to do something special for c-offsets-alist so that the ;; buffer local value has its own alist structure. (setq c-offsets-alist (copy-alist c-offsets-alist)) @@ -1474,12 +1530,13 @@ (make-local-variable 'comment-indent-hook) (setq comment-indent-hook 'c-comment-indent)) ;; Put C menu into menubar and on popup menu for XEmacs 19. I think - ;; this happens automatically for Emacs 19. - (if (and (boundp 'current-menubar) + ;; this happens automatically for Emacs 19. Skip it for Infodock. + (if (and (not (memq 'infodock c-emacs-features)) + (boundp 'current-menubar) current-menubar (not (assoc mode-name current-menubar))) ;; its possible that this buffer has changed modes from one of - ;; the other cc-mode modes. In that case, only the menubar + ;; the other CC Mode modes. In that case, only the menubar ;; title of the menu changes. (let ((modes (copy-sequence c-list-of-mode-names)) changed-p) @@ -1493,10 +1550,12 @@ (if (not changed-p) (progn (set-buffer-menubar (copy-sequence current-menubar)) - (add-menu nil mode-name c-mode-menu))))) + (if (fboundp 'add-submenu) + (add-submenu nil (c-mode-menu)) + (add-menu nil mode-name c-mode-menu) + ))))) (if (boundp 'mode-popup-menu) - (setq mode-popup-menu - (cons (concat mode-name " Mode Commands") c-mode-menu))) + (setq mode-popup-menu (c-mode-menu))) ;; put auto-hungry designators onto minor-mode-alist, but only once (or (assq 'c-auto-hungry-string minor-mode-alist) (setq minor-mode-alist @@ -1716,7 +1775,9 @@ (if c-hungry-delete-key "/h" nil))) ;; updates the modeline for all Emacsen (if (or (memq 'v19 c-emacs-features) (memq 'v20 c-emacs-features)) - (force-mode-line-update) + (if (boundp 'redraw-modeline) + (redraw-modeline) + (force-mode-line-update)) (set-buffer-modified-p (buffer-modified-p)))) (defun c-calculate-state (arg prevstate) @@ -1966,6 +2027,22 @@ (progn (delete-region mbeg mend) (insert "} else {"))) + ;; clean up brace-elseif-brace + (if (and c-auto-newline + (memq 'brace-elseif-brace c-cleanup-list) + (= last-command-char ?\{) + (re-search-backward "}[ \t\n]*else[ \t\n]+if[ \t\n]*" nil t) + (save-excursion + (goto-char (match-end 0)) + (c-safe (forward-sexp 1)) + (skip-chars-forward " \t\n") + (setq mbeg (match-beginning 0) + mend (match-end 0)) + (= here (1+ (point)))) + (not (c-in-literal))) + (progn + (delete-region mbeg mend) + (insert "} else if "))) (goto-char (- (point-max) pos)) ) ;; does a newline go after the brace? @@ -2221,6 +2298,8 @@ +(defvar c-read-offset-history nil) + (defun c-read-offset (langelem) ;; read new offset value for LANGELEM from minibuffer. return a ;; legal value only @@ -2232,7 +2311,8 @@ (prompt (concat "Offset " defstr)) offset input interned raw) (while (not offset) - (setq input (read-string prompt) + (setq input (completing-read prompt obarray 'fboundp nil nil + 'c-read-offset-history) offset (cond ((string-equal "" input) oldoff) ; default ((string-equal "+" input) '+) ((string-equal "-" input) '-) @@ -2336,16 +2416,23 @@ ))) stylevars)) +(defvar c-set-style-history nil) + ;;;###autoload (defun c-set-style (stylename) - "Set cc-mode variables to use one of several different indentation styles. + "Set CC Mode variables to use one of several different indentation styles. STYLENAME is a string representing the desired style from the list of styles described in the variable `c-style-alist'. See that variable -for details of setting up styles." +for details of setting up styles. + +The variable `c-indentation-style' always contains the buffer's current +style name." (interactive (list (let ((completion-ignore-case t) (prompt (format "Which %s indentation style? " mode-name))) - (completing-read prompt c-style-alist nil t)))) + (completing-read prompt c-style-alist nil t + (cons c-indentation-style 0) + 'c-set-style-history)))) (let ((vars (cdr (or (assoc (downcase stylename) c-style-alist) (assoc (upcase stylename) c-style-alist) (assoc stylename c-style-alist) @@ -2356,6 +2443,7 @@ ;; first reset the style to `cc-mode' to give every style a common ;; base. Then institute the new style. (c-set-style-1 default) + (setq c-indentation-style stylename) (if (not (string= stylename "cc-mode")) (c-set-style-1 vars))) (c-keep-region-active)) @@ -2503,7 +2591,8 @@ ;; to. (paragraph-start (concat paragraph-start re1)) (paragraph-separate (concat paragraph-separate re1)) - (chars-to-delete 0)) + (chars-to-delete 0) + ) (save-restriction ;; Don't fill the comment together with the code ;; following it. So temporarily exclude everything @@ -2515,6 +2604,9 @@ (if comment-start-place (goto-char comment-start-place) (search-backward "/*")) + (if (and (not c-hanging-comment-starter-p) + (looking-at "/\\*[ \t]*$")) + (forward-line 1)) ;; Protect text before the comment ;; start by excluding it. Add ;; spaces to bring back proper @@ -2607,7 +2699,7 @@ (if (and sentence-flag (or (nth 3 state) (nth 4 state) - (looking-at (concat "[ \t]*" comment-start-skip)) +; (looking-at (concat "[ \t]*" comment-start-skip)) (save-excursion (skip-chars-backward " \t") (goto-char (- (point) 2)) @@ -2641,7 +2733,7 @@ (c-keep-region-active)) ;; WARNING: Be *exceptionally* careful about modifications to this -;; function! Much of cc-mode depends on this Doing The Right Thing. +;; function! Much of CC Mode depends on this Doing The Right Thing. ;; If you break it you will be sorry. (defun c-beginning-of-statement-1 (&optional lim) ;; move to the start of the current statement, or the previous @@ -2653,112 +2745,123 @@ ;; between c-crosses-statement-barrier-p and ;; c-beginning-of-statement-1. A better way should be ;; implemented. - maybe-labelp + maybe-labelp saved (last-begin (point))) - (while (not donep) - ;; stop at beginning of buffer - (if (bobp) (setq donep t) - ;; go backwards one balanced expression, but be careful of - ;; unbalanced paren being reached - (if (not (c-safe (progn (backward-sexp 1) t))) - (progn - (if firstp - (backward-up-list 1) - (goto-char last-begin)) - ;; skip over any unary operators, or other special - ;; characters appearing at front of identifier - (save-excursion - (c-backward-syntactic-ws lim) - (skip-chars-backward "-+!*&:.~ \t\n") - (if (= (preceding-char) ?\() - (setq last-begin (point)))) - (goto-char last-begin) - (setq last-begin (point) - donep t))) - - (setq maybe-labelp nil) - ;; see if we're in a literal. if not, then this bufpos may be - ;; a candidate for stopping - (cond - ;; CASE 0: did we hit the error condition above? - (donep) - ;; CASE 1: are we in a literal? - ((eq (c-in-literal lim) 'pound) - (beginning-of-line)) - ;; CASE 2: some other kind of literal? - ((c-in-literal lim)) - ;; CASE 3: are we looking at a conditional keyword? - ((or (looking-at c-conditional-key) - (and (= (following-char) ?\() - (save-excursion - (forward-sexp 1) - (c-forward-syntactic-ws) - (/= (following-char) ?\;)) - (let ((here (point)) - (foundp (progn - (c-backward-syntactic-ws lim) - (forward-word -1) - (and lim - (<= lim (point)) - (not (c-in-literal lim)) - (looking-at c-conditional-key) - )))) - ;; did we find a conditional? - (if (not foundp) - (goto-char here)) - foundp))) - ;; are we in the middle of an else-if clause? - (if (save-excursion - (and (not substmt-p) - (c-safe (progn (forward-sexp -1) t)) - (looking-at "\\[ \t\n]+\\") - (not (c-in-literal lim)))) + ;; first check for bare semicolon + (if (and (progn (c-backward-syntactic-ws lim) + (= (preceding-char) ?\;)) + (c-safe (progn (forward-char -1) + (setq saved (point)) + t)) + (progn (c-backward-syntactic-ws lim) + (memq (preceding-char) '(?\; ?{ ?} ?:))) + ) + (setq last-begin saved) + (goto-char last-begin) + (while (not donep) + ;; stop at beginning of buffer + (if (bobp) (setq donep t) + ;; go backwards one balanced expression, but be careful of + ;; unbalanced paren being reached + (if (not (c-safe (progn (backward-sexp 1) t))) (progn - (forward-sexp -1) - (c-backward-to-start-of-if lim))) - ;; are we sitting at an else clause, that we are not a - ;; substatement of? - (if (and (not substmt-p) - (looking-at "\\[^_]")) - (c-backward-to-start-of-if lim)) - ;; are we sitting at the while of a do-while? - (if (and (looking-at "\\[^_]") - (c-backward-to-start-of-do lim)) - (setq substmt-p nil)) - (setq last-begin (point) - donep substmt-p)) - ;; CASE 4: are we looking at a label? - ((looking-at c-label-key)) - ;; CASE 5: is this the first time we're checking? - (firstp (setq firstp nil - substmt-p (not (c-crosses-statement-barrier-p - (point) last-begin)) - last-begin (point))) - ;; CASE 6: have we crossed a statement barrier? - ((c-crosses-statement-barrier-p (point) last-begin) - (setq donep t)) - ;; CASE 7: ignore labels - ((and maybe-labelp - (or (and c-access-key (looking-at c-access-key)) - ;; with switch labels, we have to go back further - ;; to try to pick up the case or default - ;; keyword. Potential bogosity alert: we assume - ;; `case' or `default' is first thing on line - (let ((here (point))) - (beginning-of-line) - (c-forward-syntactic-ws) - (if (looking-at c-switch-label-key) - t - (goto-char here) - nil)) - (looking-at c-label-key)))) - ;; CASE 8: ObjC or Java method def - ((and c-method-key - (setq last-begin (c-in-method-def-p))) - (setq donep t)) - ;; CASE 9: nothing special - (t (setq last-begin (point))) - ))) + (if firstp + (backward-up-list 1) + (goto-char last-begin)) + ;; skip over any unary operators, or other special + ;; characters appearing at front of identifier + (save-excursion + (c-backward-syntactic-ws lim) + (skip-chars-backward "-+!*&:.~ \t\n") + (if (= (preceding-char) ?\() + (setq last-begin (point)))) + (goto-char last-begin) + (setq last-begin (point) + donep t))) + + (setq maybe-labelp nil) + ;; see if we're in a literal. if not, then this bufpos may be + ;; a candidate for stopping + (cond + ;; CASE 0: did we hit the error condition above? + (donep) + ;; CASE 1: are we in a literal? + ((eq (c-in-literal lim) 'pound) + (beginning-of-line)) + ;; CASE 2: some other kind of literal? + ((c-in-literal lim)) + ;; CASE 3: are we looking at a conditional keyword? + ((or (looking-at c-conditional-key) + (and (= (following-char) ?\() + (save-excursion + (forward-sexp 1) + (c-forward-syntactic-ws) + (/= (following-char) ?\;)) + (let ((here (point)) + (foundp (progn + (c-backward-syntactic-ws lim) + (forward-word -1) + (and lim + (<= lim (point)) + (not (c-in-literal lim)) + (looking-at c-conditional-key) + )))) + ;; did we find a conditional? + (if (not foundp) + (goto-char here)) + foundp))) + ;; are we in the middle of an else-if clause? + (if (save-excursion + (and (not substmt-p) + (c-safe (progn (forward-sexp -1) t)) + (looking-at "\\[ \t\n]+\\") + (not (c-in-literal lim)))) + (progn + (forward-sexp -1) + (c-backward-to-start-of-if lim))) + ;; are we sitting at an else clause, that we are not a + ;; substatement of? + (if (and (not substmt-p) + (looking-at "\\[^_]")) + (c-backward-to-start-of-if lim)) + ;; are we sitting at the while of a do-while? + (if (and (looking-at "\\[^_]") + (c-backward-to-start-of-do lim)) + (setq substmt-p nil)) + (setq last-begin (point) + donep substmt-p)) + ;; CASE 4: are we looking at a label? + ((looking-at c-label-key)) + ;; CASE 5: is this the first time we're checking? + (firstp (setq firstp nil + substmt-p (not (c-crosses-statement-barrier-p + (point) last-begin)) + last-begin (point))) + ;; CASE 6: have we crossed a statement barrier? + ((c-crosses-statement-barrier-p (point) last-begin) + (setq donep t)) + ;; CASE 7: ignore labels + ((and maybe-labelp + (or (and c-access-key (looking-at c-access-key)) + ;; with switch labels, we have to go back further + ;; to try to pick up the case or default + ;; keyword. Potential bogosity alert: we assume + ;; `case' or `default' is first thing on line + (let ((here (point))) + (beginning-of-line) + (c-forward-syntactic-ws) + (if (looking-at c-switch-label-key) + t + (goto-char here) + nil)) + (looking-at c-label-key)))) + ;; CASE 8: ObjC or Java method def + ((and c-method-key + (setq last-begin (c-in-method-def-p))) + (setq donep t)) + ;; CASE 9: nothing special + (t (setq last-begin (point))) + )))) (goto-char last-begin) ;; we always do want to skip over non-whitespace modifier ;; characters that didn't get skipped above @@ -3035,7 +3138,8 @@ (unwind-protect (let ((c-tab-always-indent t) ;; shut up any echo msgs on indiv lines - (c-echo-syntactic-information-p nil)) + (c-echo-syntactic-information-p nil) + fence) (c-progress-init start end 'c-indent-region) (setq endmark (copy-marker end)) (while (and (bolp) @@ -3050,6 +3154,7 @@ (beginning-of-line) ;; indent the current line (c-indent-line) + (setq fence (point)) (if (save-excursion (beginning-of-line) (looking-at "[ \t]*#")) @@ -3075,7 +3180,9 @@ (goto-char sexpend) (setq sexpend (point-marker)) (c-safe (backward-sexp 1)) - (setq sexpbeg (point))))) + (setq sexpbeg (point)))) + (if (and sexpbeg (< sexpbeg fence)) + (setq sexpbeg fence))) ;; check to see if the next line starts a ;; comment-only line (save-excursion @@ -3101,7 +3208,8 @@ (and sexpend (markerp sexpend) (set-marker sexpend nil)) - (forward-line 1))))) + (forward-line 1) + (setq fence (point)))))) (set-marker endmark nil) (c-progress-fini 'c-indent-region) )))) @@ -3817,6 +3925,7 @@ (looking-at c-method-key))) literal containing-sexp char-before-ip char-after-ip lim syntax placeholder c-in-literal-cache inswitch-p + injava-inher ;; narrow out any enclosing class or extern "C" block (inclass-p (c-narrow-out-enclosing-class state indent-point)) (inextern-p (and inclass-p @@ -3880,7 +3989,7 @@ ;; we need to catch multi-paragraph C comments (while (and (zerop (forward-line -1)) (looking-at "^[ \t]*$"))) - (c-add-syntax literal (c-point 'bol))) + (c-add-syntax literal (c-point 'boi))) ;; CASE 3: in a cpp preprocessor ((eq literal 'pound) (c-beginning-of-macro lim) @@ -3935,7 +4044,10 @@ ;; c-b-o-s could have left us at point-min (and (bobp) (c-forward-syntactic-ws indent-point)) - (setq placeholder (point)) + (if (looking-at "typedef[^_]") + (progn (forward-sexp 1) + (c-forward-syntactic-ws indent-point))) + (setq placeholder (c-point 'bol)) (and (or (looking-at "enum[ \t\n]+") (= char-before-ip ?=)) (save-excursion @@ -3971,6 +4083,13 @@ (c-backward-syntactic-ws lim))) (if (= (preceding-char) ?\)) (backward-sexp 1)) + (setq placeholder (point)) + (save-excursion + (and (c-safe (backward-sexp 1) t) + (looking-at "throw[^_]") + (c-safe (backward-sexp 1) t) + (setq placeholder (point)))) + (goto-char placeholder) (c-add-syntax 'member-init-intro (c-point 'boi)) ;; we don't need to add any class offset since this ;; should be relative to the ctor's indentation @@ -3979,17 +4098,22 @@ (c-recognize-knr-p (c-add-syntax 'knr-argdecl-intro (c-point 'boi)) (and inclass-p (c-add-syntax 'inclass (aref inclass-p 0)))) - ;; CASE 5B.3: Nether region after a C++ func decl, which - ;; could include a `throw' declaration. + ;; CASE 5B.3: Nether region after a C++ or Java func + ;; decl, which could include a `throws' declaration. (t (c-beginning-of-statement-1 lim) - (c-add-syntax 'ansi-funcdecl-cont (c-point 'boi)) + (c-add-syntax 'func-decl-cont (c-point 'boi)) ))) ;; CASE 5C: inheritance line. could be first inheritance ;; line, or continuation of a multiple inheritance ((or (and c-baseclass-key (looking-at c-baseclass-key)) (and (or (= char-before-ip ?:) - (= char-after-ip ?:)) + ;; watch out for scope operator + (save-excursion + (and (= char-after-ip ?:) + (c-safe (progn (forward-char 1) t)) + (/= (following-char) ?:) + ))) (save-excursion (c-backward-syntactic-ws lim) (if (= char-before-ip ?:) @@ -3997,7 +4121,25 @@ (forward-char -1) (c-backward-syntactic-ws lim))) (back-to-indentation) - (looking-at c-class-key)))) + (looking-at c-class-key))) + ;; for Java + (and (eq major-mode 'java-mode) + (let ((fence (save-excursion + (c-beginning-of-statement-1 lim) + (point))) + cont done) + (save-excursion + (while (not done) + (cond ((looking-at c-Java-special-key) + (setq injava-inher (cons cont (point)) + done t)) + ((or (not (c-safe (forward-sexp -1) t)) + (<= (point) fence)) + (setq done t)) + ) + (setq cont t))) + injava-inher)) + ) (cond ;; CASE 5C.1: non-hanging colon on an inher intro ((= char-after-ip ?:) @@ -4010,7 +4152,23 @@ ((= char-before-ip ?:) (c-add-syntax 'inher-intro (c-point 'boi)) (and inclass-p (c-add-syntax 'inclass (aref inclass-p 0)))) - ;; CASE 5C.3: a continued inheritance line + ;; CASE 5C.3: in a Java implements/extends + (injava-inher + (let ((where (cdr injava-inher)) + (cont (car injava-inher)) + (here (point))) + (goto-char where) + (cond ((looking-at "throws[^_]") + (c-add-syntax 'func-decl-cont + (progn (c-beginning-of-statement-1 lim) + (c-point 'boi)))) + (cont (c-add-syntax 'inher-cont where)) + (t (c-add-syntax 'inher-intro + (progn (goto-char (cdr injava-inher)) + (c-beginning-of-statement-1 lim) + (point)))) + ))) + ;; CASE 5C.4: a continued inheritance line (t (c-beginning-of-inheritance-list lim) (c-add-syntax 'inher-cont (point)) @@ -4116,6 +4274,7 @@ (point)))) (save-excursion (c-backward-syntactic-ws limit) + (setq placeholder (point)) (while (and (memq (preceding-char) '(?\; ?,)) (> (point) limit)) (beginning-of-line) @@ -4502,7 +4661,8 @@ (c-add-syntax 'statement-cont (c-point 'boi))) ;; CASE 15D: any old statement ((< (point) indent-point) - (let ((safepos (c-most-enclosing-brace fullstate))) + (let ((safepos (c-most-enclosing-brace fullstate)) + relpos done) (goto-char indent-point) (c-beginning-of-statement-1 safepos) ;; It is possible we're on the brace that opens a nested @@ -4512,7 +4672,21 @@ (c-backward-syntactic-ws safepos) (/= (preceding-char) ?\;))) (c-beginning-of-statement-1 safepos)) - (c-add-syntax 'statement (c-point 'boi)) + (if (and inswitch-p + (looking-at c-switch-label-key)) + (progn + (goto-char placeholder) + (end-of-line) + (forward-sexp -1))) + (setq relpos (c-point 'boi)) + (while (and (not done) + (<= safepos (point)) + (/= relpos (point))) + (c-beginning-of-statement-1 safepos) + (if (= relpos (c-point 'boi)) + (setq done t)) + (setq relpos (c-point 'boi))) + (c-add-syntax 'statement relpos) (if (= char-after-ip ?{) (c-add-syntax 'block-open)))) ;; CASE 15E: first statement in an inline, or first @@ -4730,26 +4904,42 @@ (- (current-column) cs-curcol) ))) +(defun c-lineup-java-inher (langelem) + ;; line up Java implements and extends continuations + (save-excursion + (let ((cs-curcol (progn (goto-char (cdr langelem)) + (current-column)))) + (forward-word 1) + (if (looking-at "[ \t]*$") + cs-curcol + (c-forward-syntactic-ws) + (- (current-column) cs-curcol))))) + (defun c-lineup-C-comments (langelem) ;; line up C block comment continuation lines (save-excursion - (let ((stars (progn - (beginning-of-line) - (skip-chars-forward " \t") - (if (looking-at "\\*\\*?") - (- (match-end 0) (match-beginning 0)) - 0))) + (let ((here (point)) + (stars (progn (back-to-indentation) + (skip-chars-forward "*"))) (cs-curcol (progn (goto-char (cdr langelem)) (current-column)))) (back-to-indentation) - (if (re-search-forward "/\\*[ \t]*" (c-point 'eol) t) - (goto-char (+ (match-beginning 0) - (cond - (c-block-comments-indent-p 0) - ((= stars 1) 1) - ((= stars 2) 0) - (t (- (match-end 0) (match-beginning 0))))))) - (- (current-column) cs-curcol)))) + (if (not (re-search-forward "/[*]+" (c-point 'eol) t)) + (progn + (if (not (looking-at "[*]+")) + (progn + ;; we now have to figure out where this comment begins. + (goto-char here) + (back-to-indentation) + (if (re-search-forward "[*]+/" (c-point 'eol) t) + (forward-comment -1) + (goto-char (cdr langelem)) + (back-to-indentation)))) + (- (current-column) cs-curcol)) + (if (zerop stars) + (skip-chars-forward " \t")) + (- (current-column) stars cs-curcol)) + ))) (defun c-lineup-comment (langelem) ;; support old behavior for comment indentation. we look at @@ -4910,7 +5100,7 @@ '(before after))))) (defun c-gnu-impose-minimum () - "Imposes a minimum indentation for labels and case tags. + "Imposes a minimum indentation for lines inside a top-level construct. The variable `c-label-minimum-indentation' specifies the minimum indentation amount." (let ((non-top-levels '(defun-block-intro statement statement-cont @@ -5009,16 +5199,16 @@ ;; defuns for submitting bug reports -(defconst c-version "4.322" - "cc-mode version number.") +(defconst c-version "4.379" + "CC Mode version number.") (defconst c-mode-help-address "bug-gnu-emacs@prep.ai.mit.edu, cc-mode-help@python.org" - "Address for cc-mode bug reports.") + "Address for CC Mode bug reports.") (defun c-version () - "Echo the current version of cc-mode in the minibuffer." + "Echo the current version of CC Mode in the minibuffer." (interactive) - (message "Using cc-mode version %s" c-version) + (message "Using CC Mode version %s" c-version) (c-keep-region-active)) ;; get reporter-submit-bug-report when byte-compiling @@ -5026,18 +5216,18 @@ (require 'reporter)) (defun c-submit-bug-report () - "Submit via mail a bug report on cc-mode." + "Submit via mail a bug report on CC Mode." (interactive) ;; load in reporter (let ((reporter-prompt-for-summary-p t) (reporter-dont-compact-list '(c-offsets-alist))) (and - (if (y-or-n-p "Do you want to submit a report on cc-mode? ") + (if (y-or-n-p "Do you want to submit a report on CC Mode? ") t (message "") nil) (require 'reporter) (reporter-submit-bug-report c-mode-help-address - (concat "cc-mode " c-version " (" + (concat "CC Mode " c-version " (" (cond ((eq major-mode 'c++-mode) "C++") ((eq major-mode 'c-mode) "C") ((eq major-mode 'objc-mode) "ObjC") @@ -5048,7 +5238,6 @@ ;; report only the vars that affect indentation 'c-basic-offset 'c-offsets-alist - 'c-block-comments-indent-p 'c-cleanup-list 'c-comment-only-line-offset 'c-backslash-column @@ -5056,6 +5245,7 @@ 'c-electric-pound-behavior 'c-hanging-braces-alist 'c-hanging-colons-alist + 'c-hanging-comment-starter-p 'c-hanging-comment-ender-p 'c-tab-always-indent 'c-recognize-knr-p @@ -5069,6 +5259,7 @@ (function (lambda () (insert + "Buffer Style: " c-indentation-style "\n\n" (if c-special-indent-hook (concat "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" "c-special-indent-hook is set to '" @@ -5084,52 +5275,47 @@ ;; menus for XEmacs 19 +(defun c-mode-menu () + (cons (concat mode-name " Mode Commands") c-mode-menu)) + (defun c-popup-menu (e) "Pops up the C/C++/ObjC menu." (interactive "@e") - (popup-menu (cons (concat mode-name " Mode Commands") c-mode-menu)) + (popup-menu (c-mode-menu)) (c-keep-region-active)) ;; Emacs/XEmacs Compatibility -;; XEmacs has these, Emacs (even 19.31) does not - -;; Lift XEmacs 19.13's functionp from subr.el -(defun c-functionp (obj) - "Returns t if OBJ is a function, nil otherwise." - (cond - ((symbolp obj) (fboundp obj)) - ((subrp obj)) - ((compiled-function-p obj)) - ((consp obj) - (if (eq (car obj) 'lambda) (listp (car (cdr obj))))) - (t nil))) - -(defun c-copy-tree (tree) +;; XEmacs has these, Emacs does not + +(if (fboundp 'functionp) + (defalias 'c-functionp 'functionp) + ;; Lift XEmacs 19.13's functionp from subr.el + (defun c-functionp (obj) + "Returns t if OBJ is a function, nil otherwise." + (cond + ((symbolp obj) (fboundp obj)) + ((subrp obj)) + ((compiled-function-p obj)) + ((consp obj) + (if (eq (car obj) 'lambda) (listp (car (cdr obj))))) + (t nil)))) + +(if (fboundp 'copy-tree) + (defalias 'c-copy-tree 'copy-tree) ;; Lift XEmacs 19.12's copy-tree - (if (consp tree) - (cons (c-copy-tree (car tree)) - (c-copy-tree (cdr tree))) - (if (vectorp tree) - (let* ((new (copy-sequence tree)) - (i (1- (length new)))) - (while (>= i 0) - (aset new i (c-copy-tree (aref new i))) - (setq i (1- i))) - new) - tree))) - -(defun c-mapcar-defun (var) - (let ((val (symbol-value var))) - (cons var (if (atom val) val - ;; XEmacs 19.12 and Emacs 19 + lucid.el have this - (if (fboundp 'copy-tree) - (copy-tree val) - ;; Emacs 19 and Emacs 18 - (c-copy-tree val) - ))) - )) - + (defun c-copy-tree (tree) + (if (consp tree) + (cons (c-copy-tree (car tree)) + (c-copy-tree (cdr tree))) + (if (vectorp tree) + (let* ((new (copy-sequence tree)) + (i (1- (length new)))) + (while (>= i 0) + (aset new i (c-copy-tree (aref new i))) + (setq i (1- i))) + new) + tree)))) ;; Dynamically append the default value of most variables. This is @@ -5139,47 +5325,57 @@ (or (assoc "cc-mode" c-style-alist) (progn (c-add-style "cc-mode" - (mapcar 'c-mapcar-defun - '(c-backslash-column - c-basic-offset - c-block-comments-indent-p - c-cleanup-list - c-comment-only-line-offset - c-electric-pound-behavior - c-hanging-braces-alist - c-hanging-colons-alist - c-hanging-comment-ender-p - c-offsets-alist - ))) + (mapcar + (function + (lambda (var) + (let ((val (symbol-value var))) + (cons var (if (atom val) val + (c-copy-tree val) + )) + ))) + '(c-backslash-column + c-basic-offset + c-cleanup-list + c-comment-only-line-offset + c-electric-pound-behavior + c-hanging-braces-alist + c-hanging-colons-alist + c-hanging-comment-starter-p + c-hanging-comment-ender-p + c-offsets-alist + ))) ;; the default style is now GNU. This can be overridden in ;; c-mode-common-hook or {c,c++,objc,java}-mode-hook. (c-set-style c-site-default-style))) -;; style variables -(make-variable-buffer-local 'c-offsets-alist) -(make-variable-buffer-local 'c-basic-offset) -(make-variable-buffer-local 'c-file-style) -(make-variable-buffer-local 'c-file-offsets) -(make-variable-buffer-local 'c-comment-only-line-offset) -(make-variable-buffer-local 'c-block-comments-indent-p) -(make-variable-buffer-local 'c-cleanup-list) -(make-variable-buffer-local 'c-hanging-braces-alist) -(make-variable-buffer-local 'c-hanging-colons-alist) -(make-variable-buffer-local 'c-hanging-comment-ender-p) -(make-variable-buffer-local 'c-backslash-column) -(make-variable-buffer-local 'c-label-minimum-indentation) -(make-variable-buffer-local 'c-special-indent-hook) +(if c-style-variables-are-local-p + (progn + ;; style variables + (make-variable-buffer-local 'c-offsets-alist) + (make-variable-buffer-local 'c-basic-offset) + (make-variable-buffer-local 'c-file-style) + (make-variable-buffer-local 'c-file-offsets) + (make-variable-buffer-local 'c-comment-only-line-offset) + (make-variable-buffer-local 'c-cleanup-list) + (make-variable-buffer-local 'c-hanging-braces-alist) + (make-variable-buffer-local 'c-hanging-colons-alist) + (make-variable-buffer-local 'c-hanging-comment-starter-p) + (make-variable-buffer-local 'c-hanging-comment-ender-p) + (make-variable-buffer-local 'c-backslash-column) + (make-variable-buffer-local 'c-label-minimum-indentation) + (make-variable-buffer-local 'c-special-indent-hook) + (make-variable-buffer-local 'c-indentation-style))) ;; fsets for compatibility with BOCM (fset 'electric-c-brace 'c-electric-brace) (fset 'electric-c-semi 'c-electric-semi&comma) (fset 'electric-c-sharp-sign 'c-electric-pound) -;; there is no cc-mode equivalent for electric-c-terminator +;; there is no CC Mode equivalent for electric-c-terminator (fset 'mark-c-function 'c-mark-function) (fset 'indent-c-exp 'c-indent-exp) ;;;###autoload (fset 'set-c-style 'c-set-style) -;; Lucid Emacs 19.9 + font-lock + cc-mode - c++-mode lossage +;; Lucid Emacs 19.9 + font-lock + CC Mode - c++-mode lossage (fset 'c++-beginning-of-defun 'beginning-of-defun) (fset 'c++-end-of-defun 'end-of-defun) @@ -5201,7 +5397,7 @@ (cons 'c++-access-specifier-offset 'c-offsets-alist) (cons 'c++-empty-arglist-indent 'c-offsets-alist) (cons 'c++-comment-only-line-offset 'c-comment-only-line-offset) - (cons 'c++-C-block-comments-indent-p 'c-block-comments-indent-p) + (cons 'c++-C-block-comments-indent-p na) (cons 'c++-cleanup-list 'c-cleanup-list) (cons 'c++-hanging-braces 'c-hanging-braces-alist) (cons 'c++-hanging-member-init-colon 'c-hanging-colons-alist) @@ -5227,6 +5423,7 @@ (cons 'c-continued-brace-offset 'c-offsets-alist) (cons 'c-default-macroize-column 'c-backslash-column) (cons 'c++-default-macroize-column 'c-backslash-column) + (cons 'c-block-comments-indent-p na) ))) (mapcar (function diff -r e183fc049578 -r fe104dbd9147 lisp/modes/cperl-mode.el --- a/lisp/modes/cperl-mode.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/modes/cperl-mode.el Mon Aug 13 09:19:45 2007 +0200 @@ -32,7 +32,7 @@ ;;; Corrections made by Ilya Zakharevich ilya@math.mps.ohio-state.edu ;;; XEmacs changes by Peter Arius arius@informatik.uni-erlangen.de -;; $Id: cperl-mode.el,v 1.3 1997/03/08 23:26:24 steve Exp $ +;; $Id: cperl-mode.el,v 1.4 1997/03/16 03:05:17 steve Exp $ ;;; To use this mode put the following into your .emacs file: @@ -46,6 +46,10 @@ ;;; in your .emacs file. (Emacs rulers do not consider it politically ;;; correct to make whistles enabled by default.) +;;; DO NOT FORGET to read micro-docs. (available from `Perl' menu). <<<<<< +;;; or as help on variables `cperl-tips', `cperl-problems', <<<<<< +;;; `cperl-non-problems'. <<<<<< + ;;; Additional useful commands to put into your .emacs file: ;; (setq auto-mode-alist @@ -328,6 +332,28 @@ ;;; Minor updates to `cperl-short-docs'. ;;; Will not consider <<= as start of here-doc. +;;;; After 1.29 +;;; Added an extra advice to look into Micro-docs. ;-). +;;; Enclosing of region when you press a closing parenth is regulated by +;;; `cperl-electric-parens-string'. +;;; Minor updates to `cperl-short-docs'. +;;; `initialize-new-tags-table' called only if present (Does this help +;;; with generation of tags under XEmacs?). +;;; When creating/updating tag files, new info is written at the old place, +;;; or at the end (is this a wanted behaviour? I need this in perl build directory). + +;;;; After 1.30 +;;; All the keywords from keywords.pl included (maybe with dummy explanation). +;;; No auto-help inside strings, comment, here-docs, formats, and pods. +;;; Shrinkwrapping of info, regulated by `cperl-max-help-size'. +;;; Info on variables as well. +;;; Recognision of HERE-DOCS improved yet more. +;;; Autonewline works on `}' without warnings. +;;; Autohelp works again on $_[0]. + +;;;; After 1.31 +;;; perl-descr.el found its author - hi, Johan! + (defvar cperl-extra-newline-before-brace nil "*Non-nil means that if, elsif, while, until, else, for, foreach and do constructs look like: @@ -385,10 +411,10 @@ Can be overwritten by `cperl-hairy' if nil.") (defvar cperl-electric-lbrace-space nil - "*Non-nil (and non-null) means { after $ in CPerl buffers should be preceded by ` '. + "*Non-nil (and non-null) means { after $ in CPerl buffers should be preceeded by ` '. Can be overwritten by `cperl-hairy' if nil.") -(defvar cperl-electric-parens-string "({[<" +(defvar cperl-electric-parens-string "({[]})<" "*String of parentheses that should be electric in CPerl.") (defvar cperl-electric-parens nil @@ -455,6 +481,12 @@ "*Not-nil means add backreferences to generated `imenu's. May require patched `imenu' and `imenu-go'.") +(defvar cperl-max-help-size 66 + "*Non-nil means shrink-wrapping of info-buffer allowed up to these percents.") + +(defvar cperl-shrink-wrap-info-frame t + "*Non-nil means shrink-wrapping of info-buffer-frame allowed.") + (defvar cperl-info-page "perl" "Name of the info page containing perl docs. Older version of this page was called `perl5', newer `perl'.") @@ -548,6 +580,10 @@ 1 if ( s#//#/# ); will. +By similar reasons + s\"abc\"def\"; +will confuse CPerl a lot. + If you still get wrong indentation in situation that you think the code should be able to parse, try: @@ -1194,10 +1230,10 @@ (if cperl-auto-newline (progn (cperl-indent-line) (newline) t) nil))) (progn - (if cperl-auto-newline - (setq insertpos (point))) (insert last-command-char) (cperl-indent-line) + (if cperl-auto-newline + (setq insertpos (1- (point)))) (if (and cperl-auto-newline (null only-before)) (progn (newline) @@ -1282,6 +1318,9 @@ (interactive "P") (let ((beg (save-excursion (beginning-of-line) (point))) (other-end (if (and cperl-electric-parens-mark + (cperl-val 'cperl-electric-parens) + (memq last-command-char + (append cperl-electric-parens-string nil)) (cperl-mark-active) (< (mark) (point))) (mark) @@ -2137,9 +2176,20 @@ "\\(\\`\n?\\|\n\n\\)=" "\\|" ;; One extra () before this: - "<<\\(\\([\"'`]\\)\\([^\"'`\n]*\\)\\3\\|\\(\\([a-zA-Z_][a-zA-Z_0-9]*\\)?\\)[^=]\\)" ; [^=] to avoid <<=. + "<<" + "\\(" + ;; First variant "BLAH" or just ``. + "\\([\"'`]\\)" + "\\([^\"'`\n]*\\)" + "\\3" + "\\|" + ;; Second variant: Identifier or empty + "\\(\\([a-zA-Z_][a-zA-Z_0-9]*\\)?\\)" + ;; Check that we do not have <<= or << 30 or << $blah. + "\\([^= \t$@%&]\\|[ \t]+[^ \t\n0-9$@%&]\\)" + "\\)" "\\|" - ;; 1+5 extra () before this: + ;; 1+6 extra () before this: "^[ \t]*format[ \t]*\\([a-zA-Z0-9_]+\\)?[ \t]*=[ \t]*$"))) (unwind-protect (progn @@ -2159,7 +2209,7 @@ ;; "\\(\\`\n?\\|\n\n\\)=" (if (looking-at "\n*cut\\>") (progn - (message "=cut is not preceded by a pod section") + (message "=cut is not preceeded by a pod section") (setq err (point))) (beginning-of-line) @@ -2240,12 +2290,12 @@ (t (message "End of here-document `%s' not found." tag))))) ;; format (t - ;; 1+5=6 extra () before this: + ;; 1+6=7 extra () before this: ;; "^[ \t]*format[ \t]*\\([a-zA-Z0-9_]+\\)?[ \t]*=[ \t]*$"))) (setq b (point) - name (if (match-beginning 7) ; 6 + 1 - (buffer-substring (match-beginning 7) ; 6 + 1 - (match-end 7)) ; 6 + 1 + name (if (match-beginning 8) ; 7 + 1 + (buffer-substring (match-beginning 8) ; 7 + 1 + (match-end 8)) ; 7 + 1 "")) (setq argument nil) (if cperl-pod-here-fontify @@ -2290,7 +2340,7 @@ ;;; (while (re-search-forward "\\(\\`\n?\\|\n\n\\)=" max t) ;;; (if (looking-at "\n*cut\\>") ;;; (progn -;;; (message "=cut is not preceded by a pod section") +;;; (message "=cut is not preceeded by a pod section") ;;; (setq err (point))) ;;; (beginning-of-line) @@ -3295,34 +3345,52 @@ (let ((perl-dbg-flags "-wc")) (mode-compile))) -(defun cperl-info-buffer () - ;; Returns buffer with documentation. Creates if missing - (let ((info (get-buffer "*info-perl*"))) +(defun cperl-info-buffer (type) + ;; Returns buffer with documentation. Creates if missing. + ;; If TYPE, this vars buffer. + ;; Special care is taken to not stomp over an existing info buffer + (let* ((bname (if type "*info-perl-var*" "*info-perl*")) + (info (get-buffer bname)) + (oldbuf (get-buffer "*info*"))) (if info info (save-window-excursion ;; Get Info running (require 'info) + (cond (oldbuf + (set-buffer oldbuf) + (rename-buffer "*info-perl-tmp*"))) (save-window-excursion (info)) - (Info-find-node cperl-info-page "perlfunc") + (Info-find-node cperl-info-page (if type "perlvar" "perlfunc")) (set-buffer "*info*") - (rename-buffer "*info-perl*") + (rename-buffer bname) + (cond (oldbuf + (set-buffer "*info-perl-tmp*") + (rename-buffer "*info*") + (set-buffer bname))) + (make-variable-buffer-local 'window-min-height) + (setq window-min-height 2) (current-buffer))))) (defun cperl-word-at-point (&optional p) ;; Returns the word at point or at P. (save-excursion (if p (goto-char p)) - (require 'etags) - (funcall (or (and (boundp 'find-tag-default-function) - find-tag-default-function) - (get major-mode 'find-tag-default-function) - ;; XEmacs 19.12 has `find-tag-default-hook'; it is - ;; automatically used within `find-tag-default': - 'find-tag-default)))) + (or (cperl-word-at-point-hard) + (progn + (require 'etags) + (funcall (or (and (boundp 'find-tag-default-function) + find-tag-default-function) + (get major-mode 'find-tag-default-function) + ;; XEmacs 19.12 has `find-tag-default-hook'; it is + ;; automatically used within `find-tag-default': + 'find-tag-default)))))) (defun cperl-info-on-command (command) - "Shows documentation for Perl command in other window." + "Shows documentation for Perl command in other window. +If perl-info buffer is shown in some frame, uses this frame. +Customized by setting variables `cperl-shrink-wrap-info-frame', +`cperl-max-help-size'." (interactive (let* ((default (cperl-word-at-point)) (read (read-string @@ -3334,21 +3402,72 @@ (let ((buffer (current-buffer)) (cmd-desc (concat "^" (regexp-quote command) "[^a-zA-Z_0-9]")) ; "tr///" - pos) + pos isvar height iniheight frheight buf win fr1 fr2 iniwin not-loner + max-height char-height buf-list) (if (string-match "^-[a-zA-Z]$" command) (setq cmd-desc "^-X[ \t\n]")) - (set-buffer (cperl-info-buffer)) + (setq isvar (string-match "^[$@%]" command) + buf (cperl-info-buffer isvar) + iniwin (selected-window) + fr1 (window-frame iniwin)) + (set-buffer buf) (beginning-of-buffer) - (re-search-forward "^-X[ \t\n]") - (forward-line -1) + (or isvar + (progn (re-search-forward "^-X[ \t\n]") + (forward-line -1))) (if (re-search-forward cmd-desc nil t) (progn - (setq pos (progn (beginning-of-line) - (point))) - (pop-to-buffer (cperl-info-buffer)) + ;; Go back to beginning of the group (ex, for qq) + (if (re-search-backward "^[ \t\n\f]") + (forward-line 1)) + (beginning-of-line) + ;; Get some of + (setq pos (point) + buf-list (list buf "*info-perl-var*" "*info-perl*")) + (while (and (not win) buf-list) + (setq win (get-buffer-window (car buf-list) t)) + (setq buf-list (cdr buf-list))) + (or (not win) + (eq (window-buffer win) buf) + (set-window-buffer win buf)) + (and win (setq fr2 (window-frame win))) + (if (or (not fr2) (eq fr1 fr2)) + (pop-to-buffer buf) + (special-display-popup-frame buf) ; Make it visible + (select-window win)) + (goto-char pos) ; Needed (?!). + ;; Resize + (setq iniheight (window-height) + frheight (frame-height) + not-loner (< iniheight (1- frheight))) ; Are not alone + (cond ((if not-loner cperl-max-help-size + cperl-shrink-wrap-info-frame) + (setq height + (+ 2 + (count-lines + pos + (save-excursion + (if (re-search-forward + "^[ \t][^\n]*\n+\\([^ \t\n\f]\\|\\'\\)" nil t) + (match-beginning 0) (point-max))))) + max-height + (if not-loner + (/ (* (- frheight 3) cperl-max-help-size) 100) + (setq char-height (frame-char-height)) + ;; Non-functioning under OS/2: + (if (eq char-height 1) (setq char-height 18)) + ;; Title, menubar, + 2 for slack + (- (/ (x-display-pixel-height) char-height) 4) + )) + (if (> height max-height) (setq height max-height)) + ;;(message "was %s doing %s" iniheight height) + (if not-loner + (enlarge-window (- height iniheight)) + (set-frame-height (window-frame win) (1+ height))))) (set-window-start (selected-window) pos)) (message "No entry for %s found." command)) - (pop-to-buffer buffer))) + ;;(pop-to-buffer buffer) + (select-window iniwin))) (defun cperl-info-on-current-command () "Shows documentation for Perl command at point in other window." @@ -3373,7 +3492,7 @@ imenu-extract-index-name-function (index-item (save-restriction (save-window-excursion - (set-buffer (cperl-info-buffer)) + (set-buffer (cperl-info-buffer nil)) (setq imenu-create-index-function 'imenu-default-create-index-function imenu-prev-index-position-function @@ -3660,7 +3779,7 @@ ) (t (setq xs (string-match "\\.xs$" file)) - (cond ((eq erase 'ignore) nil) + (cond ((eq erase 'ignore) (goto-char (point-max))) (erase (erase-buffer)) (t (goto-char 1) @@ -3671,12 +3790,13 @@ (progn (forward-char 1) (search-forward "\f\n" nil 'toend) - (point))) - (goto-char 1))))) + (point)))) + (goto-char (point-max))))) (insert (cperl-find-tags file xs)))) (if inbuffer nil ; Delegate to the caller (save-buffer 0) ; No backup - (initialize-new-tags-table))))) + (if (fboundp 'initialize-new-tags-table) ; Do we need something special in XEmacs? + (initialize-new-tags-table)))))) (defvar cperl-tags-hier-regexp-list "^\\(\\(package\\)\\>\\|sub\\>[^\n]+::\\|[a-zA-Z_][a-zA-Z_0-9:]*(\C-?[^\n]+::\\|[ \t]*BOOT:\C-?[^\n]+::\\)") @@ -3971,11 +4091,12 @@ ;;(concat "\\(" (mapconcat 'identity - '("[$@%*&][0-9a-zA-Z_:]+" ; Usual variable + '("[$@%*&][0-9a-zA-Z_:]+\\([ \t]*[[{]\\)?" ; Usual variable "[$@]\\^[a-zA-Z]" ; Special variable "[$@][^ \n\t]" ; Special variable "-[a-zA-Z]" ; File test "\\\\[a-zA-Z0]" ; Special chars + "^=[a-z][a-zA-Z0-9_]*" ; Pod sections "[-!&*+,-./<=>?\\\\^|~]+" ; Operator "[a-zA-Z_0-9:]+" ; symbol or number "x=" @@ -3989,6 +4110,58 @@ "Matches places in the buffer we can find help for.") (defvar cperl-message-on-help-error t) +(defvar cperl-help-from-timer nil) + +(defun cperl-word-at-point-hard () + ;; Does not save-excursion + ;; Get to the something meaningful + (or (eobp) (eolp) (forward-char 1)) + (re-search-backward "[-a-zA-Z0-9_:!&*+,-./<=>?\\\\^|~$%@]" + (save-excursion (beginning-of-line) (point)) + 'to-beg) + ;; (cond + ;; ((or (eobp) (looking-at "[][ \t\n{}();,]")) ; Not at a symbol + ;; (skip-chars-backward " \n\t\r({[]});,") + ;; (or (bobp) (backward-char 1)))) + ;; Try to backtrace + (cond + ((looking-at "[a-zA-Z0-9_:]") ; symbol + (skip-chars-backward "[a-zA-Z0-9_:]") + (cond + ((and (eq (preceding-char) ?^) ; $^I + (eq (char-after (- (point) 2)) ?\$)) + (forward-char -2)) + ((memq (preceding-char) (append "*$@%&\\" nil)) ; *glob + (forward-char -1)) + ((and (eq (preceding-char) ?\=) + (eq (current-column) 1)) + (forward-char -1))) ; =head1 + (if (and (eq (preceding-char) ?\<) + (looking-at "\\$?[a-zA-Z0-9_:]+>")) ; + (forward-char -1))) + ((and (looking-at "=") (eq (preceding-char) ?x)) ; x= + (forward-char -1)) + ((and (looking-at "\\^") (eq (preceding-char) ?\$)) ; $^I + (forward-char -1)) + ((looking-at "[-!&*+,-./<=>?\\\\^|~]") + (skip-chars-backward "[-!&*+,-./<=>?\\\\^|~]") + (cond + ((and (eq (preceding-char) ?\$) + (not (eq (char-after (- (point) 2)) ?\$))) ; $- + (forward-char -1)) + ((and (eq (following-char) ?\>) + (string-match "[a-zA-Z0-9_]" (char-to-string (preceding-char))) + (save-excursion + (forward-sexp -1) + (and (eq (preceding-char) ?\<) + (looking-at "\\$?[a-zA-Z0-9_:]+>")))) ; + (search-backward "<")))) + ((and (eq (following-char) ?\$) + (eq (preceding-char) ?\<) + (looking-at "\\$?[a-zA-Z0-9_:]+>")) ; <$fh> + (forward-char -1))) + (if (looking-at cperl-have-help-regexp) + (buffer-substring (match-beginning 0) (match-end 0)))) (defun cperl-get-help () "Get one-line docs on the symbol at the point. @@ -3996,56 +4169,19 @@ than a line. Your contribution to update/shorten it is appreciated." (interactive) (save-excursion - ;; Get to the something meaningful - (or (eobp) (eolp) (forward-char 1)) - (re-search-backward "[-a-zA-Z0-9_:!&*+,-./<=>?\\\\^|~$%@]" - (save-excursion (beginning-of-line) (point)) - 'to-beg) - ;; (cond - ;; ((or (eobp) (looking-at "[][ \t\n{}();,]")) ; Not at a symbol - ;; (skip-chars-backward " \n\t\r({[]});,") - ;; (or (bobp) (backward-char 1)))) - ;; Try to backtrace - (cond - ((looking-at "[a-zA-Z0-9_:]") ; symbol - (skip-chars-backward "[a-zA-Z0-9_:]") - (cond - ((and (eq (preceding-char) ?^) ; $^I - (eq (char-after (- (point) 2)) ?\$)) - (forward-char -2)) - ((memq (preceding-char) (append "*$@%&\\" nil)) ; *glob - (forward-char -1))) - (if (and (eq (preceding-char) ?\<) - (looking-at "\\$?[a-zA-Z0-9_:]+>")) ; - (forward-char -1))) - ((and (looking-at "=") (eq (preceding-char) ?x)) ; x= - (forward-char -1)) - ((and (looking-at "\\^") (eq (preceding-char) ?\$)) ; $^I - (forward-char -1)) - ((looking-at "[-!&*+,-./<=>?\\\\^|~]") - (skip-chars-backward "[-!&*+,-./<=>?\\\\^|~]") - (cond - ((and (eq (preceding-char) ?\$) - (not (eq (char-after (- (point) 2)) ?\$))) ; $- - (forward-char -1)) - ((and (eq (following-char) ?\>) - (string-match "[a-zA-Z0-9_]" (char-to-string (preceding-char))) - (save-excursion - (forward-sexp -1) - (and (eq (preceding-char) ?\<) - (looking-at "\\$?[a-zA-Z0-9_:]+>")))) ; - (search-backward "<")))) - ((and (eq (following-char) ?\$) - (eq (preceding-char) ?\<) - (looking-at "\\$?[a-zA-Z0-9_:]+>")) ; <$fh> - (forward-char -1))) - ;;(or (eobp) (forward-char 1)) - (if (looking-at cperl-have-help-regexp) - (cperl-describe-perl-symbol - (buffer-substring (match-beginning 0) (match-end 0))) - (if cperl-message-on-help-error - (message "Nothing found for %s..." - (buffer-substring (point) (+ 5 (point)))))))) + (let ((word (cperl-word-at-point-hard))) + (if word + (if (and cperl-help-from-timer ; Bail out if not in mainland + (not (string-match "^#!\\|\\\\\\|^=" word)) ; Show help even in comments/strings. + (or (memq (get-text-property (point) 'face) + '(font-lock-comment-face font-lock-string-face)) + (memq (get-text-property (point) 'syntax-type) + '(pod here-doc format)))) + nil + (cperl-describe-perl-symbol word)) + (if cperl-message-on-help-error + (message "Nothing found for %s..." + (buffer-substring (point) (+ 5 (point))))))))) ;;; Stolen from perl-descr.el by Johan Vromans: @@ -4054,46 +4190,27 @@ (defun cperl-describe-perl-symbol (val) "Display the documentation of symbol at point, a Perl operator." - ;; We suppose that the current position is at the start of the symbol - ;; when we convert $_[5] to @_ - (let (;;(fn (perl-symbol-at-point)) - (enable-recursive-minibuffers t) - ;;val + (let ((enable-recursive-minibuffers t) args-file regexp) - ;; (interactive - ;; (let ((fn (perl-symbol-at-point)) - ;; (enable-recursive-minibuffers t) - ;; val args-file regexp) - ;; (setq val (read-from-minibuffer - ;; (if fn - ;; (format "Symbol (default %s): " fn) - ;; "Symbol: "))) - ;; (if (string= val "") - ;; (setq val fn)) (cond ((string-match "^[&*][a-zA-Z_]" val) (setq val (concat (substring val 0 1) "NAME"))) - ((looking-at "[$@][a-zA-Z_:0-9]+\\([[{]\\)") - (if (= ?\[ (char-after (match-beginning 1))) - (setq val (concat "@" (substring val 1))) - (setq val (concat "%" (substring val 1))))) - ((and (string= val "x") (looking-at "x=")) + ((string-match "^[$@]\\([a-zA-Z_:0-9]+\\)[ \t]*\\[" val) + (setq val (concat "@" (substring val 1 (match-end 1))))) + ((string-match "^[$@]\\([a-zA-Z_:0-9]+\\)[ \t]*{" val) + (setq val (concat "%" (substring val 1 (match-end 1))))) + ((and (string= val "x") (string-match "^x=" val)) (setq val "x=")) ((string-match "^\\$[\C-a-\C-z]" val) (setq val (concat "$^" (char-to-string (+ ?A -1 (aref val 1)))))) - ((and (string= "<" val) (looking-at "<\\$?[a-zA-Z0-9_:]+>")) + ((string-match "^CORE::" val) + (setq val "CORE::")) + ((string-match "^SUPER::" val) + (setq val "SUPER::")) + ((and (string= "<" val) (string-match "^<\\$?[a-zA-Z0-9_:]+>" val)) (setq val ""))) -;;; (if (string-match "^[&*][a-zA-Z_]" val) -;;; (setq val (concat (substring val 0 1) "NAME")) -;;; (if (looking-at "[$@][a-zA-Z_:0-9]+\\([[{]\\)") -;;; (if (= ?\[ (char-after (match-beginning 1))) -;;; (setq val (concat "@" (substring val 1))) -;;; (setq val (concat "%" (substring val 1)))) -;;; (if (and (string= val "x") (looking-at "x=")) -;;; (setq val "x=") -;;; (if (looking-at "[$@][a-zA-Z_:0-9]") -;;; )))) - (setq regexp (concat "^" "\\([^a-zA-Z0-9_:]+[ \t]\\)?" + (setq regexp (concat "^" + "\\([^a-zA-Z0-9_:]+[ \t]+\\)?" (regexp-quote val) "\\([ \t([/]\\|$\\)")) @@ -4114,14 +4231,15 @@ (message "No definition for %s" val))))))) (defvar cperl-short-docs "Ignore my value" + ;; Perl4 version was written by Johan Vromans (jvromans@squirrel.nl) "# based on '@(#)@ perl-descr.el 1.9 - describe-perl-symbol' [Perl 5] -! Logical negation. -!= Numeric inequality. -!~ Search pattern, substitution, or translation (negated). +! ... Logical negation. +... != ... Numeric inequality. +... !~ ... Search pattern, substitution, or translation (negated). $! In numeric context: errno. In a string context: error string. $\" The separator which joins elements of arrays interpolated in strings. $# The output format for printed numbers. Initial value is %.20g. -$$ The process number of the perl running this script. Altered (in the child process) by fork(). +$$ Process number of this script. Changes in the fork()ed child process. $% The current page number of the currently selected output channel. The following variables are always local to the current block: @@ -4147,9 +4265,9 @@ $- The number of lines left on the page. $. The current input line number of the last filehandle that was read. $/ The input record separator, newline by default. -$0 The name of the file containing the perl script being executed. May be set -$: The set of characters after which a string may be broken to fill continuation fields (starting with ^) in a format. -$; The subscript separator for multi-dimensional array emulation. Default is \"\\034\". +$0 Name of the file containing the perl script being executed. May be set. +$: String may be broken after these characters to fill ^-lines in a format. +$; Subscript separator for multi-dim array emulation. Default \"\\034\". $< The real uid of this process. $= The page length of the current output channel. Default is 60 lines. $> The effective uid of this process. @@ -4173,28 +4291,28 @@ $^W True if warnings are requested (perl -w flag). $^X The name under which perl was invoked (argv[0] in C-speech). $_ The default input and pattern-searching space. -$| Flag for auto-flush after write/print on the currently selected output channel. Default is 0. +$| Auto-flush after write/print on the current output channel? Default 0. $~ The name of the current report format. -% Modulo division. -%= Modulo division assignment. +... % ... Modulo division. +... %= ... Modulo division assignment. %ENV Contains the current environment. %INC List of files that have been require-d or do-ne. %SIG Used to set signal handlers for various signals. -& Bitwise and. -&& Logical and. -&&= Logical and assignment. -&= Bitwise and assignment. -* Multiplication. -** Exponentiation. -*NAME Refers to all objects represented by NAME. *NAM1 = *NAM2 makes NAM1 a reference to NAM2. +... & ... Bitwise and. +... && ... Logical and. +... &&= ... Logical and assignment. +... &= ... Bitwise and assignment. +... * ... Multiplication. +... ** ... Exponentiation. +*NAME Glob: all objects refered by NAME. *NAM1 = *NAM2 aliases NAM1 to NAM2. &NAME(arg0, ...) Subroutine call. Arguments go to @_. -+ Addition. -++ Auto-increment (magical on strings). -+= Addition assignment. +... + ... Addition. +EXPR Makes EXPR into scalar context. +++ Auto-increment (magical on strings). ++EXPR EXPR++ +... += ... Addition assignment. , Comma operator. -- Subtraction. --- Auto-decrement. --= Subtraction assignment. +... - ... Subtraction. +-- Auto-decrement (NOT magical on strings). --EXPR EXPR-- +... -= ... Subtraction assignment. -A Access time in days since script started. -B File is a non-text (binary) file. -C Inode change time in days since script started. @@ -4225,54 +4343,54 @@ . Concatenate strings. .. Alternation, also range operator. .= Concatenate assignment strings -/ Division. /PATTERN/ioxsmg Pattern match -/= Division assignment. +... / ... Division. /PATTERN/ioxsmg Pattern match +... /= ... Division assignment. /PATTERN/ioxsmg Pattern match. -< Numeric less than. Glob. See , <> as well. +... < ... Numeric less than. Glob. See , <> as well. Reads line from filehandle NAME. NAME must be bareword/dollar-bareword. Glob. (Unless pattern is bareword/dollar-bareword - see ) <> Reads line from union of files in @ARGV (= command line) and STDIN. -<< Bitwise shift left. << start of HERE-DOCUMENT. -<= Numeric less than or equal to. -<=> Numeric compare. -= Assignment. -== Numeric equality. -=~ Search pattern, substitution, or translation -> Numeric greater than. ->= Numeric greater than or equal to. ->> Bitwise shift right. ->>= Bitwise shift right assignment. -? : Alternation (if-then-else) operator. ?PAT? Backwards pattern match. -?PATTERN? Backwards pattern match. +... << ... Bitwise shift left. << start of HERE-DOCUMENT. +... <= ... Numeric less than or equal to. +... <=> ... Numeric compare. +... = ... Assignment. +... == ... Numeric equality. +... =~ ... Search pattern, substitution, or translation +... > ... Numeric greater than. +... >= ... Numeric greater than or equal to. +... >> ... Bitwise shift right. +... >>= ... Bitwise shift right assignment. +... ? ... : ... Condition=if-then-else operator. ?PAT? One-time pattern match. +?PATTERN? One-time pattern match. @ARGV Command line arguments (not including the command name - see $0). @INC List of places to look for perl scripts during do/include/use. @_ Parameter array for subroutines. Also used by split unless in array context. \\ Creates a reference to whatever follows, like \$var. \\0 Octal char, e.g. \\033. \\E Case modification terminator. See \\Q, \\L, and \\U. -\\L Lowercase until \\E . -\\U Upcase until \\E . -\\Q Quote metacharacters until \\E . +\\L Lowercase until \\E . See also \l, lc. +\\U Upcase until \\E . See also \u, uc. +\\Q Quote metacharacters until \\E . See also quotemeta. \\a Alarm character (octal 007). \\b Backspace character (octal 010). \\c Control character, e.g. \\c[ . \\e Escape character (octal 033). \\f Formfeed character (octal 014). -\\l Lowercase of next character. See also \\L and \\u, +\\l Lowercase the next character. See also \\L and \\u, lcfirst, \\n Newline character (octal 012). \\r Return character (octal 015). \\t Tab character (octal 011). -\\u Upcase of next character. See also \\U and \\l, +\\u Upcase the next character. See also \\U and \\l, ucfirst, \\x Hex character, e.g. \\x1b. -^ Bitwise exclusive or. -__END__ End of program source. -__DATA__ End of program source. +^ ... Bitwise exclusive or. +__END__ Ends program source. +__DATA__ Ends program source. __FILE__ Current (source) filename. __LINE__ Current line in current source. ARGV Default multi-file input filehandle. is a synonym for <>. ARGVOUT Output filehandle with -i flag. -BEGIN { block } Immediately executed (during compilation) piece of code. -END { block } Pseudo-subroutine executed after the script finishes. +BEGIN { ... } Immediately executed (during compilation) piece of code. +END { ... } Pseudo-subroutine executed after the script finishes. DATA Input filehandle for what follows after __END__ or __DATA__. accept(NEWSOCKET,GENERICSOCKET) alarm(SECONDS) @@ -4287,20 +4405,20 @@ chroot(FILENAME) close(FILEHANDLE) closedir(DIRHANDLE) -cmp String compare. +... cmp ... String compare. connect(SOCKET,NAME) continue of { block } continue { block }. Is executed after `next' or at end. cos(EXPR) crypt(PLAINTEXT,SALT) -dbmclose(ASSOC_ARRAY) -dbmopen(ASSOC,DBNAME,MODE) +dbmclose(%HASH) +dbmopen(%HASH,DBNAME,MODE) defined(EXPR) -delete($ASSOC{KEY}) +delete($HASH{KEY}) die(LIST) do { ... }|SUBR while|until EXPR executes at least once do(EXPR|SUBR([LIST])) dump LABEL -each(ASSOC_ARRAY) +each(%HASH) endgrent endhostent endnetent @@ -4308,7 +4426,7 @@ endpwent endservent eof[([FILEHANDLE])] -eq String equality. +... eq ... String equality. eval(EXPR) or eval { BLOCK } exec(LIST) exit(EXPR) @@ -4319,7 +4437,7 @@ for (EXPR;EXPR;EXPR) { ... } foreach [VAR] (@ARRAY) { ... } fork -ge String greater than or equal. +... ge ... String greater than or equal. getc[(FILEHANDLE)] getgrent getgrgid(GID) @@ -4349,17 +4467,17 @@ gmtime(EXPR) goto LABEL grep(EXPR,LIST) -gt String greater than. +... gt ... String greater than. hex(EXPR) if (EXPR) { ... } [ elsif (EXPR) { ... } ... ] [ else { ... } ] or EXPR if EXPR index(STR,SUBSTR[,OFFSET]) int(EXPR) ioctl(FILEHANDLE,FUNCTION,SCALAR) join(EXPR,LIST) -keys(ASSOC_ARRAY) +keys(%HASH) kill(LIST) last [LABEL] -le String less than or equal. +... le ... String less than or equal. length(EXPR) link(OLDFILE,NEWFILE) listen(SOCKET,QUEUESIZE) @@ -4367,7 +4485,7 @@ localtime(EXPR) log(EXPR) lstat(EXPR|FILEHANDLE|VAR) -lt String less than. +... lt ... String less than. m/PATTERN/iogsmx mkdir(FILENAME,MODE) msgctl(ID,CMD,ARG) @@ -4375,14 +4493,14 @@ msgrcv(ID,VAR,SIZE,TYPE.FLAGS) msgsnd(ID,MSG,FLAGS) my VAR or my (VAR1,...) Introduces a lexical variable ($VAR, @ARR, or %HASH). -ne String inequality. +... ne ... String inequality. next [LABEL] oct(EXPR) open(FILEHANDLE[,EXPR]) opendir(DIRHANDLE,EXPR) ord(EXPR) pack(TEMPLATE,LIST) -package Introduces package context. +package NAME Introduces package context. pipe(READHANDLE,WRITEHANDLE) pop(ARRAY) print [FILEHANDLE] [(LIST)] @@ -4441,7 +4559,7 @@ srand(EXPR) stat(EXPR|FILEHANDLE|VAR) study[(SCALAR)] -sub [NAME [(format)]] { BODY } or sub [NAME [(format)]]; +sub [NAME [(format)]] { BODY } sub NAME [(format)]; sub [(format)] {...} substr(EXPR,OFFSET[,LEN]) symlink(OLDFILE,NEWFILE) syscall(LIST) @@ -4460,23 +4578,73 @@ unlink(LIST) unpack(TEMPLATE,EXPR) unshift(ARRAY,LIST) -until (EXPR) { ... } or EXPR until EXPR +until (EXPR) { ... } EXPR until EXPR utime(LIST) -values(ASSOC_ARRAY) +values(%HASH) vec(EXPR,OFFSET,BITS) wait waitpid(PID,FLAGS) wantarray warn(LIST) -while (EXPR) { ... } or EXPR while EXPR +while (EXPR) { ... } EXPR while EXPR write[(EXPR|FILEHANDLE)] -x Repeat string or array. -x= Repetition assignment. +... x ... Repeat string or array. +x= ... Repetition assignment. y/SEARCHLIST/REPLACEMENTLIST/ -| Bitwise or. -|| Logical or. -~ Unary bitwise complement. +... | ... Bitwise or. +... || ... Logical or. +~ ... Unary bitwise complement. #! OS interpreter indicator. If contains `perl', used for options, and -x. +AUTOLOAD {...} Shorthand for `sub AUTOLOAD {...}'. +CORE:: Prefix to access builtin function if imported sub obscures it. +SUPER:: Prefix to lookup for a method in @ISA classes. +DESTROY Shorthand for `sub DESTROY {...}'. +... EQ ... Obsolete synonym of `eq'. +... GE ... Obsolete synonym of `ge'. +... GT ... Obsolete synonym of `gt'. +... LE ... Obsolete synonym of `le'. +... LT ... Obsolete synonym of `lt'. +... NE ... Obsolete synonym of `ne'. +abs [ EXPR ] absolute value +... and ... Low-precedence synonym for &&. +bless REFERENCE [, PACKAGE] Makes reference into an object of a package. +chomp Docs missing +chr Docs missing +else Part of if/unless {BLOCK} elsif {BLOCK} else {BLOCK}. +elsif Part of if/unless {BLOCK} elsif {BLOCK} else {BLOCK}. +exists $HASH{KEY} True if the key exists. +format Docs missing +formline Docs missing +glob EXPR Synonym of . +lc [ EXPR ] Returns lowercased EXPR. +lcfirst [ EXPR ] Returns EXPR with lower-cased first letter. +map Docs missing +no PACKAGE [SYMBOL1, ...] Partial reverse for `use'. Runs `unimport' method. +... not ... Low-precedence synonym for ! - negation. +... or ... Low-precedence synonym for ||. +pos STRING Set/Get end-position of the last match over this string, see \\G. +quotemeta [ EXPR ] Quote metacharacters. +qw Docs missing +readline FH Synonym of . +readpipe CMD Synonym of `CMD`. +ref [ EXPR ] Type of EXPR when dereferenced. +sysopen Docs missing +tie Docs missing +tied Docs missing +uc [ EXPR ] Returns upcased EXPR. +ucfirst [ EXPR ] Returns EXPR with upcased first letter. +untie Docs missing +use PACKAGE [SYMBOL1, ...] Compile-time `require' with consequent `import'. +... xor ... Low-precedence synonym for exclusive or. +prototype \&SUB Returns prototype of the function given a reference. +=head1 Top-level heading. +=head2 Second-level heading. +=head3 Third-level heading (is there such?). +=over [ NUMBER ] Start list. +=item [ TITLE ] Start new item in the list. +=back End list. +=cut Switch from POD to Perl. +=pod Switch from Perl to POD. ") (defun cperl-switch-to-doc-buffer () @@ -4522,11 +4690,7 @@ (defun cperl-get-help-defer () (if (not (eq major-mode 'perl-mode)) nil - (let ((cperl-message-on-help-error nil)) + (let ((cperl-message-on-help-error nil) (cperl-help-from-timer t)) (cperl-get-help) (setq cperl-help-shown t)))) (cperl-lazy-install))) - -(provide 'cperl-mode) - -;;; cperl-mode.el ends here diff -r e183fc049578 -r fe104dbd9147 lisp/modes/pascal.el --- a/lisp/modes/pascal.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/modes/pascal.el Mon Aug 13 09:19:45 2007 +0200 @@ -187,7 +187,7 @@ "*Indentation for case statements.") (defvar pascal-auto-newline nil - "*Non-nil means automatically newline after semicolons and the punctation mark + "*Non-nil means automatically newline after semicolons and the punctuation mark after an end.") (defvar pascal-tab-always-indent t @@ -302,7 +302,7 @@ pascal-case-indent (default 2) Indentation for case statements. pascal-auto-newline (default nil) - Non-nil means automatically newline after semicolons and the punctation mark + Non-nil means automatically newline after semicolons and the punctuation mark after an end. pascal-tab-always-indent (default t) Non-nil means TAB in Pascal mode should always reindent the current line, diff -r e183fc049578 -r fe104dbd9147 lisp/modes/sendmail.el --- a/lisp/modes/sendmail.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/modes/sendmail.el Mon Aug 13 09:19:45 2007 +0200 @@ -286,6 +286,30 @@ ; (setq mail-alias-modtime modtime ; mail-aliases t)))) +;; Courtesy of Per Abrahamsen in an attempt to make +;; Emacs and XEmacs less stupid about default mail addresses. + +;; We trust the administrator if he has set `mail-host-address'. +(defcustom query-user-mail-address (not mail-host-address) + "If non-nil, prompt the user for his mail address." + :group 'message + :type 'boolean) + +(defun user-mail-address () + "Query the user for his mail address, unless it is already known." + (interactive) + (when query-user-mail-address + (setq user-mail-address + (read-string "Your mail address? " (cons user-mail-address 0))) + (setq query-user-mail-address nil) + ;; TODO: Run sanity check from Gnus here. + (when (y-or-n-p "Save address for future sessions? ") + (put 'user-mail-address 'saved-value + (list user-mail-address)) + (put 'query-user-mail-address 'saved-value '(nil)) + (custom-save-all))) + user-mail-address) + (defun mail-setup (to subject in-reply-to cc replybuffer actions) (or mail-default-reply-to (setq mail-default-reply-to (getenv "REPLYTO"))) @@ -823,6 +847,9 @@ (setq mail-do-fcc-cached-timezone (buffer-substring (point-min) (1- (point-max))))))))) +(eval-when-compile + (require 'vm-misc)) + (defun mail-do-fcc-rmail-internal (buffer) (or (eq major-mode 'rmail-mode) (error "this only works in rmail-mode")) (let ((b (point-min)) @@ -842,14 +869,6 @@ (narrow-to-region b e) (rmail-maybe-set-message-counters)))) -;;; Load VM into the compilation environment but not the load environment. -(eval-when-compile - (or (and (boundp 'loading-vm-kludge) loading-vm-kludge) - ;; nastiness to avoid circular provide/require dependency nonsense - (fboundp 'vm-spool-files) - (let ((loading-vm-kludge t)) - (require 'vm)))) - (defun mail-do-fcc-vm-internal (buffer) (or (eq major-mode 'vm-mode) (error "this only works in vm-mode")) (let ((buffer-read-only nil) diff -r e183fc049578 -r fe104dbd9147 lisp/mu/mu-cite.el --- a/lisp/mu/mu-cite.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mu/mu-cite.el Mon Aug 13 09:19:45 2007 +0200 @@ -6,7 +6,7 @@ ;; MINOURA Makoto ;; Shuhei KOBAYASHI ;; Maintainer: Shuhei KOBAYASHI -;; Version: $Revision: 1.4 $ +;; Version: $Revision: 1.5 $ ;; Keywords: mail, news, citation ;; This file is part of MU (Message Utilities). @@ -54,7 +54,7 @@ ;;; (defconst mu-cite/RCS-ID - "$Id: mu-cite.el,v 1.4 1997/02/15 22:21:09 steve Exp $") + "$Id: mu-cite.el,v 1.5 1997/03/16 03:05:20 steve Exp $") (defconst mu-cite/version (get-version-string mu-cite/RCS-ID)) @@ -122,8 +122,7 @@ ;;; @ prefix registration ;;; -(defvar mu-cite/registration-file - (expand-file-name "~/.mu-cite.el") +(defvar mu-cite/registration-file (expand-file-name "~/.mu-cite.el") "*The name of the user environment file for mu-cite.") (defvar mu-cite/allow-null-string-registration nil @@ -132,7 +131,6 @@ (defvar mu-cite/registration-symbol 'mu-cite/citation-name-alist) (defvar mu-cite/citation-name-alist nil) -(load mu-cite/registration-file t t t) (or (eq 'mu-cite/citation-name-alist mu-cite/registration-symbol) (setq mu-cite/citation-name-alist (symbol-value mu-cite/registration-symbol)) @@ -148,31 +146,48 @@ (defun mu-cite/add-citation-name (name from) (setq mu-cite/citation-name-alist (put-alist from name mu-cite/citation-name-alist)) - (mu-cite/save-to-file) + (mu-cite/save-registration-file) ) -;; save to file -(defun mu-cite/save-to-file () - (let* ((filename mu-cite/registration-file) +;; load/save registration file +(defun mu-cite/load-registration-file () + (let* ((file mu-cite/registration-file) + (buffer (get-buffer-create " *mu-register*"))) + (if (file-readable-p file) + (unwind-protect + (save-excursion + (set-buffer buffer) + (erase-buffer) + (insert-file-contents file) + ;; (eval-buffer) + (eval-current-buffer)) + (kill-buffer buffer)) + ))) +(add-hook 'mu-cite-load-hook (function mu-cite/load-registration-file)) + +(defun mu-cite/save-registration-file () + (let* ((file mu-cite/registration-file) (buffer (get-buffer-create " *mu-register*"))) - (save-excursion - (set-buffer buffer) - (setq buffer-file-name filename) - (erase-buffer) - (insert - (format ";;; %s\n" (file-name-nondirectory filename))) - (insert - (format ";;; This file is generated automatically by mu-cite %s.\n\n" - mu-cite/version)) - (insert (format "(setq %s\n '(" mu-cite/registration-symbol)) - (insert (mapconcat - (function prin1-to-string) - mu-cite/citation-name-alist "\n ")) - (insert "\n ))\n\n") - (insert - (format ";;; %s ends here.\n" (file-name-nondirectory filename))) - (save-buffer)) - (kill-buffer buffer))) + (unwind-protect + (save-excursion + (set-buffer buffer) + (setq buffer-file-name file) + (erase-buffer) + (insert ";;; " (file-name-nondirectory file) "\n") + (insert ";;; This file is generated automatically by mu-cite " + mu-cite/version "\n\n") + (insert "(setq " + (symbol-name mu-cite/registration-symbol) + "\n '(") + (insert (mapconcat + (function prin1-to-string) + mu-cite/citation-name-alist "\n ")) + (insert "\n ))\n\n") + (insert ";;; " + (file-name-nondirectory file) + " ends here.\n") + (save-buffer)) + (kill-buffer buffer)))) ;;; @ item methods diff -r e183fc049578 -r fe104dbd9147 lisp/mule/chinese-hooks.el --- a/lisp/mule/chinese-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/chinese-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -174,7 +174,7 @@ (set-coding-category-system 'iso-8-2 'euc-china) (set-coding-priority-list '(iso-8-2 big5 iso-8-designate)) (set-pathname-coding-system 'euc-china) - (set-default-file-coding-system 'euc-china) ; GB encoding + (set-default-buffer-file-coding-system 'euc-china) ; GB encoding (setq terminal-coding-system 'euc-china) (setq keyboard-coding-system 'euc-china) (add-hook 'comint-exec-hook @@ -182,8 +182,8 @@ (let ((proc (get-buffer-process (current-buffer)))) (set-process-input-coding-system proc 'euc-china) (set-process-output-coding-system proc 'euc-china)))) - (set-file-coding-system-for-read 'autodetect) - (set-default-file-coding-system 'euc-china) + (set-buffer-file-coding-system-for-read 'autodetect) + (set-default-buffer-file-coding-system 'euc-china) (setq keyboard-coding-system 'euc-china) (setq terminal-coding-system 'euc-china) (when (eq 'x (device-type (selected-device))) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/cyrillic-hooks.el --- a/lisp/mule/cyrillic-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/cyrillic-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -57,7 +57,7 @@ (lambda () (set-coding-category-system 'iso-8-designate 'iso-8859-5) (set-coding-priority-list '(iso-8-designate iso-8-1)) - (set-default-file-coding-system 'iso-8859-5) + (set-default-buffer-file-coding-system 'iso-8859-5) (setq terminal-coding-system 'iso-8859-5) (setq keyboard-coding-system 'iso-8859-5) ;; (setq-default quail-current-package diff -r e183fc049578 -r fe104dbd9147 lisp/mule/european-hooks.el --- a/lisp/mule/european-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/european-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -82,25 +82,25 @@ mnemonic "MIME/Ltn-5" )) -;(add-hook 'quail-package-alist '("latin-1" "quail/latin")) -;(add-hook 'quail-package-alist '("latin-2" "quail/latin")) -;(add-hook 'quail-package-alist '("latin-3" "quail/latin")) -;(add-hook 'quail-package-alist '("latin-4" "quail/latin")) -;(add-hook 'quail-package-alist '("latin-5" "quail/latin")) +;;(add-hook 'quail-package-alist '("latin-1" "quail/latin")) +;;(add-hook 'quail-package-alist '("latin-2" "quail/latin")) +;;(add-hook 'quail-package-alist '("latin-3" "quail/latin")) +;;(add-hook 'quail-package-alist '("latin-4" "quail/latin")) +;;(add-hook 'quail-package-alist '("latin-5" "quail/latin")) (define-language-environment 'european "European (for Latin-1 through Latin-5)" (lambda () - ;(set-coding-category-system 'iso-8-designate 'iso-8859-1) - ;(set-coding-priority-list '(iso-8-designate iso-8-1)) - (set-default-file-coding-system 'binary) ; iso-8859-1 - ;;(setq locale-coding-system 'binary) ; iso-8859-1 - (setq process-input-coding-system 'binary) ; iso-8859-1 - (setq process-output-coding-system 'binary) ; iso-8859-1 - (set-default-file-coding-system 'binary) ; iso-8859-1 - (set-file-coding-system-for-read 'binary) ; iso-8859-1 - ;(setq display-coding-system 'iso-8859-1) - ;(setq keyboard-coding-system 'iso-8859-1) - ;(setq-default quail-current-package - ; (assoc "latin-1" quail-package-alist)))) + ;;(set-coding-category-system 'iso-8-designate 'iso-8859-1) + ;;(set-coding-priority-list '(iso-8-designate iso-8-1)) + (set-default-buffer-file-coding-system 'no-conversion) ; iso-8859-1 + ;;(setq locale-coding-system 'no-conversion) ; iso-8859-1 + (setq process-input-coding-system 'no-conversion) ; iso-8859-1 + (setq process-output-coding-system 'no-conversion) ; iso-8859-1 + (set-default-buffer-file-coding-system 'no-conversion) ; iso-8859-1 + (set-buffer-file-coding-system-for-read 'no-conversion) ; iso-8859-1 + ;;(setq display-coding-system 'iso-8859-1) + ;;(setq keyboard-coding-system 'iso-8859-1) + ;;(setq-default quail-current-package + ;; (assoc "latin-1" quail-package-alist)))) )) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/greek-hooks.el --- a/lisp/mule/greek-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/greek-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -52,9 +52,9 @@ (lambda () (set-coding-category-system 'iso-8-designate 'iso-8859-7) (set-coding-priority-list '(iso-8-designate iso-8-1)) - (set-default-file-coding-system 'iso-8859-7) + (set-default-buffer-file-coding-system 'iso-8859-7) (setq terminal-coding-system 'iso-8859-7) (setq keyboard-coding-system 'iso-8859-7) -;; (setq-default quail-current-package +;; (setq-default quail-current-package ;; (assoc "greek" quail-package-alist)))) )) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/hebrew-hooks.el --- a/lisp/mule/hebrew-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/hebrew-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -60,9 +60,9 @@ (lambda () (set-coding-category-system 'iso-8-designate 'iso-8859-8) (set-coding-priority-list '(iso-8-designate iso-8-1)) - (set-default-file-coding-system 'iso-8859-8) + (set-default-buffer-file-coding-system 'iso-8859-8) (setq terminal-coding-system 'iso-8859-8) (setq keyboard-coding-system 'iso-8859-8) -;; (setq-default quail-current-package -;; (assoc "hebrew" quail-package-alist)))) +;; (setq-default quail-current-package +;; (assoc "hebrew" quail-package-alist)))) )) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/japanese-hooks.el --- a/lisp/mule/japanese-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/japanese-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -176,21 +176,36 @@ (let ((proc (get-buffer-process (current-buffer)))) (set-process-input-coding-system proc 'euc-japan) (set-process-output-coding-system proc 'euc-japan)))) - (set-file-coding-system-for-read 'autodetect) - (set-default-file-coding-system 'euc-japan) - (setq keyboard-coding-system 'euc-japan) - (setq terminal-coding-system 'euc-japan) + (set-buffer-file-coding-system-for-read 'autodetect) + (set-default-buffer-file-coding-system 'euc-japan) + (setq keyboard-coding-system 'euc-japan) + (setq terminal-coding-system 'euc-japan) (when (eq 'x (device-type (selected-device))) (x-use-halfwidth-roman-font 'japanese-jisx0208 "jisx0201")) (when (eq system-type 'ms-dos) ;; Shift-JIS is the standard coding system under Japanese MS-DOS ;; This isn't really code - just a hint to future implementors - (setq keyboard-coding-system 'shift-jis-dos) - (setq terminal-coding-system 'shift-jis-dos) - (set-default-file-coding-system 'shift-jis-dos) + (setq keyboard-coding-system 'shift-jis-dos) + (setq terminal-coding-system 'shift-jis-dos) + (set-default-buffer-file-coding-system 'shift-jis-dos) ;;(set-default-process-coding-system 'shift-jis-dos 'shift-jis-dos) ) )) (set-coding-category-system 'shift-jis 'shift-jis) + +;; stuff for providing gramatic processing of Japanese text +;; something like this should probably be created for all environments... + +(defvar aletter (concat "\\(" ascii-char "\\|" kanji-char "\\)")) +(defvar kanji-space-insertable (concat + "$B!"(B" aletter "\\|" + "$B!#(B" aletter "\\|" + aletter "$B!J(B" "\\|" + "$B!K(B" aletter "\\|" + ascii-alphanumeric kanji-kanji-char "\\|" + kanji-kanji-char ascii-alphanumeric )) + +(defvar space-insertable (concat " " aletter "\\|" kanji-space-insertable) + "Regexp for finding points that can have spaces inserted into them for justification") diff -r e183fc049578 -r fe104dbd9147 lisp/mule/kinsoku.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/mule/kinsoku.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,281 @@ +;; kinsoku.el -- Kinsoku (line wrap) processing for XEmacs/Mule + +;; Copyright (C) 1997 Free Software Foundation, Inc. +;; This file is part of Mule (MULtilingual Enhancement of XEmacs). +;; This file contains Japanese and Chinese characters. + +;; XEmacs 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. + +;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;; Written by Jareth Hein (jhod@po.iijnet.or.jp) based off of +;; code by S.Tomura, Electrotechnical Lab. (tomura@etl.go.jp) from +;; Mule-2.3 + +;;; Special characters for JIS code +;;; "$B!!!"!#!$!%!&!'!'!(!)!*!+!,!-!.!/(B" +;;; "$B!0!1!2!3!4!5!6!7!8!9!:!;!!?(B" +;;; "$B!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O(B" +;;; "$B!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_(B" +;;; "$B!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o(B" +;;; "$B!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~(B" +;;; "$B"!"""#"$"%"&"'"(")"*"+","-".(B " +;;; "$B&!&"&#&$&%&&&'&(&)&*&+&,&-&.&/(B" +;;; "$B&0&1&2&3&4&5&6&7&8(B" +;;; "$B&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O(B" +;;; "$B&P&Q&R&S&T&U&V&W&X(B" +;;; "$B'!'"'#'$'%'&'''(')'*'+','-'.'/(B" +;;; "$B'0'1'2'3'4'5'6'7'8'9':';'<'='>'?(B" +;;; "$B'@'A(B" +;;; "$B'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_!I(B +;;; "$B'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o(B" +;;; "$B'p'q(B" +;;; $B#0#1#2#3#4#5#6#7#8#9#A#B#C#D#E#F(B +;;; "$B$!$#$%$'$)$C$c$e$g$n(B" +;;; "$B%!%#%%%'%)%C%c%e%g%n%u%v(B" + +;;; Special characters for GB +;;; +;;; $A!!!"!#!$!%!&!'!(!)!*!+!,!-!.!/(B +;;;$A!0!1!2!3!4!5!6!7!8!9!:!;!!?(B +;;;$A!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O(B +;;;$A!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_(B +;;;$A!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o(B +;;;$A!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~(B +;;; $A"1"2"3"4"5"6"7"8"9":";"<"=">"?(B +;;;$A"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O(B +;;;$A"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_(B +;;;$A"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o(B +;;;$A"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~(B +;;; $A#!#"###$#%#&#'#(#)#*#+#,#-#.#/(B +;;;$A#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?(B +;;;$A#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O(B +;;;$A#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_(B +;;;$A#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o(B +;;;$A#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~(B +;;; $A$!$"$#$$$%$&$'$($)$*$+$,$-$.$/(B +;;;$A$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?(B +;;;$A$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O(B +;;;$A$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_(B +;;;$A$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o(B +;;;$A$p$q$r$s$t$u$v$w$x$y$z${$|$}$~(B +;;; $A%!%"%#%$%%%&%'%(%)%*%+%,%-%.%/(B +;;;$A%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?(B +;;;$A%@%A%B%C%D%E%F%G%H%I%J%K%L%M%N%O(B +;;;$A%P%Q%R%S%T%U%V%W%X%Y%Z%[%\%]%^%_(B +;;;$A%`%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o(B +;;;$A%p%q%r%s%t%u%v%w%x%y%z%{%|%}%~(B +;;; $A&!&"&#&$&%&&&'&(&)&*&+&,&-&.&/(B +;;;$A&0&1&2&3&4&5&6&7&8&9&:&;&<&=&>&?(B +;;;$A&@&A&B&C&D&E&F&G&H&I&J&K&L&M&N&O(B +;;;$A&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]&^&_(B +;;;$A&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o(B +;;;$A&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~(B +;;; $A'!'"'#'$'%'&'''(')'*'+','-'.'/(B +;;;$A'0'1'2'3'4'5'6'7'8'9':';'<'='>'?(B +;;;$A'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O(B +;;;$A'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_(B +;;;$A'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o(B +;;;$A'p'q'r's't'u'v'w'x'y'z'{'|'}'~(B +;;; $A(!("(#($(%(&('((()(*(+(,(-(.(/(B +;;;$A(0(1(2(3(4(5(6(7(8(9(:(;(<(=(>(?(B +;;;$A(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(B +;;;$A(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(B +;;;$A(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(B + +;;; Special characters for BIG5 +;;; +;;; $(0!!!"!#!$!%!&!'!(!)!*!+!,!-!.!/(B +;;;$(0!0!1!2!3!4!5!6!7!8!9!:!;!!?(B +;;;$(0!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O(B +;;;$(0!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_(B +;;;$(0!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o(B +;;;$(0!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~(B +;;; $(0"!"""#"$"%"&"'"(")"*"+","-"."/(B +;;;$(0"0"1"2"3"4"5"6"7"8"9":";"<"=">"?(B +;;;$(0"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O(B +;;;$(0"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_(B +;;;$(0"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o(B +;;;$(0"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~(B +;;; $(0#!#"###$#%#&#'#(#)#*#+#,#-#.#/(B +;;;$(0#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?(B +;;;$(0#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O(B +;;;$(0#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_(B +;;;$(0#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o(B +;;;$(0#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~(B +;;; $(0$!$"$#$$$%$&$'$($)$*$+$,$-$.$/(B +;;;$(0$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?(B +;;;$(0$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O(B +;;;$(0$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_(B +;;;$(0$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o(B +;;;$(0$p$q$r$s$t$u$v$w$x$y$z${$|$}$~(B +;;; $(0%!%"%#%$%%%&%'%(%)%*%+%,%-%.%/(B +;;;$(0%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?(B + +(defvar kinsoku-ascii nil "Do kinsoku-processing for ASCII.") +(make-variable-buffer-local 'kinsoku-ascii) +(set-default 'kinsoku-ascii nil) +(defvar kinsoku-jis t "Do kinsoku-processing for JISX0208.") +(make-variable-buffer-local 'kinsoku-jis) +(set-default 'kinsoku-jis t) +(defvar kinsoku-gb t "Do kinsoku-processing for GB2312.") +(make-variable-buffer-local 'kinsoku-gb) +(set-default 'kinsoku-gb t) +(defvar kinsoku-big5 t "Do kinsoku-processing for Big5..") +(make-variable-buffer-local 'kinsoku-big5) +(set-default 'kinsoku-big5 t) + +(defvar kinsoku-ascii-bol "!)-_~}]:;',.?" "BOL kinsoku for ASCII.") +(defvar kinsoku-ascii-eol "({[" "EOL kinsoku for ASCII.") +(defvar kinsoku-jis-bol + (concat "$B!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!(B" + "$B!?!@!A!B!C!D!E!G!I!K!M!O!Q!S!U!W!Y![!k!l!m!n(B" + "$B$!$#$%$'$)$C$c$e$g$n%!%#%%%'%)%C%c%e%g%n%u%v(B") + "BOL kinsoku for JISX0208.") +(defvar kinsoku-jis-eol + "$B!F!H!J!L!N!P!R!T!V!X!Z!k!l!m!n!w!x(B" + "EOL kinsoku for JISX0208.") +(defvar kinsoku-gb-bol + (concat "$A!"!##.#,!$!%!&!'!(!)!*!+!,!-!/!1#)!3!5!7!9!;!=(B" + "$A!?#;#:#?#!!@!A!B!C!c!d!e!f#/#\#"#_#~#|(e(B") + "BOL kinsoku for GB2312.") +(defvar kinsoku-gb-eol + (concat "$A!.!0#"#(!2!4!6!8!:!!c!d!e#@!f!l(B" + "$A(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(h(B") + "EOL kinsoku for GB2312.") +(defvar kinsoku-big5-bol + (concat "$(0!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2(B" + "$(0!3!4!5!6!7!8!9!:!;!!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b(B" + "$(0!d!f!h!j!k!q!p"i"j"k"n"x$u$v$w$x$y$z${(B" + "$(0$|$}$~%!%"%#%$%%%&%'%(%)%*%+%:(B") + "EOL kinsoku for BIG5.") + +(define-category ?s "Kinsoku forbidden start of line characters") +(define-category ?e "Kinsoku forbidden end of line characters") + +;; kinsoku ascii +(loop for char in (string-to-char-list kinsoku-ascii-bol) + do (modify-category-entry char ?s)) +(loop for char in kinsoku-ascii-eol + do (modify-category-entry char ?e)) +;; kinsoku-jis +(loop for char in (string-to-char-list kinsoku-jis-bol) + do (modify-category-entry char ?s)) +(loop for char in (string-to-char-list kinsoku-jis-eol) + do (modify-category-entry char ?e)) +;; kinsoku-gb +(loop for char in kinsoku-gb-bol + do (modify-category-entry char ?s)) +(loop for char in kinsoku-gb-eol + do (modify-category-entry char ?e)) +;; kinsoku-big5 +(loop for char in kinsoku-big5-bol + do (modify-category-entry char ?s)) +(loop for char in kinsoku-big5-eol + do (modify-category-entry char ?e)) + +(defun kinsoku-bol-p () + "Check if point would break forbidden beginning-of-line rules +Uses category \'s\' to check. +point$B$G2~9T$9$k$H9TF,6XB'$K?($l$k$+$I$&$+$r$+$($9!#(B +$B9TF,6XB'J8;z$O(B\'s\'$B$N(Bcategory$B$G;XDj$9$k!#(B" + (let ((ch (following-char))) + (if (or + (and kinsoku-ascii (char-in-category-p ch ?a)) + (and kinsoku-jis (char-in-category-p ch ?j)) + (and kinsoku-gb (char-in-category-p ch ?c)) + (and kinsoku-big5 (char-in-category-p ch ?t))) + (char-in-category-p ch ?s) + nil))) + +(defun kinsoku-eol-p () + "Check if point would break forbidden end-of-line rules +Uses category \'e\' to check. +point$B$G2~9T$9$k$H9TKv6XB'$K?($l$k$+$I$&$+$r$+$($9!#(B +$B9TKv6XB'J8;z$O(B\'s\'$B$N(Bcategory$B$G;XDj$9$k!#(B" + (let ((ch (preceding-char))) + (if (or + (and kinsoku-ascii (char-in-category-p ch ?a)) + (and kinsoku-jis (char-in-category-p ch ?j)) + (and kinsoku-gb (char-in-category-p ch ?c)) + (and kinsoku-big5 (char-in-category-p ch ?t))) + (char-in-category-p ch ?e) + nil))) + +(defvar kinsoku-extend-limit nil + "Defines how many characters kinsoku will search forward before giving up. +A value of nil equates to infinity. +$B6XB'=hM}$G9T$r?-$P$7$FNI$$H>3QJ8;z?t$r;XDj$9$k!#(B +$BHsIi@0?t0J30$N>l9g$OL58BBg$r0UL#$9$k!#(B") + +(defun kinsoku-process () + "Move to a point that will not break forbidden line break rules. +$B6XB'$K?($l$J$$E@$X0\F0$9$k!#(B +point$B$,9TF,6XB'$K?($l$k>l9g$O9T$r?-$P$7$F!"6XB'$K?($l$J$$E@$rC5$9!#(B +point$B$,9TKv6XB'$K?($l$k>l9g$O9T$r=L$a$F!"6XB'$K?($l$J$$E@$rC5$9!#(B +$B$?$@$7!"9T?-$P$7H>3QJ8;z?t$,(Bkinsoku-extend-limit$B$r1[$($k$H!"(B +$B9T$r=L$a$F6XB'$K?($l$J$$E@$rC5$9!#(B" + (let ((bol-kin nil) (eol-kin nil)) + (if (and (not (bolp)) + (not (eolp)) + (or (setq bol-kin (kinsoku-bol-p)) + (setq eol-kin (kinsoku-eol-p)))) + (cond(bol-kin (kinsoku-process-extend)) + (eol-kin (kinsoku-process-shrink)))))) + +(defun kinsoku-process-extend () + "Move point forward to a permissable for line-breaking. +$B9T$r?-$P$7$F6XB'$K?($l$J$$E@$X0\F0$9$k!#(B" + (let ((max-column (+ fill-column + (if (and (numberp kinsoku-extend-limit) + (>= kinsoku-extend-limit 0)) + kinsoku-extend-limit + 10000))) ;;; 10000 is deliberatly unreasonably large + ch1 ch2) + (while (and (<= (+ (current-column) + (char-width (setq ch1 (following-char)))) + max-column) + (not (bolp)) + (not (eolp)) + (or (kinsoku-eol-p) + (kinsoku-bol-p) + ;;; don't break in the middle of an English word + (and (char-in-category-p ch1 ?a) + (char-in-category-p (setq ch2 (preceding-char)) ?a) + (= ?w (char-syntax ch2)) + (= ?w (char-syntax ch1))))) + (forward-char)) + (if (or (kinsoku-eol-p) (kinsoku-bol-p)) + (kinsoku-process-shrink)))) + +(defun kinsoku-process-shrink () + "Move point backward to a point permissable for line-breaking. +$B9T$r=L$a$F6XB'$K?($l$J$$E@$X0\F0$9$k!#(B" + (let (ch1 ch2) + (while (and (not (bolp)) + (not (eolp)) + (or (kinsoku-bol-p) + (kinsoku-eol-p) + ;;; don't break in the middle of an English word + (and + (char-in-category-p (setq ch1 (following-char)) ?a) + (char-in-category-p (setq ch2 (preceding-char)) ?a) + (= ?w (char-syntax ch2)) + (= ?w (char-syntax ch1))))) + (backward-char)))) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/korean-hooks.el --- a/lisp/mule/korean-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/korean-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -94,10 +94,10 @@ (let ((proc (get-buffer-process (current-buffer)))) (set-process-input-coding-system proc 'euc-korea) (set-process-output-coding-system proc 'euc-korea)))) - (set-file-coding-system-for-read 'autodetect) - (set-default-file-coding-system 'euc-korea) - (setq keyboard-coding-system 'euc-korea) - (setq terminal-coding-system 'euc-korea) + (set-buffer-file-coding-system-for-read 'autodetect) + (set-default-buffer-file-coding-system 'euc-korea) + (setq keyboard-coding-system 'euc-korea) + (setq terminal-coding-system 'euc-korea) (when (eq 'x (device-type (selected-device))) (x-use-halfwidth-roman-font 'korean-ksc5601 "ksc5636")) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-category.el --- a/lisp/mule/mule-category.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-category.el Mon Aug 13 09:19:45 2007 +0200 @@ -119,16 +119,17 @@ (setq a (1+ a))) (nreverse list))))) -(defun char-in-category-p (char category &optional table) - "Return non-nil if CHAR is in CATEGORY. -TABLE defaults to the current buffer's category table. -Categories are specified by their designators." - (or table (setq table (category-table))) - (check-argument-type 'category-table-p table) - (check-argument-type 'category-designator-p category) - (let ((vec (get-char-table char table))) - (if (null vec) nil - (= 1 (aref vec (- category 32)))))) +;; implimented in c, file chartab.c (97/3/14 jhod@po.iijnet.or.jp) +;(defun char-in-category-p (char category &optional table) +; "Return non-nil if CHAR is in CATEGORY. +;TABLE defaults to the current buffer's category table. +;Categories are specified by their designators." +; (or table (setq table (category-table))) +; (check-argument-type 'category-table-p table) +; (check-argument-type 'category-designator-p category) +; (let ((vec (get-char-table char table))) +; (if (null vec) nil +; (= 1 (aref vec (- category 32)))))) (defun describe-category () "Describe the category specifications in the category table. @@ -173,7 +174,7 @@ (and (characterp range) (characterp first-char) (eq (char-charset range) (char-charset first-char)) - (= (char-int last-char) (1- (char-int range)))) + (= (char-to-int last-char) (1- (char-to-int range)))) (and (vectorp range) (vectorp first-char) (eq (aref range 0) (aref first-char 0)) @@ -203,7 +204,7 @@ (if (not already-matched) (setq already-matched t) (princ " ")) - (princ (int-char (+ 32 i))))) + (princ (int-to-char (+ 32 i))))) (setq i (1+ i))) (if (not already-matched) (princ "(none)"))) @@ -211,7 +212,7 @@ (while (< i 95) (if (= 1 (aref code i)) (princ (format "\n\t\tmeaning: %s" - (category-doc-string (int-char (+ 32 i)))))) + (category-doc-string (int-to-char (+ 32 i)))))) (setq i (1+ i))))) (terpri))) @@ -258,3 +259,28 @@ ;;; break line at any point under a restriction of 'kinsoku'. (defvar word-across-newline "\\(\\cj\\|\\cc\\|\\ct\\)" "Regular expression of such characters which can be a word across newline.") + +(defvar ascii-char "[\40-\176]") +(defvar ascii-space "[ \t]") +(defvar ascii-symbols "[\40-\57\72-\100\133-\140\173-\176]") +(defvar ascii-numeric "[\60-\71]") +(defvar ascii-English-Upper "[\101-\132]") +(defvar ascii-English-Lower "[\141-\172]") +(defvar ascii-alphanumeric "[\60-\71\101-\132\141-\172]") + +(defvar kanji-char "\\cj") +(defvar kanji-space "$B!!(B") +(defvar kanji-symbols "\\cS") +(defvar kanji-numeric "[$B#0(B-$B#9(B]") +(defvar kanji-English-Upper "[$B#A(B-$B#Z(B]") +(defvar kanji-English-Lower "[$B#a(B-$B#z(B]") +(defvar kanji-hiragana "\\cH") +(defvar kanji-katakana "\\cK") +(defvar kanji-Greek-Upper "[$B&!(B-$B&8(B]") +(defvar kanji-Greek-Lower "[$B&A(B-$B&X(B]") +(defvar kanji-Russian-Upper "[$B'!(B-$B'A(B]") +(defvar kanji-Russian-Lower "[$B'Q(B-$B'q(B]") +(defvar kanji-Kanji-1st-Level "[$B0!(B-$BOS(B]") +(defvar kanji-Kanji-2nd-Level "[$BP!(B-$Bt$(B]") + +(defvar kanji-kanji-char "\\(\\cH\\|\\cK\\|\\cC\\)") diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-debug.el --- a/lisp/mule/mule-debug.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-debug.el Mon Aug 13 09:19:45 2007 +0200 @@ -142,16 +142,16 @@ eol-type) (message "current: [FKDPp=%c%c%c%c%c%c%c%c] default: [FPp=%c%c%c%c%c%c]" - (coding-system-mnemonic file-coding-system) - (coding-system-eol-mnemonic file-coding-system) + (coding-system-mnemonic buffer-file-coding-system) + (coding-system-eol-mnemonic buffer-file-coding-system) (coding-system-mnemonic keyboard-coding-system) (coding-system-mnemonic terminal-coding-system) (coding-system-mnemonic (car cs)) (coding-system-eol-mnemonic (car cs)) (coding-system-mnemonic (cdr cs)) (coding-system-eol-mnemonic (cdr cs)) - (coding-system-mnemonic (default-value 'file-coding-system)) - (coding-system-eol-mnemonic (default-value 'file-coding-system)) + (coding-system-mnemonic (default-value 'buffer-file-coding-system)) + (coding-system-eol-mnemonic (default-value 'buffer-file-coding-system)) (coding-system-mnemonic (car default-process-coding-system)) (coding-system-eol-mnemonic (car default-process-coding-system)) (coding-system-mnemonic (cdr default-process-coding-system)) @@ -243,8 +243,8 @@ (if (null all) (let ((cs (and (fboundp 'process-coding-system) (process-coding-system)))) - (princ "Current:\n file-coding-system") - (princ-coding-system file-coding-system) + (princ "Current:\n buffer-file-coding-system") + (princ-coding-system buffer-file-coding-system) (princ " keyboard-coding-system") (princ-coding-system keyboard-coding-system) (princ " terminal-coding-system") @@ -254,14 +254,14 @@ (princ-coding-system (car cs)) (princ " process-coding-system (output)") (princ-coding-system (cdr cs))) - (princ "Default:\n file-coding-system") - (princ-coding-system (default-value 'file-coding-system)) + (princ "Default:\n buffer-file-coding-system") + (princ-coding-system (default-value 'buffer-file-coding-system)) (princ " process-coding-system (input)") (princ-coding-system (car default-process-coding-system)) (princ " process-coding-system (output)") (princ-coding-system (cdr default-process-coding-system)) - (princ "Others:\n file-coding-system-for-read") - (princ-coding-system file-coding-system-for-read) + (princ "Others:\n buffer-file-coding-system-for-read") + (princ-coding-system buffer-file-coding-system-for-read) (princ "Coding categories by priority:\n") (princ (coding-priority-list))) (princ "########################\n") diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-files.el --- a/lisp/mule/mule-files.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-files.el Mon Aug 13 09:19:45 2007 +0200 @@ -26,50 +26,57 @@ ;;; Derived from mule.el in the original Mule but heavily modified ;;; by Ben Wing. +;; 1997/3/11 modified by MORIOKA Tomohiko to sync with Emacs/mule API. + ;;; Code: ;;;; #### also think more about `binary' vs. `no-conversion' -(setq-default file-coding-system 'iso-2022-8) -(put 'file-coding-system 'permanent-local t) +;; Use `no-conversion' instead of `binary', because Emacs/mule does +;; not have `binary' coding-system. + +;; also think more about `internal'. + + +(setq-default buffer-file-coding-system 'iso-2022-8) +(put 'buffer-file-coding-system 'permanent-local t) (defvar coding-system-for-write nil "Overriding coding system used when writing a file. You should *bind* this, not set it. If this is non-nil, it specifies the coding system that will be used when a file is wrote in, and -overrides `file-coding-system', `insert-file-contents-pre-hook', -etc. Use those variables instead of this one for permanent changes -to the environment.") +overrides `buffer-file-coding-system', +`insert-file-contents-pre-hook', etc. Use those variables instead of +this one for permanent changes to the environment.") (defvar coding-system-for-read nil "Overriding coding system used when reading a file. You should *bind* this, not set it. If this is non-nil, it specifies the coding system that will be used when a file is read in, and -overrides `file-coding-system-for-read', `file-coding-system-alist', -etc. Use those variables instead of this one for permanent changes -to the environment.") +overrides `buffer-file-coding-system-for-read', +`buffer-file-coding-system-alist', etc. Use those variables instead +of this one for permanent changes to the environment.") -(defvar file-coding-system-for-read 'autodetect +(defvar buffer-file-coding-system-for-read 'autodetect "Coding system used when reading a file. This provides coarse-grained control; for finer-grained control, -use `file-coding-system-alist'. From a Lisp program, if you wish +use `buffer-file-coding-system-alist'. From a Lisp program, if you wish to unilaterally specify the coding system used for one particular operation, you should bind the variable `coding-system-for-read' rather than setting this variable, which is intended to be used for global environment specification.") -(defvar file-coding-system-alist - ;; '(; ("\\.el$" . euc-japan) +(defvar buffer-file-coding-system-alist '(("\\.el$" . iso-2022-8) ("\\.info$" . iso-2022-8) ("ChangeLog$" . iso-2022-8) ("\\.texi$" . iso-2022-8) - ("\\.\\(gz\\|Z\\)$" . binary) + ("\\.\\(gz\\|Z\\)$" . no-conversion) ("/spool/mail/.*$" . convert-mbox-coding-system)) "Alist specifying the coding system used for particular files. Each element of the alist is a cons of a regexp, specifying the files -to be affected, and a coding system. This overrides the more -general specification in `file-coding-system-for-read', but is +to be affected, and a coding system. This overrides the more general +specification in `buffer-file-coding-system-for-read', but is overridden by `coding-system-for-read'. Instead of a coding system you may specify a function, and it will be @@ -77,44 +84,46 @@ called with four arguments: FILENAME, VISIT, START, and END, the same as the first four arguments to `insert-file-contents'.") -(defun set-file-coding-system (coding-system &optional force) - "Set the current `file-coding-system' to CODING-SYSTEM. +(defun set-buffer-file-coding-system (coding-system &optional force) + "Set buffer-file-coding-system of the current buffer to CODING-SYSTEM. If optional argument FORCE (interactively, the prefix argument) is not given, attempt to match the EOL type of the new coding system to -the current value of `file-coding-system'." +the current value of `buffer-file-coding-system'." (interactive "zFile coding system: \nP") (get-coding-system coding-system) ;; correctness check (if (not force) (setq coding-system - (subsidiary-coding-system coding-system (coding-system-eol-type - file-coding-system)))) - (setq file-coding-system coding-system) + (subsidiary-coding-system + coding-system + (coding-system-eol-type buffer-file-coding-system)))) + (setq buffer-file-coding-system coding-system) (redraw-modeline t)) -(defun set-file-coding-system-for-read (coding-system) +(defun set-buffer-file-coding-system-for-read (coding-system) "Set the coding system used when reading in a file. -This is equivalent to setting the variable `file-coding-system-for-read'. -You can also use `file-coding-system-alist' to specify the coding system -for particular files." +This is equivalent to setting the variable +`buffer-file-coding-system-for-read'. You can also use +`buffer-file-coding-system-alist' to specify the coding system for +particular files." (interactive "zFile coding system for read: ") (get-coding-system coding-system) ;; correctness check - (setq file-coding-system-for-read coding-system)) + (setq buffer-file-coding-system-for-read coding-system)) -(defun set-default-file-coding-system (coding-system) - "Set the default value of `file-coding-system' to CODING-SYSTEM. +(defun set-default-buffer-file-coding-system (coding-system) + "Set the default value of `buffer-file-coding-system' to CODING-SYSTEM. The default value is used both for buffers without associated files and for files with no apparent coding system (i.e. primarily ASCII). -See `file-coding-system' for more information." +See `buffer-file-coding-system' for more information." (interactive "zDefault file coding system: ") - (setq-default file-coding-system coding-system) + (setq-default buffer-file-coding-system coding-system) (redraw-modeline t)) -(defun find-file-coding-system-from-filename (filename) - "Look up a file in `file-coding-system-alist'. -The return value will be nil (no applicable entry), a coding system object -\(the entry specified a coding system), or something else (the entry -specified a function to be called)." - (let ((alist file-coding-system-alist) +(defun find-buffer-file-coding-system-from-filename (filename) + "Look up a file in `buffer-file-coding-system-alist'. +The return value will be nil (no applicable entry), a coding system +object (the entry specified a coding system), or something else (the +entry specified a function to be called)." + (let ((alist buffer-file-coding-system-alist) (found nil) (codesys nil)) (let ((case-fold-search (eq system-type 'vax-vms))) @@ -194,13 +203,13 @@ (save-excursion (set-buffer (get-buffer-create " *load*")) (erase-buffer) - (let ((file-coding-system-for-read 'no-conversion)) + (let ((buffer-file-coding-system-for-read 'no-conversion)) (insert-file-contents path nil 1 3001)) (setq __codesys__ (find-coding-system-magic-cookie))) ;; use string= instead of string-match to keep match-data. (if (string= ".elc" (downcase (substring path -4))) ;; if reading a byte-compiled file and we didn't find - ;; a coding-system magic cookie, then use `binary'. + ;; a coding-system magic cookie, then use `no-conversion'. ;; We need to guarantee that we never do autodetection ;; on byte-compiled files because confusion here would ;; be a very bad thing. Pre-existing byte-compiled @@ -208,11 +217,12 @@ ;; Also, byte-compiled files always use `lf' to terminate ;; a line; don't risk confusion here either. (if (not __codesys__) - (setq __codesys__ 'binary)) - ;; otherwise use `file-coding-system-for-read', as normal - ;; #### need to do some looking up in file-coding-system-alist! + (setq __codesys__ 'no-conversion)) + ;; otherwise use `buffer-file-coding-system-for-read', as normal + ;; #### need to do some looking up in + ;; #### buffer-file-coding-system-alist! (if (not __codesys__) - (setq __codesys__ file-coding-system-for-read))) + (setq __codesys__ buffer-file-coding-system-for-read))) ;; now use the internal load to actually load the file. (load-internal file noerror nomessage nosuffix __codesys__)))))) @@ -225,11 +235,11 @@ (defvar insert-file-contents-pre-hook nil "A special hook to decide the coding system used for reading in a file. -Before reading a file, `insert-file-contents' calls the functions -on this hook with arguments FILENAME and VISIT, the same as the +Before reading a file, `insert-file-contents' calls the functions on +this hook with arguments FILENAME and VISIT, the same as the corresponding arguments in the call to `insert-file-contents'. In these functions, you may refer to the global variable -`file-coding-system-for-read'. +`buffer-file-coding-system-for-read'. The return value of the functions should be either @@ -244,7 +254,7 @@ If any function returns non-nil, the remaining functions are not called.") (defvar insert-file-contents-error-hook nil - "A hook to set `file-coding-system' when a read error has occurred. + "A hook to set `buffer-file-coding-system' when a read error has occurred. When a file error (e.g. nonexistent file) occurs while read a file, `insert-file-contents' calls the functions on this hook with three @@ -256,7 +266,7 @@ propagates to the caller of `insert-file-contents'.") (defvar insert-file-contents-post-hook nil - "A hook to set `file-coding-system' for the current buffer. + "A hook to set `buffer-file-coding-system' for the current buffer. After successful reading, `insert-file-contents' calls the functions on this hook with four arguments: FILENAME and VISIT (the same as the @@ -289,17 +299,18 @@ 1. `coding-system-for-read', if non-nil. 2. The result of `insert-file-contents-pre-hook', if non-nil. -3. The matching value for this filename from `file-coding-system-alist', - if any. -4. `file-coding-system-for-read', if non-nil. +3. The matching value for this filename from + `buffer-file-coding-system-alist', if any. +4. `buffer-file-coding-system-for-read', if non-nil. 5. The coding system 'no-conversion. -If a local value for `file-coding-system' in the current buffer does -not exist, it is set to the coding system which was actually used for -reading. +If a local value for `buffer-file-coding-system' in the current buffer +does not exist, it is set to the coding system which was actually used +for reading. -See also `insert-file-contents-access-hook', `insert-file-contents-pre-hook', -`insert-file-contents-error-hook', and `insert-file-contents-post-hook'." +See also `insert-file-contents-access-hook', +`insert-file-contents-pre-hook', `insert-file-contents-error-hook', +and `insert-file-contents-post-hook'." (let (return-val coding-system used-codesys conversion-func) ;; OK, first load the file. (condition-case err @@ -315,14 +326,14 @@ (run-special-hook-with-args 'insert-file-contents-pre-hook filename visit) ;; #3. - (let ((retval (find-file-coding-system-from-filename + (let ((retval (find-buffer-file-coding-system-from-filename filename))) (if (or (null retval) (coding-system-p retval)) retval (setq conversion-func retval) 'no-conversion)) ;; #4. - file-coding-system-for-read + buffer-file-coding-system-for-read ;; #5. 'no-conversion)) (if (consp coding-system) @@ -360,7 +371,7 @@ (set-buffer-modified-p nil))))) (setcar (cdr return-val) (- (marker-position endmark) (point))) ;; also call any post-conversion function called for by - ;; `file-coding-system-alist' + ;; `buffer-file-coding-system-alist' (if conversion-func (unwind-protect (save-excursion @@ -371,19 +382,19 @@ (set-buffer-auto-saved) (set-buffer-modified-p nil))))) (setcar (cdr return-val) (- (marker-position endmark) (point)))) - ;; now finally set the buffer's `file-coding-system'. + ;; now finally set the buffer's `buffer-file-coding-system'. (if (run-special-hook-with-args 'insert-file-contents-post-hook filename visit return-val) nil - (if (local-variable-p 'file-coding-system (current-buffer)) - ;; if file-coding-system is already local, just + (if (local-variable-p 'buffer-file-coding-system (current-buffer)) + ;; if buffer-file-coding-system is already local, just ;; set its eol type to what was found, if it wasn't ;; set already. - (set-file-coding-system - (subsidiary-coding-system file-coding-system + (set-buffer-file-coding-system + (subsidiary-coding-system buffer-file-coding-system (coding-system-eol-type coding-system))) - ;; otherwise actually set file-coding-system. - (set-file-coding-system coding-system))) + ;; otherwise actually set buffer-file-coding-system. + (set-buffer-file-coding-system coding-system))) return-val)) (defvar write-region-pre-hook nil @@ -433,7 +444,7 @@ to the file, instead of any buffer contents, and END is ignored. Optional seventh argument CODING-SYSTEM specifies the coding system used to encode the text when it is written out, and defaults to - the value of `file-coding-system' in the current buffer. + the value of `buffer-file-coding-system' in the current buffer. Interactively, with a prefix arg, you will be prompted for the coding system. See also `write-region-pre-hook' and `write-region-post-hook'." @@ -443,7 +454,7 @@ (run-special-hook-with-args 'write-region-pre-hook start end filename append visit lockname) coding-system - file-coding-system)) + buffer-file-coding-system)) (if (consp coding-system) coding-system (let ((func diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-init.el --- a/lisp/mule/mule-init.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-init.el Mon Aug 13 09:19:45 2007 +0200 @@ -30,7 +30,7 @@ ;;; makes Chinese the primary environment. ;;; If you are still not satisfied with the settings, you can ;;; override them after the above line. For instance, -;;; (set-default-file-coding-system 'big5) +;;; (set-default-buffer-file-coding-system 'big5) ;;; makes big5 be used for file I/O by default. ;;; If you are not satisfied with other default settings in this file, ;;; override any of them also in `./lisp/site-init.el'. For instance, @@ -67,11 +67,11 @@ (cons 'modeline-multibyte-status (cdr modeline-format)))) -(define-key mule-keymap "f" 'set-file-coding-system) +(define-key mule-keymap "f" 'set-buffer-file-coding-system) (define-key mule-keymap "i" 'set-keyboard-coding-system) (define-key mule-keymap "d" 'set-terminal-coding-system) (define-key mule-keymap "p" 'set-current-process-coding-system) -(define-key mule-keymap "F" 'set-default-file-coding-system) +(define-key mule-keymap "F" 'set-default-buffer-file-coding-system) (define-key mule-keymap "P" 'set-default-process-coding-system) (define-key mule-keymap "c" 'list-coding-system-briefly) (define-key mule-keymap "C" 'list-coding-system) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-load.el --- a/lisp/mule/mule-load.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-load.el Mon Aug 13 09:19:45 2007 +0200 @@ -30,6 +30,7 @@ ;;(load-gc "mule-process") (load-gc "mule-ccl") (load-gc "mule-misc") +(load-gc "kinsoku") (when (featurep 'x) (load-gc "mule-x-init")) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/mule-process.el --- a/lisp/mule/mule-process.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/mule-process.el Mon Aug 13 09:19:45 2007 +0200 @@ -410,11 +410,11 @@ (define-program-coding-system nil ".*anno.*" 'junet) (define-program-coding-system nil ".*rcvstore.*" 'junet) (setq mh-before-send-letter-hook - '(lambda () (set-file-coding-system 'junet))) + '(lambda () (set-buffer-file-coding-system 'junet))) ;; For VM (add-hook 'vm-mode-hooks '(lambda () - (set-file-coding-system 'junet))) + (set-buffer-file-coding-system 'junet))) ;; For Wnn and cWnn (define-service-coding-system "wnn" nil 'no-conversion) diff -r e183fc049578 -r fe104dbd9147 lisp/mule/thai-hooks.el --- a/lisp/mule/thai-hooks.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/thai-hooks.el Mon Aug 13 09:19:45 2007 +0200 @@ -56,6 +56,5 @@ (lambda () (set-coding-category-system 'iso-8-designate 'tis620) (set-coding-priority-list '(iso-8-designate iso-8-1)) - (set-default-file-coding-system 'tis620))) + (set-default-buffer-file-coding-system 'tis620))) ;;(setq-default quail-current-package (assoc "thai" quail-package-alist)))) - diff -r e183fc049578 -r fe104dbd9147 lisp/mule/vietnamese-hooks-2.el --- a/lisp/mule/vietnamese-hooks-2.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/mule/vietnamese-hooks-2.el Mon Aug 13 09:19:45 2007 +0200 @@ -266,5 +266,5 @@ ;; For VSCII users ;; (setq coding-category-system 'binary 'vscii) (set-coding-priority-list '(no-conversion)) - (set-default-file-coding-system 'viscii) + (set-default-buffer-file-coding-system 'viscii) (setq-default quail-current-package (assoc "viqr" quail-package-alist)))) diff -r e183fc049578 -r fe104dbd9147 lisp/packages/crypt.el --- a/lisp/packages/crypt.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/crypt.el Mon Aug 13 09:19:45 2007 +0200 @@ -1916,7 +1916,7 @@ (if crypt-dos-has-ctrl-z (replace-match "")))))))) (defun crypt-unix-to-dos-region (start end) - "Converts region from START to END, from dos to unix format. + "Converts region from START to END, from unix to os format. Replaces \"\\n\" with \"\\r\\n\" and adds a ^Z at end of file if `crypt-dos-has-ctrl-z' is non-nil." (save-excursion diff -r e183fc049578 -r fe104dbd9147 lisp/packages/diff.el --- a/lisp/packages/diff.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/diff.el Mon Aug 13 09:19:45 2007 +0200 @@ -2,7 +2,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; File: diff.el -;; Version: $Revision: 1.3 $ +;; Version: $Revision: 1.4 $ ;; Author: This file is based on diff.el by ;; sunpitt!wpmstr!fbresz@Sun.COM 1/27/89. ;; It has been completely rewritten in July 1994 by @@ -41,7 +41,7 @@ ;; should be in to loaddefs.el now. ;;;###autoload -(defvar diff-switches nil +(defvar diff-switches "-c" "*A list of switches (strings) to pass to the diff program.") (defvar diff-do-narrow nil diff -r e183fc049578 -r fe104dbd9147 lisp/packages/func-menu.el --- a/lisp/packages/func-menu.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/func-menu.el Mon Aug 13 09:19:45 2007 +0200 @@ -385,9 +385,10 @@ (defun fume-add-submenu (menu-name submenu before) (apply fume-add-submenu (fume-munge-menu-args menu-name submenu before))) +;; this seems to really be `should I try to change the menubar' (defconst fume-not-tty - (or (and (fboundp 'device-type) (not (eq 'tty (device-type)))) - (and (symbol-value 'window-system) t))) ; obsolete test + (or (featurep 'menubar) ;; XEmacs + (featurep 'menu-bar))) ;; GNU Emacs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; Customizable Variables ;;;;;;;;;;;;;;;;;;;;;;;; diff -r e183fc049578 -r fe104dbd9147 lisp/packages/icomplete.el --- a/lisp/packages/icomplete.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/icomplete.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;;; Author: Ken Manheimer ;;; Maintainer: Ken Manheimer -;;; Version: $Id: icomplete.el,v 1.1.1.3 1996/12/21 20:48:12 steve Exp $ +;;; Version: $Id: icomplete.el,v 1.2 1997/03/16 03:05:29 steve Exp $ ;;; Created: Mar 1993 klm@nist.gov - first release to usenet ;;; Keywords: help, abbrev @@ -129,17 +129,20 @@ (defun icomplete-get-keys (func-name) "Return the keys `func-name' is bound to as a string." (when (commandp func-name) - (let* ((sym (intern func-name)) - (keys (where-is-internal sym))) - (concat "<" - (if keys - (mapconcat 'key-description - (sort '([next] [kp-next] [(control v)]) - #'(lambda (x y) - (< (length x) (length y)))) - ", ") - "Unbound") - ">")))) + (save-excursion + ;; Depends on dynamic scope from read-from-minibuffer :-( + (let* ((sym (intern func-name)) + (buf (set-buffer (window-buffer owindow))) + (keys (where-is-internal sym (current-local-map buf)))) + (concat "<" + (if keys + (mapconcat 'key-description + (sort keys + #'(lambda (x y) + (< (length x) (length y)))) + ", ") + "Unbound") + ">"))))) ;;;_ > icomplete-mode (&optional prefix) ;;;###autoload diff -r e183fc049578 -r fe104dbd9147 lisp/packages/jka-compr.el --- a/lisp/packages/jka-compr.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/jka-compr.el Mon Aug 13 09:19:45 2007 +0200 @@ -830,16 +830,7 @@ (defun jka-compr-installed-p () "Return non-nil if jka-compr is installed. The return value is the entry in `file-name-handler-alist' for jka-compr." - - (let ((fnha file-name-handler-alist) - (installed nil)) - - (while (and fnha (not installed)) - (and (eq (cdr (car fnha)) 'jka-compr-handler) - (setq installed (car fnha))) - (setq fnha (cdr fnha))) - - installed)) + (rassq 'jka-compr-handler file-name-handler-alist)) ;;; Add the file I/O hook if it does not already exist. diff -r e183fc049578 -r fe104dbd9147 lisp/packages/metamail.el --- a/lisp/packages/metamail.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/metamail.el Mon Aug 13 09:19:45 2007 +0200 @@ -3,7 +3,7 @@ ;; Copyright (C) 1993, 1996 Masanobu UMEDA ;; Author: Masanobu UMEDA -;; Version: $Header: /afs/informatik.uni-tuebingen.de/local/web/xemacs/xemacs-cvs/XEmacs/xemacs/lisp/packages/Attic/metamail.el,v 1.2 1997/02/06 02:08:35 steve Exp $ +;; Version: $Header: /afs/informatik.uni-tuebingen.de/local/web/xemacs/xemacs-cvs/XEmacs/xemacs/lisp/packages/Attic/metamail.el,v 1.3 1997/03/16 03:05:29 steve Exp $ ;; Keywords: mail, news, mime, multimedia ;; This file is part of XEmacs. @@ -163,10 +163,13 @@ (save-excursion ;; Gee! Metamail does not ouput to stdout if input comes from ;; stdin. - (let ((selective-display nil) ;Disable ^M to nl translation. - (kanji-fileio-code 2) ;Write in JIS code when nemacs. - (file-coding-system ;Write in JUNET style when mule. - (if (featurep 'mule) 'junet))) + (let ((selective-display nil) ;Disable ^M to nl translation. + (kanji-fileio-code 2) ;Write in JIS code when nemacs. + (file-coding-system ;Write in JUNET style when mule. + (if (featurep 'mule) '*junet*)) + (coding-system-for-write ;Write in iso-2022-jp style + 'iso-2022-jp) ; when XEmacs/mule + ) (write-region beg end metafile nil 'nomessage)) (if buffer (set-buffer buffer)) @@ -191,7 +194,7 @@ metamail-program-name 'junet) ;; XEmacs with MULE - (setq file-coding-system 'junet))) + (setq buffer-file-coding-system 'junet))) (apply (function call-process) metamail-program-name nil diff -r e183fc049578 -r fe104dbd9147 lisp/packages/time.el --- a/lisp/packages/time.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/time.el Mon Aug 13 09:19:45 2007 +0200 @@ -42,39 +42,64 @@ (require 'itimer) -(defvar display-time-compatible nil - "*This variable may be set to nil to get the old behaviour of display-time. -This means no display of a spiffy mail icon or use of the display-time-form-list -instead of the old display-time-string-form.") +(defgroup display-time nil + "Facilities to display the current time/date/load and a new-mail indicator +in the XEmacs mode line or echo area." + :group 'applications) -(defvar display-time-mail-file nil +(defcustom display-time-compatible nil + "*This variable may be set to t to get the old behaviour of display-time. +This means no display of a spiffy mail icon or use of the +display-time-form-list instead of the old display-time-string-form." + :group 'display-time + :type 'boolean) + +(defcustom display-time-mail-file nil "*File name of mail inbox file, for indicating existence of new mail. Non-nil and not a string means don't check for mail. nil means use -default, which is system-dependent, and is the same as used by Rmail.") +default, which is system-dependent, and is the same as used by Rmail." + :group 'display-time) ;;;###autoload -(defvar display-time-day-and-date nil "\ -*Non-nil means \\[display-time] should display day and date as well as time.") +(defcustom display-time-day-and-date nil + "*Non-nil means \\[display-time] should display day,date and time. +This affects the spec 'date in the variable display-time-form-list." + :group 'display-time + :type 'boolean) -(defvar display-time-interval 20 - "*Seconds between updates of time in the mode line.") +(defcustom display-time-interval 20 + "*Seconds between updates of time in the mode line." + :group 'display-time + :type 'integer) -(defvar display-time-24hr-format nil +(defcustom display-time-24hr-format nil "*Non-nil indicates time should be displayed as hh:mm, 0 <= hh <= 23. -Nil means 1 <= hh <= 12, and an AM/PM suffix is used.") +Nil means 1 <= hh <= 12, and an AM/PM suffix is used. +This affects the spec 'time in the variable display-time-form-list." + :group 'display-time + :type 'boolean) -(defvar display-time-echo-area nil - "*If non-nil, display-time will use the echo area instead of the mode line.") +(defcustom display-time-echo-area nil + "*If non-nil, display-time will use the echo area instead of the mode line." + :group 'display-time + :type 'boolean) (defvar display-time-string nil) -(defvar display-time-hook nil - "*List of functions to be called when the time is updated on the mode line.") +(defcustom display-time-hook nil + "*List of functions to be called when the time is updated on the mode line." + :group 'display-time + :type 'hook) (defvar display-time-server-down-time nil "Time when mail file's file system was recorded to be down. If that file system seems to be up, the value is nil.") +(defcustom display-time-ignore-read-mail nil + "*Non-nil means displays the mail icon on any non-empty mailbox." + :group 'display-time + :type 'boolean) + ;;;###autoload (defun display-time () "Display current time, load level, and mail flag in mode line of each buffer. @@ -116,129 +141,162 @@ (start-itimer "display-time" 'display-time-function display-time-interval display-time-interval)) -(defvar display-time-show-icons-maybe t - "Use icons to indicate the mail status if possible") +(defcustom display-time-show-icons-maybe t + "Use icons for time, load and mail status if possible +and not specified different explicitely" + :group 'display-time + :type 'boolean) -(defvar display-time-icons-dir (concat data-directory "time/")) +(defvar display-time-icons-dir (concat data-directory "time/")) -(defvar display-time-mail-sign-string " Mail" - "The string used as mail indicator in the echo area +(defcustom display-time-mail-sign-string " Mail" + "The string used as mail indicator in the echo area (and in the modeline if display-time-show-icons-maybe is nil) -if display-time-echo-area is t") +if display-time-echo-area is t" +:group 'display-time +:type 'string) -(defvar display-time-no-mail-sign-string "" +(defcustom display-time-no-mail-sign-string "" "The string used as no-mail indicator in the echo area (and in the modeline if display-time-show-icons-maybe is nil) -if display-time-echo-area is t") - -(defvar display-time-mail-sign - (progn - (let* ((file (concat display-time-icons-dir "letter.xpm")) - (glyph (if (featurep 'xpm) (make-glyph file) - display-time-mail-sign-string)) - (ext (make-extent nil nil))) - (cons ext glyph))) - "A variable holding a cons cell (ext . glyph) -which gives an indicator for new mail in the modeline") +if display-time-echo-area is t" +:group 'display-time +:type 'string) + +(defcustom display-time-display-pad t + "Wether the load indicator is displayed with a trapezoidal \"pad\" +in the background" + :group 'display-time + :type 'boolean) -(defvar display-time-no-mail-sign - (progn - (let* ((file (concat display-time-icons-dir "no-letter.xpm")) - (glyph (if (featurep 'xpm) (make-glyph file) - display-time-no-mail-sign-string)) - (ext (make-extent nil nil))) - (cons ext glyph))) - "A variable holding a cons cell (ext . glyph) which gives -an indicator for `no mail' in the modeline") +(defcustom display-time-load-list + (list 0.2 0.5 0.8 1.1 1.8 2.6) + "*A list giving six thresholds for the load +which correspond to the six different icons to be displayed +as a load indicator" + :group 'display-time + :type '(list (number :tag "Threshold 1 load") + (number :tag "Threshold 2 load") + (number :tag "Threshold 3 load") + (number :tag "Threshold 4 load") + (number :tag "Threshold 5 load") + (number :tag "Threshold 6 load"))) (defun display-time-string-to-char-list (str) (mapcar (function identity) str)) - (if (featurep 'xpm) (progn - (setq display-time-1-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "1.xpm")))) - (setq display-time-2-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "2.xpm")))) - (setq display-time-3-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "3.xpm")))) - (setq display-time-4-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "4.xpm")))) - (setq display-time-5-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "5.xpm")))) - (setq display-time-6-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "6.xpm")))) - (setq display-time-7-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "7.xpm")))) - (setq display-time-8-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "8.xpm")))) - (setq display-time-9-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "9.xpm")))) - (setq display-time-0-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "0.xpm")))) - (setq display-time-:-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "dp.xpm")))) - (setq display-time-load-0.0-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-0.0.xpm")))) - (setq display-time-load-0.5-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-0.5.xpm")))) - (setq display-time-load-1.0-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-1.0.xpm")))) - (setq display-time-load-1.5-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-1.5.xpm")))) - (setq display-time-load-2.0-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-2.0.xpm")))) - (setq display-time-load-2.5-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-2.5.xpm")))) - (setq display-time-load-3.0-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "l-3.0.xpm")))) - (setq display-time-am-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "am.xpm")))) - (setq display-time-pm-glyph - (cons (make-extent nil nil) - (make-glyph (concat display-time-icons-dir "pm.xpm")))) - )) + (defvar display-time-mail-sign + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "letter.xpm")))) + (defvar display-time-no-mail-sign + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "no-letter.xpm")))) + (defvar display-time-1-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "1.xpm")))) + (defvar display-time-2-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "2.xpm")))) + (defvar display-time-3-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "3.xpm")))) + (defvar display-time-4-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "4.xpm")))) + (defvar display-time-5-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "5.xpm")))) + (defvar display-time-6-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "6.xpm")))) + (defvar display-time-7-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "7.xpm")))) + (defvar display-time-8-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "8.xpm")))) + (defvar display-time-9-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "9.xpm")))) + (defvar display-time-0-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "0.xpm")))) + (defvar display-time-:-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "dp.xpm")))) + (defvar display-time-load-0.0-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-0.0.xpm")))) + (defvar display-time-load-0.5-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-0.5.xpm")))) + (defvar display-time-load-1.0-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-1.0.xpm")))) + (defvar display-time-load-1.5-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-1.5.xpm")))) + (defvar display-time-load-2.0-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-2.0.xpm")))) + (defvar display-time-load-2.5-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-2.5.xpm")))) + (defvar display-time-load-3.0-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-3.0.xpm")))) + (defvar display-time-load-0.0-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-0.0.xpm")))) + (defvar display-time-load-0.5-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-0.5.xpm")))) + (defvar display-time-load-1.0-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-1.0.xpm")))) + (defvar display-time-load-1.5-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-1.5.xpm")))) + (defvar display-time-load-2.0-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-2.0.xpm")))) + (defvar display-time-load-2.5-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-2.5.xpm")))) + (defvar display-time-load-3.0-jtl-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "l-jtl-3.0.xpm")))) + (defvar display-time-am-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "am.xpm")))) + (defvar display-time-pm-glyph + (cons (make-extent nil nil) + (make-glyph (concat display-time-icons-dir "pm.xpm")))) + )) -(defun display-time-convert-num-to-pics (string) - (let ((list (display-time-string-to-char-list string)) - elem result tmp) - (if (not (and display-time-show-icons-maybe - (eq (console-type) 'x) - (not display-time-echo-area))) string +(defun display-time-can-do-graphical-display (&optional textual) + (and display-time-show-icons-maybe + (not textual) + (eq (console-type) 'x) + (featurep 'xpm) + (not display-time-echo-area))) + + +(defun display-time-convert-num (time-string &optional textual) + (let ((list (display-time-string-to-char-list time-string)) + elem tmp) + (if (not (display-time-can-do-graphical-display textual)) time-string (while (setq elem (pop list)) (push (eval (intern-soft (concat "display-time-" (char-to-string elem) "-glyph"))) tmp)) - (setq result (reverse tmp))))) + (reverse tmp)))) -(defvar display-time-load-list - (list 0.2 0.5 0.8 1.1 1.8 2.6) - "*A list giving six thresholds for the load which correspond -to the six different icons to be displayed as a load indicator") - -(defun display-time-convert-load-to-glyph (n) - (let ((load-number (string-to-number n)) +(defun display-time-convert-load (load-string &optional textual) + (let ((load-number (string-to-number load-string)) (alist (list (cons 0.0 0.0) (cons 0.5 (car display-time-load-list)) (cons 1.0 (cadr display-time-load-list)) @@ -248,125 +306,192 @@ (cons 3.0 (caddr (cdddr display-time-load-list))) (cons 100000 100000))) result elem) - (if (not (and display-time-show-icons-maybe - (eq (console-type) 'x) - (not display-time-echo-area))) n + (if (not (display-time-can-do-graphical-display textual)) + load-string (while (>= load-number (cdr (setq elem (pop alist)))) (setq result (eval (intern-soft (concat "display-time-load-" (number-to-string (car elem)) + (if display-time-display-pad "-jtl") "-glyph"))))) result))) -(defun display-time-convert-am-pm (n) - (if (not (and display-time-show-icons-maybe - (eq (console-type) 'x) - (not display-time-echo-area))) n - (cond ((equal n "am") display-time-am-glyph) - ((equal n "pm") display-time-pm-glyph)))) +(defun display-time-convert-am-pm (ampm-string &optional textual) + (if (not (display-time-can-do-graphical-display textual)) + ampm-string + (cond ((equal ampm-string "am") display-time-am-glyph) + ((equal ampm-string "pm") display-time-pm-glyph)))) -(defun display-time-mail-sign () +(defun display-time-mail-sign (&optional textual) "*A function giving back the object indicating 'mail' which is the value of display-time-mail-sign when running under X, display-time-echo-area is nil and display-time-show-icons-maybe is t. It is the value of display-time-mail-sign-string otherwise." - (if (or (not (eq (console-type) 'x)) - display-time-echo-area - (not display-time-show-icons-maybe)) + (if (not (display-time-can-do-graphical-display textual)) display-time-mail-sign-string display-time-mail-sign)) -(defun display-time-no-mail-sign () +(defun display-time-no-mail-sign (&optional textual) "*A function giving back the object indicating 'no mail' which is the value of display-time-no-mail-sign when running under X, display-time-echo-area is nil and display-time-show-icons-maybe is t. It is the value of display-time-no-mail-sign-string otherwise." - (if (or (not (eq (console-type) 'x)) - display-time-echo-area - (not display-time-show-icons-maybe)) + (if (not (display-time-can-do-graphical-display textual)) display-time-no-mail-sign-string display-time-no-mail-sign)) -(defvar display-time-form-list - (list 'date-compatible 'time-compatible 'load 'mail) - "*This list describes the format of the strings/glyphs which are to be -displayed by display-time. The old variable display-time-string-forms is -only used if display-time-compatible is non-nil. It is a list consisting of +(defcustom display-time-form-list + (list 'date 'time 'load 'mail) + "*This list describes the format of the strings/glyphs +which are to be displayed by display-time. +The old variable display-time-string-forms is only used if +display-time-compatible is non-nil. It is a list consisting of strings or any of the following symbols: -date-compatible: This prints out the date in a manner compatible to - the default value of the obsolete variable - display-time-string-forms. It respects the variable - display-time-day-and-date. If this is t it will print - out the current date in the form DAYNAME MONTH DAY - otherwise it will print nothing. +There are three complex specs whose behaviour is changed via +the setting of various variables -time-compatible: This prints out the time in a manner compatible to - the default value of the obsolete variable - display-time-string-forms. It respects the variable - display-time-24hr-format. If this is t it will print - out the current hours in 24-hour format, if nil the - hours will be printed in 12-hour format and the - minutes will be followed by 'AM' or 'PM'. +date: This prints out the date in a manner compatible to + the default value of the obsolete variable + display-time-string-forms. It respects the variable + display-time-day-and-date. If this is t it will print + out the current date in the form DAYNAME MONTH DAY + otherwise it will print nothing. + +time: This prints out the time in a manner compatible to + the default value of the obsolete variable + display-time-string-forms. It respects the variable + display-time-24hr-format. If this is t it will print + out the current hours in 24-hour format, if nil the + hours will be printed in 12-hour format and the + minutes will be followed by 'AM' or 'PM'. + +time-text: The same as above, but will not use a glyph + +The other specs are simpler, as their meaning is not changed via +variables. -24-hours: This prints the hours in 24-hours format - -12-hours: This prints the hours in 12-hours format +24-hours: This prints the hours in 24-hours format + +24-hours-text: The same as above, but will not use a glyph + +12-hours: This prints the hours in 12-hours format + +12-hours-text: The same as above, but will not use a glyph + +am-pm: This prints am or pm. -am-pm: This prints Am or Pm. - -dp: This prints a \":\", maybe as an icon - -minutes: This prints the minutes. - -day: This prints out the current day as a number. - -dayname: This prints out today's name. +Timezone: This prints out the local timezone + +am-pm-text: The same as above, but will not use a glyph + +minutes: This prints the minutes. + +minutes-text: The same as above, but will not use a glyph + +day: This prints out the current day as a number. + +dayname: This prints out today's name. + +month: This prints out the current month as a number + +monthname: This prints out the current month's name -month: This prints out the current month as a number - -monthname: This prints out the current month's name - -load: This prints out the system's load. - -mail: This displays a mail indicator. Under X this will - normally be a small icon which changes depending if - there is new mail or not.") +year: This prints out the current year. + +load: This prints out the system's load. + +load-text: The same as above, but will not use a glyph + +mail: This displays a mail indicator. Under X this will + normally be a small icon which changes depending if + there is new mail or not. + +mail-text: The same as above, but will not use a glyph" + :group 'display-time + :type '(repeat (choice :tag "Toggle Symbol/String" + (const :tag "Date" date) + (const :tag "Time" time) + (const :tag "Time (text)" time-text) + (const :tag "24 hour format" 24-hours) + (const :tag "24 hour format (text)" 24-hours-text) + (const :tag "12 hour format" 12-hours) + (const :tag "12 hour format (text)" 12-hours-text) + (const :tag "AM/PM indicator" am-pm) + (const :tag "AM/PM indicator (text)" am-pm-text) + (const :tag "Timezone" timezone) + (const :tag "Minutes" minutes) + (const :tag "Minutes (text)" minutes-text) + (const :tag "Day" day) + (const :tag "Dayname" dayname) + (const :tag "Month" month) + (const :tag "Monthname" monthname) + (const :tag "Year" year) + (const :tag "Load" load) + (const :tag "Load (text)" load-text) + (const :tag "Mail sign" mail) + (const :tag "Mail sign (text)" mail-text) + (string :tag "String")))) (defun display-time-evaluate-list () "Evalute the variable display-time-form-list" (let ((list display-time-form-list) elem tmp result) (while (setq elem (pop list)) (cond ((stringp elem) (push elem tmp)) - ((eq elem 'date-compatible) + ((eq elem 'date) (push (if display-time-day-and-date (format "%s %s %s " dayname monthname day) "") tmp)) - ((eq elem 'time-compatible) + ((eq elem 'time) (progn - (push (display-time-convert-num-to-pics + (push (display-time-convert-num (format "%s:%s" (if display-time-24hr-format 24-hours 12-hours) - minutes)) tmp) + minutes)) tmp) (if (not display-time-24hr-format) (push (display-time-convert-am-pm am-pm) tmp)))) + ((eq elem 'time-text) + (push (display-time-convert-num + (format "%s:%s" + (if display-time-24hr-format 24-hours 12-hours) + minutes) t) tmp) + (if (not display-time-24hr-format) + (push (display-time-convert-am-pm am-pm t) tmp))) ((eq elem 'day) (push day tmp)) ((eq elem 'dayname) (push dayname tmp)) ((eq elem 'month) (push month tmp)) ((eq elem 'monthname) (push monthname tmp)) - ((eq elem '24-hours) (push (display-time-convert-num-to-pics 24-hours) - tmp)) - ((eq elem '12-hours) (push (display-time-convert-num-to-pics 12-hours) - tmp)) - ((eq elem 'minutes) (push (display-time-convert-num-to-pics minutes) - tmp)) - ((eq elem 'am-pm) (push am-pm tmp)) - ((eq elem 'dp) (push (display-time-convert-num-to-pics ":") tmp)) + ((eq elem '24-hours) + (push (display-time-convert-num 24-hours) tmp)) + ((eq elem 'year) + (push year tmp)) + ((eq elem '24-hours-text) + (push (display-time-convert-num 24-hours t) tmp)) + ((eq elem '12-hours) + (push (display-time-convert-num 12-hours) tmp)) + ((eq elem '12-hours-text) + (push (display-time-convert-num 12-hours t) tmp)) + ((eq elem 'minutes) + (push (display-time-convert-num minutes) tmp)) + ((eq elem 'minutes-text) + (push (display-time-convert-num minutes t) tmp)) + ((eq elem 'am-pm) + (push (display-time-convert-am-pm am-pm) tmp)) + ((eq elem 'am-pm-text) + (push (display-time-convert-am-pm am-pm t) tmp)) + ((eq elem 'timezone) + (push time-zone tmp)) ((eq elem 'load) - (push (display-time-convert-load-to-glyph load) tmp)) - ((eq elem 'mail) (push (if mail (display-time-mail-sign) - (display-time-no-mail-sign)) - tmp)))) + (push (display-time-convert-load load) tmp)) + ((eq elem 'load-text) + (push (display-time-convert-load load t) tmp)) + ((eq elem 'mail) + (push (if mail (display-time-mail-sign) + (display-time-no-mail-sign)) tmp)) + ((eq elem 'mail-text) + (push (if mail (display-time-mail-sign t) + (display-time-no-mail-sign t)) tmp)) + )) ;; We know that we have a list containing only of strings if ;; display-time-echo-area is t. So we construct this string from ;; the list. Else we just reverse the list and give it as result. @@ -461,7 +586,7 @@ (save-window-excursion (select-window (minibuffer-window)) (erase-buffer) - (indent-to (- (screen-width) (length display-time-string) 1)) + (indent-to (- (frame-width) (length display-time-string) 1)) (insert display-time-string) (message (buffer-string))))) (force-mode-line-update) @@ -469,8 +594,13 @@ (sit-for 0))) (defun display-time-file-nonempty-p (file) - (and (file-exists-p file) - (< 0 (nth 7 (file-attributes (file-chase-links file)))))) + (let ((attributes (file-attributes (file-chase-links file)))) + (and attributes + (< 0 (nth 7 attributes)) + (or display-time-ignore-read-mail + (> (car (nth 5 attributes)) (car (nth 4 attributes))) + (and (= (car (nth 5 attributes)) (car (nth 4 attributes))) + (> (cadr (nth 5 attributes)) (cadr (nth 4 attributes)))))))) (provide 'time) diff -r e183fc049578 -r fe104dbd9147 lisp/packages/vc.el --- a/lisp/packages/vc.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/packages/vc.el Mon Aug 13 09:19:45 2007 +0200 @@ -114,9 +114,8 @@ "Maximum number of saved comments in the comment ring.") ;;; XEmacs - This is dumped into loaddefs.el already. -;; Not any more! -sb -(defvar diff-switches "-c" - "*A string or list of strings specifying switches to be passed to diff.") +;(defvar diff-switches "-c" +; "*A string or list of strings specifying switches to be passed to diff.") ;;;###autoload (defvar vc-checkin-hook nil diff -r e183fc049578 -r fe104dbd9147 lisp/prim/about.el --- a/lisp/prim/about.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/about.el Mon Aug 13 09:19:45 2007 +0200 @@ -157,7 +157,7 @@ (toggle-read-only 0) (let ((rest (if who-to-load (list who-to-load) - '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry kyle larsi))) + '(steve mrb cthomp wing stig jwz mly vladimir baw piper bw wmperry kyle larsi jens))) (got-error nil)) (while rest (let* ((who (car rest)) @@ -203,31 +203,34 @@ (about-load-mosaic) ;; HERE TO PLACE ADDITIONAL MUGSHOTS +) - (goto-char (point-max)) - (insert "\n ") +;; This is losing badly to a redisplay glitch, and it doesn't scale up. + +; (goto-char (point-max)) +; (insert "\n ") - (let ((rest '(steve mrb cthomp wing stig linebreak jwz mly vladimir linebreak baw piper bw linebreak wmperry kyle larsi)) - (got-error nil)) - (while rest - (if (eq (car rest) 'linebreak) - (insert "\n\n ") - (let* ((who (car rest)) - (b (get-buffer "About XEmacs")) - (p (symbol-value-in-buffer who b nil))) - (or (glyphp p) (setq p nil)) - (and p - (let ((e (make-extent (point) (point)))) - (set-extent-begin-glyph e p) - (set-extent-property e 'keymap about-xref-map) - (set-extent-property e 'xref who))) - (insert " ") - (sit-for 0))) - (setq rest (cdr rest))) - (insert "\n") - (goto-char (point-min)) - (or got-error (message nil))) - ) +; (let ((rest '(steve mrb cthomp wing stig linebreak jwz mly vladimir linebreak baw piper bw linebreak wmperry kyle larsi jens)) +; (got-error nil)) +; (while rest +; (if (eq (car rest) 'linebreak) +; (insert "\n\n ") +; (let* ((who (car rest)) +; (b (get-buffer "About XEmacs")) +; (p (symbol-value-in-buffer who b nil))) +; (or (glyphp p) (setq p nil)) +; (and p +; (let ((e (make-extent (point) (point)))) +; (set-extent-begin-glyph e p) +; (set-extent-property e 'keymap about-xref-map) +; (set-extent-property e 'xref who))) +; (insert " ") +; (sit-for 0))) +; (setq rest (cdr rest))) +; (insert "\n") +; (goto-char (point-min)) +; (or got-error (message nil))) +; ) (defun about-xemacs-xref () (interactive "@") @@ -294,6 +297,7 @@ ('mrb "About Martin Buchholz") ('kyle "About Kyle Jones") ('larsi "About Lars Magne Ingebrigtsen") + ('jens "About Jens Lautenbacher") ('others "About Everyone") ('features "New XEmacs Features") ('history "XEmacs History") @@ -776,6 +780,25 @@ (insert " to go back to the previous page.\n") ) + ((eq xref 'jens) + (about-face "Jens Lautenbacher" 'bold) + (insert " + + Jens did the artwork for graphics added to XEmacs 20.1 and 19.15. + + I'm currently working at the University of Karlsruhe, Germany + on getting my diploma thesis on Supersymmetry (uuh, that's + physics) done. After that (and all the remaining exams) I'm + looking forward to make a living out of my hobbies -- + computers (and graphics). But because I have no deadline for + the exams and XEmacs betas are released at a high rate this + may take some time...") + + (insert "\n\n\tClick ") + (about-xref "here" prev-page "Return to previous page") + (insert " to go back to the previous page.\n") + ) + ((eq xref 'others) (insert "Click ") (about-xref "here" 'about "Return to previous page") @@ -847,6 +870,15 @@ CERN and stuff. See \"http://www.ifi.uio.no/~larsi/\" + ") (about-xref "Jens Lautenbacher" 'jens "Find out more about Jens Lautenbacher") (insert " + I'm currently working at the University of Karlsruhe, Germany + on getting my diploma thesis on Supersymmetry (uuh, that's + physics) done. After that (and all the remaining exams) I'm + looking forward to make a living out of my hobbies -- + computers (and graphics). But because I have no deadline for + the exams and XEmacs betas are released at a high rate this + may take some time... + Darrell Kindred Unofficial maintainer of the xemacs-beta list of extant bugs and contributor of an extraordinary number of important bug @@ -995,7 +1027,6 @@ Valdis Kletnieks Jens Krinke Mats Larsson - Jens Lautenbacher Simon Leinen Carsten Leonhardt James LewisMoss diff -r e183fc049578 -r fe104dbd9147 lisp/prim/auto-autoloads.el --- a/lisp/prim/auto-autoloads.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/auto-autoloads.el Mon Aug 13 09:19:45 2007 +0200 @@ -1059,6 +1059,17 @@ ;;;*** +;;;### (autoloads (widget-delete widget-create) "wid-edit" "custom/wid-edit.el") + +(autoload 'widget-create "wid-edit" "\ +Create widget of TYPE. +The optional ARGS are additional keyword arguments." nil nil) + +(autoload 'widget-delete "wid-edit" "\ +Delete WIDGET." nil nil) + +;;;*** + ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug/edebug.el") (autoload 'def-edebug-spec "edebug" "\ @@ -2040,6 +2051,74 @@ ;;;*** +;;;### (autoloads (gnats:summ-pr gnats:query-pr gnats:edit-pr gnats:view-pr gnats:gnats-mode) "gnats" "gnats/gnats.el") + +(defvar gnats::mode-name nil "\ +Name of the GNATS mode.") + +(setq gnats::mode-name 'gnats:gnats-mode) + +(fset 'gnats-mode gnats::mode-name) + +(autoload 'gnats:gnats-mode "gnats" "\ +Major mode for editing problem reports. +For information about the form see gnats(1) and pr_form(5). + +When you are finished editing the buffer, type \\[gnats:submit-pr] to commit +your changes to the PR database. To abort the edit, type +\\[gnats:unlock-buffer]. + +Special commands: +\\{gnats-mode-map} +Turning on gnats-mode calls the value of the variable gnats-mode-hook, +if it is not nil." nil nil) + +(fset 'view-pr 'gnats:view-pr) + +(autoload 'gnats:view-pr "gnats" "\ +Visit the problem report named by the string ID. While viewing, press +'e' to edit the currently viewed PR." t nil) + +(fset 'edit-pr 'gnats:edit-pr) + +(autoload 'gnats:edit-pr "gnats" "\ +Edit the problem report named by the string ID." t nil) + +(fset 'query-pr 'gnats:query-pr) + +(autoload 'gnats:query-pr "gnats" "\ +Run query-pr, with user-specified args, and collect output in a buffer. +While query-pr runs asynchronously, you can use the \\[next-error] command +to find the text that the hits refer to." t nil) + +(fset 'summ-pr 'gnats:summ-pr) + +(autoload 'gnats:summ-pr "gnats" "\ +Run query-pr, with user-specified args, and display a pretty summary. +Well, display a summary, at least." t nil) + +;;;*** + +;;;### (autoloads (send-pr:send-pr-mode send-pr:send-pr) "send-pr" "gnats/send-pr.el") + +(fset 'send-pr 'send-pr:send-pr) + +(autoload 'send-pr:send-pr "send-pr" "\ +Create a buffer and read in the result of `send-pr -P'. +When finished with editing the problem report use \\[send-pr:submit-pr] +to send the PR with `send-pr -b -f -'." t nil) + +(fset 'send-pr-mode 'send-pr:send-pr-mode) + +(autoload 'send-pr:send-pr-mode "send-pr" "\ +Major mode for submitting problem reports. +For information about the form see gnats(1) and send-pr(1). +Special commands: \\{send-pr-mode-map} +Turning on send-pr-mode calls the value of the variable send-pr-mode-hook, +if it is not nil." t nil) + +;;;*** + ;;;### (autoloads (gnus-earcon-display) "earcon" "gnus/earcon.el") (autoload 'gnus-earcon-display "earcon" "\ @@ -3248,7 +3327,7 @@ information already added. You just need to add a description of the problem, including a reproducible test case and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `c-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the hook `c-mode-common-hook' is @@ -3265,7 +3344,7 @@ of the problem, including a reproducible test case, and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `c++-mode-hook' is run with no args, if that variable is bound and has a non-nil value. Also the hook @@ -3282,7 +3361,7 @@ of the problem, including a reproducible test case, and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `objc-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the hook `c-mode-common-hook' @@ -3299,7 +3378,7 @@ of the problem, including a reproducible test case and send the message. -To see what version of cc-mode you are running, enter `\\[c-version]'. +To see what version of CC Mode you are running, enter `\\[c-version]'. The hook variable `java-mode-hook' is run with no args, if that value is bound and has a non-nil value. Also the common hook @@ -3311,10 +3390,13 @@ \\{java-mode-map}" t nil) (autoload 'c-set-style "cc-mode" "\ -Set cc-mode variables to use one of several different indentation styles. +Set CC Mode variables to use one of several different indentation styles. STYLENAME is a string representing the desired style from the list of styles described in the variable `c-style-alist'. See that variable -for details of setting up styles." t nil) +for details of setting up styles. + +The variable `c-indentation-style' always contains the buffer's current +style name." t nil) (fset 'set-c-style 'c-set-style) @@ -3758,7 +3840,7 @@ ;;;### (autoloads (ksh-mode) "ksh-mode" "modes/ksh-mode.el") (autoload 'ksh-mode "ksh-mode" "\ -ksh-mode $Revision: 1.14 $ - Major mode for editing (Bourne, Korn or Bourne again) +ksh-mode $Revision: 1.15 $ - Major mode for editing (Bourne, Korn or Bourne again) shell scripts. Special key bindings and commands: \\{ksh-mode-map} @@ -4125,7 +4207,7 @@ pascal-case-indent (default 2) Indentation for case statements. pascal-auto-newline (default nil) - Non-nil means automatically newline after semicolons and the punctation mark + Non-nil means automatically newline after semicolons and the punctuation mark after an end. pascal-tab-always-indent (default t) Non-nil means TAB in Pascal mode should always reindent the current line, @@ -5110,7 +5192,7 @@ (autoload 'vhdl-mode "vhdl-mode" "\ Major mode for editing VHDL code. -vhdl-mode $Revision: 1.14 $ +vhdl-mode $Revision: 1.15 $ To submit a problem report, enter `\\[vhdl-submit-bug-report]' from a vhdl-mode buffer. This automatically sets up a mail buffer with version information already added. You just need to add a description of the @@ -5962,7 +6044,7 @@ ;;;### (autoloads (diff-backup diff) "diff" "packages/diff.el") -(defvar diff-switches nil "\ +(defvar diff-switches "-c" "\ *A list of switches (strings) to pass to the diff program.") (autoload 'diff "diff" "\ @@ -7537,8 +7619,7 @@ ;;;### (autoloads (display-time) "time" "packages/time.el") -(defvar display-time-day-and-date nil "\ -*Non-nil means \\[display-time] should display day and date as well as time.") +(defcustom display-time-day-and-date nil "*Non-nil means \\[display-time] should display day,date and time.\nThis affects the spec 'date in the variable display-time-form-list." :group 'display-time :type 'boolean) (autoload 'display-time "time" "\ Display current time, load level, and mail flag in mode line of each buffer. @@ -8282,6 +8363,48 @@ ;;;*** +;;;### (autoloads (with-timeout run-with-idle-timer run-with-timer run-at-time) "timer" "prim/timer.el") + +(autoload 'run-at-time "timer" "\ +Perform an action after a delay of SECS seconds. +Repeat the action every REPEAT seconds, if REPEAT is non-nil. +TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds +from now, or a value from `encode-time'. +REPEAT may be an integer or floating point number. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." t nil) + +(autoload 'run-with-timer "timer" "\ +Perform an action after a delay of SECS seconds. +Repeat the action every REPEAT seconds, if REPEAT is non-nil. +SECS and REPEAT may be integers or floating point numbers. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." t nil) + +(autoload 'run-with-idle-timer "timer" "\ +Perform an action the next time Emacs is idle for SECS seconds. +If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds. +SECS may be an integer or a floating point number. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." t nil) + +(put 'with-timeout 'lisp-indent-function 1) + +(autoload 'with-timeout "timer" "\ +Run BODY, but if it doesn't finish in SECONDS seconds, give up. +If we give up, we run the TIMEOUT-FORMS and return the value of the last one. +The call should look like: + (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...) +The timeout is checked whenever Emacs waits for some kind of external +event (such as keyboard input, input from subprocesses, or a certain time); +if the program loops without waiting in any way, the timeout will not +be detected." nil 'macro) + +;;;*** + ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "prim/userlock.el") (autoload 'ask-user-about-lock "userlock" "\ @@ -9641,28 +9764,6 @@ ;;;*** -;;;### (autoloads (y-or-n-p-with-timeout yes-or-no-p-with-timeout with-timeout with-timeout-internal) "with-timeout" "utils/with-timeout.el") - -(autoload 'with-timeout-internal "with-timeout" nil nil nil) - -(autoload 'with-timeout "with-timeout" "\ -Usage: (with-timeout (seconds &rest timeout-forms) &rest body) -This is just like progn, but if the given number of seconds expires before -the body returns, then timeout-forms are evaluated and returned instead. -The body won't be interrupted in the middle of a computation: the check for -the timer expiration only occurs when body does a redisplay, or prompts the -user for input, or calls accept-process-output." nil 'macro) - -(autoload 'yes-or-no-p-with-timeout "with-timeout" "\ -Just like yes-or-no-p, but will time out after TIMEOUT seconds -if the user has not yes answered, returning DEFAULT-VALUE." nil nil) - -(autoload 'y-or-n-p-with-timeout "with-timeout" "\ -Just like y-or-n-p, but will time out after TIMEOUT seconds -if the user has not yes answered, returning DEFAULT-VALUE." nil nil) - -;;;*** - ;;;### (autoloads (xbm-button-create) "xbm-button" "utils/xbm-button.el") (autoload 'xbm-button-create "xbm-button" "\ @@ -9937,17 +10038,6 @@ ;;;*** -;;;### (autoloads (widget-delete widget-create) "wid-edit" "w3/wid-edit.el") - -(autoload 'widget-create "wid-edit" "\ -Create widget of TYPE. -The optional ARGS are additional keyword arguments." nil nil) - -(autoload 'widget-delete "wid-edit" "\ -Delete WIDGET." nil nil) - -;;;*** - ;;;### (autoloads (font-menu-weight-constructor font-menu-size-constructor font-menu-family-constructor reset-device-font-menus) "x-font-menu" "x11/x-font-menu.el") (defvar font-menu-ignore-scaled-fonts t "\ diff -r e183fc049578 -r fe104dbd9147 lisp/prim/custom-load.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/prim/custom-load.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,106 @@ +(put 'gnus-start 'custom-loads '("gnus-group" "gnus-int" "gnus-start" "gnus-util" "gnus")) +(put 'extensions 'custom-loads '("wid-edit")) +(put 'message 'custom-loads '("message" "sendmail")) +(put 'gnus-score-expire 'custom-loads '("gnus-kill" "gnus-score")) +(put 'gnus-score-kill 'custom-loads '("gnus-kill")) +(put 'gnus-message 'custom-loads '("message")) +(put 'gnus-summary-sort 'custom-loads '("gnus-sum")) +(put 'nnmail-procmail 'custom-loads '("nnmail")) +(put 'widgets 'custom-loads '("wid-browse" "wid-edit")) +(put 'environment 'custom-loads '("cus-edit")) +(put 'gnus-article-buttons 'custom-loads '("gnus-art")) +(put 'gnus-extract-archive 'custom-loads '("gnus-uu")) +(put 'gnus-article-headers 'custom-loads '("gnus-art" "gnus-sum")) +(put 'gnus-score 'custom-loads '("gnus-nocem" "gnus")) +(put 'gnus-summary-various 'custom-loads '("gnus-sum")) +(put 'gnus-topic 'custom-loads '("gnus-topic")) +(put 'gnus-article-emphasis 'custom-loads '("gnus-art")) +(put 'earcon 'custom-loads '("earcon")) +(put 'gnus-group-foreign 'custom-loads '("gnus-group")) +(put 'gnus-article-washing 'custom-loads '("gnus-art")) +(put 'mail 'custom-loads '("gnus" "message")) +(put 'gnus-summary-exit 'custom-loads '("gnus-sum")) +(put 'comint-input-face 'custom-loads '("comint")) +(put 'gnus-article-saving 'custom-loads '("gnus-art")) +(put 'gnus-extract-view 'custom-loads '("gnus-sum" "gnus-uu")) +(put 'gnus-group-listing 'custom-loads '("gnus-group")) +(put 'gnus-summary 'custom-loads '("gnus-sum" "gnus")) +(put 'message-headers 'custom-loads '("auto-autoloads" "message")) +(put 'gnus-group-select 'custom-loads '("gnus-sum")) +(put 'display-time 'custom-loads '("time" "auto-autoloads")) +(put 'hypermedia 'custom-loads '("wid-edit")) +(put 'w3-advanced 'custom-loads '("w3-cus")) +(put 'w3-menus 'custom-loads '("w3-cus")) +(put 'gnus-summary-mail 'custom-loads '("gnus-sum")) +(put 'gnus-score-default 'custom-loads '("gnus-score" "gnus-sum")) +(put 'nnmail-expire 'custom-loads '("nnmail")) +(put 'gnus-thread 'custom-loads '("gnus-sum")) +(put 'gnus-nocem 'custom-loads '("gnus-nocem")) +(put 'gnus-threading 'custom-loads '("gnus-sum")) +(put 'applications 'custom-loads '("cus-edit" "time")) +(put 'gnus-summary-maneuvering 'custom-loads '("gnus-sum")) +(put 'gnus-extract 'custom-loads '("gnus" "gnus-uu")) +(put 'help 'custom-loads '("cus-edit")) +(put 'nnmail-split 'custom-loads '("nnmail")) +(put 'gnus-article-various 'custom-loads '("gnus-art" "gnus-sum")) +(put 'message-sending 'custom-loads '("auto-autoloads" "message")) +(put 'w3-files 'custom-loads '("w3-cus")) +(put 'widget-browse 'custom-loads '("wid-browse")) +(put 'gnus-article 'custom-loads '("gnus-art" "gnus-cite")) +(put 'gnus 'custom-loads '("gnus-art" "gnus-async" "gnus-cache" "gnus-demon" "gnus-dup" "gnus-eform" "gnus-uu" "gnus-win" "gnus" "nnmail")) +(put 'gnus-treading 'custom-loads '("gnus-sum")) +(put 'nnmail 'custom-loads '("nnmail")) +(put 'gnus-article-hiding 'custom-loads '("gnus-art" "gnus-sum")) +(put 'customize 'custom-loads '("wid-edit" "custom" "cus-face" "cus-edit")) +(put 'w3-printing 'custom-loads '("w3-cus")) +(put 'nnmail-duplicate 'custom-loads '("nnmail")) +(put 'gnus-summary-visual 'custom-loads '("gnus-sum" "gnus")) +(put 'w3-images 'custom-loads '("w3-cus")) +(put 'gnus-group-various 'custom-loads '("gnus-group")) +(put 'nnmail-retrieve 'custom-loads '("nnmail")) +(put 'message-interface 'custom-loads '("message")) +(put 'gnus-group 'custom-loads '("gnus-topic" "gnus")) +(put 'programming 'custom-loads '("cus-edit")) +(put 'gnus-article-signature 'custom-loads '("gnus-art")) +(put 'dired 'custom-loads '("dired-faces")) +(put 'gnus-duplicate 'custom-loads '("gnus-dup")) +(put 'gnus-score-adapt 'custom-loads '("gnus-score")) +(put 'nnmail-various 'custom-loads '("nnmail")) +(put 'nnmail-files 'custom-loads '("nnmail")) +(put 'gnus-asynchronous 'custom-loads '("gnus-async")) +(put 'gnus-visual 'custom-loads '("earcon" "gnus-art" "gnus-picon" "gnus" "smiley")) +(put 'message-forwarding 'custom-loads '("message")) +(put 'message-news 'custom-loads '("message")) +(put 'gnus-edit-form 'custom-loads '("gnus-eform")) +(put 'external 'custom-loads '("cus-edit")) +(put 'gnus-files 'custom-loads '("gnus" "nnmail")) +(put 'gnus-cite 'custom-loads '("gnus-cite")) +(put 'gnus-demon 'custom-loads '("gnus-demon")) +(put 'gnus-summary-choose 'custom-loads '("gnus-sum")) +(put 'development 'custom-loads '("cus-edit")) +(put 'gnus-windows 'custom-loads '("gnus-win")) +(put 'message-mail 'custom-loads '("auto-autoloads" "message")) +(put 'message-various 'custom-loads '("auto-autoloads" "message")) +(put 'gnus-group-levels 'custom-loads '("gnus-group")) +(put 'languages 'custom-loads '("cus-edit")) +(put 'gnus-summary-format 'custom-loads '("gnus-sum")) +(put 'gnus-score-decay 'custom-loads '("gnus-score")) +(put 'gnus-extract-post 'custom-loads '("gnus-uu")) +(put 'faces 'custom-loads '("cus-edit" "wid-edit" "gnus" "message")) +(put 'gnus-various 'custom-loads '("gnus-sum")) +(put 'gnus-article-highlight 'custom-loads '("gnus-art")) +(put 'emacs 'custom-loads '("cus-edit" "dired-faces")) +(put 'news 'custom-loads '("gnus" "message")) +(put 'w3-hooks 'custom-loads '("w3-cus")) +(put 'message-insertion 'custom-loads '("auto-autoloads" "message")) +(put 'wp 'custom-loads '("cus-edit")) +(put 'message-faces 'custom-loads '("message")) +(put 'gnus-score-files 'custom-loads '("gnus-score")) +(put 'gnus-summary-marks 'custom-loads '("gnus-sum")) +(put 'picons 'custom-loads '("gnus-picon")) +(put 'nnmail-prepare 'custom-loads '("nnmail")) +(put 'w3-display 'custom-loads '("w3-cus")) +(put 'w3-parsing 'custom-loads '("w3-cus")) +(put 'message-buffers 'custom-loads '("message")) +(put 'editing 'custom-loads '("cus-edit")) +(put 'gnus-article-mime 'custom-loads '("gnus-art" "gnus-sum")) diff -r e183fc049578 -r fe104dbd9147 lisp/prim/files-nomule.el --- a/lisp/prim/files-nomule.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/files-nomule.el Mon Aug 13 09:19:45 2007 +0200 @@ -67,8 +67,9 @@ Optional seventh argument CODING-SYSTEM is meaningful only if support for Mule is present in XEmacs and specifies the coding system used to encode the text when it is written out, and defaults to - the value of `file-coding-system' in the current buffer. When Mule - support is not present, the CODING-SYSTEM argument is ignored." + the value of `buffer-file-coding-system' in the current buffer. + When Mule support is not present, the CODING-SYSTEM argument is + ignored." (interactive "r\nFWrite region to file: ") (write-region-internal start end filename append visit lockname nil)) diff -r e183fc049578 -r fe104dbd9147 lisp/prim/files.el --- a/lisp/prim/files.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/files.el Mon Aug 13 09:19:45 2007 +0200 @@ -32,8 +32,8 @@ ;;; Code: ;; XEmacs: Avoid compilation warnings. -(defvar overriding-file-coding-system) -(defvar file-coding-system) +(defvar coding-system-for-read) +(defvar buffer-file-coding-system) ;; XEmacs: In buffer.c ;(defconst delete-auto-save-files t @@ -590,7 +590,7 @@ with a prefix argument, you will be prompted for the coding system." (interactive "FFind file: \nZCoding system: ") (if codesys - (let ((overriding-file-coding-system + (let ((coding-system-for-read (get-coding-system codesys))) (switch-to-buffer (find-file-noselect filename))) (switch-to-buffer (find-file-noselect filename)))) @@ -1689,7 +1689,7 @@ (set-buffer-modified-p t) (setq buffer-read-only nil) (if codesys - (let ((file-coding-system (get-coding-system codesys))) + (let ((buffer-file-coding-system (get-coding-system codesys))) (save-buffer)) (save-buffer))) @@ -2321,7 +2321,7 @@ with a prefix argument, you will be prompted for the coding system." (interactive "r\nFAppend to file: \nZCoding system: ") (if codesys - (let ((file-coding-system (get-coding-system codesys))) + (let ((buffer-file-coding-system (get-coding-system codesys))) (write-region start end filename t)) (write-region start end filename t))) diff -r e183fc049578 -r fe104dbd9147 lisp/prim/fill.el --- a/lisp/prim/fill.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/fill.el Mon Aug 13 09:19:45 2007 +0200 @@ -28,6 +28,9 @@ ;; All the commands for filling text. These are documented in the XEmacs ;; Reference Manual. +;; 97/3/14 Jareth Hein (jhod@po.iijnet.or.jp) added functions for kinsoku (asian text +;; line break processing) + ;;; Code: (defconst fill-individual-varying-indent nil @@ -77,6 +80,38 @@ "*Function to call to choose a fill prefix for a paragraph. This function is used when `adaptive-fill-regexp' does not match.") +;; Added for kinsoku processing. Use this instead of +;; (skip-chars-backward "^ \t\n") +;; (skip-chars-backward "^ \n" linebeg) +(defun fill-move-backward-to-break-point (regexp &optional lim) + (let ((opoint (point))) + ;; 93.8.23 by kawamoto@ics.es.osaka-u.ac.jp + ;; case of first 'word' being longer than fill-column + (if (not (re-search-backward regexp lim 'move)) + nil + ;; we have skipped backward SPC or WAN (word-across-newline). So move point forward again. + (forward-char) + (if (<= opoint (point)) + (forward-char -1))))) + +;; Added for kinsoku processing. Use instead of +;; (re-search-forward "[ \t]" opoint t) +;; (skip-chars-forward "^ \n") +;; (skip-chars-forward "^ \n") +(defun fill-move-forward-to-break-point (regexp &optional lim) + (let ((opoint (point))) + (if (not (re-search-forward regexp lim 'move)) + nil + (forward-char -1) + (if (<= (point) opoint) + (forward-char)))) + (if (featurep 'mule) (kinsoku-process-extend))) + +(defun fill-end-of-sentence-p () + (save-excursion + (skip-chars-backward " ]})\"'") + (memq (preceding-char) '(?. ?? ?!)))) + (defun current-fill-column () "Return the fill-column to use for this line. The fill-column to use for a buffer is stored in the variable `fill-column', @@ -106,9 +141,10 @@ (defun canonically-space-region (beg end) "Remove extra spaces between words in region. Leave one space between words, two at end of sentences or after colons -(depending on values of `sentence-end-double-space' and `colon-double-space'). - Remove indentation from each line." +\(depending on values of `sentence-end-double-space' and `colon-double-space'). +Remove indentation from each line." (interactive "r") + ;;;### 97/3/14 jhod: Do I have to add anything here for kinsoku? (save-excursion (goto-char beg) ;; XEmacs - (ENE/stig from fa-extras.el): Skip the start of a comment. @@ -149,6 +185,7 @@ ;; XEmacs -- added DONT-SKIP-FIRST. Port of older code changes by Stig. ;; #### probably this junk is broken -- do-auto-fill doesn't actually use ;; it. If so, it should be removed. + (defun fill-context-prefix (from to &optional first-line-regexp dont-skip-first) "Compute a fill prefix from the text between FROM and TO. @@ -172,7 +209,9 @@ (move-to-left-margin) ;; XEmacs change (let ((start (point)) - (eol (save-excursion (end-of-line) (point)))) + ; jhod: no longer used? + ;(eol (save-excursion (end-of-line) (point))) + ) (setq result (if (not (looking-at paragraph-start)) (cond ((and adaptive-fill-regexp (looking-at adaptive-fill-regexp)) @@ -319,8 +358,40 @@ (goto-char from) (skip-chars-forward " \t") ;; Then change all newlines to spaces. - (subst-char-in-region from (point-max) ?\n ?\ ) - (if (and nosqueeze (not (eq justify 'full))) + ;;; 97/3/14 jhod: Kinsoku change + ;; Spacing is not necessary for charcters of no word-separater. + ;; The regexp word-across-newline is used for this check. + (if (not (and (featurep 'mule) + (stringp word-across-newline))) + (subst-char-in-region from (point-max) ?\n ?\ ) + ;; + ;; WAN +NL+WAN --> WAN + WAN + ;; not(WAN)+NL+WAN --> not(WAN) + WAN + ;; WAN +NL+not(WAN) --> WAN + not(WAN) + ;; SPC +NL+not(WAN) --> SPC + not(WAN) + ;; not(WAN)+NL+not(WAN) --> not(WAN) + SPC + not(WAN) + ;; + (goto-char from) + (end-of-line) + (while (not (eobp)) + ;; Insert SPC only when point is between nonWAN. Insert + ;; before deleting to preserve marker if possible. + (if (or (prog2 ; check following char. + (forward-char) ; skip newline + (or (eobp) + (looking-at word-across-newline)) + (forward-char -1)) + (prog2 ; check previous char. + (forward-char -1) + (or (eq (following-char) ?\ ) + (looking-at word-across-newline)) + (forward-char))) + nil + (insert ?\ )) + (delete-char 1) ; delete newline + (end-of-line))) + ;; end patch + (if (and nosqueeze (not (eq justify 'full))) nil (canonically-space-region (or squeeze-after (point)) (point-max)) (goto-char (point-max)) @@ -330,14 +401,20 @@ (goto-char (point-min)) ;; This is the actual filling loop. - (let ((prefixcol 0) linebeg) + (let ((prefixcol 0) linebeg + (re-break-point (if (featurep 'mule) + (concat "[ \n\t]\\|" word-across-newline) + "[ \n\t]"))) (while (not (eobp)) (setq linebeg (point)) (move-to-column (1+ (current-fill-column))) (if (eobp) (or nosqueeze (delete-horizontal-space)) ;; Move back to start of word. - (skip-chars-backward "^ \n" linebeg) + ;; 97/3/14 jhod: Kinsoku + ;(skip-chars-backward "^ \n" linebeg) + (fill-move-backward-to-break-point re-break-point linebeg) + ;; end patch ;; Don't break after a period followed by just one space. ;; Move back to the previous place to break. ;; The reason is that if a period ends up at the end of a line, @@ -350,7 +427,12 @@ (not (eq (following-char) ?\ )) (eq (char-after (- (point) 2)) ?\.)) (forward-char -2) - (skip-chars-backward "^ \n" linebeg))) + ;; 97/3/14 jhod: Kinsoku + ;(skip-chars-backward "^ \n" linebeg))) + (fill-move-backward-to-break-point re-break-point linebeg))) + (if (featurep 'mule) (kinsoku-process)) + ;end patch + ;; If the left margin and fill prefix by themselves ;; pass the fill-column. or if they are zero ;; but we have no room for even one word, @@ -373,7 +455,10 @@ (and (looking-at "\\. ") (not (looking-at "\\. "))))))) (skip-chars-forward " \t") - (skip-chars-forward "^ \n\t") + ;; 94/3/14 jhod: Kinsoku + ;(skip-chars-forward "^ \n\t") + (fill-move-forward-to-break-point re-break-point) + ;; end patch (setq first nil))) ;; Normally, move back over the single space between the words. (forward-char -1)) @@ -401,7 +486,10 @@ (and (looking-at "\\. ") (not (looking-at "\\. "))))))) (skip-chars-forward " \t") - (skip-chars-forward "^ \t\n") + ;; 97/3/14 jhod: Kinsoku + ;(skip-chars-forward "^ \t\n") + (fill-move-forward-to-break-point re-break-point) + ;; end patch (setq first nil)))) ;; Check again to see if we got to the end of the paragraph. (if (save-excursion (skip-chars-forward " \t") (eobp)) @@ -409,6 +497,43 @@ ;; Replace whitespace here with one newline, then indent to left ;; margin. (skip-chars-backward " \t") + ;; 97/3/14 jhod: More kinsoku stuff + (if (featurep 'mule) + ;; WAN means chars which match word-across-newline. + ;; (0) | SPC + SPC* --> NL + ;; (1) WAN | SPC + SPC* --> WAN + SPC + NL + ;; (2) | SPC + SPC* + WAN --> SPC + NL + WAN + ;; (3) '.' | SPC + nonSPC --> '.' + SPC + NL + nonSPC + ;; (4) '.' | SPC + SPC --> '.' + NL + ;; (5) | SPC* --> NL + (let ((start (point)) ; 92.6.30 by K.Handa + (ch (following-char))) + (if (and (= ch ? ) + (progn ; not case (0) -- 92.6.30 by K.Handa + (skip-chars-forward " \t") + (not (eobp))) + (or + (progn ; case (1) + (goto-char start) + (forward-char -1) + (looking-at word-across-newline)) + (progn ; case (2) + (goto-char start) + (skip-chars-forward " \t") + (and (not (eobp)) + (looking-at word-across-newline) + ;; never leave space after the end of sentence + (not (fill-end-of-sentence-p)))) + (progn ; case (3) + (goto-char (1+ start)) + (and (not (eobp)) + (/= (following-char) ? ) + (fill-end-of-sentence-p))))) + ;; We should keep one SPACE before NEWLINE. (1),(2),(3) + (goto-char (1+ start)) + ;; We should delete all SPACES around break point. (4),(5) + (goto-char start)))) + ;; end of patch (insert ?\n) ;; Give newline the properties of the space(s) it replaces (set-text-properties (1- (point)) (point) @@ -627,6 +752,16 @@ (if (region-active-p) (region-end) (point)))) (set-justification b e 'center t)) +;; 97/3/14 jhod: This functions are added for Kinsoku support +(defun find-space-insertable-point () + "Search backward for a permissable point for inserting justification spaces" + (if (boundp 'space-insertable) + (if (re-search-backward space-insertable nil t) + (progn (forward-char 1) + t) + nil) + (search-backward " " nil t))) + ;; A line has up to six parts: ;; ;; >>> hello. @@ -754,14 +889,15 @@ ;; Ncols is number of additional spaces needed (if (> ncols 0) (if (and (not eop) - (search-backward " " nil t)) + ;; 97/3/14 jhod: Kinsoku + (find-space-insertable-point)) ;(search-backward " " nil t)) (while (> ncols 0) (let ((nmove (+ 3 (random 3)))) (while (> nmove 0) - (or (search-backward " " nil t) + (or (find-space-insertable-point) ;(search-backward " " nil t) (progn (goto-char (point-max)) - (search-backward " "))) + (find-space-insertable-point))) ;(search-backward " "))) (skip-chars-backward " ") (setq nmove (1- nmove)))) ;; XEmacs change diff -r e183fc049578 -r fe104dbd9147 lisp/prim/help.el --- a/lisp/prim/help.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/help.el Mon Aug 13 09:19:45 2007 +0200 @@ -905,8 +905,8 @@ (princ (format ".\n -- loads from \"%s\"" file-name) stream)) (if home (princ (format ".\n -- loaded from %s" home))) - (princ ".") - (terpri) + (princ "." stream) + (terpri stream) (cond (kbd-macro-p (princ "These characters are executed:\n\n\t" stream) (princ (key-description def) stream) @@ -935,7 +935,7 @@ (progn (princ doc stream) (or (eq ?\n (aref doc (1- (length doc)))) - (terpri))))))))) + (terpri stream))))))))) (defun describe-function-arglist (function) @@ -1137,23 +1137,52 @@ (message "%s is not on any keys" definition))) nil) -(defun locate-library (library &optional nosuffix) - "Show the full path name of XEmacs library LIBRARY. +;; Synched with Emacs 19.35 +(defun locate-library (library &optional nosuffix path interactive-call) + "Show the precise file name of Emacs library LIBRARY. This command searches the directories in `load-path' like `M-x load-library' to find the file that `M-x load-library RET LIBRARY RET' would load. Optional second arg NOSUFFIX non-nil means don't add suffixes `.elc' or `.el' -to the specified name LIBRARY (a la calling `load' instead of `load-library')." - (interactive "sLocate library: \nP") - ;; Let's accept both symbols and strings, since they're often equivalent - (when (symbolp library) - (setq library (symbol-name library))) - ;; XEmacs: We have the nifty `locate-file' so we use it. - (let ((file (locate-file library load-path (if nosuffix nil ".elc:.el:")))) - (when (interactive-p) - (if file - (message "Library is file %s" file) - (message "No library %s in search path" library))) - file)) +to the specified name LIBRARY. + +If the optional third arg PATH is specified, that list of directories +is used instead of `load-path'." + (interactive (list (read-string "Locate library: ") + nil nil + t)) + (let (result) + (catch 'answer + (mapcar + (lambda (dir) + (mapcar + (lambda (suf) + (let ((try (expand-file-name (concat library suf) dir))) + (and (file-readable-p try) + (null (file-directory-p try)) + (progn + (setq result try) + (throw 'answer try))))) + (if nosuffix + '("") + (let ((basic '(".elc" ".el" "")) + (compressed '(".Z" ".gz" ""))) + ;; If autocompression mode is on, + ;; consider all combinations of library suffixes + ;; and compression suffixes. + (if (rassq 'jka-compr-handler file-name-handler-alist) + (apply 'nconc + (mapcar (lambda (compelt) + (mapcar (lambda (baselt) + (concat baselt compelt)) + basic)) + compressed)) + basic))))) + (or path load-path))) + (and interactive-call + (if result + (message "Library is file %s" result) + (message "No library %s in search path" library))) + result)) ;; Functions ported from C into Lisp in XEmacs diff -r e183fc049578 -r fe104dbd9147 lisp/prim/itimer.el --- a/lisp/prim/itimer.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/itimer.el Mon Aug 13 09:19:45 2007 +0200 @@ -45,7 +45,7 @@ ;; ;; See the doc strings of these functions for more information. -(defvar itimer-version "1.03" +(defvar itimer-version "1.04" "Version number of the itimer package.") (defvar itimer-list nil @@ -183,7 +183,7 @@ (defun itimer-is-idle (itimer) "Returns non-nil if ITIMER is an idle timer. -Normal timers eexpire after a set interval. Idle timers expire +Normal timers expire after a set interval. Idle timers expire only after Emacs has been idle for a specific interval. ``Idle'' means no command events within the interval." (check-itimer itimer) @@ -220,7 +220,7 @@ ;; timeout value would expire before we would normally ;; wakeup, wakeup now and recompute a new wakeup time. (or (and (< value itimer-next-wakeup) - (get-itimer (itimer-name itimer)) + (and (itimer-name itimer) (get-itimer (itimer-name itimer))) (progn (itimer-driver-wakeup) (setcar (cdr itimer) value) (itimer-driver-wakeup) @@ -694,24 +694,25 @@ ;; allow keyboard quit to occur, but catch and report it. ;; provide the variable `current-itimer' in case the function ;; is interested. - (condition-case condition-data - (save-match-data - (let* ((current-itimer itimer) - (quit-flag nil) - (inhibit-quit nil) - itimer itimers time-elapsed) - (if (itimer-uses-arguments current-itimer) - (apply (itimer-function current-itimer) - (itimer-function-arguments current-itimer)) - (funcall (itimer-function current-itimer))))) - (error (message "itimer \"%s\" signaled: %s" (itimer-name itimer) - (prin1-to-string condition-data))) - (quit (message "itimer \"%s\" quit" (itimer-name itimer)))) - ;; restart the itimer if we should, otherwise delete it. - (if (null (itimer-restart itimer)) - (delete-itimer itimer) - (set-itimer-value-internal itimer (itimer-restart itimer)) - (setq next-wakeup (min next-wakeup (itimer-value itimer))))) + (unwind-protect + (condition-case condition-data + (save-match-data + (let* ((current-itimer itimer) + (quit-flag nil) + (inhibit-quit nil) + itimer itimers time-elapsed) + (if (itimer-uses-arguments current-itimer) + (apply (itimer-function current-itimer) + (itimer-function-arguments current-itimer)) + (funcall (itimer-function current-itimer))))) + (error (message "itimer \"%s\" signaled: %s" (itimer-name itimer) + (prin1-to-string condition-data))) + (quit (message "itimer \"%s\" quit" (itimer-name itimer)))) + ;; restart the itimer if we should, otherwise delete it. + (if (null (itimer-restart itimer)) + (delete-itimer itimer) + (set-itimer-value-internal itimer (itimer-restart itimer)) + (setq next-wakeup (min next-wakeup (itimer-value itimer)))))) (setq itimers (cdr itimers))) ;; if user is editing itimers, update displayed info (if (eq major-mode 'itimer-edit-mode) @@ -728,8 +729,11 @@ (process-send-string itimer-process "3\n")) ;; if there are no active itimers, return quickly. (if itimer-list - (setq itimer-next-wakeup - (itimer-run-expired-timers (string-to-int string))) + (let ((wakeup nil)) + (unwind-protect + (setq wakeup (itimer-run-expired-timers (string-to-int string))) + (and (null wakeup) (process-send-string process "1\n"))) + (setq itimer-next-wakeup wakeup)) (setq itimer-next-wakeup 600)) ;; tell itimer-process when to wakeup again (process-send-string itimer-process @@ -783,8 +787,8 @@ (defun itimer-timer-wakeup () (let ((inhibit-quit t)) - (cond ((fboundp 'cancel-timer) - (cancel-timer itimer-timer)) + (cond ;((fboundp 'cancel-timer) + ; (cancel-timer itimer-timer)) ((fboundp 'disable-timeout) (disable-timeout itimer-timer))) (setq itimer-timer (add-timeout itimer-short-interval @@ -818,10 +822,12 @@ (let* ((inhibit-quit t) (now (current-time)) (elapsed (itimer-time-difference now itimer-timer-last-wakeup)) - sleep) - (setq itimer-timer-last-wakeup now - sleep (itimer-run-expired-timers elapsed) - itimer-next-wakeup sleep + (sleep nil)) + (setq itimer-timer-last-wakeup now) + (unwind-protect + (setq sleep (itimer-run-expired-timers elapsed)) + (and (null sleep) (add-timeout 1 'itimer-timer-driver nil nil))) + (setq itimer-next-wakeup sleep itimer-timer (add-timeout sleep 'itimer-timer-driver nil nil)))) (defun itimer-driver-start () diff -r e183fc049578 -r fe104dbd9147 lisp/prim/loadup.el --- a/lisp/prim/loadup.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/loadup.el Mon Aug 13 09:19:45 2007 +0200 @@ -206,6 +206,7 @@ (load-gc "energize/energize-load.el")) (when (featurep 'sparcworks) (load-gc "sunpro/sunpro-load.el")) + (load-gc "custom-load") (fmakunbound 'load-gc) )) ;; end of call-with-condition-handler diff -r e183fc049578 -r fe104dbd9147 lisp/prim/modeline.el --- a/lisp/prim/modeline.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/modeline.el Mon Aug 13 09:19:45 2007 +0200 @@ -293,32 +293,34 @@ (defun modeline-minor-mode-menu (event) (interactive "e") - (popup-menu-and-execute-in-window - (cons (format "Minor Mode Commands for %S:" - (buffer-name (event-buffer event))) - (apply 'nconc - (mapcar - #'(lambda (x) - (let* ((toggle-sym (car x)) - (toggle-fun - (or (get toggle-sym - 'modeline-toggle-function) - (and (fboundp toggle-sym) - (commandp toggle-sym) - toggle-sym)))) - (if (not toggle-fun) nil - (list (vector - (concat (if (and (boundp toggle-sym) - (symbol-value toggle-sym)) - "turn off " "turn on ") - (if (symbolp toggle-fun) - (symbol-name toggle-fun) - (symbol-name toggle-sym))) - - toggle-fun - t))))) - minor-mode-alist))) - event)) + (save-excursion + (set-buffer (event-buffer event)) + (popup-menu-and-execute-in-window + (cons (format "Minor Mode Commands for %S:" + (buffer-name (event-buffer event))) + (apply 'nconc + (mapcar + #'(lambda (x) + (let* ((toggle-sym (car x)) + (toggle-fun + (or (get toggle-sym + 'modeline-toggle-function) + (and (fboundp toggle-sym) + (commandp toggle-sym) + toggle-sym)))) + (if (not toggle-fun) nil + (list (vector + (concat (if (and (boundp toggle-sym) + (symbol-value toggle-sym)) + "turn off " "turn on ") + (if (symbolp toggle-fun) + (symbol-name toggle-fun) + (symbol-name toggle-sym))) + + toggle-fun + t))))) + minor-mode-alist))) + event))) (defvar modeline-minor-mode-map (make-sparse-keymap 'modeline-minor-mode-map) "Keymap consulted for mouse-clicks on the minor-mode modeline list.") diff -r e183fc049578 -r fe104dbd9147 lisp/prim/mouse.el --- a/lisp/prim/mouse.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/mouse.el Mon Aug 13 09:19:45 2007 +0200 @@ -1048,7 +1048,9 @@ (if zmacs-regions (funcall 'default-mouse-track-cleanup-extents-hook) (let ((extent default-mouse-track-extent) - (func #'(lambda (e) (set-extent-face e 'primary-selection)))) + (func #'(lambda (e) + (and (extent-live-p e) + (set-extent-face e 'primary-selection))))) (add-hook 'pre-command-hook 'default-mouse-track-cleanup-extents-hook) (if (consp extent) ; rectangle-p (mapcar func extent) diff -r e183fc049578 -r fe104dbd9147 lisp/prim/obsolete.el --- a/lisp/prim/obsolete.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/obsolete.el Mon Aug 13 09:19:45 2007 +0200 @@ -608,9 +608,9 @@ (color-instance-rgb-components (make-color-instance color))) (make-compatible 'x-color-values 'color-instance-rgb-components) -;; The name of char-int is unintuitive and silly. -(define-obsolete-function-alias 'char-int 'char-to-int) +;; The name of char-int is unintuitive and silly, but in CLtL2. +(define-compatible-function-alias 'char-int 'char-to-int) ;; likewise with int-char. -(define-obsolete-function-alias 'int-char 'int-to-char) +(define-compatible-function-alias 'int-char 'int-to-char) ;;; obsolete.el ends here diff -r e183fc049578 -r fe104dbd9147 lisp/prim/simple.el --- a/lisp/prim/simple.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/simple.el Mon Aug 13 09:19:45 2007 +0200 @@ -52,6 +52,11 @@ ;; this isn't a user-visible change. These functions have also been altered ;; to use (mark t) for the same reason. +;; 97/3/14 Jareth Hein (jhod@po.iijnet.or.jp) added kinsoku processing (support +;; for filling of Asian text) into the fill code. This was ripped bleeding from +;; Mule-2.3, and could probably use some feature additions (like additional wrap +;; styles, etc) + ;;; Code: (defun newline (&optional arg) @@ -2213,6 +2218,11 @@ (fill-point (let ((opoint (point)) bounce + ;; 97/3/14 jhod: Kinsoku + (re-break-point (if (featurep 'mule) + (concat "[ \t\n]\\|" word-across-newline) + "[ \t\n]")) + ;; end patch (first t)) (save-excursion (move-to-column (1+ fill-column)) @@ -2229,15 +2239,24 @@ (and (looking-at "\\. ") (not (looking-at "\\. ")))))) (setq first nil) - (skip-chars-backward "^ \t\n") + ;; 97/3/14 jhod: Kinsoku + ; (skip-chars-backward "^ \t\n")) + (fill-move-backward-to-break-point re-break-point) + ;; end patch ;; If we find nowhere on the line to break it, ;; break after one word. Set bounce to t ;; so we will not keep going in this while loop. (if (bolp) (progn - (re-search-forward "[ \t]" opoint t) + ;; 97/3/14 jhod: Kinsoku + ; (re-search-forward "[ \t]" opoint t) + (fill-move-forward-to-break-point re-break-point + opoint) + ;; end patch (setq bounce t))) (skip-chars-backward " \t")) + (if (and (featurep 'mule) + (or bounce (bolp))) (kinsoku-process)) ;; 97/3/14 jhod: Kinsoku ;; Let fill-point be set to the place where we end up. (point))))) @@ -2256,7 +2275,7 @@ ;; break the line there. (if (save-excursion (goto-char fill-point) - (not (bolp))) + (not (or (bolp) (eolp)))) ; 97/3/14 jhod: during kinsoku processing it is possible to move beyond (let ((prev-column (current-column))) ;; If point is at the fill-point, do not `save-excursion'. ;; Otherwise, if a comment prefix or fill-prefix is inserted, @@ -2264,7 +2283,20 @@ (if (save-excursion (skip-chars-backward " \t") (= (point) fill-point)) - (indent-new-comment-line) + ;; 97/3/14 jhod: Kinsoku processing + ;(indent-new-comment-line) + (let ((spacep (memq (preceding-char) '(?\ ?\t)))) + (indent-new-comment-line) + ;; if user type space explicitly, leave SPC + ;; even if there is no WAN. + (if spacep + (save-excursion + (goto-char fill-point) + ;; put SPC except that there is SPC + ;; already or there is sentence end. + (or (memq (following-char) '(?\ ?\t)) + (fill-end-of-sentence-p) + (insert ?\ ))))) (save-excursion (goto-char fill-point) (indent-new-comment-line))) @@ -2401,7 +2433,8 @@ (auto-fill-mode 1)) (defun set-fill-column (arg) - "Set `fill-column' to current column, or to argument if given. + "Set `fill-column' to specified argument. +Just \\[universal-argument] as argument means to use the current column The variable `fill-column' has a separate value for each buffer." (interactive "_P") ; XEmacs (cond ((integerp arg) @@ -2435,6 +2468,9 @@ (interactive) (let (comcol comstart) (skip-chars-backward " \t") + ;; 97/3/14 jhod: Kinsoku processing + (if (featurep 'mule) + (kinsoku-process)) (delete-region (point) (progn (skip-chars-forward " \t") (point))) @@ -2447,6 +2483,7 @@ ;; fa-extras, which I'm not gonna do. His changes are to (1) execute ;; the save-excursion below unconditionally, and (2) uncomment the check ;; for (not comment-multi-line) further below. --Stig + ;;### jhod: probably need to fix this for kinsoku processing (if (not comment-multi-line) (save-excursion (if (and comment-start-skip diff -r e183fc049578 -r fe104dbd9147 lisp/prim/startup.el --- a/lisp/prim/startup.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/prim/startup.el Mon Aug 13 09:19:45 2007 +0200 @@ -883,7 +883,7 @@ "To get out of XEmacs, type " (key save-buffers-kill-emacs) ".\n" "Type " (key help-with-tutorial) " for a tutorial on using XEmacs.\n" "Type " (key info) " to enter Info, " - "which you can use to read online documentation.\n\n" + "which you can use to read online documentation.\n" (face (bold red) ( "\ For tips and answers to frequently asked questions, see the XEmacs FAQ. \(It's on the Help menu, or type " (key xemacs-local-faq) " [a capital F!].\)")))) @@ -1208,6 +1208,12 @@ ) )) + ;; 1997/03/06 by Jeff Miller + ;; initialize 'site-directory'. This is the site-lisp dir used by + ;; XEmacs + (if site-lisp + (setq site-directory (file-name-as-directory site-lisp)) + ) ;; If running from the build directory, always prefer the exec-directory ;; that is here over to the one that came from paths.h. (when (or (and (null exec-directory) lib-src) diff -r e183fc049578 -r fe104dbd9147 lisp/prim/timer.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/prim/timer.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,308 @@ +;;; timer.el --- run a function with args at some time in future. + +;; Copyright (C) 1996 Free Software Foundation, Inc. + +;; Maintainer: FSF + +;; This file is part of GNU Emacs. + +;; GNU Emacs 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. + +;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; This package gives you the capability to run Emacs Lisp commands at +;; specified times in the future, either as one-shots or periodically. + +;;; Code: + +(require 'itimer) + +(fset 'timer-create 'make-itimer) + +(fset 'timerp 'itimerp) + +;(defvar timer-idle-list nil +; "List of active idle-time timers in order of increasing time") +(defvaralias 'timer-idle-list 'itimer-list) +(defvaralias 'timer-list 'itimer-list) + + +(defun timer-set-time (timer time &optional delta) + "Set the trigger time of TIMER to TIME. +TIME must be in the internal format returned by, e.g., `current-time'. +If optional third argument DELTA is a non-zero integer, make the timer +fire repeatedly that many seconds apart." + (set-itimer-value timer (itimer-time-difference time (current-time))) + (and delta (check-nonnegative-number delta)) + (and delta (set-itimer-restart timer delta)) + timer) + +(defun timer-set-idle-time (timer secs &optional repeat) + "Set the trigger idle time of TIMER to SECS. +If optional third argument REPEAT is non-nil, make the timer +fire each time Emacs is idle for that many seconds." + (set-itimer-is-idle timer t) + (set-itimer-value timer secs) + (when repeat + (set-itimer-restart timer secs)) + timer) + +(defun timer-relative-time (time secs &optional usecs) + "Advance TIME by SECS seconds and optionally USECS microseconds. +SECS may be a fraction." + (let ((high (car time)) + (low (if (consp (cdr time)) (nth 1 time) (cdr time))) + (micro (if (numberp (car-safe (cdr-safe (cdr time)))) + (nth 2 time) + 0))) + ;; Add + (if usecs (setq micro (+ micro usecs))) + (if (floatp secs) + (setq micro (+ micro (floor (* 1000000 (- secs (floor secs))))))) + (setq low (+ low (floor secs))) + + ;; Normalize + (setq low (+ low (/ micro 1000000))) + (setq micro (mod micro 1000000)) + (setq high (+ high (/ low 65536))) + (setq low (logand low 65535)) + + (list high low (and (/= micro 0) micro)))) + +(defun timer-inc-time (timer secs &optional usecs) + "Increment the time set in TIMER by SECS seconds and USECS microseconds. +SECS may be a fraction." + (let ((time (itimer-value timer))) + (setq time (+ time secs (if (and usecs (fboundp 'lisp-float-type)) + (/ usecs (float 1000000)) + 0))) + (set-itimer-value timer time))) + +(defun timer-set-time-with-usecs (timer time usecs &optional delta) + "Set the trigger time of TIMER to TIME. +TIME must be in the internal format returned by, e.g., `current-time'. +If optional third argument DELTA is a non-zero integer, make the timer +fire repeatedly that many seconds apart." + (let ((list (list nil nil nil))) + (setcar list (car time)) + (setcar (nthcdr 1 list) (if (consp (cdr time)) + (car (cdr time)) + (cdr time))) + (setcar (nthcdr 2 list) usecs) + (set-itimer-value timer (itimer-time-difference list (current-time))) + (set-itimer-restart timer delta) + timer)) + +(defun timer-set-function (timer function &optional args) + "Make TIMER call FUNCTION with optional ARGS when triggering." + (set-itimer-function timer function) + (set-itimer-function-arguments timer args) + (set-itimer-uses-arguments timer t) + timer) + +(defun timer-activate (timer) + "Put TIMER on the list of active timers." + (activate-itimer timer)) + +(defun timer-activate-when-idle (timer) + "Arrange to activate TIMER whenever Emacs is next idle." + (set-itimer-is-idle timer t) + (set-itimer-uses-arguments timer nil) + ;(unless (memq timer timer-idle-list) + ;(setq timer-idle-list (cons timer timer-idle-list))) + (activate-itimer timer)) + +;; can't do this, different kind of timer +;;(defalias 'disable-timeout 'cancel-timer) + +(defun cancel-timer (timer) + "Remove TIMER from the list of active timers." + ;(setq timer-idle-list (delq timer timer-idle-list)) + (delete-itimer timer)) + +(defun cancel-function-timers (function) + "Cancel all timers scheduled by `run-at-time' which would run FUNCTION." + (interactive "aCancel timers of function: ") + (let ((p itimer-list)) + (while p + (if (eq function (itimer-function p)) + (progn + (setq p (cdr p)) + (delete-itimer (car p))) + (setq p (cdr p)))))) + +;;;###autoload +(defun run-at-time (time repeat function &rest args) + "Perform an action after a delay of SECS seconds. +Repeat the action every REPEAT seconds, if REPEAT is non-nil. +TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds +from now, or a value from `encode-time'. +REPEAT may be an integer or floating point number. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." + (interactive "sRun at time: \nNRepeat interval: \naFunction: ") + + ;; Special case: nil means "now" and is useful when repeating. + (if (null time) + (setq time (current-time))) + + ;; Handle numbers as relative times in seconds. + (if (numberp time) + (setq time (timer-relative-time (current-time) time))) + + ;; Handle relative times like "2 hours and 35 minutes" + (if (stringp time) + (let ((secs (timer-duration time))) + (if secs + (setq time (timer-relative-time (current-time) secs))))) + + ;; Handle "11:23pm" and the like. Interpret it as meaning today + ;; which admittedly is rather stupid if we have passed that time + ;; already. (Though only Emacs hackers hack Emacs at that time.) + (if (stringp time) + (progn + (require 'diary-lib) + (let ((hhmm (diary-entry-time time)) + (now (decode-time))) + (if (>= hhmm 0) + (setq time + (encode-time 0 (% hhmm 100) (/ hhmm 100) (nth 3 now) + (nth 4 now) (nth 5 now) (nth 8 now))))))) + + (or (consp time) + (error "Invalid time format")) + + (or (null repeat) + (numberp repeat) + (error "Invalid repetition interval")) + + (let ((timer (timer-create))) + (timer-set-time timer time repeat) + (timer-set-function timer function args) + (timer-activate timer) + timer)) + +;;;###autoload +(defun run-with-timer (secs repeat function &rest args) + "Perform an action after a delay of SECS seconds. +Repeat the action every REPEAT seconds, if REPEAT is non-nil. +SECS and REPEAT may be integers or floating point numbers. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." + (interactive "sRun after delay (seconds): \nNRepeat interval: \naFunction: ") + (apply 'run-at-time secs repeat function args)) + +;;;###autoload +(defun run-with-idle-timer (secs repeat function &rest args) + "Perform an action the next time Emacs is idle for SECS seconds. +If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds. +SECS may be an integer or a floating point number. +The action is to call FUNCTION with arguments ARGS. + +This function returns a timer object which you can use in `cancel-timer'." + (interactive + (list (read-from-minibuffer "Run after idle (seconds): " nil nil t) + (y-or-n-p "Repeat each time Emacs is idle? ") + (intern (completing-read "Function: " obarray 'fboundp t)))) + (let ((timer (timer-create))) + (timer-set-function timer function args) + (timer-set-idle-time timer secs repeat) + (timer-activate-when-idle timer) + timer)) + +(defun with-timeout-handler (tag) + (throw tag 'timeout)) + +;;;###autoload (put 'with-timeout 'lisp-indent-function 1) + +;;;###autoload +(defmacro with-timeout (list &rest body) + "Run BODY, but if it doesn't finish in SECONDS seconds, give up. +If we give up, we run the TIMEOUT-FORMS and return the value of the last one. +The call should look like: + (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...) +The timeout is checked whenever Emacs waits for some kind of external +event \(such as keyboard input, input from subprocesses, or a certain time); +if the program loops without waiting in any way, the timeout will not +be detected." + (let ((seconds (car list)) + (timeout-forms (cdr list))) + `(let ((with-timeout-tag (cons nil nil)) + with-timeout-value with-timeout-timer) + (if (catch with-timeout-tag + (progn + (setq with-timeout-timer + (run-with-timer ,seconds nil + 'with-timeout-handler + with-timeout-tag)) + (setq with-timeout-value (progn . ,body)) + nil)) + (progn . ,timeout-forms) + (cancel-timer with-timeout-timer) + with-timeout-value)))) + +(defun y-or-n-p-with-timeout (prompt seconds default-value) + "Like (y-or-n-p PROMPT), with a timeout. +If the user does not answer after SECONDS seconds, return DEFAULT-VALUE." + (with-timeout (seconds default-value) + (y-or-n-p prompt))) + +(defvar timer-duration-words + (list (cons "microsec" 0.000001) + (cons "microsecond" 0.000001) + (cons "millisec" 0.001) + (cons "millisecond" 0.001) + (cons "sec" 1) + (cons "second" 1) + (cons "min" 60) + (cons "minute" 60) + (cons "hour" (* 60 60)) + (cons "day" (* 24 60 60)) + (cons "week" (* 7 24 60 60)) + (cons "fortnight" (* 14 24 60 60)) + (cons "month" (* 30 24 60 60)) ; Approximation + (cons "year" (* 365.25 24 60 60)) ; Approximation + ) + "Alist mapping temporal words to durations in seconds") + +(defun timer-duration (string) + "Return number of seconds specified by STRING, or nil if parsing fails." + (let ((secs 0) + (start 0) + (case-fold-search t)) + (while (string-match + "[ \t]*\\([0-9.]+\\)?[ \t]*\\([a-z]+[a-rt-z]\\)s?[ \t]*" + string start) + (let ((count (if (match-beginning 1) + (string-to-number (match-string 1 string)) + 1)) + (itemsize (cdr (assoc (match-string 2 string) + timer-duration-words)))) + (if itemsize + (setq start (match-end 0) + secs (+ secs (* count itemsize))) + (setq secs nil + start (length string))))) + (if (= start (length string)) + secs + (if (string-match "\\`[0-9.]+\\'" string) + (string-to-number string))))) + +(provide 'timer) + +;;; timer.el ends here diff -r e183fc049578 -r fe104dbd9147 lisp/psgml/psgml-html.el --- a/lisp/psgml/psgml-html.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/psgml/psgml-html.el Mon Aug 13 09:19:45 2007 +0200 @@ -76,10 +76,10 @@ " \n" "\n" " \n" - "

" (s title) "

\n\n" + "

" (s title) "

\n\n" p - "\n\n
\n" - "
" html-helper-address-string "
\n" + "\n\n
\n" + "
" html-helper-address-string "
\n" (html-helper-return-created-string) html-helper-timestamp-start html-helper-timestamp-end diff -r e183fc049578 -r fe104dbd9147 lisp/psgml/psgml-parse.el --- a/lisp/psgml/psgml-parse.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/psgml/psgml-parse.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,5 +1,5 @@ ;;;; psgml-parse.el --- Parser for SGML-editing mode with parsing support -;; $Id: psgml-parse.el,v 1.4 1997/03/08 23:26:54 steve Exp $ +;; $Id: psgml-parse.el,v 1.5 1997/03/16 03:05:41 steve Exp $ ;; Copyright (C) 1994, 1995 Lennart Staflin @@ -1206,7 +1206,7 @@ (sgml-pop-entity) (erase-buffer) ;; For XEmacs-20.0/Mule - (setq file-coding-system 'no-conversion) + (setq buffer-file-coding-system 'no-conversion) (sgml-write-dtd sgml-dtd-info to-file) t)) @@ -1234,7 +1234,7 @@ "Merge the binary coded dtd in the current buffer with the current dtd. The current dtd is the variable sgml-dtd-info. Return t if mereged was successfull or nil if failed." - (setq file-coding-system 'no-conversion) + (setq buffer-file-coding-system 'no-conversion) (goto-char (point-min)) (sgml-read-sexp) ; skip filev (let ((dependencies (sgml-read-sexp)) @@ -2368,7 +2368,7 @@ ;; (reported by Jeffrey Friedl ) (setq mc-flag nil) ;; For XEmacs 20.0/Mule - (setq file-coding-system 'no-conversion) + (setq buffer-file-coding-system 'no-conversion) (when (eq sgml-scratch-buffer (default-value 'sgml-scratch-buffer)) (make-local-variable 'sgml-scratch-buffer) (setq sgml-scratch-buffer nil)) diff -r e183fc049578 -r fe104dbd9147 lisp/quail/quail-tit.el --- a/lisp/quail/quail-tit.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/quail/quail-tit.el Mon Aug 13 09:19:45 2007 +0200 @@ -73,7 +73,7 @@ (let ((buf (get-buffer-create "*tit-work*")) pos ;; tit keywords and default values - (encode '*euc-china*) + (encode 'euc-china) (multichoice t) prompt comment @@ -92,22 +92,22 @@ (erase-buffer) (if (null (string-match "\\.tit$" tit-file)) (setq tit-file (concat tit-file ".tit"))) - (let ((file-coding-system-for-read '*noconv*)) + (let ((coding-system-for-read 'no-conversion)) (insert-file-contents tit-file)) (set-visited-file-name (tit-dest-file tit-file dest-dir)) - (set-file-coding-system '*junet*unix) - + (set-buffer-file-coding-system 'junet-unix) + ;; convert GB or BIG5 to Mule's internal code (save-excursion (if (re-search-forward "^ENCODE:" nil t) (progn (skip-chars-forward " \t") (if (looking-at "GB") - (setq encode '*euc-china*) - (setq encode '*big5*))))) + (setq encode 'euc-china) + (setq encode 'big5))))) (tit-message "Converting %s to Mule's internal code..." encode) - (code-convert 1 (point-max) encode '*internal*) + (decode-coding-region 1 (point-max) encode) (goto-char 1) ;; setting headers diff -r e183fc049578 -r fe104dbd9147 lisp/rmail/rmail.el --- a/lisp/rmail/rmail.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/rmail/rmail.el Mon Aug 13 09:19:45 2007 +0200 @@ -948,7 +948,7 @@ (if (not (featurep 'mule)) (setq size (nth 1 (insert-file-contents tofile))) ;; At first, read the file without converting coding-system. - (setq size (nth 1 (let (file-coding-system-for-read) + (setq size (nth 1 (let ((coding-system-for-read 'no-conversion)) (insert-file-contents tofile)))) ;; 1996/12/9 by MORIOKA Tomohiko ;; Don't code-convert for RMAIL file diff -r e183fc049578 -r fe104dbd9147 lisp/tl/emu-x20.el --- a/lisp/tl/emu-x20.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tl/emu-x20.el Mon Aug 13 09:19:45 2007 +0200 @@ -3,7 +3,7 @@ ;; Copyright (C) 1994,1995,1996,1997 MORIOKA Tomohiko ;; Author: MORIOKA Tomohiko -;; Version: $Id: emu-x20.el,v 1.4 1997/02/15 22:21:24 steve Exp $ +;; Version: $Id: emu-x20.el,v 1.5 1997/03/16 03:05:43 steve Exp $ ;; Keywords: emulation, compatibility, Mule, XEmacs ;; This file is part of XEmacs. @@ -23,6 +23,14 @@ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. +;;; Commentary: + +;; This module requires XEmacs 20.1 b6 or later with mule. + +;;; Commentary: + +;; This module requires XEmacs 20.1 b6 or later with mule. + ;;; Code: (require 'cyrillic) @@ -33,27 +41,20 @@ ;;; (defconst *noconv* 'no-conversion) -(defconst *ctext* 'ctext) -(defconst *hz* 'hz) -(defconst *big5* 'big5) -(defconst *euc-kr* 'euc-kr) -(defconst *koi8* 'koi8) - -(defalias 'set-buffer-file-coding-system 'set-file-coding-system) (defmacro as-binary-process (&rest body) `(let (selective-display ; Disable ^M to nl translation. - (file-coding-system 'no-conversion) + (coding-system-for-write 'no-conversion) process-input-coding-system process-output-coding-system) ,@body)) (defmacro as-binary-input-file (&rest body) - `(let ((file-coding-system-for-read 'no-conversion)) + `(let ((coding-system-for-read 'no-conversion)) ,@body)) (defmacro as-binary-output-file (&rest body) - `(let ((file-coding-system 'no-conversion)) + `(let ((coding-system-for-write 'no-conversion)) ,@body)) @@ -67,7 +68,7 @@ to advanced Emacs features, such as file-name-handlers, format decoding, find-file-hooks, etc. This function ensures that none of these modifications will take place." - (let ((file-coding-system-for-read 'no-conversion)) + (let ((coding-system-for-read 'no-conversion)) (insert-file-contents-literally filename visit beg end replace) )) diff -r e183fc049578 -r fe104dbd9147 lisp/tl/emu-xemacs.el --- a/lisp/tl/emu-xemacs.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tl/emu-xemacs.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,14 +1,14 @@ ;;; emu-xemacs.el --- emu API implementation for XEmacs ;; Copyright (C) 1995 Free Software Foundation, Inc. -;; Copyright (C) 1995,1996 MORIOKA Tomohiko +;; Copyright (C) 1995,1996,1997 MORIOKA Tomohiko ;; Author: MORIOKA Tomohiko ;; Version: -;; $Id: emu-xemacs.el,v 1.2 1997/03/08 23:26:56 steve Exp $ +;; $Id: emu-xemacs.el,v 1.3 1997/03/16 03:05:44 steve Exp $ ;; Keywords: emulation, compatibility, XEmacs -;; This file is part of emu. +;; This file is part of XEmacs. ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as @@ -27,7 +27,7 @@ ;;; Code: -;;; @ text property +;;; @ face ;;; (or (fboundp 'face-list) @@ -42,23 +42,9 @@ (or (face-differs-from-default-p 'underline) (set-face-underline-p 'underline t)) -(or (fboundp 'tl:set-text-properties) - (defun tl:set-text-properties (start end props &optional buffer) - (if (or (null buffer) (bufferp buffer)) - (if props - (while props - (put-text-property - start end (car props) (nth 1 props) buffer) - (setq props (nthcdr 2 props))) - (remove-text-properties start end ()) - ))) - ) -(defun tl:add-text-properties (start end properties &optional object) - (add-text-properties start end - (append properties (list 'highlight t)) - object) - ) +;;; @ overlay +;;; (defalias 'tl:make-overlay 'make-extent) (defalias 'tl:overlay-put 'set-extent-property) diff -r e183fc049578 -r fe104dbd9147 lisp/tl/emu.el --- a/lisp/tl/emu.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tl/emu.el Mon Aug 13 09:19:45 2007 +0200 @@ -3,7 +3,7 @@ ;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko -;; Version: $Id: emu.el,v 1.4 1997/02/15 22:21:25 steve Exp $ +;; Version: $Id: emu.el,v 1.5 1997/03/16 03:05:44 steve Exp $ ;; Keywords: emulation, compatibility, NEmacs, MULE, Emacs/mule, XEmacs ;; This file is part of emu. @@ -36,7 +36,19 @@ )) ))) +(defmacro defmacro-maybe (name &rest everything-else) + (or (and (fboundp name) + (not (get name 'defmacro-maybe)) + ) + (` (or (fboundp (quote (, name))) + (progn + (defmacro (, name) (,@ everything-else)) + (put (quote (, name)) 'defmacro-maybe t) + )) + ))) + (put 'defun-maybe 'lisp-indent-function 'defun) +(put 'defmacro-maybe 'lisp-indent-function 'defun) (or (boundp 'emacs-major-version) @@ -122,17 +134,18 @@ default-mime-charset))) -;;; @ EMACS 19.29 emulation +;;; @ Emacs 19.29 emulation ;;; (defvar path-separator ":" "Character used to separate concatenated paths.") -(defun-maybe buffer-substring-no-properties (beg end) - "Return the text from BEG to END, without text properties, as a string. -\[emu.el; EMACS 19.29 emulating function]" - (let ((string (buffer-substring beg end))) - (tl:set-text-properties 0 (length string) nil string) +(defun-maybe buffer-substring-no-properties (start end) + "Return the characters of part of the buffer, without the text properties. +The two arguments START and END are character positions; +they can be in either order. [Emacs 19.29 emulating function]" + (let ((string (buffer-substring start end))) + (set-text-properties 0 (length string) nil string) string)) (defun-maybe match-string (num &optional string) @@ -141,7 +154,7 @@ Value is nil if NUMth pair didn't match, or there were less than NUM pairs. Zero means the entire text matched by the whole regexp or whole string. STRING should be given if the last search was by `string-match' on STRING. -\[emu.el; EMACS 19.29 emulating function]" +\[Emacs 19.29 emulating function]" (if (match-beginning num) (if string (substring string (match-beginning num) (match-end num)) @@ -163,21 +176,21 @@ ) )) + +;;; @ Emacs 19.30 emulation +;;; + ;; This function was imported Emacs 19.30. (defun-maybe add-to-list (list-var element) "Add to the value of LIST-VAR the element ELEMENT if it isn't there yet. If you want to use `add-to-list' on a variable that is not defined until a certain package is loaded, you should put the call to `add-to-list' into a hook function that will be run only after loading the package. -\[emu.el; EMACS 19.30 emulating function]" +\[Emacs 19.30 emulating function]" (or (member element (symbol-value list-var)) (set list-var (cons element (symbol-value list-var))) )) - -;;; @ EMACS 19.30 emulation -;;; - (cond ((fboundp 'insert-file-contents-literally) ) ((boundp 'file-name-handler-alist) @@ -188,7 +201,7 @@ to advanced Emacs features, such as file-name-handlers, format decoding, find-file-hooks, etc. This function ensures that none of these modifications will take place. -\[emu.el; Emacs 19.30 emulating function]" +\[Emacs 19.30 emulating function]" (let (file-name-handler-alist) (insert-file-contents filename visit beg end replace) )) @@ -198,29 +211,27 @@ )) -;;; @ EMACS 19.31 emulation +;;; @ Emacs 19.31 emulation ;;; (defun-maybe buffer-live-p (object) "Return non-nil if OBJECT is a buffer which has not been killed. Value is nil if OBJECT is not a buffer or if it has been killed. -\[emu.el; EMACS 19.31 emulating function]" +\[Emacs 19.31 emulating function]" (and object (get-buffer object) (buffer-name (get-buffer object)) )) -(or (fboundp 'save-selected-window) - ;; This function was imported Emacs 19.33. - (defmacro save-selected-window (&rest body) - "Execute BODY, then select the window that was selected before BODY. -\[emu.el; EMACS 19.31 emulating function]" - (list 'let - '((save-selected-window-window (selected-window))) - (list 'unwind-protect - (cons 'progn body) - (list 'select-window 'save-selected-window-window)))) - ) +;; This macro was imported Emacs 19.33. +(defmacro-maybe save-selected-window (&rest body) + "Execute BODY, then select the window that was selected before BODY. +\[Emacs 19.31 emulating function]" + (list 'let + '((save-selected-window-window (selected-window))) + (list 'unwind-protect + (cons 'progn body) + (list 'select-window 'save-selected-window-window)))) ;;; @ XEmacs emulation @@ -228,7 +239,7 @@ (defun-maybe functionp (obj) "Returns t if OBJ is a function, nil otherwise. -\[emu.el; XEmacs emulating function]" +\[XEmacs emulating function]" (or (subrp obj) (byte-code-function-p obj) (and (symbolp obj)(fboundp obj)) diff -r e183fc049578 -r fe104dbd9147 lisp/tl/file-detect.el --- a/lisp/tl/file-detect.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tl/file-detect.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; Author: MORIOKA Tomohiko ;; Version: -;; $Id: file-detect.el,v 1.4 1997/03/08 23:26:56 steve Exp $ +;; $Id: file-detect.el,v 1.5 1997/03/16 03:05:44 steve Exp $ ;; Keywords: install, module ;; This file is part of tl (Tiny Library). @@ -117,31 +117,40 @@ (setq paths (cdr paths)) )))) +(defvar exec-suffix-list '("") + "*List of suffixes for executable.") + +(defun exec-installed-p (file &optional paths suffixes) + "Return absolute-path of FILE if FILE exists in PATHS. +If PATHS is omitted, `exec-path' is used. +If suffixes is omitted, `exec-suffix-list' is used. [file-detect.el]" + (or paths + (setq paths exec-path) + ) + (or suffixes + (setq suffixes exec-suffix-list) + ) + (catch 'tag + (while paths + (let ((stem (expand-file-name file (car paths))) + (sufs suffixes) + ) + (while sufs + (let ((file (concat stem (car sufs)))) + (if (file-exists-p file) + (throw 'tag file) + )) + (setq sufs (cdr sufs)) + )) + (setq paths (cdr paths)) + ))) + (defun module-installed-p (module &optional paths) "Return t if module is provided or exists in PATHS. If PATHS is omitted, `load-path' is used. [file-detect.el]" (or (featurep module) - (let ((name (symbol-name module))) - (if (null paths) - (setq paths load-path) - ) - (catch 'tag - (while paths - (let ((file (expand-file-name name (car paths)))) - (let ((elc-file (concat file ".elc"))) - (if (file-exists-p elc-file) - (throw 'tag elc-file) - )) - (let ((el-file (concat file ".el"))) - (if (file-exists-p el-file) - (throw 'tag el-file) - )) - (if (file-exists-p file) - (throw 'tag file) - ) - ) - (setq paths (cdr paths)) - ))))) + (exec-installed-p (symbol-name module) load-path '(".elc" ".el")) + )) ;;; @ end diff -r e183fc049578 -r fe104dbd9147 lisp/tl/filename.el --- a/lisp/tl/filename.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tl/filename.el Mon Aug 13 09:19:45 2007 +0200 @@ -3,7 +3,7 @@ ;; Copyright (C) 1996 MORIOKA Tomohiko ;; Author: MORIOKA Tomohiko -;; Version: $Id: filename.el,v 1.2 1996/12/28 21:03:09 steve Exp $ +;; Version: $Id: filename.el,v 1.3 1997/03/16 03:05:44 steve Exp $ ;; Keywords: string, file name ;; This file is part of tl (Tiny Library). @@ -43,7 +43,7 @@ (defvar filename-filters (nconc - (and (file-installed-p "kakasi" exec-path) + (and (exec-installed-p "kakasi") '(filename-japanese-to-roman-string) ) '(filename-special-filter diff -r e183fc049578 -r fe104dbd9147 lisp/tm/gnus-charset.el --- a/lisp/tm/gnus-charset.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/gnus-charset.el Mon Aug 13 09:19:45 2007 +0200 @@ -5,7 +5,7 @@ ;; Author: MORIOKA Tomohiko ;; Created: 1996/8/6 ;; Version: -;; $Id: gnus-charset.el,v 1.2 1997/01/04 23:05:18 steve Exp $ +;; $Id: gnus-charset.el,v 1.3 1997/03/16 03:05:45 steve Exp $ ;; Keywords: news, MIME, multimedia, multilingual, encoded-word ;; This file is not part of GNU Emacs yet. @@ -149,7 +149,7 @@ )) (defun gnus-prepare-save-mail-function () (setq file-coding-system *noconv* - coding-system-for-write 'no-conversion) + buffer-file-coding-system 'no-conversion) ) (add-hook 'nnmail-prepare-save-mail-hook 'gnus-prepare-save-mail-function) diff -r e183fc049578 -r fe104dbd9147 lisp/tm/gnus-mime.el --- a/lisp/tm/gnus-mime.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/gnus-mime.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; Author: MORIOKA Tomohiko ;; Created: 1996/8/6 -;; Version: $Revision: 1.5 $ +;; Version: $Revision: 1.6 $ ;; Keywords: news, MIME, multimedia, multilingual, encoded-word ;; This file is not part of GNU Emacs yet. @@ -33,7 +33,7 @@ ;;; (defconst gnus-mime-RCS-ID - "$Id: gnus-mime.el,v 1.5 1997/03/08 23:26:57 steve Exp $") + "$Id: gnus-mime.el,v 1.6 1997/03/16 03:05:45 steve Exp $") (defconst gnus-mime-version (get-version-string gnus-mime-RCS-ID)) @@ -65,30 +65,6 @@ (require 'gnus) (require 'gnus-charset) -(eval-when-compile - (require 'gnus-sum)) - -;;; @ for tm-partial -;;; - -(defun gnus-mime-partial-preview-function () - (gnus-summary-preview-mime-message (gnus-summary-article-number)) - ) - -(call-after-loaded - 'tm-partial - (function - (lambda () - (set-atype 'mime/content-decoding-condition - '((type . "message/partial") - (method . mime-article/grab-message/partials) - (major-mode . gnus-original-article-mode) - (summary-buffer-exp . gnus-summary-buffer) - )) - (set-alist 'tm-partial/preview-article-method-alist - 'gnus-original-article-mode - 'gnus-mime-partial-preview-function) - ))) ;;; @ end diff -r e183fc049578 -r fe104dbd9147 lisp/tm/gnus-sum-mime.el --- a/lisp/tm/gnus-sum-mime.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/gnus-sum-mime.el Mon Aug 13 09:19:45 2007 +0200 @@ -5,7 +5,7 @@ ;; Author: MORIOKA Tomohiko ;; Created: 1996/8/6 ;; Version: -;; $Id: gnus-sum-mime.el,v 1.3 1997/02/15 22:21:26 steve Exp $ +;; $Id: gnus-sum-mime.el,v 1.4 1997/03/16 03:05:46 steve Exp $ ;; Keywords: news, MIME, multimedia, multilingual, encoded-word ;; This file is not part of GNU Emacs yet. @@ -96,6 +96,29 @@ (function gnus-summary-scroll-down)) +;;; @ for tm-partial +;;; + +(defun gnus-mime-partial-preview-function () + (gnus-summary-preview-mime-message (gnus-summary-article-number)) + ) + +(call-after-loaded + 'tm-partial + (function + (lambda () + (set-atype 'mime/content-decoding-condition + '((type . "message/partial") + (method . mime-article/grab-message/partials) + (major-mode . gnus-original-article-mode) + (summary-buffer-exp . gnus-summary-buffer) + )) + (set-alist 'tm-partial/preview-article-method-alist + 'gnus-original-article-mode + 'gnus-mime-partial-preview-function) + ))) + + ;;; @ end ;;; diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tm-def.el --- a/lisp/tm/tm-def.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tm-def.el Mon Aug 13 09:19:45 2007 +0200 @@ -3,7 +3,7 @@ ;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko -;; Version: $Id: tm-def.el,v 1.4 1997/02/15 22:21:26 steve Exp $ +;; Version: $Id: tm-def.el,v 1.5 1997/03/16 03:05:46 steve Exp $ ;; Keywords: mail, news, MIME, multimedia, definition ;; This file is part of tm (Tools for MIME). @@ -118,12 +118,12 @@ "Create a button between FROM and TO with callback FUNC and data DATA." (and tm:button-face (tl:overlay-put (tl:make-overlay from to) 'face tm:button-face)) - (tl:add-text-properties from to - (append (and tm:mouse-face - (list 'mouse-face tm:mouse-face)) - (list 'tm-callback func) - (and data (list 'tm-data data)) - )) + (add-text-properties from to + (append (and tm:mouse-face + (list 'mouse-face tm:mouse-face)) + (list 'tm-callback func) + (and data (list 'tm-data data)) + )) ) (defvar tm:mother-button-dispatcher nil) diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tm-ew-d.el --- a/lisp/tm/tm-ew-d.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tm-ew-d.el Mon Aug 13 09:19:45 2007 +0200 @@ -9,7 +9,7 @@ ;; Original: 1992/07/20 ENAMI Tsugutomo's `mime.el'. ;; Renamed: 1993/06/03 to tiny-mime.el. ;; Renamed: 1995/10/03 from tiny-mime.el. (split off encoder) -;; Version: $Revision: 1.3 $ +;; Version: $Revision: 1.4 $ ;; Keywords: encoded-word, MIME, multilingual, header, mail, news ;; This file is part of tm (Tools for MIME). @@ -42,7 +42,7 @@ ;;; (defconst tm-ew-d/RCS-ID - "$Id: tm-ew-d.el,v 1.3 1997/01/30 02:22:48 steve Exp $") + "$Id: tm-ew-d.el,v 1.4 1997/03/16 03:05:46 steve Exp $") (defconst mime/eword-decoder-version (get-version-string tm-ew-d/RCS-ID)) @@ -199,10 +199,10 @@ (condition-case err (mime/decode-encoded-text charset encoding text must-unfold) (error - (and (tl:add-text-properties 0 (length word) - (and tm:warning-face - (list 'face tm:warning-face)) - word) + (and (add-text-properties 0 (length word) + (and tm:warning-face + (list 'face tm:warning-face)) + word) word))) )) word)) diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tm-file.el --- a/lisp/tm/tm-file.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tm-file.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,10 +1,10 @@ ;;; tm-file.el --- tm-view internal method for file extraction -;; Copyright (C) 1995,1996 Free Software Foundation, Inc. +;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko ;; modified by Shuhei KOBAYASHI -;; Version: $Id: tm-file.el,v 1.2 1996/12/28 21:03:14 steve Exp $ +;; Version: $Id: tm-file.el,v 1.3 1997/03/16 03:05:46 steve Exp $ ;; Keywords: mail, news, MIME, multimedia, file, extract ;; This file is part of tm (Tools for MIME). @@ -60,17 +60,7 @@ (save-excursion (set-buffer tmp-buf) (mime-decode-region (point-min)(point-max) encoding) - (let ((coding-system-for-write 'no-conversion) - (mc-flag nil) ; for Mule - (file-coding-system - (if (featurep 'mule) *noconv*)) - kanji-flag ; for NEmacs - (emx-binary-mode t) ; for OS/2 - jka-compr-compression-info-list ; for jka-compr - jam-zcat-filename-list ; for jam-zcat - require-final-newline) - (write-file filename) - ) + (as-binary-output-file (write-file filename)) (kill-buffer tmp-buf) ))) diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tm-image.el --- a/lisp/tm/tm-image.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tm-image.el Mon Aug 13 09:19:45 2007 +0200 @@ -7,7 +7,7 @@ ;; Dan Rich ;; Maintainer: MORIOKA Tomohiko ;; Created: 1995/12/15 -;; Version: $Id: tm-image.el,v 1.4 1997/02/15 22:21:29 steve Exp $ +;; Version: $Id: tm-image.el,v 1.5 1997/03/16 03:05:46 steve Exp $ ;; Keywords: image, picture, X-Face, MIME, multimedia, mail, news @@ -90,7 +90,7 @@ ;; ;; X-Face ;; - (if (file-installed-p uncompface-program exec-path) + (if (exec-installed-p uncompface-program) (add-hook 'mime-viewer/content-header-filter-hook 'x-face-decode-message-header) ) diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tm-play.el --- a/lisp/tm/tm-play.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tm-play.el Mon Aug 13 09:19:45 2007 +0200 @@ -4,7 +4,7 @@ ;; Author: MORIOKA Tomohiko ;; Created: 1995/9/26 (separated from tm-view.el) -;; Version: $Id: tm-play.el,v 1.3 1997/03/08 23:26:57 steve Exp $ +;; Version: $Id: tm-play.el,v 1.4 1997/03/16 03:05:47 steve Exp $ ;; Keywords: mail, news, MIME, multimedia ;; This file is part of tm (Tools for MIME). @@ -273,7 +273,17 @@ (cons t (mime-charset-to-coding-system default-mime-charset)) )) -(cond (running-mule-merged-emacs +(cond ((boundp 'MULE) ; for MULE 2.3 or older + (defun mime-article::write-region (start end file) + (let ((file-coding-system + (cdr + (or (assq major-mode mime-article/coding-system-alist) + (assq t mime-article/coding-system-alist) + )))) + (write-region start end file) + )) + ) + ((featurep 'mule) ; for Emacs/mule and XEmacs/mule (defun mime-article::write-region (start end file) (let ((coding-system-for-write (cdr @@ -283,18 +293,7 @@ (write-region start end file) )) ) - ((or (boundp 'MULE) - running-xemacs-with-mule) - (defun mime-article::write-region (start end file) - (let ((file-coding-system - (cdr - (or (assq major-mode mime-article/coding-system-alist) - (assq t mime-article/coding-system-alist) - )))) - (write-region start end file) - )) - ) - ((boundp 'NEMACS) + ((boundp 'NEMACS) ; for NEmacs (defun mime-article::write-region (start end file) (let ((kanji-fileio-code (cdr @@ -304,7 +303,7 @@ (write-region start end file) )) ) - (t + (t ; for Emacs 19 or older and XEmacs without mule (defalias 'mime-article::write-region 'write-region) )) @@ -424,9 +423,7 @@ ;;; @ rot13-47 ;;; -(condition-case nil - (require 'view-less) - (error (require 'view))) +(require 'view) (defconst mime-view-text/plain-mode-map (copy-keymap view-mode-map)) (define-key mime-view-text/plain-mode-map diff -r e183fc049578 -r fe104dbd9147 lisp/tm/tmh-comp.el --- a/lisp/tm/tmh-comp.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/tm/tmh-comp.el Mon Aug 13 09:19:45 2007 +0200 @@ -6,7 +6,7 @@ ;; OKABE Yasuo ;; Maintainer: MORIOKA Tomohiko ;; Created: 1996/2/29 (separated from tm-mh-e.el) -;; Version: $Id: tmh-comp.el,v 1.3 1997/02/15 22:21:31 steve Exp $ +;; Version: $Id: tmh-comp.el,v 1.4 1997/03/16 03:05:47 steve Exp $ ;; Keywords: mail, MH, MIME, multimedia, encoded-word, multilingual ;; This file is part of tm (Tools for MIME). @@ -225,12 +225,9 @@ (if (get-buffer name) (throw 'tag (pop-to-buffer name)) ) - (let ((file-coding-system-for-read *noconv*) - (filename - (mh-msg-filename msg mh-draft-folder) - )) + (let ((filename (mh-msg-filename msg mh-draft-folder))) (set-buffer (get-buffer-create name)) - (insert-file-contents filename) + (as-binary-input-file (insert-file-contents filename)) (setq buffer-file-name filename) (setq code-conversion t) ) @@ -241,9 +238,9 @@ name)) (t (prog1 - (let ((file-coding-system-for-read *noconv*)) - (mh-read-draft "clean-up" (mh-msg-filename msg) nil) - ) + (as-binary-input-file + (mh-read-draft "clean-up" (mh-msg-filename msg) nil) + ) (setq code-conversion t) )))) ) diff -r e183fc049578 -r fe104dbd9147 lisp/utils/autoload.el --- a/lisp/utils/autoload.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/utils/autoload.el Mon Aug 13 09:19:45 2007 +0200 @@ -292,9 +292,11 @@ (forward-line 1))) (if dofiles (setq funlist (cdr funlist))))))) - (unless visited + ;;(unless visited ;; We created this buffer, so we should kill it. - (kill-buffer (current-buffer))) + ;; Customize needs it later, we don't want to read the file + ;; in twice. + ;;(kill-buffer (current-buffer))) (set-buffer outbuf) (setq output-end (point-marker)))) (if t ;; done-any @@ -332,6 +334,30 @@ A .el file can set this in its local variables section to make its autoloads go somewhere else.") +(defvar generated-custom-file + (expand-file-name "../lisp/prim/custom-load.el" data-directory) + "*File `update-file-autoloads' puts customization into.") + +;; Written by Per Abrahamsen +(defun autoload-snarf-defcustom (file) + "Snarf all customizations in the current buffer." + (let ((visited (get-file-buffer file))) + (save-excursion + (set-buffer (or visited (find-file-noselect file))) + (when (and file (string-match "\\`\\(.*\\)\\.el\\'" file)) + (goto-char (point-min)) + (condition-case nil + (let ((name (file-name-nondirectory (match-string 1 file)))) + (while t + (let ((expr (read (current-buffer)))) + (when (and (listp expr) + (memq (car expr) '(defcustom defface defgroup))) + (eval expr) + (put (nth 1 expr) 'custom-where name))))) + (error nil))) + (unless (buffer-modified-p) + (kill-buffer (current-buffer)))))) + ;;;###autoload (defun update-file-autoloads (file) "Update the autoloads for FILE in `generated-autoload-file' @@ -370,9 +396,10 @@ (goto-char (point-max)))) ; Append. ;; Add in new sections for file - (generate-file-autoloads file)) + (generate-file-autoloads file) + (autoload-snarf-defcustom file)) - (when (interactive-p) (save-buffer)))) + (when (interactive-p) (save-buffer)))) ;;;###autoload (defun update-autoloads-here () @@ -458,6 +485,32 @@ (unless noninteractive (save-buffer))))) +;; Based on code from Per Abrahamsen +(defun autoload-save-customization () + (save-excursion + (set-buffer (find-file-noselect generated-custom-file)) + (erase-buffer) + (insert + (with-output-to-string + (mapatoms (lambda (symbol) + (let ((members (get symbol 'custom-group)) + item where found) + (when members + (princ "(put '") + (princ symbol) + (princ " 'custom-loads '(") + (while members + (setq item (car (car members)) + members (cdr members) + where (get item 'custom-where)) + (unless (or (null where) + (member where found)) + (when found + (princ " ")) + (prin1 where) + (push where found))) + (princ "))\n"))))))))) + ;;;###autoload (defun batch-update-autoloads () "Update the autoloads for the files or directories on the command line. @@ -479,6 +532,7 @@ ((file-exists-p arg) (update-file-autoloads arg)) (t (error "No such file or directory: %s" arg)))) + (autoload-save-customization) (save-some-buffers t) (message "Done") (kill-emacs 0))) diff -r e183fc049578 -r fe104dbd9147 lisp/utils/eldoc.el --- a/lisp/utils/eldoc.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/utils/eldoc.el Mon Aug 13 09:19:45 2007 +0200 @@ -7,7 +7,7 @@ ;; Keywords: extensions ;; Created: 1995-10-06 -;; $Id: eldoc.el,v 1.2 1997/02/24 01:14:18 steve Exp $ +;; $Id: eldoc.el,v 1.3 1997/03/16 03:05:48 steve Exp $ ;; This file is part of GNU Emacs. @@ -240,7 +240,7 @@ ;; timer, we're still in the middle of executing a command, ;; e.g. a query-replace where it would be annoying to ;; overwrite the echo area. - (and (not this-command) + (and ;(not this-command) (symbolp last-command) (intern-soft (symbol-name last-command) eldoc-message-commands))) diff -r e183fc049578 -r fe104dbd9147 lisp/utils/with-timeout.el --- a/lisp/utils/with-timeout.el Mon Aug 13 09:18:41 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -;;; with-timeout.el --- timeout hackery - -;; Copyright (C) 1992 Free Software Foundation, Inc. -;; Keywords: extensions - -;; This file is part of XEmacs. - -;; XEmacs 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. - -;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Synched up with: Not in FSF. - -(defun with-timeout-timer (tag) - ;; I'm pretty sure the condition-case isn't really necessary here, - ;; but it doesn't hurt. - (condition-case () (throw tag nil) (no-catch nil))) - -;;;###autoload -(defun with-timeout-internal (with-timeout-seconds with-timeout-tag - with-timeout-body with-timeout-forms) - (let ((with-timeout-timeout nil)) - (unwind-protect - (progn - (setq with-timeout-timeout (add-timeout with-timeout-seconds - 'with-timeout-timer - with-timeout-tag)) - (let ((value (catch with-timeout-tag - (prog1 (funcall with-timeout-body) - (setq with-timeout-tag nil))))) - (if with-timeout-tag - (funcall with-timeout-forms) - value))) - (if with-timeout-timeout - (disable-timeout with-timeout-timeout))))) - -;;;###autoload -(defmacro with-timeout (seconds-and-timeout-forms &rest body) - "Usage: (with-timeout (seconds &rest timeout-forms) &rest body) -This is just like progn, but if the given number of seconds expires before -the body returns, then timeout-forms are evaluated and returned instead. -The body won't be interrupted in the middle of a computation: the check for -the timer expiration only occurs when body does a redisplay, or prompts the -user for input, or calls accept-process-output." - (let ((seconds (car seconds-and-timeout-forms)) - (timeout-forms (cdr seconds-and-timeout-forms))) - (` (with-timeout-internal (, seconds) '(, (make-symbol "_with_timeout_")) - #'(lambda () (progn (,@ body))) - #'(lambda () (progn (,@ timeout-forms))))))) - -(put 'with-timeout 'lisp-indent-function 1) - -;;;###autoload -(defun yes-or-no-p-with-timeout (timeout prompt &optional default-value) - "Just like yes-or-no-p, but will time out after TIMEOUT seconds -if the user has not yes answered, returning DEFAULT-VALUE." - (with-timeout (timeout - (message (concat prompt "(yes or no) Timeout to " - (if default-value "Yes" "No"))) - default-value) - (yes-or-no-p prompt))) - -;;;###autoload -(defun y-or-n-p-with-timeout (timeout prompt &optional default-value) - "Just like y-or-n-p, but will time out after TIMEOUT seconds -if the user has not yes answered, returning DEFAULT-VALUE." - (with-timeout (timeout - (message (concat prompt "(yes or no) Timeout to " - (if default-value "Yes" "No"))) - default-value) - (y-or-n-p prompt))) diff -r e183fc049578 -r fe104dbd9147 lisp/version.el --- a/lisp/version.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/version.el Mon Aug 13 09:19:45 2007 +0200 @@ -25,7 +25,7 @@ (defconst emacs-version "20.1" "Version numbers of this version of Emacs.") -(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta6)"))) +(setq emacs-version (purecopy (concat emacs-version " XEmacs Lucid (beta7)"))) (defconst emacs-major-version (progn (or (string-match "^[0-9]+" emacs-version) diff -r e183fc049578 -r fe104dbd9147 lisp/viper/viper.el --- a/lisp/viper/viper.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/viper/viper.el Mon Aug 13 09:19:45 2007 +0200 @@ -8,7 +8,7 @@ ;; Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. -(defconst viper-version "2.93 of February 25, 1997" +(defconst viper-version "2.93 of March 9, 1997" "The current version of Viper") ;; This file is part of GNU Emacs. @@ -607,7 +607,9 @@ ;; expert (define-key vip-insert-basic-map "\C-j" nil) ;; novice - (define-key vip-insert-basic-map "\C-j" 'vip-autoindent)))) + (define-key vip-insert-basic-map "\C-j" 'vip-autoindent))) + (define-key vip-insert-basic-map "\C-m" nil) + (define-key vip-insert-basic-map "\C-j" nil)) (setq vip-insert-diehard-minor-mode (not vip-want-emacs-keys-in-insert)) @@ -3837,7 +3839,7 @@ (defvar vip-smart-suffix-list - '("" "tex" "c" "cc" "el" "java" "html" "pl" "P" "p") + '("" "tex" "c" "cc" "C" "el" "java" "html" "htm" "pl" "P" "p") "*List of suffixes that Viper automatically tries to append to filenames ending with a `.'. This is useful when you the current directory contains files with the same prefix and many different suffixes. Usually, only one of the suffixes @@ -4446,6 +4448,7 @@ "Auto Indentation, Vi-style." (interactive) (let ((col (current-indentation))) + (if abbrev-mode (expand-abbrev)) (if vip-preserve-indent (setq vip-preserve-indent nil) (setq vip-current-indent col)) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-autoload.el --- a/lisp/vm/vm-autoload.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-autoload.el Mon Aug 13 09:19:45 2007 +0200 @@ -160,6 +160,8 @@ M should be the message struct of a real message. Returns either \"rfc934\", \"rfc1153\" or \"mime\"." nil nil) +(autoload (quote vm-digest-get-header-contents) "vm-digest" nil nil nil) + (autoload (quote vm-easy-menu-define) "vm-easymenu" "Define a menu bar submenu in maps MAPS, according to MENU. The menu keymap is stored in symbol SYMBOL, both as its value and as its function definition. DOC is used as the doc string for SYMBOL. @@ -595,6 +597,8 @@ (autoload (quote vm-start-itimers-if-needed) "vm-folder" nil nil nil) +(autoload (quote vm-check-mail-itimer-function) "vm-folder" nil nil nil) + (autoload (quote vm-get-mail-itimer-function) "vm-folder" nil nil nil) (autoload (quote vm-flush-itimer-function) "vm-folder" nil nil nil) @@ -636,6 +640,12 @@ (autoload (quote vm-gobble-crash-box) "vm-folder" nil nil nil) +(autoload (quote vm-compute-spool-files) "vm-folder" nil nil nil) + +(autoload (quote vm-spool-check-mail) "vm-folder" nil nil nil) + +(autoload (quote vm-check-for-spooled-mail) "vm-folder" nil nil nil) + (autoload (quote vm-get-spooled-mail) "vm-folder" nil nil nil) (autoload (quote vm-safe-popdrop-string) "vm-folder" nil nil nil) @@ -739,7 +749,9 @@ (autoload (quote vm-mark-or-unmark-messages-same-author) "vm-mark" nil nil nil) (autoload (quote vm-next-command-uses-marks) "vm-mark" "Does nothing except insure that the next VM command will operate only -on the marked messages in the current folder." t nil) +on the marked messages in the current folder. This only works for +commands bound to key, menu or button press events. M-x vm-command will +not work." t nil) (autoload (quote vm-marked-messages) "vm-mark" nil nil nil) @@ -787,10 +799,14 @@ (autoload (quote vm-menu-popup-context-menu) "vm-menu" nil t nil) +(autoload (quote vm-menu-goto-event) "vm-menu" nil nil nil) + (autoload (quote vm-menu-popup-url-browser-menu) "vm-menu" nil t nil) (autoload (quote vm-menu-popup-mime-dispose-menu) "vm-menu" nil t nil) +(autoload (quote vm-menu-popup-content-disposition-menu) "vm-menu" nil t nil) + (autoload (quote vm-menu-popup-fsfemacs-menu) "vm-menu" nil t nil) (autoload (quote vm-menu-mode-menu) "vm-menu" nil nil nil) @@ -1097,6 +1113,8 @@ (autoload (quote vm-mm-layout-type) "vm-mime" nil nil nil) +(autoload (quote vm-mm-layout-qtype) "vm-mime" nil nil nil) + (autoload (quote vm-mm-layout-encoding) "vm-mime" nil nil nil) (autoload (quote vm-mm-layout-id) "vm-mime" nil nil nil) @@ -1105,6 +1123,8 @@ (autoload (quote vm-mm-layout-disposition) "vm-mime" nil nil nil) +(autoload (quote vm-mm-layout-qdisposition) "vm-mime" nil nil nil) + (autoload (quote vm-mm-layout-header-start) "vm-mime" nil nil nil) (autoload (quote vm-mm-layout-body-start) "vm-mime" nil nil nil) @@ -1115,6 +1135,8 @@ (autoload (quote vm-mm-layout-cache) "vm-mime" nil nil nil) +(autoload (quote vm-set-mm-layout-type) "vm-mime" nil nil nil) + (autoload (quote vm-set-mm-layout-cache) "vm-mime" nil nil nil) (autoload (quote vm-mm-layout) "vm-mime" nil nil nil) @@ -1125,13 +1147,7 @@ (autoload (quote vm-mime-Q-encode-region) "vm-mime" nil nil nil) -(autoload (quote vm-mime-Q-decode-string) "vm-mime" nil nil nil) - -(autoload (quote vm-mime-B-decode-string) "vm-mime" nil nil nil) - -(autoload (quote vm-mime-Q-encode-string) "vm-mime" nil nil nil) - -(autoload (quote vm-mime-B-encode-string) "vm-mime" nil nil nil) +(autoload (quote vm-mime-B-encode-region) "vm-mime" nil nil nil) (autoload (quote vm-mime-crlf-to-lf-region) "vm-mime" nil nil nil) @@ -1153,7 +1169,11 @@ (autoload (quote vm-decode-mime-encoded-words) "vm-mime" nil nil nil) -(autoload (quote vm-decode-mime-encoded-words-maybe) "vm-mime" nil nil nil) +(autoload (quote vm-decode-mime-encoded-words-in-string) "vm-mime" nil nil nil) + +(autoload (quote vm-reencode-mime-encoded-words) "vm-mime" nil nil nil) + +(autoload (quote vm-reencode-mime-encoded-words-in-string) "vm-mime" nil nil nil) (autoload (quote vm-mime-parse-content-header) "vm-mime" nil nil nil) @@ -1223,8 +1243,6 @@ (autoload (quote vm-mime-display-button-text) "vm-mime" nil nil nil) -(autoload (quote vm-mime-display-internal-text/html) "vm-mime" nil nil nil) - (autoload (quote vm-mime-display-internal-text/plain) "vm-mime" nil nil nil) (autoload (quote vm-mime-display-internal-text/enriched) "vm-mime" nil nil nil) @@ -1271,13 +1289,25 @@ (autoload (quote vm-mime-run-display-function-at-point) "vm-mime" nil t nil) +(autoload (quote vm-mime-set-extent-glyph-for-layout) "vm-mime" nil nil nil) + (autoload (quote vm-mime-insert-button) "vm-mime" nil nil nil) +(autoload (quote vm-mime-rewrite-failed-button) "vm-mime" nil nil nil) + (autoload (quote vm-mime-send-body-to-file) "vm-mime" nil nil nil) (autoload (quote vm-mime-pipe-body-to-command) "vm-mime" nil nil nil) -(autoload (quote vm-mime-pipe-body-to-command-discard-output) "vm-mime" nil nil nil) +(autoload (quote vm-mime-pipe-body-to-queried-command) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-pipe-body-to-queried-command-discard-output) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-send-body-to-printer) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-display-body-as-text) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-display-body-using-external-viewer) "vm-mime" nil nil nil) (autoload (quote vm-mime-scrub-description) "vm-mime" nil nil nil) @@ -1308,8 +1338,9 @@ First argument, FILE, is the name of the file to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached -document. This argument is only used for text types, and it -is ignored for other types. +document. This argument is only used for text types, and it is +ignored for other types. Optional fourth argument DESCRIPTION +should be a one line description of the file. When called interactively all arguments are read from the minibuffer. @@ -1341,6 +1372,14 @@ (autoload (quote vm-mime-attach-object) "vm-mime" nil nil nil) +(autoload (quote vm-mime-attachment-disposition-at-point) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-set-attachment-disposition-at-point) "vm-mime" nil nil nil) + +(autoload (quote vm-disallow-overlay-endpoint-insertion) "vm-mime" nil nil nil) + +(autoload (quote vm-mime-fake-attachment-overlays) "vm-mime" nil nil nil) + (autoload (quote vm-mime-default-type-from-filename) "vm-mime" nil nil nil) (autoload (quote vm-remove-mail-mode-header-separator) "vm-mime" nil nil nil) @@ -1509,6 +1548,8 @@ (autoload (quote vm-toolbar-support-possible-p) "vm-misc" nil nil nil) +(autoload (quote vm-multiple-fonts-possible-p) "vm-misc" nil nil nil) + (autoload (quote vm-run-message-hook) "vm-misc" nil nil nil) (autoload (quote vm-error-free-call) "vm-misc" nil nil nil) @@ -1527,8 +1568,6 @@ (autoload (quote vm-set-region-face) "vm-misc" nil nil nil) -(autoload (quote vm-unsaved-message) "vm-misc" nil nil nil) - (autoload (quote vm-default-buffer-substring-no-properties) "vm-misc" nil nil nil) (autoload (quote vm-buffer-string-no-properties) "vm-misc" nil nil nil) @@ -1547,6 +1586,16 @@ (autoload (quote vm-set-buffer-variable) "vm-misc" nil nil nil) +(autoload (quote vm-buffer-variable-value) "vm-misc" nil nil nil) + +(autoload (quote vm-with-virtual-selector-variables) "vm-misc" nil nil t) + +(autoload (quote vm-string-assoc) "vm-misc" nil nil nil) + +(autoload (quote vm-string-member) "vm-misc" nil nil nil) + +(autoload (quote vm-assert) "vm-misc" nil nil t) + (autoload (quote vm-mouse-fsfemacs-mouse-p) "vm-mouse" nil nil nil) (autoload (quote vm-mouse-xemacs-mouse-p) "vm-mouse" nil nil nil) @@ -1702,14 +1751,74 @@ (autoload (quote vm-pop-move-mail) "vm-pop" nil nil nil) -(autoload (quote vm-pop-process-filter) "vm-pop" nil nil nil) +(autoload (quote vm-pop-check-mail) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-make-session) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-end-session) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-timer) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-x-box) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-x-currmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-x-maxmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-x-got) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-x-need) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-y-box) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-y-currmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-y-maxmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-y-got) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stat-y-need) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-timer) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-x-box) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-x-currmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-x-maxmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-x-got) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-x-need) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-y-box) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-y-currmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-y-maxmsg) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-y-got) "vm-pop" nil nil nil) + +(autoload (quote vm-set-pop-stat-y-need) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-start-status-timer) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-stop-status-timer) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-report-retrieval-status) "vm-pop" nil nil nil) (autoload (quote vm-pop-send-command) "vm-pop" nil nil nil) (autoload (quote vm-pop-read-response) "vm-pop" nil nil nil) +(autoload (quote vm-pop-read-past-dot-sentinel-line) "vm-pop" nil nil nil) + (autoload (quote vm-pop-read-stat-response) "vm-pop" nil nil nil) +(autoload (quote vm-pop-read-list-response) "vm-pop" nil nil nil) + +(autoload (quote vm-pop-ask-about-large-message) "vm-pop" nil nil nil) + (autoload (quote vm-pop-retrieve-to-crashbox) "vm-pop" nil nil nil) (autoload (quote vm-pop-cleanup-region) "vm-pop" nil nil nil) @@ -1930,7 +2039,18 @@ Output, if any, is displayed. The message is not altered." t nil) -(autoload (quote vm-print-message) "vm-save" "Print the current message." t nil) +(autoload (quote vm-print-message) "vm-save" "Print the current message +Prefix arg N means print the current message and the next N - 1 messages. +Prefix arg -N means print the current message and the previous N - 1 messages. + +The variables `vm-print-command' controls what command is run to +print the message, and `vm-print-command-switches' is a list of switches +to pass to the command. + +When invoked on marked messages (via vm-next-command-uses-marks), +each marked message is printed, one message per vm-print-command invocation. + +Output, if any, is displayed. The message is not altered." t nil) (autoload (quote vm-isearch-forward) "vm-search" "Incrementally search forward through the current folder's messages. Usage is identical to the standard Emacs incremental search. @@ -2068,7 +2188,7 @@ (autoload (quote vm-mode) "vm-startup" "Major mode for reading mail. -This is VM 6.13. +This is VM 6.19. Commands: h - summarize folder contents @@ -2131,7 +2251,8 @@ x - exit VM with no change to the folder M N - use marks; the next vm command will affect only marked messages - if it makes sense for the command to do so + if it makes sense for the command to do so. These commands + apply and remove marks to messages. M M - mark the current message M U - unmark the current message @@ -2166,7 +2287,7 @@ V ? - help for virtual folder commands C-_ - undo, special undo that retracts the most recent - changes in message attributes and labels. Expunges + changes in message attributes and labels. Expunges, message edits, and saves cannot be undone. C-x u is also bound to this command. @@ -2236,6 +2357,7 @@ vm-highlighted-header-face vm-highlighted-header-regexp vm-honor-page-delimiters + vm-image-directory vm-in-reply-to-format vm-included-text-attribution-format vm-included-text-discard-header-regexp @@ -2246,6 +2368,7 @@ vm-jump-to-unread-messages vm-keep-crash-boxes vm-keep-sent-messages + vm-mail-check-interval vm-mail-header-from vm-mail-mode-hook vm-make-crash-box-name @@ -2261,6 +2384,8 @@ vm-mime-base64-encoder-program vm-mime-base64-encoder-switches vm-mime-button-face + vm-mime-charset-font-alist + vm-mime-default-face-charsets vm-mime-digest-discard-header-regexp vm-mime-digest-headers vm-mime-display-function @@ -2276,7 +2401,10 @@ vm-mutable-frames vm-mutable-windows vm-netscape-program + vm-pop-bytes-per-session + vm-pop-max-message-size vm-pop-md5-program + vm-pop-messages-per-session vm-popup-menu-on-mouse-3 vm-preferences-file vm-preview-lines @@ -2307,8 +2435,8 @@ vm-send-using-mime vm-skip-deleted-messages vm-skip-read-messages + vm-spool-file-suffixes vm-spool-files - vm-spool-file-suffixes vm-startup-with-summary vm-strip-reply-headers vm-summary-arrow @@ -2318,8 +2446,8 @@ vm-summary-redo-hook vm-summary-show-threads vm-summary-thread-indent-level + vm-tale-is-an-idiot vm-temp-file-directory - vm-tale-is-an-idiot vm-trust-From_-with-Content-Length vm-undisplay-buffer-hook vm-unforwarded-header-regexp @@ -2380,6 +2508,8 @@ (autoload (quote vm-check-emacs-version) "vm-startup" nil nil nil) +(autoload (quote vm-set-debug-flags) "vm-startup" nil nil nil) + (autoload (quote vm-session-initialization) "vm-startup" nil nil nil) (autoload (quote vm-summary-mode-internal) "vm-summary" nil nil nil) @@ -2522,6 +2652,8 @@ (autoload (quote vm-toolbar-can-quit-p) "vm-toolbar" nil nil nil) +(autoload (quote vm-toolbar-mail-waiting-p) "vm-toolbar" nil nil nil) + (autoload (quote vm-toolbar-update-toolbar) "vm-toolbar" nil nil nil) (autoload (quote vm-toolbar-install-toolbar) "vm-toolbar" nil nil nil) @@ -2635,6 +2767,23 @@ (autoload (quote vm-set-new-flag-in-vector) "vm-undo" nil nil nil) +(autoload (quote vm-user-composition-folder-buffer) "vm-user" "Returns the folder buffer associated with the current buffer. +The current buffer must be a composition buffer created by VM for +a reply, resend or forward. + +Nil is returned if the current buffer is not assocaited with any +VM folder. + +Note that the buffer returned might be a virtual folder buffer, +which might have several underlying real folders associated with +it. To get the list of real folder buffers associated with a +composition buffer, use vm-user-composition-real-folder-buffers +instead." nil nil) + +(autoload (quote vm-user-composition-real-folder-buffers) "vm-user" "Returns a list of the real folder buffers associated with the current +buffer. The current buffer must be a composition buffer created +by VM for a reply, resend or forward." nil nil) + (autoload (quote vm-spool-files) "vm-vars" nil nil nil) (autoload (quote vm-version) "vm-version" "Returns the value of the variable vm-version." nil nil) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-mime.el --- a/lisp/vm/vm-mime.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-mime.el Mon Aug 13 09:19:45 2007 +0200 @@ -914,7 +914,7 @@ (make-local-variable 'scroll-in-place) (setq scroll-in-place nil) (and (vm-xemacs-mule-p) - (set-file-coding-system 'binary t)) + (set-buffer-file-coding-system 'no-conversion t)) (cond ((vm-fsfemacs-19-p) ;; need to do this outside the let because ;; loading disp-table initializes @@ -978,7 +978,7 @@ (fset 'vm-presentation-mode 'vm-mode) (put 'vm-presentation-mode 'mode-class 'special) -(defvar file-coding-system) +(defvar buffer-file-coding-system) (defun vm-determine-proper-charset (beg end) (save-excursion @@ -992,8 +992,9 @@ "us-ascii") ((cdr charsets) (or (car (cdr - (assoc (coding-system-name file-coding-system) - vm-mime-mule-coding-to-charset-alist))) + (assq (coding-system-name + buffer-file-coding-system) + vm-mime-mule-coding-to-charset-alist))) "iso-2022-jp")) (t (or (car (cdr @@ -1429,15 +1430,15 @@ (vm-mime-transfer-decode-region layout start end) (setq tempfile (vm-make-tempfile-name)) (let ((buffer-file-type buffer-file-type) - file-coding-system) + buffer-file-coding-system) ;; Tell DOS/Windows NT whether the file is binary (setq buffer-file-type (not (vm-mime-text-type-p layout))) ;; Tell XEmacs/MULE not to mess with the bits unless ;; this is a text type. (if (vm-xemacs-mule-p) (if (vm-mime-text-type-p layout) - (set-file-coding-system 'no-conversion nil) - (set-file-coding-system 'binary t))) + (set-buffer-file-coding-system 'no-conversion nil) + (set-buffer-file-coding-system 'binary t))) (write-region start end tempfile nil 0)) (delete-region start end) (save-excursion @@ -2014,8 +2015,8 @@ ;; this is a text type. (if (vm-xemacs-mule-p) (if (vm-mime-text-type-p layout) - (set-file-coding-system 'no-conversion nil) - (set-file-coding-system 'binary t))) + (set-buffer-file-coding-system 'no-conversion nil) + (set-buffer-file-coding-system 'binary t))) (vm-mime-insert-mime-body layout) (vm-mime-transfer-decode-region layout (point-min) (point-max)) (or (not (file-exists-p file)) @@ -2534,7 +2535,7 @@ (point-max))) (if (vm-xemacs-mule-p) (encode-coding-region (point-min) (point-max) - file-coding-system)) + buffer-file-coding-system)) (setq encoding (vm-determine-proper-content-transfer-encoding (point-min) (point-max)) @@ -2588,7 +2589,7 @@ (insert-buffer-substring object) (delete-char 1))) ((stringp object) - (let ((overridding-file-coding-system 'no-conversion)) + (let ((coding-system-for-read 'no-conversion)) (insert-file-contents-literally object)))) ;; gather information about the object from the extent. (if (setq already-mimed (vm-extent-property e 'vm-mime-encoded)) @@ -2730,7 +2731,7 @@ (point-max))) (if (vm-xemacs-mule-p) (encode-coding-region (point-min) (point-max) - file-coding-system)) + buffer-file-coding-system)) (setq encoding (vm-determine-proper-content-transfer-encoding (point) (point-max)) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-mouse.el --- a/lisp/vm/vm-mouse.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-mouse.el Mon Aug 13 09:19:45 2007 +0200 @@ -217,7 +217,7 @@ ;; one, whatever that is. (setq buffer-file-type nil) (and (vm-xemacs-mule-p) - (set-file-coding-system 'no-conversion nil)) + (set-buffer-file-coding-system 'no-conversion nil)) (write-region (point-min) (point-max) (concat "/tmp/Mosaic." pid) nil 0) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-pop.el --- a/lisp/vm/vm-pop.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-pop.el Mon Aug 13 09:19:45 2007 +0200 @@ -192,7 +192,7 @@ (get-buffer-create (format "trace of POP session to %s" host))) ;; Tell XEmacs/MULE not to mess with the text. (and (vm-xemacs-mule-p) - (set-file-coding-system 'binary t)) + (set-buffer-file-coding-system 'no-conversion t)) ;; clear the trace buffer of old output (save-excursion (set-buffer process-buffer) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-startup.el --- a/lisp/vm/vm-startup.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-startup.el Mon Aug 13 09:19:45 2007 +0200 @@ -80,25 +80,25 @@ ;; the file coding system and decoding it. ;; This is only possible if a file is visited and then vm-mode ;; is run on it afterwards. - (defvar file-coding-system) + (defvar buffer-file-coding-system) (if (and (vm-xemacs-mule-p) - (not (eq (get-coding-system file-coding-system) + (not (eq (get-coding-system buffer-file-coding-system) (get-coding-system 'no-conversion-unix))) - (not (eq (get-coding-system file-coding-system) + (not (eq (get-coding-system buffer-file-coding-system) (get-coding-system 'no-conversion-dos))) - (not (eq (get-coding-system file-coding-system) + (not (eq (get-coding-system buffer-file-coding-system) (get-coding-system 'no-conversion-mac))) - (not (eq (get-coding-system file-coding-system) + (not (eq (get-coding-system buffer-file-coding-system) (get-coding-system 'binary)))) (let ((buffer-read-only nil) (omodified (buffer-modified-p))) (unwind-protect (progn (encode-coding-region (point-min) (point-max) - file-coding-system) - (set-file-coding-system 'no-conversion nil) + buffer-file-coding-system) + (set-buffer-file-coding-system 'no-conversion nil) (decode-coding-region (point-min) (point-max) - file-coding-system)) + buffer-file-coding-system)) (set-buffer-modified-p omodified)))) (vm-check-for-killed-summary) (vm-check-for-killed-presentation) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-vars.el --- a/lisp/vm/vm-vars.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-vars.el Mon Aug 13 09:19:45 2007 +0200 @@ -590,7 +590,8 @@ as your default font. XEmacs does not have this limitation.") (defvar vm-mime-button-face - (cond ((fboundp 'find-face) + (cond ((and (fboundp 'find-face) + (fboundp 'device-type)) (or (and (not (eq (device-type) 'tty)) (find-face 'gui-button-face) 'gui-button-face) (and (find-face 'bold-italic) 'bold-italic))) diff -r e183fc049578 -r fe104dbd9147 lisp/vm/vm-window.el --- a/lisp/vm/vm-window.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/vm/vm-window.el Mon Aug 13 09:19:45 2007 +0200 @@ -134,7 +134,7 @@ (set-buffer (setq work-buffer (get-buffer-create "*vm-wconfig*"))) ;; for XEmacs/MULE (and (vm-xemacs-mule-p) - (set-file-coding-system 'no-conversion)) + (set-buffer-file-coding-system 'no-conversion)) (erase-buffer) (print vm-window-configurations (current-buffer)) (write-region (point-min) (point-max) file nil 0)) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/ChangeLog --- a/lisp/w3/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,5 +1,124 @@ +Thu Mar 13 19:54:50 1997 William M. Perry + +* w3-cus.el: Added customization support for Emacs-W3 + +* w3.el (w3-mail-current-document): Use url-mail-command instead of + w3-mail-command + +Thu Mar 13 11:41:42 1997 Greg Stark + +* w3-prefs.el: Implemented privacy panel + +Wed Mar 12 10:25:38 1997 William M. Perry + +* w3-e19.el (w3-mode-version-specifics): Use the nasty crufty + buffer-access-fontify-functions to make sure that we never yank + read-only text out of the Emacs-W3 buffer. + +* Synch'd up to Widget 1.62 + +Wed Mar 12 06:36:41 1997 Paul Stodghill + +* base64.el (base64-decode-region): Fixed typo in calling + command-on-region. + +Tue Mar 11 07:03:48 1997 William M. Perry + +* w3-auto.el (w3-use-hotlist): Made autoload interactive + +* w3-widget.el (widget-image-value-create): Was a little too aggressive + about when to apply the -1 :tab-order property. Now only images that + are not hyperlinks or imagemaps will not be tabbed to. + +* w3-prefs.el (w3-preferences-init-proxy-panel): Updated preferences panel + for new format of url-proxy-services + +* w3-vars.el (w3-hyperlink-menu): Fixed problem with calling wrong + bookmark function - would create a bookmark to the current document, not + the document under the mouse. + (w3-popup-menu): Added a few menu itmes (reload, show images, add bookmark) + +* w3-hot.el (w3-hotlist-add-document-at-point): Extract the title + correctly for the new widget implementation of hyperlinks. + +Mon Mar 10 06:31:48 1997 William M. Perry + +* w3-menu.el (w3-menu-options-menu): Fixed problem with XEmacs when + building without toolbars - would insert nil in the menu in a very wrong + place. + +* font.el (font-normalize-color): Under win32, make sure we define the + color before we try to use it, since Emacs doesn't support raw #RRGGBB + color specifications yet. + (font-rgb-color-p): make all #RRGGBB color specs go through + font-normalize-color + +* Emacs-W3 3.0.67 released + +Mon Mar 10 1997 Dave Love + +* w3.el (w3-do-setup): Make configuration file loading contingent + on init-file-user (i.e. suppressed with -q). + +Sun Mar 9 13:09:38 1997 William M. Perry + +* w3-widget.el (widget-image-value-create): Set :tab-order to -1 so the + latest widget library won't tab to image widgets. + +* w3.el (w3-mode): Make sure w3-mode-hook is run last, so that people can + turn off truncate-lines if they want. + +* ssl.el (open-ssl-stream): ssl-program-arguments is now dynamically + evaluated, similar to ps-lpr-switches. The special symbols 'host' and + 'port' are available, and bound to the hostname and port#/service we are + about to connect to. + +* w3-display.el (w3-finish-drawing): Remove all read-only properties on + text. + +* url-cache.el (url-cache-expired): fixed standalone mode + +Sat Mar 8 09:13:59 1997 William M. Perry + +* Emacs-W3 3.0.66 released. + +* url-cache.el (url-cache-prepare): Threw a condition-case around the + make-directory call, just in case we can't create the file for some + reason. Also fixed bug where the file wouldn't be cached until the + second time you visited it. + +* url.el (url-retrieve-internally): Deal with https asynch + +* w3-xemac.el (w3-mode-version-specifics): Don't try to add the toolbar if + device-type == 'stream. + +* w3-vars.el (w3-temporary-directory): Ditto. + +* url-vars.el (url-temporary-directory): Initialize from TMPDIR + environment variable. + +* w3.el (w3-start-viewer): Ditto. + +* md5.el (md5): Ditto. + +* mm.el (mm-compose-type): Don't use hardcoded /bin/sh and -c - use + shell-file-name and shell-command-switch + (mm-viewer-passes-test): ditto. + +* w3-sysdp.el: Better device-* functions for Emacs-19 under win32 and OS/2 + +* w3-display.el (w3-display-node): Better handling for support. + Fri Mar 7 06:13:20 1997 William M. Perry <wmperry@aventail.com> +* w3-script.el (w3-script-evaluate-form): protect against bad input during + the read-from-string when parsing emacs-lisp scripts. + +* w3-auto.el (w3-preferences-edit): Make the autoload for this be + interactive so that the user can actually find it! + +* Emacs-W3 3.0.65 released. + * w3.el (w3-document-information): Better handling of last-modified findings. diff -r e183fc049578 -r fe104dbd9147 lisp/w3/Makefile --- a/lisp/w3/Makefile Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/Makefile Mon Aug 13 09:19:45 2007 +0200 @@ -45,7 +45,7 @@ SOURCES = \ $(CUSTOMSOURCES) $(URLSOURCES) mule-sysdp.el w3-widget.el \ w3-imap.el css.el dsssl.el font.el images.el w3-vars.el \ - w3-style.el w3-keyword.el w3-forms.el w3-emulate.el \ + w3-cus.el w3-style.el w3-keyword.el w3-forms.el w3-emulate.el \ w3-auto.el w3-menu.el w3-mouse.el w3-toolbar.el w3-prefs.el \ w3-speak.el w3-latex.el w3-parse.el w3-display.el w3-print.el \ w3-about.el w3-hot.el w3-e19.el w3-xemac.el w3.el w3-script.el \ @@ -91,6 +91,7 @@ w3.cps w3.fns w3.kys w3.pgs w3.tps w3.vrs \ w3.log w3.toc w3.aux +w3-vars.elc: w3-cus.el w3-vars.el w3-display.elc: w3-display.el css.el font.el w3-imap.el css.elc: css.el font.el -w3.elc: css.el w3-vars.el +w3.elc: css.el w3-vars.el w3.el diff -r e183fc049578 -r fe104dbd9147 lisp/w3/base64.el --- a/lisp/w3/base64.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/base64.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; base64.el,v --- Base64 encoding functions ;; Author: Kyle E. Jones -;; Created: 1997/01/23 00:13:17 -;; Version: 1.4 +;; Created: 1997/03/12 14:37:09 +;; Version: 1.6 ;; Keywords: extensions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -102,7 +102,7 @@ (condition-case nil (progn (insert-char char count ignored buffer) - (fset 'vm-insert-char 'insert-char)) + (fset 'base64-insert-char 'insert-char)) (wrong-number-of-arguments (fset 'base64-insert-char 'base64-xemacs-insert-char) (base64-insert-char char count ignored buffer)))) @@ -129,7 +129,7 @@ (buffer-disable-undo work-buffer) (if base64-decoder-program (let* ((binary-process-output t) ; any text already has CRLFs - (status (apply 'command-on-region + (status (apply 'base64-run-command-on-region start end work-buffer base64-decoder-program base64-decoder-switches))) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/font.el --- a/lisp/w3/font.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/font.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; font.el --- New font model ;; Author: wmperry -;; Created: 1997/03/03 15:15:42 -;; Version: 1.34 +;; Created: 1997/03/10 15:18:19 +;; Version: 1.36 ;; Keywords: faces ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -977,9 +977,10 @@ (list r g b) )) (defsubst font-rgb-color-p (obj) - (and (vectorp obj) - (= (length obj) 4) - (eq (aref obj 0) 'rgb))) + (or (and (vectorp obj) + (= (length obj) 4) + (eq (aref obj 0) 'rgb)) + (string-match "^#[0-9a-fA-F]+$" obj))) (defsubst font-rgb-color-red (obj) (aref obj 1)) (defsubst font-rgb-color-green (obj) (aref obj 2)) @@ -1072,15 +1073,21 @@ "Return an RGB tuple, given any form of input. If an error occurs, black is returned." (case (device-type device) - ((x pm win32) + ((x pm) (apply 'format "#%02x%02x%02x" (font-color-rgb-components color))) + (win32 + (let* ((rgb (font-color-rgb-components color)) + (color (apply 'format "#%02x%02x%02x" rgb))) + (win32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color) + color)) (tty (apply 'font-tty-find-closest-color (font-color-rgb-components color))) (ns (let ((vals (mapcar (function (lambda (x) (>> x 8))) (font-color-rgb-components color)))) (apply 'format "RGB%02x%02x%02xff" vals))) - (otherwise "black"))) + (otherwise + color))) (defun font-set-face-background (&optional face color &rest args) (interactive) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/images.el --- a/lisp/w3/images.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/images.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; images.el --- Automatic image converters ;; Author: wmperry -;; Created: 1997/02/26 16:21:01 -;; Version: 1.9 +;; Created: 1997/03/11 19:28:30 +;; Version: 1.10 ;; Keywords: images ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -29,6 +29,8 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; The emacsen compatibility package - load it up before anything else ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(require 'mule-sysdp) + (eval-and-compile (if (not (and (string-match "XEmacs" emacs-version) (or (> emacs-major-version 19) @@ -149,7 +151,8 @@ (while chain (cond ((stringp (car chain)) - (let ((file-coding-system mule-no-coding-system)) + (let ((coding-system-for-read 'no-conversion) + (coding-system-for-write 'no-conversion)) (call-process-region (point-min) (point-max) shell-file-name t diff -r e183fc049578 -r fe104dbd9147 lisp/w3/md5.el --- a/lisp/w3/md5.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/md5.el Mon Aug 13 09:19:45 2007 +0200 @@ -393,9 +393,9 @@ (md5-encode (buffer-string)) "") (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") + shell-file-name t buffer nil - "-c" md5-program) + shell-command-switch md5-program) ;; MD5 digest is 32 chars long ;; mddriver adds a newline to make neaten output for tty ;; viewing, make sure we leave it behind. @@ -404,5 +404,3 @@ (and buffer (kill-buffer buffer) nil)))) (provide 'md5) - -;;; md5.el ends here ---------------------------------------------------------- diff -r e183fc049578 -r fe104dbd9147 lisp/w3/mm.el --- a/lisp/w3/mm.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/mm.el Mon Aug 13 09:19:45 2007 +0200 @@ -728,7 +728,7 @@ (eval test)) (t (setq test (mm-unescape-mime-test test type-info) - test (list "/bin/sh" nil nil nil "-c" test) + test (list shell-file-name nil nil nil shell-command-switch test) status (apply 'call-process test)) (= 0 status))))) @@ -1042,9 +1042,9 @@ (setq comp (concat (substring comp 0 (match-end 1)) fnam (substring comp (match-end 0) nil)) usef t)) - (call-process (or shell-file-name - (getenv "ESHELL") (getenv "SHELL") "/bin/sh") - nil (if usef nil buff) nil "-c" comp) + (call-process shell-file-name nil + (if usef nil buff) + nil shell-command-switch comp) (setq retval (concat (if typeit (concat "Content-type: " type "\r\n\r\n") "") diff -r e183fc049578 -r fe104dbd9147 lisp/w3/mule-sysdp.el --- a/lisp/w3/mule-sysdp.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/mule-sysdp.el Mon Aug 13 09:19:45 2007 +0200 @@ -77,7 +77,7 @@ (if (and (listp code) (not (car code))) (setq code 'autodetect)) (decode-coding-region (point-min) (point-max) code) - (set-file-coding-system code)) + (set-buffer-file-coding-system code)) (otherwise nil))) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/ssl.el --- a/lisp/w3/ssl.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/ssl.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; ssl.el,v --- ssl functions for emacsen without them builtin ;; Author: wmperry -;; Created: 1996/05/28 01:20:06 -;; Version: 1.2 +;; Created: 1997/03/09 23:02:56 +;; Version: 1.8 ;; Keywords: comm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -29,10 +29,13 @@ (defvar ssl-program-name "ssl" "*The program to run in a subprocess to open an SSL connection.") -(defvar ssl-program-arguments nil +(defvar ssl-program-arguments '(host port) "*Arguments that should be passed to the program `ssl-program-name'. This should be used if your SSL program needs command line switches to -specify any behaviour (certificate file locations, etc).") +specify any behaviour (certificate file locations, etc). +The special symbols 'host and 'port may be used in the list of arguments +and will be replaced with the hostname and service/port that will be connected +to.") (defun open-ssl-stream (name buffer host service) "Open a SSL connection for a service to a host. @@ -47,16 +50,14 @@ with any buffer Third arg is name of the host to connect to, or its IP address. Fourth arg SERVICE is name of the service desired, or an integer - specifying a port number to connect to." - (let ((proc (apply 'start-process - name - buffer - ssl-program-name - (append ssl-program-arguments - (list host - (if (stringp service) - service - (int-to-string service))))))) +specifying a port number to connect to." + (if (integerp service) (setq service (int-to-string service))) + (let* ((process-connection-type t) + (port service) + (proc (eval + (` + (start-process name buffer ssl-program-name + (,@ ssl-program-arguments)))))) (process-kill-without-query proc) proc)) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/url-cache.el --- a/lisp/w3/url-cache.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/url-cache.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-cache.el --- Uniform Resource Locator retrieval tool ;; Author: wmperry -;; Created: 1997/03/06 16:25:51 -;; Version: 1.7 +;; Created: 1997/03/09 21:09:36 +;; Version: 1.10 ;; Keywords: comm, data, processes, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -53,7 +53,9 @@ ((file-directory-p file) nil) (t - (make-directory (file-name-directory file) t)))) + (condition-case () + (or (make-directory (file-name-directory file) t) t) + (error nil))))) (defvar url-cache-ignored-protocols '("www" "about" "https" "mailto") @@ -62,6 +64,8 @@ (defun url-cache-cachable-p (obj) ;; return t iff the current buffer is cachable (cond + ((not url-automatic-caching) ; User doesn't want to cache + nil) ((null obj) ; Something horribly confused nil) ((member (url-type obj) url-cache-ignored-protocols) @@ -138,7 +142,7 @@ (defun url-cache-create-filename-human-readable (url) "Return a filename in the local cache for URL" (if url - (let* ((url url) + (let* ((url (if (vectorp url) (url-recreate-url url) url)) (urlobj (url-generic-parse-url url)) (protocol (url-type urlobj)) (hostname (url-host urlobj)) @@ -197,6 +201,7 @@ Very fast if you are in XEmacs, suitably fast otherwise." (if url (let* ((checksum (md5 url)) + (url (if (vectorp url) (url-recreate-url url) url)) (urlobj (url-generic-parse-url url)) (protocol (url-type urlobj)) (hostname (url-host urlobj)) @@ -236,23 +241,18 @@ ;;;###autoload (defun url-cache-expired (url mod) "Return t iff a cached file has expired." - (if (not (string-match url-nonrelative-link url)) - t - (let* ((urlobj (url-generic-parse-url url)) - (type (url-type urlobj))) - (cond - (url-standalone-mode - (not (file-exists-p (url-cache-create-filename urlobj)))) - ((string= type "http") - (if (not url-standalone-mode) t - (not (file-exists-p (url-cache-create-filename urlobj))))) - ((not (fboundp 'current-time)) - t) - ((member type '("file" "ftp")) - (if (or (equal mod '(0 0)) (not mod)) - (return t) - (or (> (nth 0 mod) (nth 0 (current-time))) - (> (nth 1 mod) (nth 1 (current-time)))))) - (t nil))))) + (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url))) + (type (url-type urlobj))) + (cond + (url-standalone-mode + (not (file-exists-p (url-cache-create-filename url)))) + ((string= type "http") + t) + ((member type '("file" "ftp")) + (if (or (equal mod '(0 0)) (not mod)) + (return t) + (or (> (nth 0 mod) (nth 0 (current-time))) + (> (nth 1 mod) (nth 1 (current-time)))))) + (t nil)))) (provide 'url-cache) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/url-vars.el --- a/lisp/w3/url-vars.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/url-vars.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; url-vars.el --- Variables for Uniform Resource Locator tool ;; Author: wmperry -;; Created: 1997/03/07 16:46:48 -;; Version: 1.31 +;; Created: 1997/03/14 06:51:57 +;; Version: 1.35 ;; Keywords: comm, data, processes, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -26,7 +26,7 @@ ;;; Boston, MA 02111-1307, USA. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst url-version (let ((x "p3.0.65")) +(defconst url-version (let ((x "p3.0.68")) (if (string-match "State: \\([^ \t\n]+\\)" x) (substring x (match-beginning 1) (match-end 1)) x)) @@ -313,7 +313,8 @@ "*Maximum number of times a password will be prompted for when a protected document is denied by the server.") -(defvar url-temporary-directory "/tmp" "*Where temporary files go.") +(defvar url-temporary-directory (or (getenv "TMPDIR") "/tmp") + "*Where temporary files go.") (defvar url-show-status t "*Whether to show a running total of bytes transferred. Can cause a diff -r e183fc049578 -r fe104dbd9147 lisp/w3/url.el --- a/lisp/w3/url.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/url.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,13 +1,13 @@ ;;; url.el --- Uniform Resource Locator retrieval tool ;; Author: wmperry -;; Created: 1997/03/05 23:37:22 -;; Version: 1.61 +;; Created: 1997/03/09 06:19:51 +;; Version: 1.62 ;; Keywords: comm, data, processes, hypermedia ;;; LCD Archive Entry: ;;; url|William M. Perry|wmperry@cs.indiana.edu| ;;; Functions for retrieving/manipulating URLs| -;;; 1997/03/05 23:37:22|1.61|Location Undetermined +;;; 1997/03/09 06:19:51|1.62|Location Undetermined ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1598,6 +1598,9 @@ (let ((count 0)) (cl-maphash (function (lambda (key value) + (while (string-match "[\r\n]+" key) + (setq key (concat (substring key 0 (match-beginning 0)) + (substring key (match-end 0) nil)))) (setq count (1+ count)) (insert "(cl-puthash \"" key "\"" (if (not (stringp value)) " '" "") @@ -1949,7 +1952,8 @@ "<p><address>William Perry</address><br>" "<address>" url-bug-address "</address>")) (cond - ((and url-be-asynchronous (not cached) (member type '("http" "proxy"))) + ((and url-be-asynchronous (not cached) + (member type '("http" "https" "proxy"))) nil) ((and url-be-asynchronous (get-buffer url-working-buffer)) (funcall url-default-retrieval-proc (buffer-name))) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-auto.el --- a/lisp/w3/w3-auto.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-auto.el Mon Aug 13 09:19:45 2007 +0200 @@ -11,7 +11,7 @@ (autoload 'w3-hotlist-rename-entry "w3-hot") (autoload 'w3-hotlist-append "w3-hot") (autoload 'w3-parse-hotlist "w3-hot") -(autoload 'w3-use-hotlist "w3-hot") +(autoload 'w3-use-hotlist "w3-hot" nil t) (autoload 'w3-hotlist-add-document-at-point "w3-hot") (autoload 'w3-hotlist-add-document "w3-hot") @@ -46,7 +46,7 @@ (autoload 'widget-at "wid-edit") ;; Preferences -(autoload 'w3-preferences-edit "w3-prefs") +(autoload 'w3-preferences-edit "w3-prefs" "" t) (defvar widget-field-new nil) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-cus.el --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/w3/w3-cus.el Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,378 @@ +;;; w3-cus.el --- Customization support for Emacs-W3 +;; Author: wmperry +;; Created: 1997/03/14 06:51:36 +;; Version: 1.3 +;; Keywords: comm, help, hypermedia + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Copyright (c) 1993 - 1996 by William M. Perry (wmperry@cs.indiana.edu) +;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc. +;;; +;;; This file is part of GNU Emacs. +;;; +;;; GNU Emacs 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. +;;; +;;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the +;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;;; Boston, MA 02111-1307, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(eval-and-compile + (condition-case () + (require 'custom) + (error nil)) + (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) + nil ;; We've got what we needed + ;; We have the old custom-library, hack around it! + (defmacro defcustom (var value doc &rest args) + (` (defvar (, var) (, value) (, doc)))))) + +;;; File related variables +(defcustom w3-configuration-directory "~/.w3/" + "*Directory where Emacs-w3 can find its configuration files" + :group 'w3-files + :type 'directory) + +(defcustom w3-default-configuration-file nil + "*Where per-user customizations of w3 are kept." + :group 'w3-files + :type 'file) + +(defcustom w3-default-homepage nil + "*The url to open at startup. It can be any valid URL. +This will default to the environment variable WWW_HOME if you do not +set it in your .emacs file. If WWW_HOME is undefined, then it will +default to the hypertext documentation for W3 at Indiana University." + :group 'w3-files + :type 'string) + +(defcustom w3-default-stylesheet nil + "*The filename of the users default stylesheet." + :group 'w3-files + :type 'file) + +(defcustom w3-hotlist-file nil + "*Hotlist filename. +This should be the name of a file that is stored in either +NCSA's Mosaic/X or Netscape/X format. It is used to keep a listing +of commonly accessed URL's without having to go through 20 levels of +menus to get to them." + :group 'w3-files + :type 'file) + +(defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/docs/" + "*Where the w3 documentation lives. This MUST end in a slash." + :group 'w3-files + :type 'string) + +(defcustom w3-temporary-directory (or (getenv "TMPDIR") "/tmp") + "*Where temporary files go." + :group 'w3-files + :type 'directory) + +;;; Display related variables +(defcustom w3-display-frames nil + "*Fetch frames - not optimal." + :group 'w3-display + :type 'boolean) + +(defcustom w3-do-incremental-display nil + "*Whether to do incremental display of pages or not." + :group 'w3-display + :type 'boolean) + +(defcustom w3-echo-link '(title url text name) + "*Whether to display the URL of a link when tabbing through links. +Value is a list of one or more of the following symbols: + + url == url of the target + text == text of the link + title == title attribute of the link + name == name or id attribute of the link + +If none of the information is available, nothing will be shown for the link +in menus, etc." + :group 'w3-display + :type '(set (const :tag "URL" :value url) + (const :tag "Link Text" :value text) + (const :tag "Title of the link as defined in the HTML tag" + :value title) + (const :tag "Name of the link as defined in the HTML tag" + :value name))) + +(defcustom w3-horizontal-rule-char ?- + "*The character to use to create a horizontal rule. +Must be the character's code, not a string. This character is +replicated across the screen to create a division." + :group 'w3-display + :type 'character) + +(defcustom w3-defined-link-types + ;; This is the HTML3.0 list (downcased) plus "made". + '("previous" "next" "up" "down" "home" "toc" "index" "glossary" + "copyright" "bookmark" "help" "made") + "A list of the (lower-case) names which have special significance +as the values of REL or REV attributes of <link> elements. They will +be presented on the toolbar or the links menu, for instance." + :group 'w3-display + :type '(repeat string)) + +;;; Parsing related variables +(defcustom w3-debug-html nil + "*Whether to gripe about bad HTML or not." + :group 'w3-parsing + :type '(choice (const :tag "HTML Errors" :value t) + (const :tag "Errors and stylistic issues" :value style) + (const :tag "None" :value nil))) + +(defcustom w3-debug-buffer "*HTML Debug*" + "*Name of buffer to store debugging information in." + :group 'w3-parsing + :type 'string) + +;;; Image related variables +(defcustom w3-auto-image-alt t + "*Whether emacs-w3 should create an alt attribute for an image that +is missing it. +If nil, emacs-w3 will not automatically create an ALT attribute. +If t, the alt attribute will be [IMAGE(nameofimage)] +If a string, it should be a string suitable for running through format, + with only one %s, which will be replaced with just the filename of the + graphic that is not loaded." + :group 'w3-images + :type '(choice (const :tag "None" :value nil) + (const :tag "Default" :value t) + string)) + +(defcustom w3-icon-directory "http://cs.indiana.edu/elisp/w3/icons/" + "*Where to find standard icons. Must end in a /!" + :group 'w3-images + :type 'string) + +(defcustom w3-icon-format 'gif + "*Image format the default icons are expected to be in. +This is a symbol, string or nil, specifing what file extension to use. +If nil, then no file extension is used." + :group 'w3-images + :type '(choice (const :tag "GIF Image" :value gif) + (const :tag "XPM Image" :value xpm) + (const :tag "XBM Image" :value xbm) + (const :tag "Let the server decide" :value nil) + (string :tag "Other"))) + +(defcustom w3-delay-image-loads nil + "*Whether to delay image loading, or automatically retrieve them." + :group 'w3-images + :type 'boolean) + +(defcustom w3-image-mappings + '( + ("image/x-xbitmap" . xbm) + ("image/xbitmap" . xbm) + ("image/xbm" . xbm) + ("image/jpeg" . jpeg) + ("image/gif" . gif) + ("image/png" . png) + ("image/x-fax" . g3fax) + ("image/x-raster" . rast) + ("image/windowdump" . xwd) + ("image/x-icon" . icon) + ("image/portable-graymap" . pgm) + ("image/portable-pixmap" . ppm) + ("image/x-pixmap" . xpm) + ("image/x-xpixmap" . xpm) + ("image/pict" . pict) + ("image/x-rgb" . sgi) + ("image/x-sgi" . sgi) + ("image/x-macpaint" . macpt) + ("image/x-targa" . tga) + ("image/tiff" . tiff) + ) + "*How to map MIME types to image types for the `image' package. +Each entry is a cons cell of MIME types and image-type symbols." + :group 'w3-images + :type '(repeat cons)) + +;;; Printing variables +(defcustom w3-latex-docstyle "{article}" + "*The documentstyle to use when printing or mailing files as LaTeX. +Good defaults are: {article}, [psfig,twocolumn]{article}, etc." + :group 'w3-printing + :type 'string) + +(defcustom w3-latex-print-links nil + "*If non-nil, prints the URLs of hypertext links as endnotes at the end of +the document. If `footnote', prints the URL's as footnotes on a page." + :group 'w3-printing + :type '(choice (const :tag "As endnotes" :value t) + (const :tag "As footnotes" :value footnote) + (const :tag "Do not print" :value nil))) + +(defcustom w3-latex-use-latex2e nil + "*If non-nil, configures LaTeX parser to use LaTeX2e syntax. A `nil' +value indicates that LaTeX 2.0.9 compatibility will be used instead." + :group 'w3-printing + :type 'boolean) + +(defcustom w3-latex-packages nil + "*List of LaTeX packages to include when converting HTML to LaTeX. +Currently this is only used if `w3-latex-use-latex2e' is non-nil." + :group 'w3-printing + :type '(repeat string)) + +(defcustom w3-latex-use-maketitle nil + "*Non-nil makes the LaTeX parser use real LaTeX title pages." + :group 'w3-printing + :type 'boolean) + +;;; Menus +(defcustom w3-max-menu-length 35 + "*The maximum length of a pulldown menu before it will be split into +smaller chunks, with the first part as a submenu, followed by the rest +of the menu." + :group 'w3-menus + :type 'integer) + +(defcustom w3-max-menu-width 40 + "*The maximum width of a pulldown menu choice." + :group 'w3-menus + :type 'integer) + +;;; Advanced stuff +(defcustom w3-modeline-format + '(" " ("W3" + (w3-netscape-emulation-minor-mode + " (NS)") + (w3-lynx-emulation-minor-mode + " (Lynx)") + ": " + (40 (-40 "%b")) + " " + (w3-current-isindex "[Searchable] ") + "%p" " " global-mode-string)) + "*The modeline format string when in w3 mode" + :group 'w3-advanced + :type 'list) + +(defcustom w3-netscape-compatible-comments t + "*Whether to honor netscape-style <! > comments. +Ye gods I wish I could turn this off by default." + :group 'w3-parsing + :type 'boolean) + +(defcustom w3-notify 'semibully + "*Selects the behavior when w3 page is ready. +This variable may have one of the following values: + +newframe -- put the w3 page in its own frame +bully -- make the w3 page the current buffer and only window +semibully -- make the w3 page the current buffer in the same window +aggressive -- make the w3 page the current buffer in the other window +friendly -- display w3page in other window but don't make current +polite -- don't display w3 page, but prints message when ready (beeps) +quiet -- like `polite', but don't beep +meek -- make no indication that page is ready + +Any other value of `w3-notify' is equivalent to `meek'." + :group 'w3-display + :type '(choice (const :tag "Display in a new frame" + :value newframe) + (const :tag "Display in the current window, select buffer, and kill other windows" + :value bully) + (const :tag "Display in the current window, select buffer" + :value semibully) + (const :tag "Display in another window, select buffer" + :value aggressive) + (const :tag "Display in another window, but do not select it" + :value friendly) + (const :tag "Do not display page, but show a message and beep" + :value polite) + (const :tag "Do not display page, but show a message (no beep)" + :value quiet) + (const :tag "Do not indicate that the page has been retrieved" + :value meek))) + +(defcustom w3-popup-menu-on-mouse-3 t + "*Non-nil value means W3 should provide context-sensitive menus on mouse-3. +A nil value means W3 should not change the binding of mouse-3." + :group 'w3-display + :type 'boolean) + +(defcustom w3-print-command "lpr -h -d" + "*Print command for dvi files. +This is usually 'lpr -h -d' to send it to a postscript printer, but you can set +it up so that it is any command that takes a dvi file as its last argument." + :group 'w3-printing + :type 'string) + +(defcustom w3-reuse-buffers 'yes + "What to do when following a link will re-fetch a document that has +already been fetched into a W3 buffer. Possible values are: nil, +'yes, and 'no. Nil means ask the user if we should reuse the buffer. + A value of 'yes means assume the user wants us to reuse the buffer. +A value of 'no means assume the user wants us to re-fetch the document. + +This will also accept: +'no ==> always reload +'yes ==> always reuse +'ask ==> always ask" + :group 'w3-display + :type '(choice (const :tag "Always reload" :value no) + (const :tag "Always reuse" :value yes) + (const :tag "Always ask" :value ask))) + +(defcustom w3-right-margin 2 + "*Default right margin for Emacs-W3 buffers. +This amount is subtracted from (window-width) for each new WWW buffer +and used as the new fill-column." + :group 'w3-display + :type 'integer) + +(defcustom w3-maximum-line-length nil + "*Maximum length of a line. +If nil, then lines can extend all the way to the window margin." + :group 'w3-display + :type 'integer) + +(defcustom w3-track-mouse t + "*Whether to track the mouse and message the url under the mouse." + :group 'w3-display + :type 'boolean) + +(defcustom w3-honor-stylesheets t + "*Whether to let a document specify a CSS stylesheet." + :group 'w3-display + :type 'boolean) + +(defcustom w3-user-colors-take-precedence nil + "*Whether to let a document define certain colors about itself. +Like foreground and background colors and pixmaps, color of links and +visited links, etc." + :group 'w3-display + :type 'boolean) + +;;; Hook Variables +(defcustom w3-load-hook nil + "*Hooks to be run after loading w3." + :group 'w3-hooks + :type 'hook) + +(defcustom w3-mode-hook nil + "*Hooks to be run after entering w3-mode." + :group 'w3-hooks + :type 'hook) + +(defcustom w3-source-file-hook nil + "*Hooks to be run after getting document source." + :group 'w3-hooks + :type 'hook) + +(provide 'w3-cus) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-display.el --- a/lisp/w3/w3-display.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-display.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-display.el --- display engine v99999 ;; Author: wmperry -;; Created: 1997/03/06 04:12:42 -;; Version: 1.144 +;; Created: 1997/03/14 06:33:15 +;; Version: 1.147 ;; Keywords: faces, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -440,14 +440,6 @@ ;; Various macros (eval-when-compile - (defmacro w3-expand-url (url) - (` - (url-expand-file-name (, url) - (cdr-safe - (assoc - (cdr-safe - (assq 'base args)) w3-base-alist))))) - (defmacro w3-handle-empty-tag () (` (progn @@ -1684,7 +1676,7 @@ (if cols (setq w3-frameset-dimensions (push cols w3-frameset-dimensions)))) (w3-handle-content node)) - (w3-handle-empty-tag))) + (w3-handle-content node))) (frame (if w3-display-frames (let* ((href (or (w3-get-attribute 'src) @@ -1705,7 +1697,8 @@ (list (car w3-frame-labels) name - (cdr w3-frame-labels))))))))))) + (cdr w3-frame-labels))))))))) + (w3-handle-empty-tag))) (noframes (if w3-display-frames (w3-handle-empty-tag) @@ -2070,9 +2063,9 @@ (and (not w3-running-xemacs) (not (eq (device-type) 'tty)) (w3-fixup-eol-faces)) - (message "Drawing... done") - ;;(w3-handle-headers) - ) + (let ((inhibit-read-only t)) + (put-text-property (point-min) (point-max) 'read-only nil)) + (message "Drawing... done")) (defun w3-region (st nd) (if (not w3-setup-done) (w3-do-setup)) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-e19.el --- a/lisp/w3/w3-e19.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-e19.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-e19.el --- Emacs 19.xx specific functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/18 23:32:51 -;; Version: 1.18 +;; Created: 1997/03/12 20:07:18 +;; Version: 1.19 ;; Keywords: faces, help, mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -97,9 +97,15 @@ (ns-store-pasteboard-internal str)) (t nil))) +(defun w3-e19-no-read-only (st nd) + ;; Make sure we don't yank any read-only data out of this buffer + (let ((inhibit-read-only t)) + (put-text-property st nd 'read-only nil))) + (defun w3-mode-version-specifics () ;; Emacs 19 specific stuff for w3-mode (make-local-variable 'track-mouse) + (set (make-local-variable 'buffer-access-fontify-functions) 'w3-e19-no-read-only) (if w3-track-mouse (setq track-mouse t))) (defun w3-mouse-handler (e) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-emulate.el --- a/lisp/w3/w3-emulate.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-emulate.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-emulate.el --- All variable definitions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/04 19:21:18 -;; Version: 1.11 +;; Created: 1997/03/14 06:12:02 +;; Version: 1.12 ;; Keywords: comm, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -109,56 +109,6 @@ (skip-chars-forward "^ \t\n\r") (skip-chars-forward " \t")) -(defun w3-read-netscape-config (&optional fname) - "Read in a netscape-style configuration file." - (interactive "fNetscape configuration file: ") - (if (not (and (file-exists-p fname) - (file-readable-p fname))) - (error "Could not read %s" fname)) - (let ((results nil) - (tag nil) - (val nil) - (var nil) - (save-pos nil)) - (save-excursion - (set-buffer (get-buffer-create " *w3-tmp*")) - (erase-buffer) - (insert-file-contents-literally fname) - (goto-char (point-min)) - (skip-chars-forward "^ \t\r\n") ; Skip tag line - (skip-chars-forward " \t\r\n") ; Skip blank line(s) - (while (not (eobp)) - (setq save-pos (point)) - (skip-chars-forward "^:") - (upcase-region save-pos (point)) - (setq tag (buffer-substring save-pos (point))) - (skip-chars-forward ":\t ") - (setq save-pos (point)) - (skip-chars-forward "^\r\n") - (setq val (if (= save-pos (point)) - nil - (buffer-substring save-pos (point)))) - (cond - ((null val) nil) - ((string-match "^[0-9]+$" val) - (setq val (string-to-int val))) - ((string= "false" (downcase val)) - (setq val nil)) - ((string= "true" (downcase val)) - (setq val t)) - (t nil)) - (skip-chars-forward " \t\n\r") - (setq results (cons (cons tag val) results)))) - (while results - (setq tag (car (car results)) - val (cdr (car results)) - var (cdr-safe (assoc tag w3-netscape-variable-mappings)) - results (cdr results)) - (cond - ((eq var 'w3-delay-image-loads) (set var (not val))) - (var (set var val)) - (t nil))))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Now, lets try Lynx diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-hot.el --- a/lisp/w3/w3-hot.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-hot.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions ;; Author: wmperry -;; Created: 1997/02/18 23:36:48 -;; Version: 1.12 +;; Created: 1997/03/11 15:04:05 +;; Version: 1.13 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -316,15 +316,15 @@ (defun w3-hotlist-add-document-at-point (pref-arg) "Add the document pointed to by the hyperlink under point to the hotlist." (interactive "P") - (let ((url (w3-view-this-url t)) title) + (let ((url (w3-view-this-url t)) + (widget (widget-at (point))) + (title nil)) (or url (error "No link under point.")) - (setq title (get-text-property (point) 'title)) - (if (and title - (marker-buffer (car title)) - (marker-buffer (cdr title))) - (setq title (buffer-substring-no-properties (car title) (cdr title))) - (setq title "None")) - (w3-hotlist-add-document pref-arg title url))) + (if (and (widget-get widget :from) + (widget-get widget :to)) + (setq title (buffer-substring (widget-get widget :from) + (widget-get widget :to)))) + (w3-hotlist-add-document pref-arg (or title url) url))) (defun w3-hotlist-add-document (pref-arg &optional the-title the-url) "Add this documents url to the hotlist" diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-latex.el --- a/lisp/w3/w3-latex.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-latex.el Mon Aug 13 09:19:45 2007 +0200 @@ -38,24 +38,9 @@ ;;; 3) This still doesn't handle tables. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(require 'w3-cus) (require 'w3-print) -(defvar w3-latex-print-links nil - "*If non-nil, prints the URLs of hypertext links as endnotes at the end of -the document. If `footnote', prints the URL's as footnotes on a page.") - -(defvar w3-latex-use-latex2e nil - "*If non-nil, configures LaTeX parser to use LaTeX2e syntax. A `nil' -value indicates that LaTeX 2.0.9 compatibility will be used instead.") - -(defvar w3-latex-packages nil - "*List of LaTeX packages to include. Currently this is only used if -`w3-latex-use-latex2e' is non-nil.") - -(defvar w3-latex-use-maketitle nil - "*Non-nil makes the LaTeX parser use real LaTeX title pages for -document titles.") - ;; Internal variables - do not touch! (defvar w3-latex-current-url nil "What URL we are formatting") (defvar w3-latex-verbatim nil "Whether we are in a {verbatim} block or not") diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-menu.el --- a/lisp/w3/w3-menu.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-menu.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-menu.el --- Menu functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/03/04 14:32:11 -;; Version: 1.30 +;; Created: 1997/03/13 19:25:10 +;; Version: 1.32 ;; Keywords: menu, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -318,11 +318,11 @@ (if (and w3-running-xemacs (featurep 'toolbar)) ["Show Toolbar" w3-toggle-toolbar :style toggle :selected (w3-toolbar-active)] - nil) + ["Show Toolbar" w3-toggle-toolbar nil]) (if w3-running-xemacs ["Show Location" w3-toggle-location :style toggle :selected (w3-location-active)] - nil) + ["Show Location" w3-toggle-location nil]) (if w3-running-xemacs ["Show Status Bar" w3-toggle-minibuffer :style toggle @@ -634,6 +634,7 @@ url-be-asynchronous url-honor-refresh-requests url-privacy-level + url-cookie-confirmation url-proxy-services url-standalone-mode url-use-hypertext-gopher diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-prefs.el --- a/lisp/w3/w3-prefs.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-prefs.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-prefs.el --- Preferences panels for Emacs-W3 ;; Author: wmperry -;; Created: 1997/03/04 14:33:41 -;; Version: 1.16 +;; Created: 1997/03/14 06:31:17 +;; Version: 1.19 ;; Keywords: hypermedia, preferences ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -43,7 +43,8 @@ (cookies . "HTTP Cookies") (hooks . "Various Hooks") (compatibility . "Compatibility") - (proxy . "Proxy"))) + (proxy . "Proxy") + (privacy . "Privacy"))) (defun w3-preferences-generic-variable-callback (widget &rest ignore) (condition-case () @@ -218,7 +219,7 @@ (while todo (setq cur (car todo) todo (cdr todo) - doc (get cur 'variable-documentation)) + doc (documentation-property cur 'variable-documentation)) ;; (get cur 'variable-documentation)) (if (string-match "^\\*" doc) (setq doc (substring doc 1 nil))) (setq pt (point)) @@ -287,18 +288,23 @@ (proxy nil) (host-var nil) (port-var nil) - (urlobj nil)) + (host nil) + (port nil) + (proxy-entry nil)) (widget-insert "\n") (while proxies (setq proxy (car proxies) proxies (cdr proxies) host-var (intern (format "w3-%s-proxy-host" (downcase proxy))) port-var (intern (format "w3-%s-proxy-port" (downcase proxy))) - urlobj (url-generic-parse-url - (cdr-safe - (assoc (downcase proxy) url-proxy-services)))) - (set (make-local-variable host-var) (or (url-host urlobj) "")) - (set (make-local-variable port-var) (or (url-port urlobj) ""))))) + proxy-entry (cdr-safe (assoc (downcase proxy) url-proxy-services))) + (if (and proxy-entry (string-match "\\(.*\\):\\([0-9]+\\)" proxy-entry)) + (setq host (match-string 1 proxy-entry) + port (match-string 2 proxy-entry)) + (setq host proxy-entry + port nil)) + (set (make-local-variable host-var) (or host "")) + (set (make-local-variable port-var) (or port ""))))) (defun w3-preferences-create-proxy-panel () (let ((proxies '("FTP" "Gopher" "HTTP" "Security" "WAIS" "SHTTP" "News")) @@ -352,12 +358,126 @@ port (symbol-value port-var)) (if (and host (/= 0 (length host))) (setq new-proxy-services (cons (cons (downcase proxy) - (format "http://%s:%s/" host + (format "%s:%s" host (or port "80"))) new-proxy-services)))) (setq url-proxy-services new-proxy-services))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Privacy panel +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defsubst w3-preferences-privacy-bits-sort (bits) + (sort bits (function (lambda (a b) + (memq b (memq a '(email os lastloc agent cookie))))))) + +(defvar url-valid-privacy-levels + '((paranoid . (email os lastloc agent cookie)) + (high . (email lastloc)) + (low . (lastloc)) + (none . nil))) + +(defvar w3-preferences-privacy-bit-widgets nil) +(defvar w3-preferences-privacy-level-widget nil) +(defvar w3-preferences-temp-url-privacy-level nil) +;; darnit i just noticed the checklist widget, this should probably be +;; reimplemented with that instead of checkboxes, but i've almost finished. +(defun w3-preferences-privacy-bit-callback (widget &rest ignore) + (let ((privacy-bits (if (listp w3-preferences-temp-url-privacy-level) + w3-preferences-temp-url-privacy-level + (copy-list (cdr-safe (assq w3-preferences-temp-url-privacy-level url-valid-privacy-levels))))) + (bit (widget-get widget 'bit)) + (val (widget-value widget))) + (if val + (setq privacy-bits (delq bit privacy-bits)) + (setq privacy-bits (w3-preferences-privacy-bits-sort (cons bit (delq bit privacy-bits))))) + (setq w3-preferences-temp-url-privacy-level + (or (car (rassoc privacy-bits url-valid-privacy-levels)) + privacy-bits)) + (widget-value-set w3-preferences-privacy-level-widget + (if (listp w3-preferences-temp-url-privacy-level) + 'custom + w3-preferences-temp-url-privacy-level)) + )) + + +(defun w3-preferences-privacy-level-callback (widget &rest ignore) + (let* ((val (widget-value widget)) + (privacy-bits (cdr-safe (assq val url-valid-privacy-levels)))) + (if (eq val 'custom) nil + (setq w3-preferences-temp-url-privacy-level val) + (mapcar (function (lambda (bit) + (widget-value-set (cdr bit) + (not (memq (car bit) + privacy-bits))))) + w3-preferences-privacy-bit-widgets)) + )) + +(defun w3-preferences-init-privacy-panel () + (w3-preferences-create-temp-variables '(url-privacy-level + url-cookie-confirmation)) + (setq w3-preferences-privacy-bit-widgets nil) + (setq w3-preferences-privacy-level-widget nil)) + +(defsubst w3-preferences-create-privacy-bit-widget (bit bit-text current-bits) + (let ((bit-widget (widget-create + 'checkbox + :value (not (memq bit current-bits)) + :notify 'w3-preferences-privacy-bit-callback + ))) + (widget-put bit-widget 'bit bit) + (setq w3-preferences-privacy-bit-widgets (cons (cons bit bit-widget) + w3-preferences-privacy-bit-widgets)) + (widget-insert " " bit-text "\n"))) + + +(defun w3-preferences-create-privacy-panel () + (let ((privacy-bits (if (listp url-privacy-level) + url-privacy-level + (cdr-safe (assq url-privacy-level url-valid-privacy-levels))))) + (widget-insert "\n") + (widget-insert "General Privacy Level: ") + ;;; XXX something is weird with case folding in the following widget if you + ;;; type an option in lower case it accepts it but doesn't do anything + (setq w3-preferences-privacy-level-widget + (widget-create + 'choice + :value (if (listp w3-preferences-temp-url-privacy-level) + 'custom + w3-preferences-temp-url-privacy-level) + :notify 'w3-preferences-privacy-level-callback + :format "%v" + :tag "Privacy Level" + (list 'choice-item :format "%[%t%]" :tag "Paranoid" :value 'paranoid) + (list 'choice-item :format "%[%t%]" :tag "High" :value 'high) + (list 'choice-item :format "%[%t%]" :tag "Low" :value 'low) + (list 'choice-item :format "%[%t%]" :tag "None" :value 'none) + (list 'choice-item :format "%[%t%]" :tag "Custom" :value 'custom))) + (widget-put w3-preferences-privacy-level-widget 'variable 'w3-preferences-temp-url-privacy-level) + + (widget-insert "\n(controls the options below)\n\nSend the following information with each request:\n") + (setq w3-preferences-privacy-bit-widgets nil) + (w3-preferences-create-privacy-bit-widget 'email "E-mail address" privacy-bits) + (w3-preferences-create-privacy-bit-widget 'lastloc "Last location visited" privacy-bits) + (w3-preferences-create-privacy-bit-widget 'os "Operating system information" privacy-bits) + (w3-preferences-create-privacy-bit-widget 'agent "User agent information" privacy-bits) + (w3-preferences-create-privacy-bit-widget 'cookie "Accept cookies" privacy-bits) + (widget-insert " ") + (widget-put + (widget-create + 'checkbox + :value (symbol-value 'w3-preferences-temp-url-cookie-confirmation) + :notify 'w3-preferences-generic-variable-callback) + 'variable 'w3-preferences-temp-url-cookie-confirmation) + (widget-insert " Ask before accepting cookies\n")) + (widget-setup)) + +(defun w3-preferences-save-privacy-panel () + (w3-preferences-restore-variables '(url-privacy-level + url-cookie-confirmation)) + (url-setup-privacy-info)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun w3-preferences-create-panel (panel) @@ -458,6 +578,7 @@ (window-conf (current-window-configuration))) (delete-other-windows) (set-buffer prefs-buffer) + (set (make-local-variable 'widget-push-button-gui) nil) (w3-preferences-init-all-panels) (set-window-buffer (selected-window) prefs-buffer) (make-local-variable 'widget-field-face) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-script.el --- a/lisp/w3/w3-script.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-script.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-script.el --- Scripting support ;; Author: wmperry -;; Created: 1997/03/07 14:13:39 -;; Version: 1.5 +;; Created: 1997/03/08 01:28:33 +;; Version: 1.6 ;; Keywords: hypermedia, scripting ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -81,10 +81,12 @@ (let ((st 0) (form nil) (max (length f))) - (while (and (< st max) (setq form (read-from-string f st))) - (setq st (cdr form) - form (car form)) - (w3-elisp-safe-eval form)))) + (condition-case () + (while (and (< st max) (setq form (read-from-string f st))) + (setq st (cdr form) + form (car form)) + (w3-elisp-safe-eval form)) + (error nil)))) (otherwise (message "Unimplemented scripting language: %S" w3-current-scripting-language))))) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-sysdp.el --- a/lisp/w3/w3-sysdp.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-sysdp.el Mon Aug 13 09:19:45 2007 +0200 @@ -658,11 +658,13 @@ (cond ((eq window-system 'x) (car-safe (x-list-fonts fontname))) ((eq window-system 'ns) (car-safe (ns-list-fonts fontname))) + ((eq window-system 'win32) (car-safe (x-list-fonts fontname))) + ((eq window-system 'pm) (car-safe (x-list-fonts fontname))) (t nil))) (sysdep-defalias 'device-pixel-width (cond - ((and (eq window-system 'x) (fboundp 'x-display-pixel-width)) + ((and (memq window-system '(x win32 pm)) (fboundp 'x-display-pixel-width)) 'x-display-pixel-width) ((and (eq window-system 'ns) (fboundp 'ns-display-pixel-width)) 'ns-display-pixel-width) @@ -670,7 +672,7 @@ (sysdep-defalias 'device-pixel-height (cond - ((and (eq window-system 'x) (fboundp 'x-display-pixel-height)) + ((and (memq window-system '(x win32 pm)) (fboundp 'x-display-pixel-height)) 'x-display-pixel-height) ((and (eq window-system 'ns) (fboundp 'ns-display-pixel-height)) 'ns-display-pixel-height) @@ -678,7 +680,7 @@ (sysdep-defalias 'device-mm-width (cond - ((and (eq window-system 'x) (fboundp 'x-display-mm-width)) + ((and (memq window-system '(x win32 pm)) (fboundp 'x-display-mm-width)) 'x-display-mm-width) ((and (eq window-system 'ns) (fboundp 'ns-display-mm-width)) 'ns-display-mm-width) @@ -686,7 +688,7 @@ (sysdep-defalias 'device-mm-height (cond - ((and (eq window-system 'x) (fboundp 'x-display-mm-height)) + ((and (memq window-system '(x win32 pm)) (fboundp 'x-display-mm-height)) 'x-display-mm-height) ((and (eq window-system 'ns) (fboundp 'ns-display-mm-height)) 'ns-display-mm-height) @@ -694,7 +696,7 @@ (sysdep-defalias 'device-bitplanes (cond - ((and (eq window-system 'x) (fboundp 'x-display-planes)) + ((and (memq window-system '(x win32 pm)) (fboundp 'x-display-planes)) 'x-display-planes) ((and (eq window-system 'ns) (fboundp 'ns-display-planes)) 'ns-display-planes) @@ -747,7 +749,7 @@ ((string-match "color" val) 'color) ((string-match "gray-scale" val) 'grayscale) (t 'mono)))))) - (t (function (lambda (&optional device) 'mono))))) + (t (function (lambda (&optional device) 'color))))) (sysdep-defun device-class-list () "Returns a list of valid device classes." @@ -787,7 +789,6 @@ "Given a TYPE, return t if it is valid." (memq type (device-type-list))) - ;; Extent stuff (sysdep-fset 'delete-extent 'delete-overlay) (sysdep-fset 'extent-end-position 'overlay-end) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-vars.el --- a/lisp/w3/w3-vars.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-vars.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-vars.el,v --- All variable definitions for emacs-w3 ;; Author: wmperry -;; Created: 1997/03/07 16:46:48 -;; Version: 1.102 +;; Created: 1997/03/14 06:51:56 +;; Version: 1.108 ;; Keywords: comm, help, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -29,8 +29,11 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Variable definitions for w3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require 'w3-cus) ; Grab everything that is customized + (defconst w3-version-number - (let ((x "p3.0.65")) + (let ((x "p3.0.68")) (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x) (setq x (substring x (match-beginning 1) (match-end 1))) (setq x (substring x 1))) @@ -38,7 +41,7 @@ (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x "")) "Version # of w3-mode.") -(defconst w3-version-date (let ((x "1997/03/07 16:46:48")) +(defconst w3-version-date (let ((x "1997/03/14 06:51:56")) (if (string-match "Date: \\([^ \t\n]+\\)" x) (substring x (match-beginning 1) (match-end 1)) x)) @@ -51,216 +54,16 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; General configuration variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar w3-auto-image-alt t - "*Whether emacs-w3 should create an alt attribute for an image that -is missing it. -If nil, emacs-w3 will not automatically create an ALT attribute. -If t, the alt attribute will be [IMAGE(nameofimage)] -If a string, it should be a string suitable for running through format, - with only one %s, which will be replaced with just the filename of the - graphic that is not loaded.") - -(defvar w3-configuration-directory "~/.w3/" - "*Where emacs-w3 can find its configuration files") - -(defvar w3-debug-html nil "*Whether to gripe about bad HTML or not.") - -(defvar w3-debug-buffer "*HTML Debug*" - "*Name of buffer to store debugging information in.") - -(defvar w3-default-configuration-file nil - "*Where per-user customizations of w3 are kept.") - -(defvar w3-default-homepage nil - "*The url to open at startup. It can be any valid URL. -This will default to the environment variable WWW_HOME if you do not -set it in your .emacs file. If WWW_HOME is undefined, then it will -default to the hypertext documentation for W3 at Indiana University.") - -(defvar w3-default-stylesheet nil - "*The filename of the users default stylesheet.") - -(defvar w3-display-frames nil - "*Fetch frames - not optimal.") - -(defvar w3-frame-labels '("FRAME(" . ")") - "Strings surrounding a frame name") - -(defvar w3-frame-regexp "FRAME(\\([^)]+\\))" - "Regexp for finding a frame hyperlink") - -(defvar w3-frameset-structure nil - "Frameset structure") - -(defvar w3-frameset-dimensions nil - "Frameset dimensions") - -(defvar w3-frame-name nil - "Frame name") - -(defvar w3-base-target nil - "Base target name") - -(defvar w3-target-window-distances nil - "Target window distances") - -(defvar w3-do-incremental-display nil - "*Whether to do incremental display of pages or not.") - (defvar w3-dump-to-disk nil "*If non-nil, all W3 pages loaded will be dumped to disk.") -(defvar w3-echo-link '(title url text name) - "*Whether to display the URL of a link when tabbing through links. -Value is a list of one or more of the following symbols: - - url == url of the target - text == text of the link - title == title attribute of the link - name == name or id attribute of the link - -If none of the information is available, nothing will be shown for the link -in menus, etc.") - -(defvar w3-horizontal-rule-char ?- - "*The character to use to create a horizontal rule. -Must be the character's code, not a string. This character is -replicated across the screen to create a division.") - (defvar w3-fetch-with-default t "*Whether `w3-fetch' should determine a good starting URL as a default.") -(defvar w3-hotlist-file nil - "*Hotlist filename. -This should be the name of a file that is stored in either -NCSA's Mosaic/X or Netscape/X format. It is used to keep a listing -of commonly accessed URL's without having to go through 20 levels of -menus to get to them.") - -(defvar w3-icon-directory "http://cs.indiana.edu/elisp/w3/icons/" - "*Where to find standard icons. Must end in a /!") - -(defvar w3-icon-format 'xbm - "*What file extension icons end in. This is a symbol, string, or nil. -If nil, then no file extension is used.") - -(defvar w3-indent-level 4 - "*Default # of spaces to indent instead of using TABs. This is -necessary to preserve tabs in PRE segments yet still get smaller -indentation for lists, etc.") - -(defvar w3-keep-old-buffers t - "*Whether to keep old buffers around when following links.") - -(defvar w3-latex-docstyle "{article}" - "*The documentstyle to use when printing/mailing converted HTML -files in LaTeX. Good defaults are: -{article}, [psfig,twocolumn]{article}, etc.") - -(defvar w3-mail-command 'mail - "*This function will be called whenever w3 needs to send mail. It should -enter a mail-mode-like buffer in the current window. -The commands `mail-to' and `mail-subject' should still work in this -buffer, and it should use mail-header-separator if possible.") - -(defvar w3-max-menu-length 35 - "*The maximum length of a pulldown menu before it will be split into -smaller chunks, with the first part as a submenu, followed by the rest -of the menu.") - -(defvar w3-max-menu-width 40 "*The maximum width of a pulldown menu choice.") - -(defvar w3-modeline-format - '(" " ("W3" - (w3-netscape-emulation-minor-mode - " (NS)") - (w3-lynx-emulation-minor-mode - " (Lynx)") - ": " - (40 (-40 "%b")) - " " - (w3-current-isindex "[Searchable] ") - "%p" " " global-mode-string)) - "*The modeline format string when in w3 mode") - -(defvar w3-mule-attribute 'underline - "*How to highlight items in Mule (Multi-Linugual Emacs).") - -(defvar w3-netscape-configuration-file nil - "*A Netscape-for-X style configuration file. This file will only be read if -and only if `w3-use-netscape-configuration-file' is non-nil.") - -(defvar w3-netscape-compatible-comments t - "*Whether to honor netscape-style <! > comments. -Ye gods I wish I could turn this off by default.") - -(defvar w3-notify 'semibully - "*Selects the behavior when w3 page is ready. -This variable may have one of the following values: - -newframe -- put the w3 page in its own frame -bully -- make the w3 page the current buffer and only window -semibully -- make the w3 page the current buffer in the same window -aggressive -- make the w3 page the current buffer in the other window -friendly -- display w3page in other window but don't make current -polite -- don't display w3 page, but prints message when ready (beeps) -quiet -- like `polite', but don't beep -meek -- make no indication that page is ready - -Any other value of `w3-notify' is equivalent to `meek'.") - -(defvar w3-popup-menu-on-mouse-3 t - "*Non-nil value means W3 should provide context-sensitive menus on mouse-3. -A nil value means W3 should not change the binding of mouse-3.") - -(defvar w3-print-command "lpr -h -d" - "*Print command for dvi files. -This is usually lpr -h -d to send it to a postscript printer, but you can set -it up so that it is any command that takes a dvi file as its last argument.") - -(defvar w3-reuse-buffers 'reuse - "What to do when following a link will re-fetch a document that has -already been fetched into a W3 buffer. Possible values are: nil, -'yes, and 'no. Nil means ask the user if we should reuse the buffer. - A value of 'yes means assume the user wants us to reuse the buffer. -A value of 'no means assume the user wants us to re-fetch the document. - -This will also accept: -'no 'never 'reload ==> always reload -'yes 'reuse 'always ==> always reuse -'ask nil ==> always ask") - -(defvar w3-right-margin 2 - "*Amount of space to leave on right margin of WWW buffers. -This amount is subtracted from (window-width) for each new WWW buffer -and used as the new fill-column.") - -(defvar w3-maximum-line-length nil - "*Maximum length of a line. If nil, then lines can extend all the way to -the window margin.") - -(defvar w3-temporary-directory "/tmp" "*Where temporary files go.") - (defvar w3-track-last-buffer nil "*Whether to track the last w3 buffer to automatically switch to with M-x w3.") -(defvar w3-track-mouse t - "*Whether to track the mouse and message the url under the mouse.") - -(defvar w3-use-netscape-configuration-file nil - "*Whether to use a netscape configuration file to determine things like -home pages, link colors, etc. If non-nil, then `w3-netscape-configuration-file' -is read in at startup.") - -(defvar w3-honor-stylesheets t - "*Whether to let a document specify a CSS stylesheet.") - -(defvar w3-user-colors-take-precedence nil - "*Whether to let a document define certain colors about itself. -Like foreground and background colors and pixmaps, color of links and -visited links, etc.") - (defvar w3-gc-cons-threshold-multiplier 1 "Amount to temporarily multiply gc-cons-threshold by when parsing HTML. Setting this to a number greater than 1 will result in less frequent @@ -270,14 +73,6 @@ in later garbage collections taking more time.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Hook Variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar w3-load-hook nil "*Hooks to be run after loading w3.") -(defvar w3-mode-hook nil "*Hooks to be run after entering w3-mode.") -(defvar w3-source-file-hook nil - "*Hooks to be run after getting document source.") - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Figure out what flavor of emacs we are running ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar w3-running-xemacs (string-match "XEmacs\\|Lucid" emacs-version) @@ -288,43 +83,8 @@ "*In FSF v19 emacs?") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Graphics parsing stuff +;; Store the database of HTML general entities. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar w3-graphics-list nil - "*List of graphics already read in.") - -(defvar w3-delay-image-loads nil - "*Delay loading images for w3 or not?") - -(defvar w3-delayed-images nil - "*A buffer-local variable holding positions and urls of images within -the buffer.") - -(defvar w3-image-mappings - '( - ("image/x-xbitmap" . xbm) - ("image/xbitmap" . xbm) - ("image/xbm" . xbm) - ("image/jpeg" . jpeg) - ("image/gif" . gif) - ("image/png" . png) - ("image/x-fax" . g3fax) - ("image/x-raster" . rast) - ("image/windowdump" . xwd) - ("image/x-icon" . icon) - ("image/portable-graymap" . pgm) - ("image/portable-pixmap" . ppm) - ("image/x-pixmap" . xpm) - ("image/x-xpixmap" . xpm) - ("image/pict" . pict) - ("image/x-rgb" . sgi) - ("image/x-sgi" . sgi) - ("image/x-macpaint" . macpt) - ("image/x-targa" . tga) - ("image/tiff" . tiff) - ) "*How to map MIME types to image types for the `image' package.") - -;; Store the database of HTML general entities. (defvar w3-html-entities '( (excl . 33) @@ -562,6 +322,11 @@ '("Emacs-W3 Commands" ["Back" w3-history-backward (car (w3-history-find-url-internal (url-view-url t)))] ["Forward" w3-history-forward (cdr (w3-history-find-url-internal (url-view-url t)))] + "---" + ["Reload" (w3-reload-document) t] + ["Show Images" (w3-load-delayed-images) w3-delayed-images] + "---" + ["Add bookmark" (w3-hotlist-add-document nil) t] ) "The shorter popup menu.") @@ -578,7 +343,7 @@ (defvar w3-hyperlink-menu '(("Open this Link (%s)" . w3-fetch) - ("Add Bookmark for this Link" . w3-hotlist-add-document) + ("Add Bookmark for this Link" . w3-hotlist-add-document-at-point) ("New Window with this Link" . w3-fetch-other-frame) ("Save Link As..." . w3-download-url) ("Copy this Link Location to Clipboard" . w3-save-url) @@ -589,20 +354,37 @@ the link. Each label can have exactly one `%s' that will be replaced by the URL of the link.") -(defvar w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/docs/" - "*Where the w3 documentation lives. This MUST end in a slash.") - -(defvar w3-defined-link-types - ;; This is the HTML3.0 list (downcased) plus "made". - '("previous" "next" "up" "down" "home" "toc" "index" "glossary" - "copyright" "bookmark" "help" "made") - "A list of the (lower-case) names which have special significance -as the values of REL or REV attributes of <link> elements. They will -be presented on the toolbar or the links menu, for instance.") - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Variables internal to W3, you should not change any of these ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar w3-graphics-list nil + "*List of graphics already read in.") + +(defvar w3-delayed-images nil + "*A buffer-local variable holding positions and urls of images within +the buffer.") + +(defvar w3-frame-labels '("FRAME(" . ")") + "Strings surrounding a frame name") + +(defvar w3-frame-regexp "FRAME(\\([^)]+\\))" + "Regexp for finding a frame hyperlink") + +(defvar w3-frameset-structure nil + "Frameset structure") + +(defvar w3-frameset-dimensions nil + "Frameset dimensions") + +(defvar w3-frame-name nil + "Frame name") + +(defvar w3-base-target nil + "Base target name") + +(defvar w3-target-window-distances nil + "Target window distances") + (defvar w3-form-radio-elements nil "Internal variable - do not touch!") (defvar w3-form-elements nil "Internal variable - do not touch!") @@ -612,9 +394,6 @@ (defvar w3-current-stylesheet nil "The stylesheet for this document.") -(defvar w3-base-alist nil - "An assoc list of named BASE tags in the current document.") - (defvar w3-blinking-buffs nil "A list of buffers with blinking text in them. This is used to optimize when we change a face so the entire display @@ -625,37 +404,9 @@ "An internal variable for the new display engine that specifies the last character position that was correctly filled.") -(defvar w3-last-tag nil - "An internal variable for the new display engine that specifies the -last tag processed.") - (defvar w3-active-faces nil "The list of active faces.") (defvar w3-active-voices nil "The list of active voices.") -(defvar w3-netscape-variable-mappings - '(("PRINT_COLOR" . ps-print-color-p) - ("SOCKS_HOST" . url-socks-host) - ("ORGANIZATION" . url-user-organization) - ("EMAIL_ADDRESS" . url-personal-mail-address) - ("REAL_NAME" . url-user-real-name) - ("NEWSGROUP_DESCRIPTIONS" . url-show-newsgroup-descriptions) - ("NNTPSERVER" . url-news-server) - ("AUTOLOAD_IMAGES" . w3-delay-image-loads) - ("HOME_DOCUMENT" . w3-default-homepage) - ("UNDERLINE_LINKS" . w3-underline-links) - ("TMPDIR" . url-temporary-directory)) - "A mapping from netscape configuration file options to w3 variables.") - -(defvar w3-acceptable-protocols-alist - '(("Gopher" . "gopher") - ("TN3270 (IBM Mainframe emulation)" . "tn3270") - ("Interactive Telnet Session" . "telnet") - ("Local file or file over ftp" . "file") - ("File on an http server" . "http") - ("Usenet newsgroup/article" . "news") - ("Mail session" . "mailto")) - "An assoc list of descriptive labels and the corresponding URL stub.") - (defconst w3-bug-address "wmperry@cs.indiana.edu" "Address of current maintainer, where to send bug reports.") (defvar w3-continuation '(url-uncompress url-clean-text) @@ -750,8 +501,6 @@ (if (boundp var) (make-variable-buffer-local var)))) w3-persistent-variables) -(make-variable-buffer-local 'w3-base-alist) -(make-variable-buffer-local 'w3-last-tag) (make-variable-buffer-local 'w3-last-fill-pos) (make-variable-buffer-local 'w3-frame-name) (make-variable-buffer-local 'w3-active-faces) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-widget.el --- a/lisp/w3/w3-widget.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-widget.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-widget.el --- An image widget ;; Author: wmperry -;; Created: 1997/03/05 23:37:58 -;; Version: 1.20 +;; Created: 1997/03/11 15:40:22 +;; Version: 1.23 ;; Keywords: faces, images ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -56,6 +56,8 @@ (defvar widget-image-keymap (make-sparse-keymap) "Keymap used over glyphs in an image widget") +(define-widget-keywords :tab-order) + (defconst widget-mouse-button1 nil) (defconst widget-mouse-button2 nil) (defconst widget-mouse-button3 nil) @@ -244,7 +246,8 @@ ((and server-map (stringp href)) (setq real-widget (widget-image-create-subwidget - 'push-button :tag alt + 'push-button + :tag alt :delete 'widget-default-delete :value href :action (widget-get widget :action) @@ -261,6 +264,7 @@ (setq real-widget (widget-image-create-subwidget 'push-button :tag alt :format "%[%t%]" + :tab-order -1 :delete 'widget-default-delete :action (widget-get widget :action) :notify 'widget-image-callback)))) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3-xemac.el --- a/lisp/w3/w3-xemac.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3-xemac.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3-xemac.el --- XEmacs specific functions for emacs-w3 ;; Author: wmperry -;; Created: 1997/02/17 23:09:24 -;; Version: 1.15 +;; Created: 1997/03/09 01:59:33 +;; Version: 1.16 ;; Keywords: faces, help, mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -144,9 +144,11 @@ (if (not w3-track-mouse) (setq inhibit-help-echo nil)) (setq mode-motion-hook 'w3-mouse-handler))) - (if (eq (device-type) 'tty) - nil - (w3-add-toolbar-to-buffer)) + (case (device-type) + ((tty stream) ; TTY or batch + nil) + (otherwise + (w3-add-toolbar-to-buffer))) (setq mode-popup-menu w3-popup-menu)) (require 'w3-toolbar) diff -r e183fc049578 -r fe104dbd9147 lisp/w3/w3.el --- a/lisp/w3/w3.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/w3/w3.el Mon Aug 13 09:19:45 2007 +0200 @@ -1,7 +1,7 @@ ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions ;; Author: wmperry -;; Created: 1997/03/07 16:44:12 -;; Version: 1.93 +;; Created: 1997/03/14 06:39:41 +;; Version: 1.98 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -130,18 +130,13 @@ ;;; Functions to pass files off to external viewers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun w3-start-viewer (fname cmd &optional view) - "Start a subprocess, named FNAME, executing CMD + "Start a subprocess, named FNAME, executing CMD. If third arg VIEW is non-nil, show the output in a buffer when the subprocess exits." (if view (save-excursion (set-buffer (get-buffer-create view)) (erase-buffer))) - (let ((proc - (start-process fname view (or shell-file-name - (getenv "ESHELL") - (getenv "SHELL") - "/bin/sh") "-c" cmd))) - proc)) + (start-process fname view shell-file-name shell-command-switch cmd)) (defun w3-viewer-filter (proc string) ;; A process filter for asynchronous external viewers @@ -279,56 +274,6 @@ (mule-write-region-no-coding-system (point-min) (point-max) file) (kill-buffer (current-buffer)))) -(defun w3-build-url (protocol) - "Build a url for PROTOCOL, return it as a string" - (interactive (list (cdr (assoc (completing-read - "Protocol: " - w3-acceptable-protocols-alist nil t) - w3-acceptable-protocols-alist)))) - (let (user host port file) - (cond - ((null protocol) (error "Protocol is unknown to me!")) - ((string= protocol "news") - (setq host (read-string "Enter news server name, or blank for default: ") - port (read-string "Enter port number, or blank for default: ") - file (read-string "Newgroup name or Message-ID: "))) - ((string= protocol "mailto") (setq file (read-string "E-mail address: "))) - ((string= protocol "http") - (setq host (read-string "Enter server name: ") - port (read-string "Enter port number, or blank for default: ") - file (read-string "Remote file: ")) - (and (string= "" port) (setq port nil)) - (and (string= "" host) (error "Must specify a remote machine!"))) - ((string= protocol "file") - (if (funcall url-confirmation-func "Local file?") - (setq file (read-file-name "Local File: " nil nil t)) - (setq user (read-string "Login as user (blank=anonymous): ") - host (read-string "Remote machine name: ")) - (and (string= user "") (setq user "anonymous")) - (and (string= host "") (error "Must specify a remote machine!")) - (setq file (read-file-name "File: " (format "/%s@%s:" user host) - nil t) - file (substring file (length (format "/%s@%s:" user host)))))) - ((or (string= protocol "telnet") - (string= protocol "tn3270")) - (setq user (read-string "Login as user (blank=none): ") - host (read-string "Remote machine name: ") - port (read-string "Port number (blank=23): ")) - (and (string= "" port) (setq port nil)) - (and (string= "" user) (setq user nil)) - (and (string= "" host) (error "Must specify a host machine!"))) - ((string= protocol "gopher") - (setq host (read-string "Enter server name: ") - port (read-string "Enter port number, or blank for default: ") - file (read-string "Remote file: ")) - (and (string= "" port) (setq port nil)) - (and (string= "" host) (error "Must specify a remote machine!")))) - (message "%s:%s%s" - protocol - (if (null host) "" (concat "//" host - (if (null port) "" (concat ":" port)))) - (if (= ?/ (string-to-char file)) file (concat "/" file))))) - ;;;###autoload (defun w3-open-local (fname) "Find a local file, and interpret it as a hypertext document. @@ -653,7 +598,7 @@ (nth 5 attributes))) (hdrs url-current-mime-headers) (size (or (cdr (assoc "content-length" url-current-mime-headers)) - (point-max))) + (buffer-size))) (info w3-current-metainfo)) (set-buffer (get-buffer-create url-working-buffer)) (setq url-current-can-be-cached nil) @@ -967,7 +912,7 @@ (setq content-type "application/x-latex; charset=iso-8859-1") (w3-parse-tree-to-latex w3-current-parse url))) (buffer-string)))) - (funcall w3-mail-command) + (funcall url-mail-command) (mail-subject) (if (and (boundp 'mime/editor-mode-flag) mime/editor-mode-flag) (insert format " from <URL: " url ">") @@ -2008,7 +1953,8 @@ w3-configuration-directory)) - (if (and w3-default-configuration-file + (if (and init-file-user + w3-default-configuration-file (file-exists-p w3-default-configuration-file)) (condition-case e (load w3-default-configuration-file nil t) @@ -2027,14 +1973,6 @@ "Please consult the `%s' buffer for details.")) w3-default-configuration-file buf-name)))))) - (setq w3-netscape-configuration-file - (cond - (w3-netscape-configuration-file - w3-netscape-configuration-file) - ((memq system-type '(ms-dos ms-windows)) - (expand-file-name "~/NETSCAPE.CFG")) - (t (expand-file-name "~/.netscape/preferences")))) - (if (and (eq w3-user-colors-take-precedence 'guess) (not (eq (device-type) 'tty)) (not (eq (device-class) 'mono))) @@ -2050,11 +1988,6 @@ (expand-file-name "history" w3-configuration-directory))) - (if (and w3-use-netscape-configuration-file - w3-netscape-configuration-file - (fboundp 'w3-read-netscape-config)) - (w3-read-netscape-config w3-netscape-configuration-file)) - (add-minor-mode 'w3-netscape-emulation-minor-mode " NS" w3-netscape-emulation-minor-mode-map) (add-minor-mode 'w3-lynx-emulation-minor-mode " Lynx" @@ -2125,7 +2058,7 @@ (write-file-hooks nil) (write-contents-hooks nil) (enable-multibyte-characters t) ; mule 2.4 - (buffer-file-coding-system mule-no-coding-system) ; mule 2.4 + (coding-system-for-write mule-no-coding-system) ; (X)Emacs/mule (file-coding-system mule-no-coding-system) ; mule 2.3 (mc-flag t)) ; mule 2.3 (write-file fname) @@ -2275,12 +2208,12 @@ (mapcar (function (lambda (x) (set-variable (car x) (cdr x)))) tmp) (w3-mode-version-specifics) (w3-menu-install-menus) - (run-hooks 'w3-mode-hook) - (widget-setup) (setq url-current-passwd-count 0 inhibit-read-only nil truncate-lines t mode-line-format w3-modeline-format) + (run-hooks 'w3-mode-hook) + (widget-setup) (if w3-current-isindex (setq mode-line-process "-Searchable"))))) diff -r e183fc049578 -r fe104dbd9147 lisp/x11/x-menubar.el --- a/lisp/x11/x-menubar.el Mon Aug 13 09:18:41 2007 +0200 +++ b/lisp/x11/x-menubar.el Mon Aug 13 09:19:45 2007 +0200 @@ -1209,9 +1209,8 @@ "This function will return a list of all faces that have not been 'customized'." (delq nil (mapcar '(lambda (face) - (if (not (or (get face 'saved-face) - (get face 'factory-face))) - face)) + (unless (get face 'saved-face) + face)) (face-list)))) (defun save-options-specifier-spec-list (face property) @@ -1410,9 +1409,18 @@ (popup-menu (cond ((and global-popup-menu mode-popup-menu) (check-menu-syntax mode-popup-menu) - (let ((title (car mode-popup-menu)) - (items (cdr mode-popup-menu))) - (append global-popup-menu + (let* ((title (car mode-popup-menu)) + (items (cdr mode-popup-menu)) + filters) + ;; Strip keywords from local menu for attaching them at the top + (while (not (vectorp (car items))) + (setq items (append filters (list (car items)))) + (setq items (cdr items))) + ;; If filters contains a keyword already present in + ;; `global-popup-menu' you will probably lose. + (append (list (car global-popup-menu)) + filters + (cdr global-popup-menu) '("---" "---") (if popup-menu-titles (list title)) (if popup-menu-titles '("---" "---")) diff -r e183fc049578 -r fe104dbd9147 man/ChangeLog --- a/man/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/man/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,8 @@ +Wed Mar 12 14:39:43 1997 Steven L Baur <steve@altair.xemacs.org> + + * lispref/strings.texi (Text Comparison): Correct example for + `char-equal'. Add new function `char='. + Thu Mar 6 13:33:54 1997 Steven L Baur <steve@altair.xemacs.org> * Makefile: Update for new texinfo manual. diff -r e183fc049578 -r fe104dbd9147 man/cc-mode.texi --- a/man/cc-mode.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/cc-mode.texi Mon Aug 13 09:19:45 2007 +0200 @@ -1,11 +1,11 @@ -\input texinfo @c -*- texinfo -*- +\input texinfo @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @comment %**start of header (This is for running Texinfo on a region) @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @setfilename cc-mode.info -@settitle CC-MODE Version 4 Documentation +@settitle CC MODE Version 4 Documentation @footnotestyle end @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -17,12 +17,12 @@ @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @comment @comment texinfo manual for @file{cc-mode.el} version 4 -@comment manual version: 2.55 +@comment manual version: 2.66 @comment generated from the original README file by Krishna Padmasola @comment <krishna@earth-gw.njit.edu> @comment @comment Barry A. Warsaw <bwarsaw@cnri.reston.va.us> -@comment Last modification: 1996/08/21 19:29:16 +@comment Last modification: 1997/03/07 23:36:14 @comment @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -48,10 +48,10 @@ @comment The title is printed in a large font. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@center @titlefont{CC-MODE Version 4} +@center @titlefont{CC Mode Version 4} @sp 2 @center A GNU Emacs mode for editing C, C++, Objective-C, and Java code. -@center (manual revision: 2.55) +@center (manual revision: 2.66) @sp 2 @center Barry A. Warsaw @@ -89,7 +89,7 @@ * Syntactic Symbols:: * Performance Issues:: * Frequently Asked Questions:: -* Getting the latest cc-mode release:: +* Getting the latest CC Mode release:: * Sample .emacs File:: * Limitations and Known Bugs:: * Mailing Lists and Submitting Bug Reports:: @@ -107,31 +107,35 @@ @chapter Introduction @cindex Introduction +@macro ccmode +CC Mode +@end macro + @cindex BOCM -Welcome to @code{cc-mode}, version 4. This is a GNU Emacs mode for +Welcome to @ccmode{}, version 4. This is a GNU Emacs mode for editing files containing C, C++, Objective-C, and Java code. This incarnation of the mode is descendant from @file{c-mode.el} (also called "Boring Old C Mode" or BOCM @code{:-)}, and @file{c++-mode.el} -version 2, which I have been maintaining since 1992. @code{cc-mode} +version 2, which I have been maintaining since 1992. @ccmode{} represents a significant milestone in the mode's life. It has been fully merged back with Emacs 19's @file{c-mode.el}. Also a new, more intuitive and flexible mechanism for controlling indentation has been developed. -@code{cc-mode} version 4 supports the editing of K&R and ANSI C, -@dfn{ARM} @footnote{i.e. ``The Annotated C++ Reference Manual'', by -Ellis and Stroustrup.} C++, Objective-C, and Java files. In this way, -you can easily set up consistent coding styles for use in editing all C, -C++, Objective-C, and Java programs. @code{cc-mode} does @emph{not} -handle font-locking (a.k.a. syntax coloring, keyword highlighting) or -anything of that nature, for any of the 4 modes. Those are handled by -other Emacs packages. +@ccmode{} version 4 supports the editing of K&R and ANSI C, @dfn{ARM} +@footnote{``The Annotated C++ Reference Manual'', by Ellis and +Stroustrup.} C++, Objective-C, and Java files. In this way, you can +easily set up consistent coding styles for use in editing all C, C++, +Objective-C, and Java programs. @ccmode{} does @emph{not} handle +font-locking (a.k.a. syntax coloring, keyword highlighting) or anything +of that nature, for any of the 4 modes. Those are handled by other +Emacs packages. This manual will describe the following: @itemize @bullet @item -How to get started using @code{cc-mode}. +How to get started using @ccmode{}. @item How the new indentation engine works. @@ -141,36 +145,33 @@ @end itemize -Note that the name of this file is @file{cc-mode.el}, and I'll often -refer to the package as @code{cc-mode}, but there really is no top level -@code{cc-mode} entry point. I call it @code{cc-mode} simply to -differentiate it from @file{c-mode.el}. All of the variables, commands, -and functions in @code{cc-mode} are prefixed with -@code{c-@var{<thing>}}, and @code{c-mode}, @code{c++-mode}, -@code{objc-mode}, and @code{java-mode} entry points are provided. This -file is intended to be a replacement for @file{c-mode.el} and -@file{c++-mode.el}. +Note that the name of this package is ``@ccmode{}''. The main file for +@ccmode{} is @file{cc-mode.el}, but other files are included in the +@ccmode{} distribution. There is no top level @code{cc-mode} entry +point. All of the variables, commands, and functions in @ccmode{} are +prefixed with @code{c-@var{<thing>}}, and @code{c-mode}, +@code{c++-mode}, @code{objc-mode}, and @code{java-mode} entry points are +provided. This file is intended to be a replacement for +@file{c-mode.el} and @file{c++-mode.el}. @findex c-version The major version number was incremented to 4 with the addition of @code{objc-mode}. To find the minor revision number of this release, use @kbd{M-x c-version RET}. -As of this writing (20-Aug-1996), both Emacs 19.33 and XEmacs 19.14 are -distributed with @code{cc-mode}, however neither have the very latest -version. In all likelihood, Emacs 19.34 and XEmacs 19.15 will contain -the latest version of @code{cc-mode}. You may therefore, want to -upgrade your copy of @code{cc-mode}. See @ref{Getting the latest -cc-mode release}. +As of this writing (27-Feb-1997), Emacs 19.34, XEmacs 19.14, and XEmacs +20.0 are all distributed with @ccmode{}, but they may not have the +latest releases. You may therefore, want to upgrade your copy of +@ccmode{}. See @ref{Getting the latest CC Mode release}. @cindex @file{cc-compat.el} file This distribution also contains a file called @file{cc-compat.el} which -should ease your transition from BOCM to @code{cc-mode}. It currently +should ease your transition from BOCM to @ccmode{}. It currently comes unguaranteed and unsupported, but this may change for future versions. If you have a BOCM configuration you are really happy with, -and want to postpone learning how to configure @code{cc-mode}, take a +and want to postpone learning how to configure @ccmode{}, take a look at that file. It maps BOCM configuration variables to -@code{cc-mode}'s new indentation model. +@ccmode{}'s new indentation model. A special word of thanks goes to Krishna Padmasola for his work in converting the original @file{README} file to texinfo format. @@ -185,12 +186,12 @@ @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@file{cc-mode.el} works well with the 2 main branches of Emacs 19: -XEmacs, maintained by @code{xemacs.org} and the Emacs 19 maintained by -the Free Software Foundation. Emacs 19 users will want to use Emacs -version 19.21 or better, XEmacs users will want 19.6 or better. Earlier -versions of these Emacsen have deficiencies and/or bugs which will -adversely affect the performance and usability of @code{cc-mode}. You +@file{cc-mode.el} works well with the three main branches of Emacs: +XEmacs 19 and XEmacs 20, both maintained by @code{xemacs.org}, and Emacs +19 maintained by the Free Software Foundation. Emacs users will want to +use version 19.21 or better, XEmacs users will want 19.6 or better. +Earlier versions of these Emacsen have deficiencies and/or bugs which +will adversely affect the performance and usability of @ccmode{}. You are better off just getting the latest version of Emacs or XEmacs. @cindex @file{cc-mode-18.el} file @@ -198,18 +199,18 @@ @file{cc-mode-18.el} compatibility file, but only moderately well. A word of warning though, @emph{Emacs 18 lacks some fundamental functionality and ultimately, using Emacs 18 is a losing -battle}. Hence @code{cc-mode} under Emacs 18 is no longer supported and +battle}. Hence @ccmode{} under Emacs 18 is no longer supported and it is highly recommended that you upgrade to Emacs 19. If you use -@code{cc-mode} under Emacs 18, you're on your own. With @code{cc-mode} +@ccmode{} under Emacs 18, you're on your own. With @ccmode{} version 5, Emacs 18 support will be dropped altogether. Note that as of XEmacs 19.13 and Emacs 19.30, your Emacs already comes -with @code{cc-mode} version 4 preconfigured for your use. You should be +with @ccmode{} version 4 preconfigured for your use. You should be able to safely skip the rest of the setup information in this chapter, -unless you want to install the latest version of @code{cc-mode} into one +unless you want to install the latest version of @ccmode{} into one of these Emacsen. -@cindex @file{.emacs} file +@cindex .emacs file The first thing you will want to do is put @file{cc-mode.el} somewhere on your @code{load-path} so Emacs can find it. Do a @kbd{C-h v load-path RET} to see all the directories Emacs looks at when loading a @@ -253,9 +254,9 @@ @end example If you are running a version of Emacs or XEmacs that comes with -@code{cc-mode} by default, you can simply add the following to your +@ccmode{} by default, you can simply add the following to your @file{.emacs} file in order to upgrade to the latest version of -@code{cc-mode}: +@ccmode{}: @example (load "cc-mode") @@ -283,7 +284,7 @@ @end example After those lines you will want to add the following autoloads to your -@file{.emacs} file so that @code{cc-mode} gets loaded at the right time: +@file{.emacs} file so that @ccmode{} gets loaded at the right time: @example @group @@ -295,7 +296,7 @@ @end group @end example -Alternatively, if you want to make sure @code{cc-mode} is loaded when +Alternatively, if you want to make sure @ccmode{} is loaded when Emacs starts up, you could use this line instead of the autoloads above: @example @@ -335,35 +336,36 @@ That's all you need --- I know, I know, it sounds like a lot @code{:-)}, but after you've done all this, you should only need to quit and restart Emacs. The next time you visit a C, C++, Objective-C, or Java file you -should be using @code{cc-mode}. You can check this easily by hitting -@kbd{M-x c-version RET} in the @code{c-mode}, @code{c++-mode}, or -@code{objc-mode} buffer. You should see this message in the echo area: +should be using @ccmode{}. You can check this easily by hitting +@kbd{M-x c-version RET}; you should see this message in the echo area: @example -Using @code{cc-mode} version 4.@var{xxx} - -Where @var{xxx} is the latest release minor number. +Using CC Mode version 4.@var{xxx} @end example +@noindent +where @var{xxx} is the latest minor release number. + + @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @node New Indentation Engine, Minor Modes, Getting Connected, Top -@comment node-name, next, previous,up +@comment node-name, next, previous, up @chapter New Indentation Engine @cindex New Indentation Engine @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@code{cc-mode} has a new indentation engine, providing a simplified, yet -flexible and general mechanism for customizing indentation. It breaks -indentation calculation into two steps. First, for the line of code being -indented, @code{cc-mode} analyzes what kind of language construct it's -looking at, then it applies user defined offsets to the current line -based on this analysis. +@ccmode{} has a new indentation engine, providing a simplified, yet +flexible and general mechanism for customizing indentation. It separates +indentation calculation into two steps: first, @ccmode{} analyzes the +line of code being indented to determine the kind of language construct +it's looking at, then it applies user defined offsets to the current +line based on this analysis. This section will briefly cover how indentation is calculated in -@code{cc-mode}. It is important to understand the indentation model -being used so that you will know how to customize @code{cc-mode} for +@ccmode{}. It is important to understand the indentation model +being used so that you will know how to customize @ccmode{} for your personal coding style. @menu @@ -386,7 +388,7 @@ @cindex syntactic component @cindex syntactic component list @cindex relative buffer position -The first thing @code{cc-mode} does when indenting a line of code, is to +The first thing @ccmode{} does when indenting a line of code, is to analyze the line, determining the @dfn{syntactic component list} of the construct on that line. A @dfn{syntactic component} consists of a pair of information (in lisp parlance, a @emph{cons cell}), where the first @@ -405,9 +407,9 @@ indentation of some line higher up in the buffer. This is represented by the relative buffer position in the syntactic component. -It might help to see an example. Suppose we had the following code as -the only thing in a @code{c++-mode} buffer @footnote{The line numbers in -this and future examples don't actually appear in the buffer, of course!}: +Here is an example. Suppose we had the following code as the only thing +in a @code{c++-mode} buffer @footnote{The line numbers in this and +future examples don't actually appear in the buffer, of course!}: @example @group @@ -439,7 +441,7 @@ This tells us that the line is a statement and it is indented relative to buffer position 35, which happens to be the @samp{i} in @code{int} on -line 3. If you were to move Point to line 3 and hit @kbd{C-c C-s}, you +line 3. If you were to move point to line 3 and hit @kbd{C-c C-s}, you would see: @example @@ -479,10 +481,10 @@ @cindex substatment block @noindent which tells us that this is a brace that @emph{opens} a substatement -block. @footnote{A @dfn{substatement} indicates the line after an -@code{if}, @code{else}, @code{while}, @code{do}, @code{switch}, or -@code{for} statement, and a @dfn{substatement block} is a brace block -following one of those constructs.} +block. @footnote{A @dfn{substatement} indicates the line after a +conditional statement, such as @code{if}, @code{else}, @code{while}, +@code{do}, @code{switch}, or @code{for} in C. A @dfn{substatement +block} is a brace block following one of those conditionals.} @cindex comment only line Syntactic component lists can contain more than one component, and @@ -537,7 +539,7 @@ offsets to apply for those symbols. These offsets are added to a running total. -Second, if the component has a relative buffer position, @code{cc-mode} +Second, if the component has a relative buffer position, @ccmode{} adds the column number of that position to the running total. By adding up the offsets and columns for every syntactic component on the list, the final total indentation for the current line is computed. @@ -558,7 +560,7 @@ @end example @kindex TAB -Let's say Point is on line 3 and we hit the @key{TAB} key to re-indent +Let's say point is on line 3 and we hit the @key{TAB} key to re-indent the line. Remember that the syntactic component list for that line is: @example @@ -568,13 +570,13 @@ @end example @noindent -@code{cc-mode} looks up @code{defun-block-intro} in the +@ccmode{} looks up @code{defun-block-intro} in the @code{c-offsets-alist} variable. Let's say it finds the value @samp{4}; it adds this to the running total (initialized to zero), yielding a running total indentation of 4 spaces. -Next @code{cc-mode} goes to buffer position 29 and asks for the current -column. This brace is in column zero, so @code{cc-mode} +Next @ccmode{} goes to buffer position 29 and asks for the current +column. This brace is in column zero, so @ccmode{} adds @samp{0} to the running total. Since there is only one syntactic component on the list for this line, indentation calculation is complete, and the total indentation for the line @@ -605,9 +607,9 @@ @end example -Here, @code{cc-mode} first looks up the @code{substatement-open} symbol +Here, @ccmode{} first looks up the @code{substatement-open} symbol in @code{c-offsets-alist}. Let's say it finds the value @samp{4}. This -yields a running total of 4. @code{cc-mode} then goes to +yields a running total of 4. @ccmode{} then goes to buffer position 46, which is the @samp{i} in @code{if} on line 3. This character is in the fourth column on that line so adding this to the running total yields an indentation for the line of 8 spaces. @@ -622,7 +624,7 @@ @vindex c-echo-syntactic-information-p @vindex echo-syntactic-information-p (c-) @cindex TAB -To help you configure @code{cc-mode}, you can set the variable +As you configure @ccmode{}, you might want to set the variable @code{c-echo-syntactic-information-p} to non-@code{nil} so that the syntactic component list and calculated offset will always be echoed in the minibuffer when you hit @kbd{TAB}. @@ -636,16 +638,16 @@ @cindex Minor Modes @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@code{cc-mode} contains two minor-mode-like features that you should +@ccmode{} contains two minor-mode-like features that you should find useful while you enter new C code. The first is called @dfn{auto-newline} mode, and the second is called @dfn{hungry-delete} mode. These minor modes can be toggled on and off independently, and -@code{cc-mode} can be configured so that it starts up with any +@ccmode{} can be configured so that it starts up with any combination of these minor modes. By default, both of these minor modes are turned off. The state of the minor modes is always reflected in the minor mode list -on the modeline of the @code{cc-mode} buffer. When auto-newline mode is +on the modeline of the @ccmode{} buffer. When auto-newline mode is enabled, you will see @samp{C/a} on the mode line @footnote{Remember that the @samp{C} could be replaced with @samp{C++}, @samp{ObjC}, or @samp{Java}.}. When hungry delete mode is enabled you would see @@ -660,7 +662,7 @@ @findex toggle-hungry-state (c-) @findex toggle-auto-state (c-) @findex toggle-auto-hungry-state (c-) -@code{cc-mode} provides keybindings which allow you to toggle the minor +@ccmode{} provides keybindings which allow you to toggle the minor modes on the fly while editing code. To toggle just the auto-newline state, hit @kbd{C-c C-a} (@code{c-toggle-auto-state}). When you do this, you should see the @samp{a} indicator either appear or disappear @@ -680,7 +682,8 @@ to your @file{.emacs} file: @example -(add-hook 'c-mode-common-hook '(lambda () (c-toggle-auto-hungry-state 1))) +(add-hook 'c-mode-common-hook + '(lambda () (c-toggle-auto-hungry-state 1))) @end example @@ -717,10 +720,9 @@ @cindex syntactic whitespace @item The character was not typed inside of a literal @footnote{A -@dfn{literal} is defined in @code{cc-mode} as any comment, -string, or cpp macro definition. These constructs are also known as -@dfn{syntactic whitespace} since they are usually ignored when scanning -C code.}. +@dfn{literal} is defined as any comment, string, or cpp macro +definition. These constructs are also known as @dfn{syntactic +whitespace} since they are usually ignored when scanning C code.}. @item @kindex C-u @@ -729,10 +731,16 @@ @end itemize -Certain other conditions may apply on a language specific basis. For +@findex c-enable-//-in-c-mode +@findex enable-//-in-c-mode (c-) +Some characters are electric in some languages, and not in others. For example, the second slash (@kbd{/}) of a C++ style line comment is electric in @code{c++-mode}, @code{objc-mode}, and @code{java-mode}, but -not in @code{c-mode}. +not in @code{c-mode}@footnote{Ordinarily, @samp{//} does not introduce a +comment in @code{c-mode}. However, if you call the function +@code{c-enable-//-in-c-mode}, @code{c-mode} will recognize C++ style +line comments. Note however that this is a global change which will +affect all your @code{c-mode} buffers.}. @menu @@ -805,7 +813,7 @@ using a function as a brace hanging @var{ACTION}. When the @var{ACTION} is a list, it can contain any combination of the -symbols @code{before} and @code{after}, directing @code{cc-mode} where to +symbols @code{before} and @code{after}, directing @ccmode{} where to put newlines in relationship to the brace being inserted. Thus, if the list contains only the symbol @code{after}, then the brace is said to @dfn{hang} on the right side of the line, as in: @@ -848,6 +856,12 @@ on the next line. Here, in the @code{block-close} entry, you also see an example of using a function as an @var{ACTION}. +A word of caution: it is not a good idea to hang top-level construct +introducing braces, such as @code{class-open} or @code{defun-open}. +Emacs makes an assumption that such braces will always appear in column +zero, hanging such braces can introduce performance problems. +@xref{Performance Issues} for more information. + @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @node Hanging Colons, Hanging Semi-colons and commas, Hanging Braces, Auto-newline insertion @@ -872,7 +886,7 @@ In C++, double-colons are used as a scope operator but because these colons always appear right next to each other, newlines before and after them are controlled by a different mechanism, called @dfn{clean-ups} in -@code{cc-mode}. @xref{Clean-ups} for details. +@ccmode{}. @xref{Clean-ups} for details. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -883,7 +897,7 @@ @cindex Hanging Semi-colons and commas @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Semicolons and commas are also electric in @code{cc-mode}, but since +Semicolons and commas are also electric in @ccmode{}, but since these characters do not correspond directly to syntactic symbols, a different mechanism is used to determine whether newlines should be automatically inserted after these characters. @xref{Customizing @@ -971,9 +985,9 @@ commands, or whitespace that contains intervening constructs. @cindex literal -You can configure @code{cc-mode}'s clean-ups by setting the variable +You can configure @ccmode{}'s clean-ups by setting the variable @code{c-cleanup-list}, which is a list of clean-up symbols. By default, -@code{cc-mode} cleans up only the @code{scope-operator} construct, which +@ccmode{} cleans up only the @code{scope-operator} construct, which is necessary for proper C++ support. Note that clean-ups are only performed when the construct does not occur within a literal (see @ref{Auto-newline insertion}), and when there is nothing but whitespace @@ -981,7 +995,7 @@ @vindex c-cleanup-list @vindex cleanup-list (c-) -There are currently only five specific constructs that @code{cc-mode} +There are currently only five specific constructs that @ccmode{} can clean up, as indicated by these symbols: @itemize @bullet @@ -1018,6 +1032,37 @@ @end example @item +@code{brace-elseif-brace} --- similar to the @code{brace-else-brace} +clean-up, but cleans up @samp{@} else if (...)@{} constructs. For +example: +@example +@group + +void spam(int i) +@{ + if( i==7 ) + @{ + dosomething(); + @} + else if( i==3 ) @{ + +@end group +@end example +@noindent +appears like this after the open brace is typed: +@example +@group + +void spam(int i) +@{ + if( i==7 ) @{ + dosomething(); + @} else if( i==3 ) @{ + +@end group +@end example + +@item @code{empty-defun-braces} --- cleans up braces following a top-level function or class definition that contains no body. Clean up occurs when the closing brace is typed. Thus the following: @@ -1109,7 +1154,7 @@ @vindex c-delete-function @vindex delete-function (c-) @cindex literal -By default, @code{cc-mode} actually runs the command +By default, @ccmode{} actually runs the command @code{c-electric-delete} when you hit @kbd{DEL}. When this command is used to delete a single character (i.e. when it is called interactively with no numeric argument), it really runs the function contained in the @@ -1142,8 +1187,6 @@ @cindex Indentation Commands @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@findex c-set-style -@findex set-style (c-) Various commands are provided which allow you to conveniently re-indent C constructs. There are several things to note about these indentation commands. First, when you @@ -1157,24 +1200,24 @@ @findex hanging-braces-alist (c-) Second, changing some variables have no effect on existing code, even when you do re-indent. For example, the @code{c-hanging-*} variables -and @code{c-cleanup-list} only affect new code as it is typed in. So -for example, changing @code{c-hanging-braces-alist} and re-indenting the -buffer will not adjust placement of braces already in the file. +and @code{c-cleanup-list} only affect new code as it is typed in +on-the-fly, so changing @code{c-hanging-braces-alist} and re-indenting +the buffer will not adjust placement of braces already in the file. @vindex c-progress-interval @vindex progress-interval (c-) Third, re-indenting large portions of code is currently rather inefficient. Improvements have been made since previous releases of -@code{cc-mode}, and much more radical improvements are planned, but for -now you need to be aware of this @footnote{In particular, I have had -people complain about the speed that @code{cc-mode} re-indents -@code{lex(1)} output. Lex, yacc, and other code generators usually -output some pretty perversely formatted code. @emph{Don't} try to -indent this stuff with @code{cc-mode}!}. Some provision has been made -to at least inform you as to the progress of the re-indentation. The -variable @code{c-progress-interval} controls how often a progress -message is displayed. Set this variable to @code{nil} to inhibit -progress messages. Note that this feature only works with Emacs 19. +@ccmode{}, and much more radical improvements are planned, but for now +you need to be aware of this @footnote{In particular, I have had people +complain about the speed with which @code{lex(1)} output is re-indented. +Lex, yacc, and other code generators usually output some pretty +perversely formatted code. @emph{Don't} try to indent this stuff!}. +Some provision has been made to at least inform you as to the progress +of the re-indentation. The variable @code{c-progress-interval} controls +how often a progress message is displayed. Set this variable to +@code{nil} to inhibit progress messages. Note that this feature only +works with Emacs 19 and beyond. Also, except as noted below, re-indentation is always driven by the same mechanisms that control on-the-fly indentation of code. @xref{New @@ -1194,10 +1237,10 @@ (@code{c-indent-command}). The behavior of this command is controlled by the variable @code{c-tab-always-indent}. When this variable is @code{t}, @kbd{TAB} always just indents the current line. When -@code{nil}, the line is indented only if Point is at the left margin, or +@code{nil}, the line is indented only if point is at the left margin, or on or before the first non-whitespace character on the line, otherwise @emph{something else happens}@footnote{Actually what happens is that the -function stored in the variable @code{c-insert-tab-function} is called. +function stored in @code{c-insert-tab-function} is called. Normally this just inserts a real tab character, or the equivalent number of spaces, depending on the setting of the variable @code{indent-tabs-mode}. If you preferred, you could set @@ -1205,7 +1248,7 @@ If the value of @code{c-tab-always-indent} is something other than @code{t} or @code{nil} (e.g. @code{'other}), then a real tab character@footnote{The caveat about @code{indent-tabs-mode} in the -previous footnote also applies here.} is inserted only when Point is +previous footnote also applies here.} is inserted only when point is inside a literal (see @ref{Auto-newline insertion}), otherwise the line is indented. @@ -1213,7 +1256,7 @@ @findex c-indent-exp @findex indent-exp (c-) To indent an entire balanced brace or parenthesis expression, use -@kbd{M-C-q} (@code{c-indent-exp}). Note that Point should be on +@kbd{M-C-q} (@code{c-indent-exp}). Note that point should be on the opening brace or parenthesis of the expression you want to indent. @kindex C-c C-q @@ -1221,15 +1264,15 @@ @findex indent-defun (c-) Another very convenient keystroke is @kbd{C-c C-q} (@code{c-indent-defun}) when re-indents the entire top-level function or -class definition that encompases Point. It leaves Point at the +class definition that encompases point. It leaves point at the same position within the buffer. @kindex M-C-\ @findex indent-region To indent any arbitrary region of code, use @kbd{M-C-\} (@code{indent-region}). This is a standard Emacs command, specially -tailored for C code in a @code{cc-mode} buffer. Note that of course, -Point and Mark must delineate the region you +tailored for C code in a @ccmode{} buffer. Note that of course, +point and mark must delineate the region you want to indent. @kindex M-C-h @@ -1247,7 +1290,7 @@ @cindex Other Commands @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@code{cc-mode} contains other useful command for moving around in C +@ccmode{} contains other useful command for moving around in C code. @table @code @@ -1255,9 +1298,9 @@ @kindex C-c C-u @findex c-up-conditional @findex up-conditional (c-) -Move Point back to the containing preprocessor conditional, leaving the -Mark behind. A prefix argument acts as a repeat count. With a negative -argument, move Point forward to the end of the containing +Move point back to the containing preprocessor conditional, leaving the +mark behind. A prefix argument acts as a repeat count. With a negative +argument, move point forward to the end of the containing preprocessor conditional. When going backwards, @code{#elif} is treated like @code{#else} followed by @code{#if}. When going forwards, @code{#elif} is ignored.@refill @@ -1266,7 +1309,7 @@ @kindex C-c C-p @findex c-backward-conditional @findex backward-conditional (c-) -Move Point back over a preprocessor conditional, leaving Mark +Move point back over a preprocessor conditional, leaving the mark behind. A prefix argument acts as a repeat count. With a negative argument, move forward. @@ -1274,7 +1317,7 @@ @kindex C-c C-n @findex c-forward-conditional @findex forward-conditional (c-) -Move Point forward across a preprocessor conditional, leaving Mark +Move point forward across a preprocessor conditional, leaving the mark behind. A prefix argument acts as a repeat count. With a negative argument, move backward. @@ -1282,34 +1325,34 @@ @kindex ESC a @findex c-beginning-of-statement @findex beginning-of-statement (c-) -Move Point to the beginning of the innermost C statement. If Point is +Move point to the beginning of the innermost C statement. If point is already at the beginning of a statement, it moves to the beginning of the preceding statement. With prefix argument @var{n}, move back @var{n} @minus{} 1 statements. -If Point is within a string or comment, or next to a comment (only -whitespace between them), this command moves by sentences instead of -statements. - -When called from a program, this function takes two optional arguments: -the numeric prefix argument, and a buffer position limit (don't move -back before that place). +If point is within a string or comment, or at the end of a comment, this +command moves by sentences instead of statements. + +When called from a program, this function takes three optional +arguments: the numeric prefix argument, a buffer position limit (don't +move back before that place), and a flag to indicate whether movement +should be by statements (if @code{t}) or sentence (if non-@code{nil}). @item M-e (c-end-of-statement) @kindex ESC e @findex c-end-of-statement @findex end-of-statement (c-) -Move Point to the end of the innermost C statement. If Point is at the +Move point to the end of the innermost C statement. If point is at the end of a statement, move to the end of the next statement. With prefix argument @var{n}, move forward @var{n} @minus{} 1 statements. -If Point is within a string or comment, or next to a comment (only -whitespace between them), this command moves by sentences instead of -statements. - -When called from a program, this function takes two optional arguments: -the numeric prefix argument, and a buffer position limit (don't move -past that place). +If point is within a string or comment, or at the end of a comment, this +command moves by sentences instead of statements. + +When called from a program, this function takes three optional +arguments: the numeric prefix argument, a buffer position limit (don't +move back before that place), and a flag to indicate whether movement +should be by statements (if @code{t}) or sentence (if non-@code{nil}). @item M-x c-forward-into-nomenclature @findex c-forward-into-nomenclature @@ -1319,13 +1362,13 @@ letter of each word is capitalized, and not separated by underscores. E.g. @samp{SymbolsWithMixedCaseAndNoUnderlines}. -This command moves Point forward to end of a C++ nomenclature +This command moves point forward to end of a C++ nomenclature section or word. With prefix argument @var{n}, move @var{n} times. @item M-x c-backward-into-nomenclature @findex c-backward-into-nomenclature @findex backward-into-nomenclature (c-) -Move Point backward to beginning of a C++ nomenclature +Move point backward to beginning of a C++ nomenclature section or word. With prefix argument @var{n}, move @var{n} times. If @var{n} is negative, move forward. @@ -1337,6 +1380,35 @@ operator without performing the electric behavior of colon insertion. @kbd{C-c :} does just this. +@item M-q (fill-paragraph) +@kindex ESC q +@findex fill-paragraph +@vindex c-hanging-comment-starter-p +@vindex c-hanging-comment-ender-p +@vindex hanging-comment-starter-p (c-) +@vindex hanging-comment-ender-p (c-) +The command is used to fill a block style (C) or line style (C++) +comment, in much the same way that text in the various text modes can be +filled. You should never attempt to fill non-comment code sections; +you'll end up with garbage! Two variables control how C style block +comments are filled, specifically how the comment start and end +delimiters are handled. + +The variable @code{c-hanging-comment-starter-p} controls whether comment +start delimiters which appear on a line by themselves, end up on a line +by themselves after the fill. When the value is @code{nil}, the comment +starter will remain on its own line@footnote{It will not be placed on a +separate line if it is not already on a separate line.}. Otherwise, +text on the next line will be put on the same line as the comment +starter. This is called @dfn{hanging} because the following text hangs +on the line with the comment starter. + +The variable @code{c-hanging-comment-ender-p} controls the analogous +behavior for the block comment end delimiter. When the value is +@code{nil}, the comment ender will remain on its own line after the +file@footnote{The same caveat as above holds true.}. Otherwise, the +comment end delimiter will be placed at the end of the previous line. + @end table @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1347,8 +1419,15 @@ @cindex Customizing Indentation @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +@vindex c-offsets-alist +@vindex offsets-alist (c-) @cindex c-set-offset @cindex set-offset (c-) +The variable @code{c-offsets-alist} contains the mappings between +syntactic symbols and the offsets to apply for those symbols. You +should never modify this variable directly though. Use the function +@code{c-set-offset} instead (see below for details). + The @code{c-offsets-alist} variable is where you customize all your indentations. You simply need to decide what additional offset you want to add for every syntactic symbol. You can use the command @kbd{C-c @@ -1363,14 +1442,14 @@ @cindex basic-offset (c-) As mentioned previously, the variable @code{c-offsets-alist} is an association list of syntactic symbols and the offsets to be applied for -those symbols. In fact, these offset values can be any of an integer, -a function or variable name, or one of the following symbols: @code{+}, -@code{-}, @code{++}, @code{--}, @code{*}, or @code{/}. These symbols -describe offset in multiples of the value of the variable -@code{c-basic-offset}. By defining a style's indentation in terms of -this fundamental variable, you can change the amount of whitespace given -to an indentation level while leaving the same relationship between -levels. Here are the values that the special +those symbols. In fact, these offset values can be any of an integer, a +function or lambda expression, a variable name, or one of the following +symbols: @code{+}, @code{-}, @code{++}, @code{--}, @code{*}, or +@code{/}. These symbols describe offset in multiples of the value of +the variable @code{c-basic-offset}. By defining a style's indentation +in terms of this fundamental variable, you can change the amount of +whitespace given to an indentation level while leaving the same +relationship between levels. Here are the values that the special symbols correspond to: @table @code @@ -1390,6 +1469,8 @@ @end table +@vindex c-style-variables-are-local-p +@vindex style-variables-are-local-p (c-) @noindent So, for example, because most of the default offsets are defined in terms of @code{+}, @code{-}, and @code{0}, if you like the general @@ -1397,10 +1478,12 @@ you can probably achieve your style just by changing @code{c-basic-offset} like so (in your @file{.emacs} file)@footnote{The reason you need to use @code{setq-default} instead of @code{setq} is -that @code{c-basic-offset} is a buffer local variable, as are most of -the @code{cc-mode} configuration variables. If you were to put this -code in, e.g. your @code{c-mode-common-hook} function, you could use -@code{setq}.}: +that @code{c-basic-offset} is a buffer local variable, as are most +configuration variables. If you were to put this code in, e.g. your +@code{c-mode-common-hook} function, you could use @code{setq}. +Alternatively, you can keep these variables global by setting +@code{c-style-variables-are-local-p} to @code{nil}, but you must do this +before @code{cc-mode.el} is loaded into your Emacs session.}: @example (setq-default c-basic-offset 4) @@ -1521,7 +1604,7 @@ @code{substatement-open}, which is just the syntactic symbol we want to change! -After you hit return, @code{cc-mode} will then prompt you for the new +After you hit return, @ccmode{} will then prompt you for the new offset value, with the old value as the default. The default in this case is @samp{+}, but we want no extra indentation so enter @samp{0} and @kbd{RET}. This will associate the offset 0 with the @@ -1561,8 +1644,8 @@ @node Permanent Customization, Styles, Interactive Customization, Customizing Indentation @comment node-name, next, previous,up -@section Permanent Indentation -@cindex Permanent Indentation +@section Permanent Customization +@cindex Permanent Customization @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @vindex c-mode-common-hook @@ -1572,9 +1655,9 @@ @vindex java-mode-hook @cindex hooks To make this change permanent, you need to add some lisp code to your -@file{.emacs} file. @code{cc-mode} provides several hooks that you can +@file{.emacs} file. @ccmode{} provides several hooks that you can use to customize the mode according to your coding style. Each language -mode has its own hook, adhering to standard to Emacs major mode +mode has its own hook, adhering to standard Emacs major mode conventions. There is also one general hook: @itemize @bullet @@ -1606,11 +1689,12 @@ Here's a simplified example of what you can add to your @file{.emacs} file to make the changes described in the previous section -(@ref{Interactive Customization}) more permanent. See the Emacs -manuals for more information on customizing Emacs via hooks. -@xref{Sample .emacs File} for a more complete sample @file{.emacs} file. +(@ref{Interactive Customization}) more permanent. See the Emacs manuals +for more information on customizing Emacs via hooks. @xref{Sample +.emacs File} for a more complete sample @file{.emacs} file. @footnote{The use of @code{add-hook} in this example only works for -Emacs 19. Workarounds are available if you are using Emacs 18.} +Emacs 19 and beyond. Workarounds are available if you are using Emacs +18.} @example @group @@ -1642,7 +1726,7 @@ people who work on GNU software will have to use the GNU coding style on C code. Some shops are more lenient, allowing some variety of coding styles, and as programmers come and go, there could be a number of -styles in use. For this reason, @code{cc-mode} makes it convenient for +styles in use. For this reason, @ccmode{} makes it convenient for you to set up logical groupings of customizations called @dfn{styles}, associate a single name for any particular style, and pretty easily start editing new or existing code using these styles. This section @@ -1663,9 +1747,8 @@ @cindex Built-in Styles @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -If you're lucky, one of @code{cc-mode}'s built-in styles might be just -what you're looking for. Some of the most common C and C++ styles are -already built-in. These include: +If you're lucky, one of @ccmode{}'s built-in styles might be just +what you're looking for. These include: @itemize @bullet @item @@ -1698,6 +1781,17 @@ @code{euagate.eua.ericsson.se}}. @item +@cindex Linux style +@code{linux} --- C coding standard for Linux development. + +@item +@cindex Python style +@code{python} --- C coding standard for Python extension +modules@footnote{Python is a high level scripting language with a C/C++ +foreign function interface. For more information, see +@code{<http://www.python.org/>}.}. + +@item @cindex Java style @cindex java-mode @code{java} --- The style for editing Java code. Note that this style is @@ -1707,24 +1801,26 @@ @findex c-set-style @findex set-style (c-) +@kindex C-c . If you'd like to experiment with these built-in styles you can simply -type the following in a @code{cc-mode} buffer: +type the following in a @ccmode{} buffer: @example @group -@kbd{M-x c-set-style RET @var{STYLE-NAME} RET} +@kbd{C-c . @var{STYLE-NAME} RET} @end group @end example @noindent -Note that all style names are case insensitive, even the ones you define. +@kbd{C-c .} runs the command @code{c-set-style}. Note that all style +names are case insensitive, even the ones you define. Setting a style in this way does @emph{not} automatically re-indent your file. For commands that you can use to view the effect of your changes, see @ref{Commands}. Once you find a built-in style you like, you can make the change -permanent by adding a call to your @file{.emacs} file. Let's say for +permanent by adding some lisp to your @file{.emacs} file. Let's say for example that you want to use the @samp{ellemtel} style in all your files. You would add this: @example @@ -1740,6 +1836,7 @@ @end group @end example +@cindex cc-mode style There is one other special style you can use, called @samp{cc-mode} style. This style is special because all other styles implicitly inherit from it; in other words, whenever you set a style, @@ -1747,11 +1844,20 @@ your style need only define the differences between it and @samp{cc-mode} style. +Note @emph{you should never change any of the default styles}. +Instead, it's better to add a new style using @code{c-add-style} +(@xref{Adding Styles}). This is especially true for @code{cc-mode} and +@code{java} styles. + +@vindex c-indentation-style +@vindex indentation-style (c-) Note that for BOCM compatibility, @samp{gnu} is the default style, and any non-style based customizations you make (i.e. in @code{c-mode-common-hook} in your @file{.emacs} file) will be based on @samp{gnu} style unless you do -a @code{c-set-style} as the first thing in your hook. +a @code{c-set-style} as the first thing in your hook. The variable +@code{c-indentation-style} always contains the buffer's current style name, +as a string. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1769,7 +1875,7 @@ If none of the built-in styles is appropriate, you'll probably want to add a new @dfn{style definition}. Styles are kept in the @code{c-style-alist} variable, but you should never modify this variable -directly. Instead, @code{cc-mode} provides the function +directly. Instead, @ccmode{} provides the function @code{c-add-style} that you can use to easily add new styles or change existing styles. This function takes two arguments, a @var{stylename} string, and an association list @var{description} of style @@ -1795,8 +1901,8 @@ The Emacs manual describes how you can customize certain variables on a per-file basis by including a @dfn{Local Variable} block at the end of the file. So far, you've only seen a functional interface to -@code{cc-mode}, which is highly inconvenient for use in a Local Variable -block. @code{cc-mode} provides two variables that make it easier for +@ccmode{}, which is highly inconvenient for use in a Local Variable +block. @ccmode{} provides two variables that make it easier for you to customize your style on a per-file basis. @vindex c-file-style @@ -1805,7 +1911,7 @@ @vindex file-offsets (c-) The variable @code{c-file-style} can be set to a style name string. -When the file is visited, @code{cc-mode} will automatically set the +When the file is visited, @ccmode{} will automatically set the file's style to this style using @code{c-set-style}. @vindex c-offsets-alist @@ -1814,13 +1920,15 @@ @findex set-offset (c-) Another variable, @code{c-file-offsets}, takes an association list similar to what is allowed in @code{c-offsets-alist}. When the file is -visited, @code{cc-mode} will automatically institute these offets using +visited, @ccmode{} will automatically institute these offets using @code{c-set-offset}. Note that file style settings (i.e. @code{c-file-style}) are applied before file offset settings (i.e. @code{c-file-offsets})@footnote{File -styles are only supported since XEmacs 19.12 and Emacs 19.29. They work -via the standard Emacs hook variable @code{hack-local-variables-hook}.}. +styles have only been supported since XEmacs 19.12 and Emacs 19.29. +They work via the standard Emacs hook variable +@code{hack-local-variables-hook}. Older Emacsen lack this hook, so file +styles can't be used with them.}. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -1835,17 +1943,36 @@ @vindex style-alist (c-) @vindex c-basic-offset @vindex basic-offset (c-) -For most users, @code{cc-mode} will support their coding styles with +For most users, @ccmode{} will support their coding styles with very little need for more advanced customizations. Usually, one of the standard styles defined in @code{c-style-alist} will do the trick. At most, perhaps one of the syntactic symbol offsets will need to be tweaked slightly, or maybe @code{c-basic-offset} will need to be changed. However, some styles require a more flexible framework for -customization, and one of the real strengths of @code{cc-mode} is that +customization, and one of the real strengths of @ccmode{} is that the syntactic analysis model provides just such a framework. This allows -you to implement special indentation calculations for situations not +you to implement custom indentation calculations for situations not handled by the mode directly. +@vindex c-style-variables-are-local-p +@vindex style-variables-are-local-p +Note that the style controlling variables can either have global values, +or can be buffer local (e.g. different in every buffer). If all the C +files you edit tend to have the same style, you might want to keep the +variables global. If you tend to edit files with many different styles, +you will have to make the variables buffer local. The variable +@code{c-style-variables-are-local-p} controls this. + +When @code{c-style-variables-are-local-p} is non-nil, then the style +variables will have a different settable value for each buffer, +otherwise all buffers will share the same values. This variable only +takes effect when @ccmode{} is loaded into your Emacs session. By +default (for backwards compatibility reasons), its value is @code{t}. +Note that once the variables are made buffer local, they will retain +this property for the remainder of the current Emacs session. To change +this behavior, set @code{c-style-variables-are-local-p} to @code{nil} +@emph{before} you load @file{cc-mode.el}. + @menu * Custom Indentation Functions:: * Custom Brace and Colon Hanging:: @@ -1862,11 +1989,11 @@ @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @cindex custom indentation functions -One of the most common ways to customize @code{cc-mode} is by writing -@dfn{custom indentation functions} and associating them with specific -syntactic symbols (see @ref{Syntactic Symbols}). @code{cc-mode} itself -uses custom indentation functions to provide more sophisticated -indentation, for example when lining up C++ stream operator blocks: +The most flexible way to customize @ccmode{} is by writing @dfn{custom +indentation functions} and associating them with specific syntactic +symbols (see @ref{Syntactic Symbols}). @ccmode{} itself uses custom +indentation functions to provide more sophisticated indentation, for +example when lining up C++ stream operator blocks: @example @group @@ -1885,7 +2012,7 @@ syntactic symbol. Here, @code{stream-op} has an offset of @code{+}, and with a @code{c-basic-offset} of 2, you can see that lines 4 through 6 are simply indented two spaces to the right of line 3. But perhaps we'd -like @code{cc-mode} to be a little more intelligent so that it lines up +like @ccmode{} to be a little more intelligent so that it lines up all the @samp{<<} symbols in lines 3 through 6. To do this, we have to write a custom indentation function which finds the column of first stream operator on the first line of the statement. Here is the lisp @@ -1912,7 +2039,7 @@ running total indentation for the line. Note that what actually gets returned is the difference between the column that the first stream operator is on, and the column of the buffer relative position passed in -the function's argument. Remember that @code{cc-mode} automatically +the function's argument. Remember that @ccmode{} automatically adds in the column of the component's relative buffer position and we don't want that value added into the final total twice. @@ -1951,7 +2078,7 @@ @vindex offsets-alist (c-) Custom indentation functions can be as simple or as complex as you like, and any syntactic symbol that appears in @code{c-offsets-alist} can have -a custom indentation function associated with it. @code{cc-mode} comes +a custom indentation function associated with it. @ccmode{} comes with several standard custom indentation functions, not all of which are used by the default styles. @@ -2047,7 +2174,7 @@ @vindex c-hanging-braces-alist @vindex hanging-braces-alist (c-) Syntactic symbols aren't the only place where you can customize -@code{cc-mode} with the lisp equivalent of callback functions. Brace +@ccmode{} with the lisp equivalent of callback functions. Brace ``hanginess'' can also be determined by custom functions associated with syntactic symbols on the @code{c-hanging-braces-alist} variable. Remember that @var{ACTION}'s are typically a list containing some @@ -2064,7 +2191,7 @@ function can also return @code{nil}. This return value has the normal brace hanging semantics. -As an example, @code{cc-mode} itself uses this feature to dynamically +As an example, @ccmode{} itself uses this feature to dynamically determine the hanginess of braces which close ``do-while'' constructs: @example @@ -2084,7 +2211,7 @@ @findex c-snug-do-while @findex snug-do-while (c-) -@code{cc-mode} assigns the @code{block-close} syntactic symbol to the +@ccmode{} assigns the @code{block-close} syntactic symbol to the brace that closes the @code{do} construct, and normally we'd like the line that follows a @code{block-close} brace to begin on a separate line. However, with ``do-while'' constructs, we want the @@ -2130,7 +2257,7 @@ Note that for symmetry, colon hanginess should be customizable by allowing function symbols as @var{ACTION}s on the @code{c-hanging-colon-alist} variable. Since no use has actually been -found for this feature, it isn't currently implemented. +found for this feature, it isn't currently implemented! @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @node Customizing Semi-colons and Commas, Other Special Indentations, Custom Brace and Colon Hanging, Advanced Customizations @@ -2173,7 +2300,8 @@ Here's an example of a criteria function that will prevent newlines from being inserted after semicolons when there is a non-blank following -line. Otherwise, it makes no determination: +line. Otherwise, it makes no determination. To use, add this to the +front of the @code{c-hanging-semi&comma-criteria} list. @example @group @@ -2201,20 +2329,20 @@ @vindex c-label-minimum-indentation @vindex label-minimum-indentation (c-) In @samp{gnu} style (see @ref{Built-in Styles}), a minimum indentation -is imposed on lines with @code{label} or @code{case-label} syntax. This -minimum indentation is controlled by the variable +is imposed on lines inside top-level constructs. This minimum +indentation is controlled by the variable @code{c-label-minimum-indentation}. The default value for this variable is 1. @vindex c-special-indent-hook @vindex special-indent-hook (c-) -One other customization variable is available in @code{cc-mode}: +One other customization variable is available in @ccmode{}: @code{c-special-indent-hook}. This is a standard hook variable that is -called after every line is indented by @code{cc-mode}. You can use it +called after every line is indented by @ccmode{}. You can use it to do any special indentation or line adjustments your style dictates, such as adding extra indentation to constructors or destructor declarations in a class definition, etc. Note however, that you should -not change Point or Mark inside your @code{c-special-indent-hook} +not change point or mark inside your @code{c-special-indent-hook} functions (i.e. you'll probably want to wrap your function in a @code{save-excursion}). @@ -2262,14 +2390,16 @@ @item @code{inline-close} --- brace that closes an in-class inline method @item -@code{ansi-funcdecl-cont} --- the nether region between an ANSI function -declaration and the defun opening brace +@code{func-decl-cont} --- the nether region between a function +declaration's argument list and the defun opening brace. In C++ and +Java, this can include the @code{throws} clauses of a method +declaration. @item @code{knr-argdecl-intro} --- first line of a K&R C argument declaration @item @code{knr-argdecl} --- subsequent lines in a K&R C argument declaration @item -@code{topmost-intro} --- the first line in a topmost construct definition +@code{topmost-intro} --- the first line in a topmost definition @item @code{topmost-intro-cont} --- topmost definition continuation lines @item @@ -2293,9 +2423,9 @@ @item @code{brace-list-entry} --- subsequent lines in an enum or static array list @item -@code{statement} --- a C (or like) statement +@code{statement} --- a C statement @item -@code{statement-cont} --- a continuation of a C (or like) statement +@code{statement-cont} --- a continuation of a C statement @item @code{statement-block-intro} --- the first line in a new statement block @item @@ -2304,19 +2434,20 @@ @code{statement-case-open} --- the first line in a case block starting with brace @item -@code{substatement} --- the first line after an if/while/for/do/else +@code{substatement} --- the first line after a conditional @item @code{substatement-open} --- the brace that opens a substatement block @item @code{case-label} --- a case or default label @item -@code{access-label} --- C++ private/protected/public access label +@code{access-label} --- C++ access control label @item -@code{label} --- any non-special C (or like) label +@code{label} --- any non-special C label @item -@code{do-while-closure} --- the `while' that ends a do/while construct +@code{do-while-closure} --- the `while' that ends a +@code{do}-@code{while} construct @item -@code{else-clause} --- the `else' of an if/else construct +@code{else-clause} --- the `else' of an @code{if}-@code{else} construct @item @code{comment-intro} --- a line containing only a comment introduction @item @@ -2330,9 +2461,9 @@ @item @code{arglist-close} --- the solo close paren of an argument list @item -@code{stream-op} --- lines continuing a stream operator construct +@code{stream-op} --- lines continuing a stream operator @item -@code{inclass} --- the construct is nested inside a class definition +@code{inclass} --- the line is nested inside a class definition @item @code{cpp-macro} --- the start of a cpp macro @item @@ -2349,7 +2480,8 @@ @item @code{extern-lang-close} --- brace that closes an external language block @item -@code{inextern-lang} --- analogous to `inclass' syntactic symbol +@code{inextern-lang} --- analogous to `inclass' syntactic symbol, but +for @code{extern} blocks. @end itemize @cindex -open syntactic symbols @@ -2750,19 +2882,14 @@ parenthesis that opens the list is @emph{not empty} following the open parenthesis. Contrast this against lines 6 and 13 which are assigned @code{arglist-cont} syntax. This is because the parenthesis that opens -their argument lists is the last character on that line @footnote{The -need for this somewhat confusing arrangement is that the typical -indentation desired for these lines is calculated differently. -This should be simplified in version 5 of @code{cc-mode}, along with the -added distinction between argument lists in function declarations, and -argument lists in function calls.}. +their argument lists is the last character on that line. Note that there is no @code{arglist-open} syntax. This is because any parenthesis that opens an argument list, appearing on a separate line, is assigned the @code{statement-cont} syntax instead. A few miscellaneous syntactic symbols that haven't been previously -covered are illustrated by this example: +covered are illustrated by this C++ example: @example @group @@ -2772,7 +2899,7 @@ 4: /* this line starts a multi-line 5: * comment. This line should get `c' syntax */ 6: - 7: char* a_long_multiline_string = "This line starts a multi-line \ + 7: char* a_multiline_string = "This line starts a multi-line \ 8: string. This line should get `string' syntax."; 9: 10: note: @@ -2794,17 +2921,14 @@ @itemize @bullet -@cindex ansi-funcdecl-cont syntactic symbol +@cindex func-decl-cont syntactic symbol @item -line 2, assigned the @code{ansi-funcdecl-cont} syntax; +line 2, assigned the @code{func-decl-cont} syntax; @cindex comment-intro syntactic symbol @item line 4, assigned both @code{defun-block-intro} @emph{and} -@code{comment-intro} syntax @footnote{The @code{comment-intro} syntactic -symbol is is another example of a @dfn{modifier} since it always appears -on a syntactic analysis list with other symbols, and rarely has an -associated relative buffer position.}; +@code{comment-intro} syntax; @cindex c syntactic symbol @item @@ -2837,7 +2961,7 @@ @cindex stream-op syntactic symbol @item -line 17, assigned @code{stream-op} syntax @footnote{In C++ only.}. +line 17, assigned @code{stream-op} syntax. @end itemize @@ -2897,24 +3021,19 @@ @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! C and it's derivative languages are highly complex creatures. Often, -ambiguous code situations arise that require @code{cc-mode} to scan +ambiguous code situations arise that require @ccmode{} to scan large portions of the buffer to determine syntactic context. Such pathological code@footnote{such as the output of @code{lex(1)}!} -can cause @code{cc-mode} to perform fairly badly. +can cause @ccmode{} to perform fairly badly. This section identifies some of the coding styles to watch out for, and suggests some workarounds that you can use to improve performance. -Note that this is an area that will get a lot of attention in -@code{cc-mode} version 5. The mode should end up being much faster, at -the expense of dropping Emacs 18 support, owing to the implementation of -syntactic analysis caching. - -Because @code{cc-mode} has to scan the buffer backwards from the current +Because @ccmode{} has to scan the buffer backwards from the current insertion point, and because C's syntax is fairly difficult to parse in -the backwards direction, @code{cc-mode} often tries to find the nearest +the backwards direction, @ccmode{} often tries to find the nearest position higher up in the buffer from which to begin a forward scan. The farther this position is from the current insertion point, the -slower the mode gets. Some coding styles can even force @code{cc-mode} +slower the mode gets. Some coding styles can even force @ccmode{} to scan from the beginning of the buffer! @findex beginning-of-defun @@ -2922,46 +3041,61 @@ One of the simplest things you can do to reduce scan time, is make sure any brace that opens a top-level block construct always appears in the leftmost column. This is actually an Emacs constraint, as embodied in -the @code{beginning-of-defun} function which @code{cc-mode} uses +the @code{beginning-of-defun} function which @ccmode{} uses heavily. If you insist on hanging top-level open braces on the right side of the line, then you should set the variable @code{defun-prompt-regexp} to something reasonable @footnote{Note that this variable is only defined in Emacs 19.}, however that ``something -reasonable'' is difficult to define, so @code{cc-mode} doesn't do it +reasonable'' is difficult to define, so @ccmode{} doesn't do it for you. -You will probably notice pathological behavior from @code{cc-mode} when +@vindex c-Java-defun-prompt-regexp +@vindex Java-defun-prompt-regexp (c-) +A special note about @code{defun-prompt-regexp} in Java mode: while much +of the early sample Java code seems to encourage a style where the brace +that opens a class is hung on the right side of the line, this is not a +good style to pursue in Emacs. @ccmode{} comes with a variable +@code{c-Java-defun-prompt-regexp} which tries to define a regular +expression usable for this style, but there are problems with it. In +some cases it can cause @code{beginning-of-defun} to hang@footnote{This +has been observed in Emacs 19.34 and XEmacs 19.15.}. For this reason, +it is not used by default, but if you feel adventurous, you can set +@code{defun-prompt-regexp} to it in your mode hook. In any event, +setting and rely on @code{defun-prompt-regexp} will definitely slow +things down! + +You will probably notice pathological behavior from @ccmode{} when working in files containing large amounts of cpp macros. This is -because @code{cc-mode} cannot quickly skip backwards over these lines. +because @ccmode{} cannot quickly skip backwards over these lines. @vindex c-recognize-knr-p @vindex recognize-knr-p (c-) -Previous versions of @code{cc-mode} had potential performance problems -when recognizing ``K&R'' style function argument declarations. This was +Previous versions of @ccmode{} had potential performance problems +when recognizing K&R style function argument declarations. This was because there are ambiguities in the C syntax when K&R style argument -lists are used (it is hard to distinguish them from top-level -declarations). @code{cc-mode} has adopted BOCM's convention for +lists are used@footnote{It is hard to distinguish them from top-level +declarations.}. @ccmode{} has adopted BOCM's convention for limiting the search: it assumes that argdecls are indented at least one space, and that the function headers are not indented at all. With -current versions of @code{cc-mode}, -@code{c-recognize-knr-p} is deprecated. +current versions of @ccmode{}, user customization of +@code{c-recognize-knr-p} is deprecated. Just don't put argdecls in +column zero! @cindex @file{cc-lobotomy.el} file @vindex cc-lobotomy-pith-list -You might want to investigate some of the -speed-ups contained in the file @file{cc-lobotomy.el}, which -is part of the canonical @code{cc-mode} distribution. As mentioned -previous, @code{cc-mode} always trades accuracy for speed, however it is -recognized that sometimes you need speed and can sacrifice some accuracy -in indentation. The file @file{cc-lobotomy.el} contains hacks that -will ``dumb down'' @code{cc-mode} in some specific ways, making that -trade-off of speed for accuracy. I won't go into details of its use -here; you should read the comments at the top of the file, and look at -the variable @code{cc-lobotomy-pith-list} for details. +You might want to investigate the speed-ups contained in the +file @file{cc-lobotomy.el}, which is part of the @ccmode{} distribution. +As mentioned previous, @ccmode{} always trades accuracy for speed, +however it is recognized that sometimes you need speed and can sacrifice +some accuracy in indentation. The file @file{cc-lobotomy.el} contains +hacks that will ``dumb down'' @ccmode{} in some specific ways, making +that trade-off of speed for accuracy. I won't go into details of its +use here; you should read the comments at the top of the file, and look +at the variable @code{cc-lobotomy-pith-list} for details. @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@node Frequently Asked Questions, Getting the latest cc-mode release, Performance Issues, Top +@node Frequently Asked Questions, Getting the latest CC Mode release, Performance Issues, Top @comment node-name, next, previous,up @chapter Frequently Asked Questions @@ -3014,17 +3148,17 @@ @end example -This is a very common question. @code{:-)} If you want this to be the -default behavior, don't lobby me, lobby RMS! +This is a very common question. If you want this to be the default +behavior, don't lobby me, lobby RMS! @code{:-)} @sp 1 @strong{Q.} @emph{I put @code{(c-set-offset 'substatement-open 0)} in my @file{.emacs} file but I get an error saying that @code{c-set-offset}'s function definition is void.} -@strong{A.} This means that @code{cc-mode} wasn't loaded into your +@strong{A.} This means that @ccmode{} wasn't loaded into your Emacs session by the time the @code{c-set-offset} call was reached, -mostly likely because @code{cc-mode} is being autoloaded. Instead +mostly likely because @ccmode{} is being autoloaded. Instead of putting the @code{c-set-offset} line in your top-level @file{.emacs} file, put it in your @code{c-mode-common-hook}, or simply add the following to the top of your @file{.emacs} file: @@ -3042,31 +3176,36 @@ constructs appear in different colors, or in bold face, etc.?} @strong{A.} ``Syntax Colorization'' is an Emacs 19 feature, controlled -by @code{font-lock-mode}. It is not part of @code{cc-mode}. +by @code{font-lock-mode}. It is not part of @ccmode{}. @sp 1 @strong{Q.} @emph{I @code{setq} @code{c-basic-offset} to 4 in my @file{.emacs} file, but why does everything still get indented with only 2 spaces?} -@strong{A.} It's because @code{c-basic-offset} is now a ``buffer local -variable'', meaning its value is unique to each buffer. The prefered -way to customize this is to change its value in a ``mode hook'' (most -likely @code{c-mode-common-hook}. Alternatively you can use -@code{setq-default} to change its value globally. +@vindex c-style-variables-are-local-p +@vindex style-variables-are-local-p +@strong{A.} It's because @code{c-basic-offset} is, by default, a +``buffer local variable'', meaning its value is unique to each buffer. +The prefered way to customize this is to change its value in a ``mode +hook'' (most likely @code{c-mode-common-hook}). Alternatively you can +use @code{setq-default} to change its value globally. Better yet, +before you load @file{cc-mode.el}, set the variable +@code{c-style-variables-are-local-p} to @code{nil}. @xref{Advanced +Customizations}. @end quotation @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@node Getting the latest cc-mode release, Sample .emacs File, Frequently Asked Questions, Top +@node Getting the latest CC Mode release, Sample .emacs File, Frequently Asked Questions, Top @comment node-name, next, previous,up -@chapter Getting the latest @code{cc-mode} release -@cindex Getting the latest @code{cc-mode} release +@chapter Getting the latest CC Mode release +@cindex Getting the latest CC Mode release @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@code{cc-mode} is now distributed with both Emacs 19 and XEmacs 19, so +@ccmode{} is now distributed with Emacs 19, XEmacs 19, and XEmacs 20, so you would typically just use the version that comes with your Emacs. These may be slightly out of date due to release schedule skew, so you should always check the canonical site for the latest version. @@ -3089,10 +3228,16 @@ distribution (named @code{cc-mode.tar.gz}; a gzip'd tar file), or any of the individual files, including PostScript documentation. -If you do not have anonymous ftp access, you can get the distribution -through an anonymous ftp-to-mail gateway, such as the one run by DEC at -@code{ftpmail@@decwrl.dec.com}. To get @code{cc-mode} via email, send -the following message in the body of your mail to that address: +If you do not have World Wide Web, or anonymous ftp access, you can get +the distribution through an anonymous ftp-to-mail gateway, such as the +one run by DEC at: +@example + +@code{ftpmail@@decwrl.dec.com} + +@end example +To get @ccmode{} via email, send the following message in the body of +your mail to that address: @example reply <a valid net address back to you> @@ -3110,11 +3255,11 @@ about its availability! @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@node Sample .emacs File, Limitations and Known Bugs, Getting the latest cc-mode release, Top +@node Sample .emacs File, Limitations and Known Bugs, Getting the latest CC Mode release, Top @comment node-name, next, previous,up -@chapter Sample @file{.emacs} file -@cindex Sample @file{.emacs} file +@chapter Sample .emacs file +@cindex Sample .emacs file @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @example @@ -3123,23 +3268,23 @@ ;; change some of the actual values. (defconst my-c-style - '((c-tab-always-indent . t) - (c-comment-only-line-offset . 4) - (c-hanging-braces-alist . ((substatement-open after) - (brace-list-open))) - (c-hanging-colons-alist . ((member-init-intro before) - (inher-intro) - (case-label after) - (label after) - (access-label after))) - (c-cleanup-list . (scope-operator - empty-defun-braces - defun-close-semi)) - (c-offsets-alist . ((arglist-close . c-lineup-arglist) - (substatement-open . 0) - (case-label . 4) - (block-open . 0) - (knr-argdecl-intro . -))) + '((c-tab-always-indent . t) + (c-comment-only-line-offset . 4) + (c-hanging-braces-alist . ((substatement-open after) + (brace-list-open))) + (c-hanging-colons-alist . ((member-init-intro before) + (inher-intro) + (case-label after) + (label after) + (access-label after))) + (c-cleanup-list . (scope-operator + empty-defun-braces + defun-close-semi)) + (c-offsets-alist . ((arglist-close . c-lineup-arglist) + (substatement-open . 0) + (case-label . 4) + (block-open . 0) + (knr-argdecl-intro . -))) (c-echo-syntactic-information-p . t) ) "My C Programming Style") @@ -3183,14 +3328,13 @@ Re-indenting large regions or expressions can be slow. @item -Use with Emacs 18 can be slow and annoying. You should seriously +Use with Emacs 18 can be slow and annoying. You should seriously consider upgrading to Emacs 19. @item -There is still some weird behavior when filling C block comments. -My suggestion is to check out separate fill packages such as -@code{filladapt} or @code{adaptive-fill-mode}. These can do a much -better job of filling comment regions. +Add-on fill packages may not work as well as @ccmode{}'s built-in +filling routines. I no longer recommend you use @code{filladapt} to +fill comments. @cindex c-indent-exp @cindex indent-exp (c-) @@ -3225,9 +3369,10 @@ Bug reports are now sent to the following email addresses: @code{cc-mode-help@@python.org} and -@code{bug-gnu-emacs@@prep.ai.mit.edu}; the latter is mirrored on the Usenet -newsgroup @code{gnu.emacs.bug}. Other questions and suggestions should -be mailed to @code{help-gnu-emacs@@prep.ai.mit.edu} which is mirrored on +@code{bug-gnu-emacs@@prep.ai.mit.edu}; the latter is mirrored on the +Usenet newsgroup @code{gnu.emacs.bug}. You can send other questions, +suggestions, and kudos to @code{cc-mode-help@@python.org}, or +@code{help-gnu-emacs@@prep.ai.mit.edu} which is mirrored on newsgroup @code{gnu.emacs.help}. @@ -3249,7 +3394,7 @@ @ifinfo @end ifinfo -Since all @code{cc-mode} commands are prepended with the string +Since all @ccmode{} commands are prepended with the string @samp{c-}, each appears under its @code{c-@var{<thing>}} name and its @code{@var{<thing>} (c-)} name. @iftex @@ -3273,10 +3418,7 @@ @unnumbered Variable Index @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@ifinfo - -@end ifinfo -Since all @code{cc-mode} variables are prepended with the string +Since all @ccmode{} variables are prepended with the string @samp{c-}, each appears under its @code{c-@var{<thing>}} name and its @code{@var{<thing>} (c-)} name. @iftex diff -r e183fc049578 -r fe104dbd9147 man/custom.texi --- a/man/custom.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/custom.texi Mon Aug 13 09:19:45 2007 +0200 @@ -13,7 +13,7 @@ @comment node-name, next, previous, up @top The Customization Library -Version: 1.59 +Version: 1.63 @menu * Introduction:: @@ -648,6 +648,14 @@ definitions. @item +Support selectable color themes. I.e., change many faces by setting one +variable. + +@item +There should be a way to see only the "current" display when editing a +face, and that should be "on" by default. + +@item Support undo using lmi's @file{gnus-undo.el}. @item diff -r e183fc049578 -r fe104dbd9147 man/gnus.texi --- a/man/gnus.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/gnus.texi Mon Aug 13 09:19:45 2007 +0200 @@ -1165,7 +1165,7 @@ be a letter. @sc{gnus} will call the function @code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter following @samp{%u}. The function will be passed a single dummy -paratere as argument. The function should return a string, which will +parameter as argument. The function should return a string, which will be inserted into the buffer just like information from any other specifier. @end table @@ -13386,11 +13386,15 @@ @table @code +@item gnus-home-directory +All Gnus path variables will be initialized from this variable, which +defaults to @file{~/}. + @item gnus-directory @vindex gnus-directory -All Gnus directories will be initialized from this variable, which -defaults to the @samp{SAVEDIR} environment variable, or @file{~/News/} -if that variable isn't set. +Most Gnus storage path variables will be initialized from this variable, +which defaults to the @samp{SAVEDIR} environment variable, or +@file{~/News/} if that variable isn't set. @item gnus-default-directory @vindex gnus-default-directory diff -r e183fc049578 -r fe104dbd9147 man/lispref/strings.texi --- a/man/lispref/strings.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/lispref/strings.texi Mon Aug 13 09:19:45 2007 +0200 @@ -345,10 +345,30 @@ @example (char-equal ?x ?x) @result{} t -(char-to-string (+ 256 ?x)) - @result{} "x" -(char-equal ?x (+ 256 ?x)) +(let ((case-fold-search t)) + (char-equal ?x ?X)) @result{} t +(let ((case-fold-search nil)) + (char-equal ?x ?X)) + @result{} nil +@end example +@end defun + +@defun char= character1 character2 +This function returns @code{t} if the arguments represent the same +character, @code{nil} otherwise. Case is significant. + +@example +(char= ?x ?x) + @result{} t +(char= ?x ?X) + @result{} nil +(let ((case-fold-search t)) + (char-equal ?x ?X)) + @result{} nil +(let ((case-fold-search nil)) + (char-equal ?x ?X)) + @result{} nil @end example @end defun diff -r e183fc049578 -r fe104dbd9147 man/w3.texi --- a/man/w3.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/w3.texi Mon Aug 13 09:19:45 2007 +0200 @@ -130,12 +130,48 @@ @vindex w3-default-homepage @findex w3 If installed correctly, starting Emacs-W3 is quite painless. Just type -@kbd{M-x w3} in a running Emacs sessions. This will retrieve the -default page that has been configured - by default the documentation for -Emacs-W3 at Indiana University. +@kbd{M-x w3} in a running Emacs session. This will retrieve the default +page that has been configured (@pxref{Preferences Panel}) - by default the +documentation for Emacs-W3 at Indiana University. If the default page is not retrieved correctly at startup, you will have -to do some customization. +to do some customization (@pxref{Preferences Panel}). + +Once started, you can use the mouse and the menu or use the following +key commands (for more commands and more detail, @pxref{Basic Usage, , +Basic Usage}). + +@table @asis +@item move forward +press the space bar, + +@item move backwards +press the backspace key, + +@item move to the next HTML reference on the page +press the @kbd{TAB} key, + +@item move to the previous HTML reference on the page +press the @kbd{SHIFT} and @kbd{TAB} keys at the same time. If this does +not work (some text terminals cannot distinguish between @kbd{TAB} and +@kbd{SHIFT-TAB}, pressing the @kbd{ALT} and @kbd{TAB} keys should also +work. + +@item follow a link +put the cursor over it +and press the @kbd{RETURN} key, or @* +click the left mouse button on it, + +@item fetch a @sc{url} +press the @kbd{Control} and @kbd{o} keys at the same time,@* +type the @sc{url}, and then press the @kbd{RETURN} key, + +@item return to the last URL you were at +press the @kbd{l} key, + +@item quit W3 mode +press the @kbd{q} key. +@end table @menu * Downloading:: Where to download Emacs-W3. @@ -3396,18 +3432,37 @@ ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/ @end table +Currently, an external in order to use SSL from within Emacs-W3. This +program should be able to take command line parameters for the hostname +and port number to connect to, and read/write to standard input/output +(similar to telnet, but without the annoying status messages). + +The following variables control how the external program is invoked. + +@table @code +@item ssl-program-name @vindex ssl-program-name -Whichever reference implementation is used (I recommend the SSLeay -distribution, just to thumb a nose at the NSA :), there is a program -that can be run in a subprocess that takes a hostname and port number on -the command line, and reads/writes to standard input/output (the -Netscape implementation comes with one of these by default). Set the -variable @code{ssl-program-name} to point to this program. - - -This should be all the configuration necessary. In the future, I will -be distributing a set of patches to Emacs 19.xx and XEmacs 19.xx to -SSL-enable them, for the sake of speed. +The name of the program to run, as a string. + +@example +(setq ssl-program-name "s_client") +@end example + +@item ssl-program-arguments +@vindex ssl-program-arguments +This should be used if your SSL program needs command line switches to +specify any behaviour (certificate file locations, etc). This is a list +of strings and symbols. + +The special symbols 'host and 'port may be used in the list of arguments +and will be replaced with the hostname and service/port that will be +connected to. + +@example +(setq ssl-program-arguments '("-host" host "-port" service "-verify" "4" + "-CApath /usr/local/ssl/certs")) +@end example +@end table @node Mailcap Files, Down with DoubleClick, Installing SSL, Top @appendix Mailcap Files diff -r e183fc049578 -r fe104dbd9147 man/widget.texi --- a/man/widget.texi Mon Aug 13 09:18:41 2007 +0200 +++ b/man/widget.texi Mon Aug 13 09:19:45 2007 +0200 @@ -1,6 +1,6 @@ \input texinfo.tex -@c $Id: widget.texi,v 1.6 1997/03/08 23:27:27 steve Exp $ +@c $Id: widget.texi,v 1.7 1997/03/16 03:06:11 steve Exp $ @c %**start of header @setfilename widget @@ -15,7 +15,7 @@ @comment node-name, next, previous, up @top The Emacs Widget Library -Version: 1.59 +Version: 1.63 @menu * Introduction:: @@ -530,9 +530,28 @@ return the widget containing the invalid data, and set that widgets @code{:error} property to a string explaining the error. +@item :tab-order +Specify the order in which widgets are traversed with +@code{widget-forward} or @code{widget-backward}. This is only partially +implemented. + +@enumerate a +@item +Widgets with tabbing order @code{-1} are ignored. + +@item +(Unimplemented) When on a widget with tabbing order @var{n}, go to the +next widget in the buffer with tabbing order @var{n+1} or @code{nil}, +whichever comes first. + +@item +When on a widget with no tabbing order specified, go to the next widget +in the buffer with a positive tabbing order, or @code{nil} +@end enumerate + @item :parent -The parent of a nested widget (e.g. a @code{menu-choice} item or an element of a -@code{editable-list} widget). +The parent of a nested widget (e.g. a @code{menu-choice} item or an +element of a @code{editable-list} widget). @item :sibling-args This keyword is only used for members of a @code{radio-button-choice} or diff -r e183fc049578 -r fe104dbd9147 src/ChangeLog --- a/src/ChangeLog Mon Aug 13 09:18:41 2007 +0200 +++ b/src/ChangeLog Mon Aug 13 09:19:45 2007 +0200 @@ -1,3 +1,57 @@ +Sat Mar 15 14:21:39 1997 David Moore <dmoore@ucsd.edu> + + * fileio.c (Fdo_auto_save): Protect against file handlers which + may kill the buffer being saved or otherwise modify Vbuffer_alist. + +Sat Mar 15 15:32:51 1997 Steven L Baur <steve@altair.xemacs.org> + + * Makefile.in.in (lisp): Add auto-customize.elc. + +Fri Mar 14 19:10:37 1997 David Moore <dmoore@ucsd.edu> + + * extents.c (extent_changed_for_redisplay): New parameter. + (extent_changed_for_redisplay): Notify redisplay if invisible text + has become visible. + (extent_maybe_changed_for_redisplay): New parameter. + (extent_attach): Use it. + (extent_detach): Use it. + (Fset_extent_parent): Use it. + (set_extent_invisible): Use visibility change parameter. + (Fset_extent_face): Ditto. + (Fset_extent_mouse_face): Ditto. + (set_extent_glyph): Ditto. + (do_highlight): Ditto. + +Thu Mar 13 10:40:37 1997 Steven L Baur <steve@altair.xemacs.org> + + * s/sunos4-1-4-shr.h: New file. + + * s/sunos4-1-4.h: New file. + + * s/sunos4-1.h (BROKEN_SIGIO): Define. + +Wed Mar 12 14:29:40 1997 Steven L Baur <steve@altair.xemacs.org> + + * emacs.c (fatal_error_signal): (mostly) useless check on + /usr/proc/bin/pstack removed. + + * s/bsdos3.h: New file for BSDI 3.0. + + * editfns.c (Fchar_equal): Correct DOC string. + (Fchar_Equal): (char=) CL Case sensitve comparison added. + + * data.c (Fcharacterp): Make DOC string less confrontational. + +Mon Mar 10 23:51:04 1997 Martin Buchholz <mrb@eng.sun.com> + + * input-method-motif.c (XIM_init_frame): Fix XIM crash on some + versions of X11R6 XIM. + +Sun Mar 9 21:46:53 1997 Tomasz J. Cholewo <t.cholewo@ieee.org> + + * minibuf.c (regexp_ignore_completion_p): Reverse meaning of + completion-regexp-list. + Thu Mar 6 19:15:29 1997 Steven L Baur <steve@altair.xemacs.org> * data.c (eq_with_ebola_notice): Unobfuscate Ebola warning!!! diff -r e183fc049578 -r fe104dbd9147 src/EmacsFrame.c --- a/src/EmacsFrame.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/EmacsFrame.c Mon Aug 13 09:19:45 2007 +0200 @@ -103,10 +103,10 @@ {XtNrightToolBarWidth, XtCRightToolBarWidth, XtRInt, sizeof (int), offset (right_toolbar_width), XtRImmediate, (XtPointer)-1}, {XtNtopToolBarShadowColor, XtCTopToolBarShadowColor, XtRPixel, sizeof(Pixel), - offset(top_toolbar_shadow_pixel), XtRString, (String) "black"}, + offset(top_toolbar_shadow_pixel), XtRString, (String) "#000000"}, {XtNbottomToolBarShadowColor, XtCBottomToolBarShadowColor, XtRPixel, sizeof(Pixel), offset(bottom_toolbar_shadow_pixel), XtRString, - (String) "black"}, + (String) "#000000"}, {XtNbackgroundToolBarColor, XtCBackgroundToolBarColor, XtRPixel, sizeof(Pixel), offset(background_toolbar_pixel), XtRString, (String) "Gray75"}, diff -r e183fc049578 -r fe104dbd9147 src/Makefile.in.in --- a/src/Makefile.in.in Mon Aug 13 09:18:41 2007 +0200 +++ b/src/Makefile.in.in Mon Aug 13 09:19:45 2007 +0200 @@ -1110,6 +1110,7 @@ ${lispdir}mule/mule-charset.elc ${lispdir}mule/mule-files.elc \ ${lispdir}mule/mule-category.elc ${lispdir}mule/mule-misc.elc \ ${lispdir}mule/mule-ccl.elc ${lispdir}mule/mule-init.elc \ + ${lispdir}mule/kinsoku.elc \ MULE_X11_LISP \ ${lispdir}mule/arabic-hooks.elc \ ${lispdir}mule/chinese-hooks.elc \ @@ -1273,7 +1274,7 @@ ${lispdir}prim/itimer.elc ${lispdir}prim/itimer-autosave.elc \ ${lispdir}ediff/ediff-hook.elc \ ${lispdir}custom/widget.elc \ - ${lispdir}custom/custom.elc \ + ${lispdir}custom/custom.elc ${lispdir}prim/custom-load.elc \ ${lispdir}packages/fontl-hooks.elc SCROLLBAR_LISP \ ${lispdir}prim/buffer.elc MENUBAR_LISP \ ${lispdir}packages/buff-menu.elc DIALOG_LISP MULE_LISP NOMULE_LISP \ diff -r e183fc049578 -r fe104dbd9147 src/alloc.c --- a/src/alloc.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/alloc.c Mon Aug 13 09:19:45 2007 +0200 @@ -3899,6 +3899,7 @@ Vprocess_environment = Qnil; Vexec_directory = Qnil; Vdata_directory = Qnil; + Vsite_directory = Qnil; Vdoc_directory = Qnil; Vconfigure_info_directory = Qnil; Vexec_path = Qnil; diff -r e183fc049578 -r fe104dbd9147 src/buffer.c --- a/src/buffer.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/buffer.c Mon Aug 13 09:19:45 2007 +0200 @@ -1002,6 +1002,7 @@ display). We still need to make sure redisplay realizes that the contents have potentially altered and it needs to do some work. */ + buf = decode_buffer(buffer, 0); BUF_MODIFF (buf)++; BUF_SAVE_MODIFF (buf) = NILP (flag) ? BUF_MODIFF (buf) : 0; MARK_MODELINE_CHANGED; @@ -2258,7 +2259,7 @@ #endif buffer_local_flags.buffer_file_type = make_int (0x4000); #ifdef MULE - buffer_local_flags.file_coding_system = make_int (0x8000); + buffer_local_flags.buffer_file_coding_system = make_int (0x8000); #endif /* #### Warning, 0x4000000 (that's six zeroes) is the largest number @@ -2363,7 +2364,7 @@ or print Bottom or All. %n -- print Narrow if appropriate. %t -- Under MS-DOS, print T if files is text, B if binary. - %C -- under XEmacs/Mule, print the mnemonic for `file-coding-system'. + %C -- under XEmacs/mule, print the mnemonic for `buffer-file-coding-system'. %[ -- print one [ for each recursive editing level. %] similar. %% -- print %. %- -- print infinitely many dashes. Decimal digits after the % specify field width to which to pad. @@ -2465,21 +2466,21 @@ */ ); #ifdef MULE - DEFVAR_BUFFER_DEFAULTS ("default-file-coding-system", file_coding_system /* -Default value of `file-coding-system' for buffers that do not override it. -This is the same as (default-value 'file-coding-system). + DEFVAR_BUFFER_DEFAULTS ("default-buffer-file-coding-system", buffer_file_coding_system /* +Default value of `buffer-file-coding-system' for buffers that do not override it. +This is the same as (default-value 'buffer-file-coding-system). This value is used both for buffers without associated files and for buffers whose files do not have any apparent coding system. -See `file-coding-system'. +See `buffer-file-coding-system'. */ ); - DEFVAR_BUFFER_LOCAL ("file-coding-system", file_coding_system /* + DEFVAR_BUFFER_LOCAL ("buffer-file-coding-system", buffer_file_coding_system /* *Current coding system for the current buffer. When the buffer is written out into a file, this coding system will be used for the encoding. Automatically buffer-local when set in any fashion. This is normally set automatically when a file is loaded in based on the determined coding system of the file (assuming that -`file-coding-system-for-read' is set to `autodetect', which calls +`buffer-file-coding-system-for-read' is set to `autodetect', which calls for automatic determination of the file's coding system). Normally the modeline indicates the current file coding system using its mnemonic abbreviation. @@ -2506,9 +2507,9 @@ data -- there may be stray ESC characters when the file is read by another program. -`file-coding-system' does *not* control the coding system used when -a file is read in. Use the variables `file-coding-system-for-read' -and `file-coding-system-alist' for that. From a Lisp program, if +`buffer-file-coding-system' does *not* control the coding system used when +a file is read in. Use the variables `buffer-file-coding-system-for-read' +and `buffer-file-coding-system-alist' for that. From a Lisp program, if you wish to unilaterally specify the coding system used for one particular operation, you should bind the variable `coding-system-for-read' rather than changing the other two diff -r e183fc049578 -r fe104dbd9147 src/bufslots.h --- a/src/bufslots.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/bufslots.h Mon Aug 13 09:19:45 2007 +0200 @@ -102,7 +102,7 @@ MARKED_SLOT (category_table); /* This buffer's coding system. */ - MARKED_SLOT (file_coding_system); + MARKED_SLOT (buffer_file_coding_system); #endif /* MULE */ /* Values of several buffer-local variables. diff -r e183fc049578 -r fe104dbd9147 src/callproc.c --- a/src/callproc.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/callproc.c Mon Aug 13 09:19:45 2007 +0200 @@ -55,7 +55,7 @@ #endif /* DOS_NT */ Lisp_Object Vexec_path, Vexec_directory, Vdata_directory, Vdoc_directory; -Lisp_Object Vconfigure_info_directory; +Lisp_Object Vconfigure_info_directory, Vsite_directory; /* The default base directory XEmacs is installed under. */ Lisp_Object Vprefix_directory; @@ -959,6 +959,7 @@ if (!initialized) { Vdata_directory = Qnil; + Vsite_directory = Qnil; Vdoc_directory = Qnil; Vexec_path = Qnil; } @@ -966,6 +967,7 @@ #endif { char *data_dir = egetenv ("EMACSDATA"); + char *site_dir = egetenv ("EMACSSITE"); char *doc_dir = egetenv ("EMACSDOC"); #ifdef PATH_DATA @@ -976,6 +978,10 @@ if (!doc_dir) doc_dir = (char *) PATH_DOC; #endif +#ifdef PATH_SITE + if (!site_dir) + site_dir = (char *) PATH_SITE; +#endif if (data_dir) Vdata_directory = Ffile_name_as_directory @@ -987,6 +993,11 @@ (build_string (doc_dir)); else Vdoc_directory = Qnil; + if (site_dir) + Vsite_directory = Ffile_name_as_directory + (build_string (site_dir)); + else + Vsite_directory = Qnil; /* Check the EMACSPATH environment variable, defaulting to the PATH_EXEC path from paths.h. */ @@ -1045,6 +1056,24 @@ } } + if (!NILP (Vsite_directory)) + { + tempdir = Fdirectory_file_name (Vsite_directory); + if (access ((char *) XSTRING_DATA (tempdir), 0) < 0) + { + /* If the hard-coded path is bogus, fail silently. + This will allow the normal heuristics to make an attempt. */ +#if 0 + warn_when_safe + (Qpath, Qwarning, + "Warning: machine-independent site dir (%s) does not exist.\n", + XSTRING_DATA (Vsite_directory)); +#else + Vsite_directory = Qnil; +#endif + } + } + #ifdef PATH_PREFIX Vprefix_directory = build_string ((char *) PATH_PREFIX); #else @@ -1133,6 +1162,11 @@ intended for Emacs to use. */ ); + DEFVAR_LISP ("site-directory", &Vsite_directory /* +Directory of architecture-independent files that do not come with XEmacs, +intended for Emacs to use. +*/ ); + /* FSF puts the DOC file into data-directory. They do a bunch of contortions to attempt to put everything into the DOC file whether the support is there or not. */ diff -r e183fc049578 -r fe104dbd9147 src/chartab.c --- a/src/chartab.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/chartab.c Mon Aug 13 09:19:45 2007 +0200 @@ -1647,12 +1647,12 @@ } int -check_category_at(Emchar ch, Lisp_Object table, - unsigned int designator, unsigned int not) +check_category_char(Emchar ch, Lisp_Object table, + unsigned int designator, unsigned int not) { register Lisp_Object temp; struct Lisp_Char_Table *ctbl; -#if 1 /* ifdef ERROR_CHECK_TYPECHECK */ +#ifdef ERROR_CHECK_TYPECHECK if (NILP (Fcategory_table_p (table))) signal_simple_error("Expected category table", table); #endif @@ -1665,7 +1665,7 @@ } DEFUN ("check-category-at", Fcheck_category_at, 2, 4, 0, /* -Return t if category of a character at POS includes DESIGNATIOR, +Return t if category of a character at POS includes DESIGNATOR, else return nil. Optional third arg specifies which buffer (defaulting to current), and fourth specifies the CATEGORY-TABLE, (defaulting to the buffer's category table). @@ -1682,7 +1682,28 @@ des = XREALINT(designator); ctbl = check_category_table (category_table, Vstandard_category_table); ch = BUF_FETCH_CHAR (buf, XINT(pos)); - return (check_category_at(ch, ctbl, des, 0) + return (check_category_char(ch, ctbl, des, 0) + ? Qt : Qnil); +} + +DEFUN ("char-in-category-p", Fchar_in_category_p, 2, 3, 0, /* +Return t if category of character CHR includes DESIGNATOR, else +return nil. Optional third arg specifies the CATEGORY-TABLE to use, + +which defaults to the system default table. +*/ + (chr, designator, category_table)) +{ + Lisp_Object ctbl; + Emchar ch; + unsigned int des; + + CHECK_CATEGORY_DESIGNATOR (designator); + des = XREALINT(designator); + CHECK_CHAR(chr); + ch = XCHAR(chr); + ctbl = check_category_table (category_table, Vstandard_category_table); + return (check_category_char(ch, ctbl, des, 0) ? Qt : Qnil); } @@ -1790,6 +1811,7 @@ DEFSUBR (Fcopy_category_table); DEFSUBR (Fset_category_table); DEFSUBR (Fcheck_category_at); + DEFSUBR (Fchar_in_category_p); DEFSUBR (Fcategory_designator_p); DEFSUBR (Fcategory_table_value_p); #endif /* MULE */ diff -r e183fc049578 -r fe104dbd9147 src/chartab.h --- a/src/chartab.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/chartab.h Mon Aug 13 09:19:45 2007 +0200 @@ -192,8 +192,8 @@ #ifdef MULE -int check_category_at(Emchar ch, Lisp_Object ctbl, - unsigned int designator, unsigned int not); +int check_category_char(Emchar ch, Lisp_Object ctbl, + unsigned int designator, unsigned int not); extern Lisp_Object Qcategory_table_p, Qcategory_designator_p; extern Lisp_Object Qcategory_table_value_p; diff -r e183fc049578 -r fe104dbd9147 src/console-stream.c --- a/src/console-stream.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/console-stream.c Mon Aug 13 09:19:45 2007 +0200 @@ -318,17 +318,17 @@ vars_of_console_stream (void) { DEFVAR_LISP ("terminal-console", &Vterminal_console /* -The initial console-object, which represent's Emacs's stdout. +The initial console-object, which represents XEmacs' stdout. */ ); Vterminal_console = Qnil; DEFVAR_LISP ("terminal-device", &Vterminal_device /* -The initial device-object, which represent's Emacs's stdout. +The initial device-object, which represents XEmacs' stdout. */ ); Vterminal_device = Qnil; DEFVAR_LISP ("terminal-frame", &Vterminal_frame /* -The initial frame-object, which represents Emacs's stdout. +The initial frame-object, which represents XEmacs' stdout. */ ); Vterminal_frame = Qnil; diff -r e183fc049578 -r fe104dbd9147 src/console.c --- a/src/console.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/console.c Mon Aug 13 09:19:45 2007 +0200 @@ -315,7 +315,7 @@ Return the type of the specified console (e.g. `x' or `tty'). Value is `tty' for a tty console (a character-only terminal), `x' for a console that is an X display, -`ns' for a console that is a NeXTstep connection (not yet implemeted), +`ns' for a console that is a NeXTstep connection (not yet implemented), `win32' for a console that is a Windows or Windows NT connection (not yet implemented), `pc' for a console that is a direct-write MS-DOS connection (not yet @@ -903,6 +903,9 @@ # endif #endif /* BSD */ } +#ifdef HAVE_TTY +extern Lisp_Object Fconsole_tty_controlling_process(Lisp_Object console); +#endif DEFUN ("suspend-console", Fsuspend_console, 0, 1, "", /* Suspend a console. For tty consoles, it sends a signal to suspend @@ -922,6 +925,7 @@ struct console *c; struct gcpro gcpro1; +#ifdef HAVE_TTY if (NILP (console)) console=Fselected_console(); @@ -944,6 +948,7 @@ } UNGCPRO; +#endif return Qnil; } @@ -958,6 +963,7 @@ struct console *c; struct gcpro gcpro1, gcpro2, gcpro3; +#ifdef HAVE_TTY GCPRO2 (console, devcons); c = decode_console(console); @@ -976,6 +982,7 @@ } UNGCPRO; +#endif return Qnil; } diff -r e183fc049578 -r fe104dbd9147 src/data.c --- a/src/data.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/data.c Mon Aug 13 09:19:45 2007 +0200 @@ -397,11 +397,11 @@ DEFUN ("characterp", Fcharacterp, 1, 1, 0, /* t if OBJECT is a character. -Unlike in FSF Emacs, a character is its own primitive type. +Unlike in XEmacs v19 and Emacs, a character is its own primitive type. Any character can be converted into an equivalent integer using `char-to-int'. To convert the other way, use `int-to-char'; however, only some integers can be converted into characters. Such an integer -is called a `char-to-int'; see `char-int-p'. +is called a `char-int'; see `char-int-p'. Some functions that work on integers (e.g. the comparison functions <, <=, =, /=, etc. and the arithmetic functions +, -, *, etc.) diff -r e183fc049578 -r fe104dbd9147 src/editfns.c --- a/src/editfns.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/editfns.c Mon Aug 13 09:19:45 2007 +0200 @@ -1916,7 +1916,7 @@ DEFUN ("char-equal", Fchar_equal, 2, 3, 0, /* Return t if two characters match, optionally ignoring case. -Both arguments must be characters (i.e. integers). +Both arguments must be characters (i.e. NOT integers). Case is ignored if `case-fold-search' is non-nil in BUFFER. If BUFFER is nil, the current buffer is assumed. */ @@ -1936,6 +1936,23 @@ return Qt; return Qnil; } + +DEFUN ("char=", Fchar_Equal, 2, 3, 0, /* +Return t if two characters match, case is significant. +Both arguments must be characters (i.e. NOT integers). +The optional buffer argument is for symmetry and is ignored. +*/ + (c1, c2, buffer)) +{ + Emchar x1, x2; + + CHECK_CHAR_COERCE_INT (c1); + CHECK_CHAR_COERCE_INT (c2); + x1 = XCHAR (c1); + x2 = XCHAR (c2); + + return x1 == x2 ? Qt : Qnil; +} #if 0 /* Undebugged FSFmacs code */ /* Transpose the markers in two regions of the current buffer, and @@ -2061,6 +2078,7 @@ defsymbol (&Qformat, "format"); DEFSUBR (Fchar_equal); + DEFSUBR (Fchar_Equal); DEFSUBR (Fgoto_char); DEFSUBR (Fstring_to_char); DEFSUBR (Fchar_to_string); @@ -2151,7 +2169,7 @@ set-mark-command (C-SPC) pushes a mark and activates the region. Moving the cursor with normal motion commands (C-n, C-p, etc) will cause the region between point and the recently-pushed mark to be highlighted. It will -remain highlighted until some non-motion comand is executed. +remain highlighted until some non-motion command is executed. exchange-point-and-mark (\\[exchange-point-and-mark]) activates the region. So if you mark a region and execute a command that operates on it, you can reactivate the diff -r e183fc049578 -r fe104dbd9147 src/emacs.c --- a/src/emacs.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/emacs.c Mon Aug 13 09:19:45 2007 +0200 @@ -179,7 +179,7 @@ shut_down_emacs (sig, Qnil); stderr_out("\nLisp backtrace follows:\n\n"); Fbacktrace(Qexternal_debugging_output, Qt); - +# if 0 /* This is evil, rarely useful, and causes grief in some cases. */ /* Check for Sun-style stack printing via /proc */ { CONST char *pstack = "/usr/proc/bin/pstack"; @@ -192,6 +192,7 @@ system(buf); } } +# endif } #ifdef VMS LIB$STOP (SS$_ABORT); diff -r e183fc049578 -r fe104dbd9147 src/emacsfns.h --- a/src/emacsfns.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/emacsfns.h Mon Aug 13 09:19:45 2007 +0200 @@ -217,7 +217,7 @@ /* Defined in callproc.c */ extern Lisp_Object Vexec_path, Vexec_directory, Vdata_directory, - Vdoc_directory; + Vdoc_directory, Vsite_directory; /* Defined in casefiddle.c */ diff -r e183fc049578 -r fe104dbd9147 src/event-stream.c --- a/src/event-stream.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/event-stream.c Mon Aug 13 09:19:45 2007 +0200 @@ -2368,9 +2368,8 @@ /* This is used in accept-process-output, sleep-for and sit-for. Before running any process_events in these routines, we set recursive_sit_for to Qt, and use this unwind protect to reset it to - Qnil upon exit. When recursive_sit_for is Qt, calling any of these - three routines will cause them to return immediately no matter what - their arguments were. + Qnil upon exit. When recursive_sit_for is Qt, calling sit-for will + cause it to return immediately. All of these routines install timeouts, so we clear the installed timeout as well. @@ -2406,13 +2405,6 @@ If the third arg is non-nil, it is a number of milliseconds that is added to the second arg. (This exists only for compatibility.) Return non-nil iff we received any output before the timeout expired. - -If a filter function or timeout handler (such as installed by `add-timeout') - calls any of accept-process-output, sleep-for, or sit-for, those calls - will return nil immediately (regardless of their arguments) in recursive - situations. It is recommended that you never call accept-process-output - from inside of a process filter function or timer event (either synchronous - or asynchronous). */ (process, timeout_secs, timeout_msecs)) { @@ -2426,10 +2418,6 @@ struct buffer *old_buffer = current_buffer; int count; - /* Recusive call from a filter function or timeout handler. */ - if (!NILP(recursive_sit_for)) - return Qnil; - /* We preserve the current buffer but nothing else. If a focus change alters the selected window then the top level event loop will eventually alter current_buffer to match. In the mean time @@ -2547,12 +2535,8 @@ Pause, without updating display, for ARG seconds. ARG may be a float, meaning pause for some fractional part of a second. -If a filter function or timeout handler (such as installed by `add-timeout') - calls any of accept-process-output, sleep-for, or sit-for, those calls - will return nil immediately (regardless of their arguments) in recursive - situations. It is recommended that you never call sleep-for from inside - of a process filter function or timer event (either synchronous or - asynchronous). +It is recommended that you never call sleep-for from inside of a process + filter function or timer event (either synchronous or asynchronous). */ (seconds)) { @@ -2563,10 +2547,6 @@ int count; struct gcpro gcpro1; - /* Recusive call from a filter function or timeout handler. */ - if (!NILP(recursive_sit_for)) - return Qnil; - GCPRO1 (event); id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0); @@ -2627,12 +2607,8 @@ happen if input is available before it starts. Value is t if waited the full time with no input arriving. -If a filter function or timeout handler (such as installed by `add-timeout') - calls any of accept-process-output, sleep-for, or sit-for, those calls - will return nil immediately (regardless of their arguments) in recursive - situations. It is recommended that you never call sit-for from inside - of a process filter function or timer event (either synchronous or - asynchronous) with an argument other than 0. +If sit-for is called from within a process filter function or timer + event (either synchronous or asynchronous) it will return immediately. */ (seconds, nodisplay)) { @@ -2643,10 +2619,6 @@ int id; int count; - /* Recusive call from a filter function or timeout handler. */ - if (!NILP(recursive_sit_for)) - return Qnil; - /* The unread-command-events count as pending input */ if (!NILP (Vunread_command_events) || !NILP (Vunread_command_event)) return Qnil; @@ -2668,6 +2640,18 @@ if (noninteractive || !NILP (Vexecuting_macro)) return (Qnil); + /* Recusive call from a filter function or timeout handler. */ + if (!NILP(recursive_sit_for)) + { + if (!event_stream_event_pending_p (1) && NILP (nodisplay)) + { + run_pre_idle_hook (); + redisplay (); + } + return Qnil; + } + + /* Otherwise, start reading events from the event_stream. Do this loop at least once even if (sit-for 0) so that we redisplay when no input pending. @@ -3282,7 +3266,7 @@ like command prefixes; they signal this by setting prefix-arg to non-nil. -- Therefore, we reset this-command-keys when we finish - executing a comand, unless prefix-arg is set. + executing a command, unless prefix-arg is set. -- However, if we ever do a non-local exit out of a command loop (e.g. an error in a command), we need to reset this-command-keys. We do this by calling reset_this_command_keys() @@ -3316,7 +3300,7 @@ /* The following two functions are used in call-interactively, for the @ and e specifications. We used to just use - `current-mouse-event' (i.e. the last mouse event in this-comand-keys), + `current-mouse-event' (i.e. the last mouse event in this-command-keys), but FSF does it more generally so we follow their lead. */ Lisp_Object @@ -4657,10 +4641,7 @@ (/ (- (caddr ,end) (caddr ,start)) 1000000.0))) (defun testee (ignore) - ;; All three of these should return immediately. - (sit-for 10) - (sleep-for 10) - (accept-process-output nil 10)) + (sit-for 10)) (defun test-them () (let ((start (current-time)) @@ -4674,7 +4655,8 @@ (setq end (current-time)) (test-diff-time start end))) -(test-them) should sit for 15 seconds, not 105 or 96. - +(test-them) should sit for 15 seconds. +Repeat with testee set to sleep-for and accept-process-output. +These should each delay 36 seconds. */ diff -r e183fc049578 -r fe104dbd9147 src/extents.c --- a/src/extents.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/extents.c Mon Aug 13 09:19:45 2007 +0200 @@ -1578,7 +1578,8 @@ descendants. */ static void -extent_changed_for_redisplay (EXTENT extent, int descendants_too) +extent_changed_for_redisplay (EXTENT extent, int descendants_too, + int invisibility_change) { Lisp_Object object; Lisp_Object rest; @@ -1597,7 +1598,8 @@ if there are any circularities here, so we sure as hell better ensure that there aren't. */ LIST_LOOP (rest, XWEAK_LIST_LIST (children)) - extent_changed_for_redisplay (XEXTENT (XCAR (rest)), 1); + extent_changed_for_redisplay (XEXTENT (XCAR (rest)), 1, + invisibility_change); } } @@ -1626,6 +1628,8 @@ b = XBUFFER (object); BUF_FACECHANGE (b)++; MARK_EXTENTS_CHANGED; + if (invisibility_change) + MARK_CLIP_CHANGED; buffer_extent_signal_changed_region (b, extent_endpoint_bufpos (extent, 0), extent_endpoint_bufpos (extent, 1)); @@ -1638,14 +1642,16 @@ the extent has any displayable attributes. */ static void -extent_maybe_changed_for_redisplay (EXTENT extent, int descendants_too) +extent_maybe_changed_for_redisplay (EXTENT extent, int descendants_too, + int invisibility_change) { /* Retrieve the ancestor for efficiency */ EXTENT anc = extent_ancestor (extent); if (!NILP (extent_face (anc)) || !NILP (extent_begin_glyph (anc)) || !NILP (extent_end_glyph (anc)) || !NILP (extent_mouse_face (anc)) || - !NILP (extent_invisible (anc))) - extent_changed_for_redisplay (extent, descendants_too); + !NILP (extent_invisible (anc)) || invisibility_change) + extent_changed_for_redisplay (extent, descendants_too, + invisibility_change); } static EXTENT @@ -1793,7 +1799,8 @@ extent_list_insert (el, extent); soe_insert (extent_object (extent), extent); /* only this extent changed */ - extent_maybe_changed_for_redisplay (extent, 0); + extent_maybe_changed_for_redisplay (extent, 0, + !NILP (extent_invisible (extent))); } static void @@ -1806,7 +1813,8 @@ el = extent_extent_list (extent); /* call this before messing with the extent. */ - extent_maybe_changed_for_redisplay (extent, 0); + extent_maybe_changed_for_redisplay (extent, 0, + !NILP (extent_invisible (extent))); extent_list_delete (el, extent); soe_delete (extent_object (extent), extent); set_extent_start (extent, -1); @@ -3512,7 +3520,15 @@ e->flags.has_parent = 1; } /* changing the parent also changes the properties of all children. */ - extent_maybe_changed_for_redisplay (e, 1); + { + int old_invis = (!NILP (cur_parent) && + !NILP (extent_invisible (XEXTENT (cur_parent)))); + int new_invis = (!NILP (parent) && + !NILP (extent_invisible (XEXTENT (parent)))); + + extent_maybe_changed_for_redisplay (e, 1, new_invis != old_invis); + } + return Qnil; } @@ -4611,7 +4627,7 @@ if (!EQ (extent_invisible (extent), value)) { set_extent_invisible_1 (extent, value); - extent_changed_for_redisplay (extent, 1); + extent_changed_for_redisplay (extent, 1, 1); } } @@ -4768,18 +4784,16 @@ */ (extent, face)) { - EXTENT e; + EXTENT e = decode_extent(extent, 0); Lisp_Object orig_face = face; - CHECK_EXTENT (extent); - e = XEXTENT (extent); /* retrieve the ancestor for efficiency and proper redisplay noting. */ e = extent_ancestor (e); face = memoize_extent_face_internal (face); extent_face (e) = face; - extent_changed_for_redisplay (e, 1); + extent_changed_for_redisplay (e, 1, 0); return orig_face; } @@ -4819,7 +4833,7 @@ face = memoize_extent_face_internal (face); set_extent_mouse_face (e, face); - extent_changed_for_redisplay (e, 1); + extent_changed_for_redisplay (e, 1, 0); return orig_face; } @@ -4841,7 +4855,7 @@ extent_end_glyph_layout (extent) = layout; } - extent_changed_for_redisplay (extent, 1); + extent_changed_for_redisplay (extent, 1, 0); } static Lisp_Object @@ -4943,7 +4957,7 @@ EXTENT e = decode_extent (extent, 0); e = extent_ancestor (e); extent_begin_glyph_layout (e) = symbol_to_glyph_layout (layout); - extent_maybe_changed_for_redisplay (e, 1); + extent_maybe_changed_for_redisplay (e, 1, 0); return layout; } @@ -4956,7 +4970,7 @@ EXTENT e = decode_extent (extent, 0); e = extent_ancestor (e); extent_end_glyph_layout (e) = symbol_to_glyph_layout (layout); - extent_maybe_changed_for_redisplay (e, 1); + extent_maybe_changed_for_redisplay (e, 1, 0); return layout; } @@ -4995,7 +5009,7 @@ CHECK_INT (pri); e = extent_ancestor (e); set_extent_priority (e, XINT (pri)); - extent_maybe_changed_for_redisplay (e, 1); + extent_maybe_changed_for_redisplay (e, 1, 0); return pri; } @@ -5375,14 +5389,14 @@ { /* do not recurse on descendants. Only one extent is highlighted at a time. */ - extent_changed_for_redisplay (XEXTENT (Vlast_highlighted_extent), 0); + extent_changed_for_redisplay (XEXTENT (Vlast_highlighted_extent), 0, 0); } Vlast_highlighted_extent = Qnil; if (!NILP (extent_obj) && BUFFERP (extent_object (XEXTENT (extent_obj))) && highlight_p) { - extent_changed_for_redisplay (XEXTENT (extent_obj), 0); + extent_changed_for_redisplay (XEXTENT (extent_obj), 0, 0); Vlast_highlighted_extent = extent_obj; } } diff -r e183fc049578 -r fe104dbd9147 src/fileio.c --- a/src/fileio.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/fileio.c Mon Aug 13 09:19:45 2007 +0200 @@ -4164,6 +4164,9 @@ /* This function can GC */ if (gc_in_progress) return Qnil; + /* Don't try printing an error message after everything is gone! */ + if (preparing_for_armageddon) + return Qnil; clear_echo_area (selected_frame (), Qauto_saving, 1); Fding (Qt, Qauto_save_error, Qnil); message ("Auto-saving...error for %s", XSTRING_DATA (current_buffer->name)); @@ -4246,17 +4249,19 @@ (no_message, current_only)) { /* This function can GC */ - struct buffer *old = current_buffer, *b; + struct buffer *b; Lisp_Object tail, buf; int auto_saved = 0; int do_handled_files; Lisp_Object oquit = Qnil; Lisp_Object listfile = Qnil; + Lisp_Object old; int listdesc = -1; int speccount = specpdl_depth (); - struct gcpro gcpro1, gcpro2; - - GCPRO2 (oquit, listfile); + struct gcpro gcpro1, gcpro2, gcpro3; + + XSETBUFFER (old, current_buffer); + GCPRO3 (oquit, listfile, old); check_quit (); /* make Vquit_flag accurate */ /* Ordinarily don't quit within this function, but don't make it impossible to quit (in case we get hung in I/O). */ @@ -4408,14 +4413,36 @@ write (listdesc, "\n", 1); } - condition_case_1 (Qt, - auto_save_1, Qnil, - auto_save_error, Qnil); + /* dmoore - In a bad scenario we've set b=XBUFFER(buf) + based on values in Vbuffer_alist. auto_save_1 may + cause lisp handlers to run. Those handlers may kill + the buffer and then GC. Since the buffer is killed, + it's no longer in Vbuffer_alist so it might get reaped + by the GC. We also need to protect tail. */ + /* #### There is probably a lot of other code which has + pointers into buffers which may get blown away by + handlers. */ + { + struct gcpro gcpro1, gcpro2; + GCPRO2 (buf, tail); + condition_case_1 (Qt, + auto_save_1, Qnil, + auto_save_error, Qnil); + UNGCPRO; + } + /* Handler killed our saved current-buffer! Pick any. */ + if (!BUFFER_LIVE_P (XBUFFER (old))) + XSETBUFFER (old, current_buffer); + + set_buffer_internal (XBUFFER (old)); auto_saved++; + + /* Handler killed their own buffer! */ + if (!BUFFER_LIVE_P(b)) + continue; + b->auto_save_modified = BUF_MODIFF (b); b->save_length = make_int (BUF_SIZE (b)); - set_buffer_internal (old); - EMACS_GET_TIME (after_time); /* If auto-save took more than 60 seconds, assume it was an NFS failure that got a timeout. */ diff -r e183fc049578 -r fe104dbd9147 src/input-method-motif.c --- a/src/input-method-motif.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/input-method-motif.c Mon Aug 13 09:19:45 2007 +0200 @@ -149,13 +149,13 @@ xim_resources.fontset); fontlist = XmFontListAppendEntry (NULL, fontlistEntry); XmImRegister (w, 0); - XmImVaSetFocusValues (w, - XmNfontList, fontlist, - XmNforeground, xim_resources.fg, - XmNbackground, xim_resources.bg, - XmNspotLocation, &spot, - /* XmNlineSpace, 0, */ - NULL); + XmImVaSetValues (w, + XmNfontList, fontlist, + XmNforeground, xim_resources.fg, + XmNbackground, xim_resources.bg, + XmNspotLocation, &spot, + /* XmNlineSpace, 0, */ + NULL); XmFontListEntryFree (&fontlistEntry); } diff -r e183fc049578 -r fe104dbd9147 src/intl.c --- a/src/intl.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/intl.c Mon Aug 13 09:19:45 2007 +0200 @@ -263,7 +263,7 @@ DEFUN ("set-domain", Fset_domain, 1, 1, 0, /* Specify the domain used for translating messages in this source file. -The domain declaration may only appear at top-level, and should preceed +The domain declaration may only appear at top-level, and should precede all function and variable definitions. The presence of this declaration in a compiled file effectively sets the diff -r e183fc049578 -r fe104dbd9147 src/linuxplay.c --- a/src/linuxplay.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/linuxplay.c Mon Aug 13 09:19:45 2007 +0200 @@ -297,7 +297,7 @@ parsestate.wave.state = wvSkipChunk; } else if (rq) /* align data length to a multiple of datasize; keep additional data - in "leftover" buffer --- this is neccessary to ensure proper + in "leftover" buffer --- this is necessary to ensure proper functioning of the sndcnv... routines */ waverequire(data,sz,rq); return(count); } @@ -997,7 +997,7 @@ memset(&parsestate,0,sizeof(parsestate)); /* Mainloop: read a block of data, parse its contents, perform all - the neccessary conversions and output it to the sound + the necessary conversions and output it to the sound device; repeat until all data has been processed */ rrtn = length; do { diff -r e183fc049578 -r fe104dbd9147 src/lread.c --- a/src/lread.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/lread.c Mon Aug 13 09:19:45 2007 +0200 @@ -1743,7 +1743,7 @@ /* If a token had any backslashes in it, it is disqualified from being an integer or a float. This means that 123\456 is a symbol, as is \123 (which is the way (intern "123") prints). - Also, if token was preceeded by #:, it's always a symbol. + Also, if token was preceded by #:, it's always a symbol. */ char *p = read_ptr + len; char *p1 = read_ptr; diff -r e183fc049578 -r fe104dbd9147 src/minibuf.c --- a/src/minibuf.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/minibuf.c Mon Aug 13 09:19:45 2007 +0200 @@ -51,6 +51,10 @@ /* Prompt to display in front of the minibuffer contents */ Lisp_Object Vminibuf_prompt; +/* Added on 97/3/14 by Jareth Hein (jhod@po.iijnet.or.jp) for input system support */ +/* String to be displayed in front of prompt of the minibuffer contents */ +Lisp_Object Vminibuf_preprompt; + /* Hook to run just after entry to minibuffer. */ Lisp_Object Qminibuffer_setup_hook, Vminibuffer_setup_hook; @@ -106,6 +110,25 @@ return Qnil; } +/* 97/4/13 jhod: Added for input methods */ +DEFUN ("set-minibuffer-preprompt", Fset_minibuffer_preprompt, 1, 1, 0, /* +Set the minibuffer preprompt string to PREPROMPT. This is used by language +input methods to relay state information to the user. +*/ + (preprompt)) +{ + if (NILP (preprompt)) + { + Vminibuf_preprompt = Qnil; + } + else + { + CHECK_STRING (preprompt); + + Vminibuf_preprompt = LISP_GETTEXT (preprompt); + } +} + DEFUN ("read-minibuffer-internal", Fread_minibuffer_internal, 1, 1, 0, /* Lowest-level interface to minibuffers. Don't call this. */ @@ -232,7 +255,7 @@ Lisp_Object re = XCAR (regexps); if (STRINGP (re) && (fast_string_match (re, nonreloc, reloc, offset, - length, 0, ERROR_ME, 0) >= 0)) + length, 0, ERROR_ME, 0) < 0)) return (1); } } @@ -865,7 +888,7 @@ DEFSUBR (Fminibuffer_prompt); DEFSUBR (Fminibuffer_prompt_width); #endif - + DEFSUBR (Fset_minibuffer_preprompt); DEFSUBR (Fread_minibuffer_internal); DEFSUBR (Ftry_completion); @@ -885,6 +908,10 @@ staticpro (&Vminibuf_prompt); Vminibuf_prompt = Qnil; + /* Added by Jareth Hein (jhod@po.iijnet.or.jp) for input system support */ + staticpro (&Vminibuf_preprompt); + Vminibuf_preprompt = Qnil; + DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook /* Normal hook run just after entry to minibuffer. */ ); @@ -895,9 +922,9 @@ */ ); completion_ignore_case = 0; - /* Worthless doc string */ DEFVAR_LISP ("completion-regexp-list", &Vcompletion_regexp_list /* List of regexps that should restrict possible completions. +Each completion has to match all regexps in this list. */ ); Vcompletion_regexp_list = Qnil; } diff -r e183fc049578 -r fe104dbd9147 src/mule-coding.c --- a/src/mule-coding.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/mule-coding.c Mon Aug 13 09:19:45 2007 +0200 @@ -32,7 +32,7 @@ #include "lstream.h" #include "mule-coding.h" -Lisp_Object Qfile_coding_system, Qcoding_system_error; +Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error; Lisp_Object Vkeyboard_coding_system; Lisp_Object Vterminal_coding_system; @@ -1373,9 +1373,9 @@ if (mask == ~0) { /* If the file was entirely or basically ASCII, use the - default value of `file-coding-system'. */ + default value of `buffer-file-coding-system'. */ Lisp_Object retval = - XBUFFER (Vbuffer_defaults)->file_coding_system; + XBUFFER (Vbuffer_defaults)->buffer_file_coding_system; if (!NILP (retval)) { retval = Ffind_coding_system (retval); @@ -1383,8 +1383,8 @@ { warn_when_safe (Qbad_variable, Qwarning, - "Invalid `default-file-coding-system', set to nil"); - XBUFFER (Vbuffer_defaults)->file_coding_system = Qnil; + "Invalid `default-buffer-file-coding-system', set to nil"); + XBUFFER (Vbuffer_defaults)->buffer_file_coding_system = Qnil; } } if (NILP (retval)) @@ -4569,7 +4569,7 @@ void syms_of_mule_coding (void) { - defsymbol (&Qfile_coding_system, "file-coding-system"); + defsymbol (&Qbuffer_file_coding_system, "buffer-file-coding-system"); deferror (&Qcoding_system_error, "coding-system-error", "Coding-system error", Qio_error); diff -r e183fc049578 -r fe104dbd9147 src/mule-coding.h --- a/src/mule-coding.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/mule-coding.h Mon Aug 13 09:19:45 2007 +0200 @@ -221,7 +221,7 @@ #define XCODING_SYSTEM_CCL_ENCODE(codesys) \ CODING_SYSTEM_CCL_ENCODE (XCODING_SYSTEM (codesys)) -extern Lisp_Object Qfile_coding_system, Qcoding_system_error; +extern Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error; extern Lisp_Object Vkeyboard_coding_system; extern Lisp_Object Vterminal_coding_system; diff -r e183fc049578 -r fe104dbd9147 src/print.c --- a/src/print.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/print.c Mon Aug 13 09:19:45 2007 +0200 @@ -1613,7 +1613,7 @@ those which were made with `make-symbol' or by calling `intern' with a second argument. -When print-gensym is true, such symbols will be preceeded by \"#:\", which +When print-gensym is true, such symbols will be preceded by \"#:\", which causes the reader to create a new symbol instead of interning and returning an existing one. Beware: the #: syntax creates a new symbol each time it is seen, so if you print an object which contains two pointers to the same diff -r e183fc049578 -r fe104dbd9147 src/redisplay.c --- a/src/redisplay.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/redisplay.c Mon Aug 13 09:19:45 2007 +0200 @@ -2427,7 +2427,7 @@ /* If the cursor is past the truncation line then we make it appear on the truncation glyph. If we've hit the end of the buffer then we also make the cursor - appear unless eob is immediately preceeded by a + appear unless eob is immediately preceded by a newline. In that case the cursor should actually appear on the next line. */ if (data.cursor_type == CURSOR_ON @@ -4233,17 +4233,20 @@ bounds = calculate_display_line_boundaries (w, 0); + /* 97/3/14 jhod: stuff added here to support pre-prompts (used for input systems) */ if (MINI_WINDOW_P (w) - && !NILP (Vminibuf_prompt) + && (!NILP (Vminibuf_prompt) || !NILP (Vminibuf_preprompt)) && !echo_area_active (f) && start_pos == BUF_BEGV (b)) { struct prop_block pb; + Lisp_Object string; prop = Dynarr_new (struct prop_block); + string = concat2(Vminibuf_preprompt, Vminibuf_prompt); pb.type = PROP_MINIBUF_PROMPT; - pb.data.p_string.str = XSTRING_DATA (Vminibuf_prompt); - pb.data.p_string.len = XSTRING_LENGTH (Vminibuf_prompt); + pb.data.p_string.str = XSTRING_DATA(string); + pb.data.p_string.len = XSTRING_LENGTH(string); Dynarr_add (prop, pb); } else @@ -4328,7 +4331,7 @@ } if (prop) - Dynarr_free (prop); + Dynarr_free (prop); /* #### More not quite right, but close enough. */ /* #### Ben sez: apparently window_end_pos[] is measured @@ -5742,7 +5745,7 @@ /* print the file coding system */ case 'C': { - Lisp_Object codesys = b->file_coding_system; + Lisp_Object codesys = b->buffer_file_coding_system; /* Be very careful here not to get an error. */ if (NILP (codesys) || SYMBOLP (codesys) || CODING_SYSTEMP (codesys)) { diff -r e183fc049578 -r fe104dbd9147 src/regex.c --- a/src/regex.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/regex.c Mon Aug 13 09:19:45 2007 +0200 @@ -5519,8 +5519,8 @@ PREFETCH (); emch = charptr_emchar ((CONST Bufbyte *) d); INC_CHARPTR (d); - if (check_category_at(emch, regex_emacs_buffer->category_table, - mcnt, should_succeed)) + if (check_category_char(emch, regex_emacs_buffer->category_table, + mcnt, should_succeed)) goto fail; SET_REGS_MATCHED (); } diff -r e183fc049578 -r fe104dbd9147 src/s/bsdos3.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s/bsdos3.h Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,6 @@ +/* Synched up with: not in FSF. */ + +/* s/ file for BSDI BSD/OS 3.0 system. */ + +/* unlike BSD/OS 2.1, 3.0 does not require -lipc */ +#include "bsdos2.h" diff -r e183fc049578 -r fe104dbd9147 src/s/irix6-0.h --- a/src/s/irix6-0.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/s/irix6-0.h Mon Aug 13 09:19:45 2007 +0200 @@ -16,3 +16,6 @@ #ifndef THIS_IS_MAKEFILE #undef C_SWITCH_SYSTEM #endif + +/* Irix 6.2 doesn't need -lw */ +#undef NEED_LIBW diff -r e183fc049578 -r fe104dbd9147 src/s/sunos4-1-4-shr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s/sunos4-1-4-shr.h Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,14 @@ +/* Synched up with: Not in FSF. */ + +/* For building XEmacs under SunOS 4.1.* with dynamic libraries. */ + +#ifdef NOT_C_CODE +# ifdef USE_GCC + /* of course gcc has to take different args than the rest of the universe */ +# define LD_SWITCH_SYSTEM -dynamic +# else +# define LD_SWITCH_SYSTEM -Bdynamic +# endif +#endif + +#include "sunos4-1-4.h" diff -r e183fc049578 -r fe104dbd9147 src/s/sunos4-1-4.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/s/sunos4-1-4.h Mon Aug 13 09:19:45 2007 +0200 @@ -0,0 +1,34 @@ +/* Synched up with: FSF 19.31. */ + +#include "sunos4-1.h" + +#if 0 +/* XEmacs: FSF 19.31 removes this. Let's just comment it out. */ +/* TERMIOS is broken under SunOS?? + + Someone says: This causes failure in process_send_signal (tcgetattr + loses) and may also cause hanging at Emacs startup when parent is + not a job control shell. */ +/* murray@chemical-eng.edinburgh.ac.uk says this works, and avoids + the problem of spurious ^M in subprocess output. */ +#undef HAVE_TERMIOS +#endif + +#if 0 +/* XEmacs: FSF 19.31 mistakenly reenables this. */ +/* jik@gza.com says this works now. */ +/* The bug that corrupts GNU malloc's memory pool is fixed in SunOS 4.1.3. */ + +#undef SYSTEM_MALLOC +#endif /* 0 */ + +/* barrie@calvin.demon.co.uk says memmove is missing. */ +#ifndef SYSTEM_MALLOC +#define MEMMOVE_MISSING +#endif + +/* A reliable source says this is broken through SunOS 4.1.3 */ +/* but not SunOS 4.1.4 */ +#ifdef BROKEN_SIGIO +#undef BROKEN_SIGIO +#endif diff -r e183fc049578 -r fe104dbd9147 src/s/sunos4-1.h --- a/src/s/sunos4-1.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/s/sunos4-1.h Mon Aug 13 09:19:45 2007 +0200 @@ -50,3 +50,6 @@ #if !defined(HAVE_STRERROR) && defined(__SUNPRO_C) #define HAVE_STRERROR #endif + +/* This appears to be broken on SunOS4.1.[123] */ +#define BROKEN_SIGIO diff -r e183fc049578 -r fe104dbd9147 src/toolbar-x.c --- a/src/toolbar-x.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/toolbar-x.c Mon Aug 13 09:19:45 2007 +0200 @@ -673,13 +673,11 @@ FRAME_X_TOOLBAR_BLANK_BACKGROUND_GC (f) = XtGetGC ((Widget) ef, flags, &gcv); - if (ef->emacs_frame.top_toolbar_shadow_pixel == 0) + if (ef->emacs_frame.top_toolbar_shadow_pixel == + ef->emacs_frame.bottom_toolbar_shadow_pixel) { ef->emacs_frame.top_toolbar_shadow_pixel = ef->emacs_frame.background_toolbar_pixel; - } - if (ef->emacs_frame.bottom_toolbar_shadow_pixel == 0) - { ef->emacs_frame.bottom_toolbar_shadow_pixel = ef->emacs_frame.background_toolbar_pixel; } diff -r e183fc049578 -r fe104dbd9147 src/tooltalk.c --- a/src/tooltalk.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/tooltalk.c Mon Aug 13 09:19:45 2007 +0200 @@ -933,7 +933,7 @@ protocol you're using need to agree what types mean (if anything). Conventionally \"string\" is used for strings and \"int\" for 32 bit integers. Arguments can initialized by providing a value or with -`set-tooltalk-message-attribute'. The latter is neccessary if you +`set-tooltalk-message-attribute'. The latter is necessary if you want to initialize the argument with a string that can contain embedded nulls (use 'arg_bval). */ diff -r e183fc049578 -r fe104dbd9147 src/window.c --- a/src/window.c Mon Aug 13 09:18:41 2007 +0200 +++ b/src/window.c Mon Aug 13 09:19:45 2007 +0200 @@ -2012,7 +2012,7 @@ } DEFUN ("previous-window", Fprevious_window, 0, 4, 0, /* -Return the window preceeding WINDOW in canonical ordering of windows. +Return the window preceding WINDOW in canonical ordering of windows. If omitted, WINDOW defaults to the selected window. Optional second arg MINIBUF t means count the minibuffer window even diff -r e183fc049578 -r fe104dbd9147 src/window.h --- a/src/window.h Mon Aug 13 09:18:41 2007 +0200 +++ b/src/window.h Mon Aug 13 09:19:45 2007 +0200 @@ -341,6 +341,8 @@ /* Prompt to display in front of the minibuffer contents, or nil */ extern Lisp_Object Vminibuf_prompt; +/* Prompt to display in front of the minibuffer prompt, or nil */ +extern Lisp_Object Vminibuf_preprompt; /* Depth in minibuffer invocations */ extern int minibuf_level;