SYN SYN
Charles Bailey [Fri, 20 Oct 2000 04:44:37 +0000 (04:44 +0000)]
p4raw-id: //depot/vmsperl@7375

950 files changed:
AUTHORS
Changes5.004
Changes5.6
Configure
INSTALL
MAINTAIN
MANIFEST
Makefile.SH
Policy_sh.SH
Porting/Glossary
Porting/config.sh
Porting/config_H
Porting/genlog
Porting/pumpkin.pod
README
README.Y2K
README.aix [new file with mode: 0644]
README.cygwin
README.dos
README.epoc
README.hpux
README.os2
README.os390
README.posix-bc
README.vmesa
README.win32
Todo
Todo-5.6
bytecode.pl
cflags.SH
config_h.SH
configpm
configure.com
configure.gnu
cop.h
cygwin/Makefile.SHs
djgpp/config.over
djgpp/djgpp.c
doio.c
doop.c
dosish.h
dump.c
eg/ADB [deleted file]
eg/README [deleted file]
eg/changes [deleted file]
eg/client [deleted file]
eg/down [deleted file]
eg/dus [deleted file]
eg/findcp [deleted file]
eg/findtar [deleted file]
eg/g/gcp [deleted file]
eg/g/gcp.man [deleted file]
eg/g/ged [deleted file]
eg/g/ghosts [deleted file]
eg/g/gsh [deleted file]
eg/g/gsh.man [deleted file]
eg/muck [deleted file]
eg/muck.man [deleted file]
eg/myrup [deleted file]
eg/nih [deleted file]
eg/relink [deleted file]
eg/rename [deleted file]
eg/rmfrom [deleted file]
eg/scan/scan_df [deleted file]
eg/scan/scan_last [deleted file]
eg/scan/scan_messages [deleted file]
eg/scan/scan_passwd [deleted file]
eg/scan/scan_ps [deleted file]
eg/scan/scan_sudo [deleted file]
eg/scan/scan_suid [deleted file]
eg/scan/scanner [deleted file]
eg/server [deleted file]
eg/shmkill [deleted file]
eg/sysvipc/README [deleted file]
eg/sysvipc/ipcmsg [deleted file]
eg/sysvipc/ipcsem [deleted file]
eg/sysvipc/ipcshm [deleted file]
eg/travesty [deleted file]
eg/unuc [deleted file]
eg/uudecode [deleted file]
eg/van/empty [deleted file]
eg/van/unvanish [deleted file]
eg/van/vanexp [deleted file]
eg/van/vanish [deleted file]
eg/who [deleted file]
eg/wrapsuid [deleted file]
emacs/cperl-mode.el
embed.h
embed.pl
embedvar.h
epoc/config.sh
epoc/createpkg.pl
epoc/epoc.c
epoc/epoc_stubs.c
epoc/epocish.h
epoc/link.pl
ext/B/B.pm
ext/B/B.xs
ext/B/B/Asmdata.pm
ext/B/B/Assembler.pm
ext/B/B/Bytecode.pm
ext/B/B/Debug.pm
ext/B/B/Deparse.pm
ext/B/Makefile.PL
ext/B/O.pm
ext/B/defsubs_h.PL
ext/B/ramblings/flip-flop
ext/ByteLoader/ByteLoader.pm
ext/ByteLoader/ByteLoader.xs
ext/ByteLoader/bytecode.h
ext/ByteLoader/byterun.c
ext/ByteLoader/byterun.h
ext/Data/Dumper/Dumper.pm
ext/Devel/Peek/Makefile.PL
ext/Devel/Peek/Peek.pm
ext/Devel/Peek/Peek.xs
ext/DynaLoader/dl_dlopen.xs
ext/Encode/Encode.pm [new file with mode: 0644]
ext/Encode/Encode.xs [new file with mode: 0644]
ext/Encode/Encode/ascii.enc [new file with mode: 0644]
ext/Encode/Encode/big5.enc [new file with mode: 0644]
ext/Encode/Encode/cp1250.enc [new file with mode: 0644]
ext/Encode/Encode/cp1251.enc [new file with mode: 0644]
ext/Encode/Encode/cp1252.enc [new file with mode: 0644]
ext/Encode/Encode/cp1253.enc [new file with mode: 0644]
ext/Encode/Encode/cp1254.enc [new file with mode: 0644]
ext/Encode/Encode/cp1255.enc [new file with mode: 0644]
ext/Encode/Encode/cp1256.enc [new file with mode: 0644]
ext/Encode/Encode/cp1257.enc [new file with mode: 0644]
ext/Encode/Encode/cp1258.enc [new file with mode: 0644]
ext/Encode/Encode/cp437.enc [new file with mode: 0644]
ext/Encode/Encode/cp737.enc [new file with mode: 0644]
ext/Encode/Encode/cp775.enc [new file with mode: 0644]
ext/Encode/Encode/cp850.enc [new file with mode: 0644]
ext/Encode/Encode/cp852.enc [new file with mode: 0644]
ext/Encode/Encode/cp855.enc [new file with mode: 0644]
ext/Encode/Encode/cp857.enc [new file with mode: 0644]
ext/Encode/Encode/cp860.enc [new file with mode: 0644]
ext/Encode/Encode/cp861.enc [new file with mode: 0644]
ext/Encode/Encode/cp862.enc [new file with mode: 0644]
ext/Encode/Encode/cp863.enc [new file with mode: 0644]
ext/Encode/Encode/cp864.enc [new file with mode: 0644]
ext/Encode/Encode/cp865.enc [new file with mode: 0644]
ext/Encode/Encode/cp866.enc [new file with mode: 0644]
ext/Encode/Encode/cp869.enc [new file with mode: 0644]
ext/Encode/Encode/cp874.enc [new file with mode: 0644]
ext/Encode/Encode/cp932.enc [new file with mode: 0644]
ext/Encode/Encode/cp936.enc [new file with mode: 0644]
ext/Encode/Encode/cp949.enc [new file with mode: 0644]
ext/Encode/Encode/cp950.enc [new file with mode: 0644]
ext/Encode/Encode/dingbats.enc [new file with mode: 0644]
ext/Encode/Encode/euc-cn.enc [new file with mode: 0644]
ext/Encode/Encode/euc-jp.enc [new file with mode: 0644]
ext/Encode/Encode/euc-kr.enc [new file with mode: 0644]
ext/Encode/Encode/gb12345.enc [new file with mode: 0644]
ext/Encode/Encode/gb1988.enc [new file with mode: 0644]
ext/Encode/Encode/gb2312.enc [new file with mode: 0644]
ext/Encode/Encode/iso2022-jp.enc [new file with mode: 0644]
ext/Encode/Encode/iso2022-kr.enc [new file with mode: 0644]
ext/Encode/Encode/iso2022.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-1.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-2.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-3.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-4.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-5.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-6.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-7.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-8.enc [new file with mode: 0644]
ext/Encode/Encode/iso8859-9.enc [new file with mode: 0644]
ext/Encode/Encode/jis0201.enc [new file with mode: 0644]
ext/Encode/Encode/jis0208.enc [new file with mode: 0644]
ext/Encode/Encode/jis0212.enc [new file with mode: 0644]
ext/Encode/Encode/koi8-r.enc [new file with mode: 0644]
ext/Encode/Encode/ksc5601.enc [new file with mode: 0644]
ext/Encode/Encode/macCentEuro.enc [new file with mode: 0644]
ext/Encode/Encode/macCroatian.enc [new file with mode: 0644]
ext/Encode/Encode/macCyrillic.enc [new file with mode: 0644]
ext/Encode/Encode/macDingbats.enc [new file with mode: 0644]
ext/Encode/Encode/macGreek.enc [new file with mode: 0644]
ext/Encode/Encode/macIceland.enc [new file with mode: 0644]
ext/Encode/Encode/macJapan.enc [new file with mode: 0644]
ext/Encode/Encode/macRoman.enc [new file with mode: 0644]
ext/Encode/Encode/macRomania.enc [new file with mode: 0644]
ext/Encode/Encode/macThai.enc [new file with mode: 0644]
ext/Encode/Encode/macTurkish.enc [new file with mode: 0644]
ext/Encode/Encode/macUkraine.enc [new file with mode: 0644]
ext/Encode/Encode/shiftjis.enc [new file with mode: 0644]
ext/Encode/Encode/symbol.enc [new file with mode: 0644]
ext/Encode/Makefile.PL [new file with mode: 0644]
ext/Encode/Todo [new file with mode: 0644]
ext/Errno/ChangeLog
ext/Errno/Errno_pm.PL
ext/GDBM_File/GDBM_File.xs
ext/IO/lib/IO/Handle.pm
ext/IO/lib/IO/Select.pm
ext/IO/lib/IO/Socket.pm
ext/IO/lib/IO/Socket/UNIX.pm
ext/NDBM_File/NDBM_File.pm
ext/ODBM_File/ODBM_File.pm
ext/Opcode/Opcode.pm
ext/POSIX/POSIX.xs
ext/POSIX/typemap
ext/SDBM_File/SDBM_File.pm
ext/SDBM_File/sdbm/dbm.c
ext/SDBM_File/sdbm/dbm.h
ext/Socket/Socket.pm
ext/Storable/ChangeLog [new file with mode: 0644]
ext/Storable/MANIFEST [new file with mode: 0644]
ext/Storable/Makefile.PL [new file with mode: 0644]
ext/Storable/README [new file with mode: 0644]
ext/Storable/Storable.pm [new file with mode: 0644]
ext/Storable/Storable.xs [new file with mode: 0644]
ext/Thread/Thread.xs
ext/re/Makefile.PL
global.sym
gv.c
handy.h
hints/README.hints
hints/aix.sh
hints/bsdos.sh
hints/cygwin.sh
hints/darwin.sh
hints/dec_osf.sh
hints/freebsd.sh
hints/hpux.sh
hints/irix_6.sh
hints/linux.sh
hints/mint.sh
hints/nonstopux.sh [new file with mode: 0644]
hints/openbsd.sh
hints/os2.sh
hints/solaris_2.sh
hints/titanos.sh
hints/unicos.sh
hints/uts.sh
hints/uwin.sh
hints/vmesa.sh
hv.c
hv.h
installhtml
installman
installperl
intrpvar.h
jpl/README
lib/AutoLoader.pm
lib/Benchmark.pm
lib/CGI.pm
lib/CGI/Carp.pm
lib/CGI/Cookie.pm
lib/CGI/Pretty.pm
lib/CGI/Push.pm
lib/CGI/Util.pm
lib/CGI/eg/RunMeFirst [moved from eg/cgi/RunMeFirst with 100% similarity]
lib/CGI/eg/caution.xbm [moved from eg/cgi/caution.xbm with 100% similarity]
lib/CGI/eg/clickable_image.cgi [moved from eg/cgi/clickable_image.cgi with 100% similarity]
lib/CGI/eg/cookie.cgi [moved from eg/cgi/cookie.cgi with 100% similarity]
lib/CGI/eg/crash.cgi [moved from eg/cgi/crash.cgi with 100% similarity]
lib/CGI/eg/customize.cgi [moved from eg/cgi/customize.cgi with 100% similarity]
lib/CGI/eg/diff_upload.cgi [moved from eg/cgi/diff_upload.cgi with 100% similarity]
lib/CGI/eg/dna_small_gif.uu [moved from eg/cgi/dna_small_gif.uu with 100% similarity]
lib/CGI/eg/file_upload.cgi [moved from eg/cgi/file_upload.cgi with 100% similarity]
lib/CGI/eg/frameset.cgi [moved from eg/cgi/frameset.cgi with 100% similarity]
lib/CGI/eg/index.html [moved from eg/cgi/index.html with 100% similarity]
lib/CGI/eg/internal_links.cgi [moved from eg/cgi/internal_links.cgi with 100% similarity]
lib/CGI/eg/javascript.cgi [moved from eg/cgi/javascript.cgi with 100% similarity]
lib/CGI/eg/make_links.pl [new file with mode: 0755]
lib/CGI/eg/monty.cgi [moved from eg/cgi/monty.cgi with 100% similarity]
lib/CGI/eg/multiple_forms.cgi [moved from eg/cgi/multiple_forms.cgi with 100% similarity]
lib/CGI/eg/nph-clock.cgi [moved from eg/cgi/nph-clock.cgi with 100% similarity]
lib/CGI/eg/nph-multipart.cgi [moved from eg/cgi/nph-multipart.cgi with 100% similarity]
lib/CGI/eg/popup.cgi [moved from eg/cgi/popup.cgi with 100% similarity]
lib/CGI/eg/save_state.cgi [moved from eg/cgi/save_state.cgi with 100% similarity]
lib/CGI/eg/tryit.cgi [moved from eg/cgi/tryit.cgi with 100% similarity]
lib/CGI/eg/wilogo_gif.uu [moved from eg/cgi/wilogo_gif.uu with 100% similarity]
lib/CPAN.pm
lib/CPAN/FirstTime.pm
lib/Class/Struct.pm
lib/Cwd.pm
lib/ExtUtils/Command.pm
lib/ExtUtils/Embed.pm
lib/ExtUtils/Install.pm
lib/ExtUtils/Liblist.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_VMS.pm
lib/ExtUtils/Manifest.pm
lib/ExtUtils/typemap
lib/File/Copy.pm
lib/File/Find.pm
lib/File/Temp.pm
lib/FileHandle.pm
lib/Getopt/Long.pm
lib/Math/BigFloat.pm
lib/Math/BigInt.pm
lib/Math/Complex.pm
lib/Math/Trig.pm
lib/Net/protoent.pm
lib/Pod/Checker.pm
lib/Pod/Find.pm
lib/Pod/Functions.pm
lib/Pod/Html.pm
lib/Pod/InputObjects.pm
lib/Pod/LaTeX.pm
lib/Pod/Man.pm
lib/Pod/ParseUtils.pm
lib/Pod/Parser.pm
lib/Pod/Select.pm
lib/Pod/Text.pm
lib/Pod/Usage.pm
lib/Shell.pm
lib/Term/ANSIColor.pm
lib/Test.pm
lib/Text/Soundex.pm
lib/Tie/Array.pm
lib/Tie/Handle.pm
lib/Tie/Hash.pm
lib/Tie/Scalar.pm
lib/Win32.pod
lib/bytes.pm
lib/charnames.pm
lib/chat2.pl [deleted file]
lib/fields.pm
lib/getopts.pl
lib/lib_pm.PL
lib/overload.pm
lib/perl5db.pl
lib/syslog.pl
lib/termcap.pl
lib/unicode/ArabLink.pl
lib/unicode/ArabLnkGrp.pl
lib/unicode/ArabShap.txt
lib/unicode/BidiMirr.txt [new file with mode: 0644]
lib/unicode/Bidirectional.pl
lib/unicode/Block.pl
lib/unicode/CaseFold.txt [new file with mode: 0644]
lib/unicode/Category.pl
lib/unicode/CombiningClass.pl
lib/unicode/CompExcl.txt
lib/unicode/Decomposition.pl
lib/unicode/In/AlphabeticPresentationForms.pl
lib/unicode/In/Arabic.pl
lib/unicode/In/ArabicPresentationForms-A.pl
lib/unicode/In/ArabicPresentationForms-B.pl
lib/unicode/In/Armenian.pl
lib/unicode/In/Arrows.pl
lib/unicode/In/BasicLatin.pl
lib/unicode/In/Bengali.pl
lib/unicode/In/BlockElements.pl
lib/unicode/In/Bopomofo.pl
lib/unicode/In/BopomofoExtended.pl
lib/unicode/In/BoxDrawing.pl
lib/unicode/In/BraillePatterns.pl
lib/unicode/In/CJKCompatibility.pl
lib/unicode/In/CJKCompatibilityForms.pl
lib/unicode/In/CJKCompatibilityIdeographs.pl
lib/unicode/In/CJKRadicalsSupplement.pl
lib/unicode/In/CJKSymbolsandPunctuation.pl
lib/unicode/In/CJKUnifiedIdeographs.pl
lib/unicode/In/CJKUnifiedIdeographsExtensionA.pl
lib/unicode/In/Cherokee.pl
lib/unicode/In/CombiningDiacriticalMarks.pl
lib/unicode/In/CombiningHalfMarks.pl
lib/unicode/In/CombiningMarksforSymbols.pl
lib/unicode/In/ControlPictures.pl
lib/unicode/In/CurrencySymbols.pl
lib/unicode/In/Cyrillic.pl
lib/unicode/In/Devanagari.pl
lib/unicode/In/Dingbats.pl
lib/unicode/In/EnclosedAlphanumerics.pl
lib/unicode/In/EnclosedCJKLettersandMonths.pl
lib/unicode/In/Ethiopic.pl
lib/unicode/In/GeneralPunctuation.pl
lib/unicode/In/GeometricShapes.pl
lib/unicode/In/Georgian.pl
lib/unicode/In/Greek.pl
lib/unicode/In/GreekExtended.pl
lib/unicode/In/Gujarati.pl
lib/unicode/In/Gurmukhi.pl
lib/unicode/In/HalfwidthandFullwidthForms.pl
lib/unicode/In/HangulCompatibilityJamo.pl
lib/unicode/In/HangulJamo.pl
lib/unicode/In/HangulSyllables.pl
lib/unicode/In/Hebrew.pl
lib/unicode/In/HighPrivateUseSurrogates.pl
lib/unicode/In/HighSurrogates.pl
lib/unicode/In/Hiragana.pl
lib/unicode/In/IPAExtensions.pl
lib/unicode/In/IdeographicDescriptionCharacters.pl
lib/unicode/In/Kanbun.pl
lib/unicode/In/KangxiRadicals.pl
lib/unicode/In/Kannada.pl
lib/unicode/In/Katakana.pl
lib/unicode/In/Khmer.pl
lib/unicode/In/Lao.pl
lib/unicode/In/Latin-1Supplement.pl
lib/unicode/In/LatinExtended-A.pl
lib/unicode/In/LatinExtended-B.pl
lib/unicode/In/LatinExtendedAdditional.pl
lib/unicode/In/LetterlikeSymbols.pl
lib/unicode/In/LowSurrogates.pl
lib/unicode/In/Malayalam.pl
lib/unicode/In/MathematicalOperators.pl
lib/unicode/In/MiscellaneousSymbols.pl
lib/unicode/In/MiscellaneousTechnical.pl
lib/unicode/In/Mongolian.pl
lib/unicode/In/Myanmar.pl
lib/unicode/In/NumberForms.pl
lib/unicode/In/Ogham.pl
lib/unicode/In/OpticalCharacterRecognition.pl
lib/unicode/In/Oriya.pl
lib/unicode/In/PrivateUse.pl
lib/unicode/In/Runic.pl
lib/unicode/In/Sinhala.pl
lib/unicode/In/SmallFormVariants.pl
lib/unicode/In/SpacingModifierLetters.pl
lib/unicode/In/Specials.pl
lib/unicode/In/SuperscriptsandSubscripts.pl
lib/unicode/In/Syriac.pl
lib/unicode/In/Tamil.pl
lib/unicode/In/Telugu.pl
lib/unicode/In/Thaana.pl
lib/unicode/In/Thai.pl
lib/unicode/In/Tibetan.pl
lib/unicode/In/UnifiedCanadianAboriginalSyllabics.pl
lib/unicode/In/YiRadicals.pl
lib/unicode/In/YiSyllables.pl
lib/unicode/Is/ASCII.pl
lib/unicode/Is/Alnum.pl
lib/unicode/Is/Alpha.pl
lib/unicode/Is/BidiAL.pl
lib/unicode/Is/BidiAN.pl
lib/unicode/Is/BidiB.pl
lib/unicode/Is/BidiBN.pl
lib/unicode/Is/BidiCS.pl
lib/unicode/Is/BidiEN.pl
lib/unicode/Is/BidiES.pl
lib/unicode/Is/BidiET.pl
lib/unicode/Is/BidiL.pl
lib/unicode/Is/BidiLRE.pl
lib/unicode/Is/BidiLRO.pl
lib/unicode/Is/BidiNSM.pl
lib/unicode/Is/BidiON.pl
lib/unicode/Is/BidiPDF.pl
lib/unicode/Is/BidiR.pl
lib/unicode/Is/BidiRLE.pl
lib/unicode/Is/BidiRLO.pl
lib/unicode/Is/BidiS.pl
lib/unicode/Is/BidiWS.pl
lib/unicode/Is/C.pl
lib/unicode/Is/Cc.pl
lib/unicode/Is/Cf.pl
lib/unicode/Is/Cn.pl
lib/unicode/Is/Cntrl.pl
lib/unicode/Is/Co.pl
lib/unicode/Is/Cs.pl
lib/unicode/Is/DCcircle.pl
lib/unicode/Is/DCcompat.pl
lib/unicode/Is/DCfinal.pl
lib/unicode/Is/DCfont.pl
lib/unicode/Is/DCfraction.pl
lib/unicode/Is/DCinital.pl
lib/unicode/Is/DCinitial.pl
lib/unicode/Is/DCisolated.pl
lib/unicode/Is/DCnarrow.pl
lib/unicode/Is/DCnoBreak.pl
lib/unicode/Is/DCsmall.pl
lib/unicode/Is/DCsquare.pl
lib/unicode/Is/DCsub.pl
lib/unicode/Is/DCsuper.pl
lib/unicode/Is/DCvertical.pl
lib/unicode/Is/DCwide.pl
lib/unicode/Is/DecoCanon.pl
lib/unicode/Is/DecoCompat.pl
lib/unicode/Is/Digit.pl
lib/unicode/Is/Graph.pl
lib/unicode/Is/L.pl
lib/unicode/Is/LbrkAI.pl
lib/unicode/Is/LbrkAL.pl
lib/unicode/Is/LbrkB2.pl
lib/unicode/Is/LbrkBA.pl
lib/unicode/Is/LbrkBB.pl
lib/unicode/Is/LbrkBK.pl
lib/unicode/Is/LbrkCB.pl
lib/unicode/Is/LbrkCL.pl
lib/unicode/Is/LbrkCM.pl
lib/unicode/Is/LbrkCR.pl
lib/unicode/Is/LbrkEX.pl
lib/unicode/Is/LbrkGL.pl
lib/unicode/Is/LbrkHY.pl
lib/unicode/Is/LbrkID.pl
lib/unicode/Is/LbrkIN.pl
lib/unicode/Is/LbrkIS.pl
lib/unicode/Is/LbrkLF.pl
lib/unicode/Is/LbrkNS.pl
lib/unicode/Is/LbrkNU.pl
lib/unicode/Is/LbrkOP.pl
lib/unicode/Is/LbrkPO.pl
lib/unicode/Is/LbrkPR.pl
lib/unicode/Is/LbrkQU.pl
lib/unicode/Is/LbrkSA.pl
lib/unicode/Is/LbrkSG.pl
lib/unicode/Is/LbrkSP.pl
lib/unicode/Is/LbrkSY.pl
lib/unicode/Is/LbrkXX.pl
lib/unicode/Is/LbrkZW.pl
lib/unicode/Is/Ll.pl
lib/unicode/Is/Lm.pl
lib/unicode/Is/Lo.pl
lib/unicode/Is/Lower.pl
lib/unicode/Is/Lt.pl
lib/unicode/Is/Lu.pl
lib/unicode/Is/M.pl
lib/unicode/Is/Mc.pl
lib/unicode/Is/Me.pl
lib/unicode/Is/Mirrored.pl
lib/unicode/Is/Mn.pl
lib/unicode/Is/N.pl
lib/unicode/Is/Nd.pl
lib/unicode/Is/Nl.pl
lib/unicode/Is/No.pl
lib/unicode/Is/P.pl
lib/unicode/Is/Pc.pl
lib/unicode/Is/Pd.pl
lib/unicode/Is/Pe.pl
lib/unicode/Is/Pf.pl
lib/unicode/Is/Pi.pl
lib/unicode/Is/Po.pl
lib/unicode/Is/Print.pl
lib/unicode/Is/Ps.pl
lib/unicode/Is/Punct.pl
lib/unicode/Is/S.pl
lib/unicode/Is/Sc.pl
lib/unicode/Is/Sk.pl
lib/unicode/Is/Sm.pl
lib/unicode/Is/So.pl
lib/unicode/Is/Space.pl
lib/unicode/Is/SylA.pl
lib/unicode/Is/SylAA.pl
lib/unicode/Is/SylAAI.pl
lib/unicode/Is/SylAI.pl
lib/unicode/Is/SylC.pl
lib/unicode/Is/SylE.pl
lib/unicode/Is/SylEE.pl
lib/unicode/Is/SylI.pl
lib/unicode/Is/SylII.pl
lib/unicode/Is/SylN.pl
lib/unicode/Is/SylO.pl
lib/unicode/Is/SylOO.pl
lib/unicode/Is/SylU.pl
lib/unicode/Is/SylV.pl
lib/unicode/Is/SylWA.pl
lib/unicode/Is/SylWAA.pl
lib/unicode/Is/SylWC.pl
lib/unicode/Is/SylWE.pl
lib/unicode/Is/SylWEE.pl
lib/unicode/Is/SylWI.pl
lib/unicode/Is/SylWII.pl
lib/unicode/Is/SylWO.pl
lib/unicode/Is/SylWOO.pl
lib/unicode/Is/SylWU.pl
lib/unicode/Is/SylWV.pl
lib/unicode/Is/Upper.pl
lib/unicode/Is/Word.pl
lib/unicode/Is/XDigit.pl
lib/unicode/Is/Z.pl
lib/unicode/Is/Zl.pl
lib/unicode/Is/Zp.pl
lib/unicode/Is/Zs.pl
lib/unicode/Jamo.txt
lib/unicode/JamoShort.pl
lib/unicode/Name.pl
lib/unicode/Number.pl
lib/unicode/PropList.txt [moved from lib/unicode/Props.txt with 97% similarity]
lib/unicode/README.perl [new file with mode: 0644]
lib/unicode/ReadMe.txt
lib/unicode/SpecCase.txt
lib/unicode/To/Digit.pl
lib/unicode/To/Lower.pl
lib/unicode/To/Title.pl
lib/unicode/To/Upper.pl
lib/unicode/UCD301.html [moved from lib/unicode/UCD300.html with 54% similarity]
lib/unicode/UCDFF301.html [new file with mode: 0644]
lib/unicode/Unicode.301 [moved from lib/unicode/Unicode.300 with 99% similarity]
lib/unicode/Unicode3.html [deleted file]
lib/unicode/mktables.PL
lib/utf8.pm
lib/warnings.pm
malloc.c
mg.c
myconfig.SH
objXSUB.h
op.c
op.h
opcode.h
opcode.pl
os2/Makefile.SHs
os2/OS2/ExtAttr/ExtAttr.xs
os2/OS2/ExtAttr/typemap
os2/OS2/REXX/REXX.xs
os2/os2.c
os2/os2ish.h
patchlevel.h
perl.c
perl.h
perlapi.c
perlapi.h
perlsdio.h
perlsfio.h
pod/Makefile.SH
pod/buildtoc.PL
pod/perl.pod
pod/perl5004delta.pod
pod/perl56delta.pod
pod/perlapi.pod
pod/perlcall.pod
pod/perlcompile.pod
pod/perldata.pod
pod/perldbmfilter.pod
pod/perldebguts.pod
pod/perldebtut.pod [new file with mode: 0644]
pod/perldebug.pod
pod/perldiag.pod
pod/perlebcdic.pod [new file with mode: 0644]
pod/perlembed.pod
pod/perlfaq1.pod
pod/perlfaq2.pod
pod/perlfaq4.pod
pod/perlfaq6.pod
pod/perlfaq7.pod
pod/perlfaq8.pod
pod/perlfunc.pod
pod/perlguts.pod
pod/perlhack.pod
pod/perlhist.pod
pod/perlintern.pod
pod/perlipc.pod
pod/perllexwarn.pod
pod/perllocale.pod
pod/perlmod.pod
pod/perlmodinstall.pod
pod/perlmodlib.PL
pod/perlmodlib.pod
pod/perlnewmod.pod
pod/perlop.pod
pod/perlport.pod
pod/perlre.pod
pod/perlretut.pod
pod/perlrun.pod
pod/perlsec.pod
pod/perlsyn.pod
pod/perlthrtut.pod
pod/perltie.pod
pod/perltoc.pod
pod/perltrap.pod
pod/perlunicode.pod
pod/perlutil.pod
pod/perlvar.pod
pod/perlxs.pod
pod/pod2man.PL
pod/pod2text.PL
pod/pod2usage.PL
pod/podchecker.PL
pod/podselect.PL
pp.c
pp.h
pp.sym
pp_ctl.c
pp_hot.c
pp_proto.h
pp_sys.c
proto.h
regcomp.c
regcomp.h
regcomp.pl
regexec.c
regnodes.h
sv.c
sv.h
t/README
t/TEST
t/UTEST
t/base/rs.t
t/base/term.t
t/comp/bproto.t
t/comp/colon.t
t/comp/cpp.t
t/comp/proto.t
t/comp/require.t
t/comp/use.t
t/io/argv.t
t/io/fs.t
t/io/open.t
t/io/openpid.t
t/io/pipe.t
t/lib/abbrev.t
t/lib/ansicolor.t
t/lib/anydbm.t
t/lib/attrs.t
t/lib/autoloader.t
t/lib/b.t
t/lib/basename.t
t/lib/bigfltpm.t
t/lib/bigint.t
t/lib/bigintpm.t
t/lib/cgi-form.t
t/lib/cgi-function.t
t/lib/cgi-html.t
t/lib/cgi-pretty.t
t/lib/cgi-request.t
t/lib/charnames.t
t/lib/checktree.t
t/lib/complex.t
t/lib/db-btree.t
t/lib/db-hash.t
t/lib/db-recno.t
t/lib/dirhand.t
t/lib/dosglob.t
t/lib/dprof.t
t/lib/dumper-ovl.t
t/lib/dumper.t
t/lib/encode.t [new file with mode: 0644]
t/lib/english.t
t/lib/env-array.t
t/lib/env.t
t/lib/errno.t
t/lib/fatal.t
t/lib/fields.t
t/lib/filecache.t
t/lib/filecopy.t
t/lib/filefind.t
t/lib/filefunc.t
t/lib/filehand.t
t/lib/filepath.t
t/lib/filespec.t
t/lib/findbin.t
t/lib/ftmp-mktemp.t
t/lib/ftmp-posix.t
t/lib/ftmp-security.t
t/lib/ftmp-tempfile.t
t/lib/gdbm.t
t/lib/getopt.t
t/lib/glob-basic.t
t/lib/glob-case.t
t/lib/glob-global.t
t/lib/glob-taint.t
t/lib/gol-basic.t
t/lib/gol-compat.t
t/lib/gol-linkage.t
t/lib/gol-oo.t [new file with mode: 0644]
t/lib/h2ph.t
t/lib/hostname.t
t/lib/io_const.t
t/lib/io_dir.t
t/lib/io_dup.t
t/lib/io_linenum.t
t/lib/io_multihomed.t
t/lib/io_pipe.t
t/lib/io_poll.t
t/lib/io_sel.t
t/lib/io_sock.t
t/lib/io_taint.t
t/lib/io_tell.t
t/lib/io_udp.t
t/lib/io_unix.t
t/lib/io_xs.t
t/lib/ipc_sysv.t
t/lib/ndbm.t
t/lib/odbm.t
t/lib/opcode.t
t/lib/open2.t
t/lib/open3.t
t/lib/ops.t
t/lib/parsewords.t
t/lib/peek.t
t/lib/ph.t
t/lib/posix.t
t/lib/safe1.t
t/lib/safe2.t
t/lib/sdbm.t
t/lib/searchdict.t
t/lib/selectsaver.t
t/lib/selfloader.t
t/lib/socket.t
t/lib/soundex.t
t/lib/st-06compat.t [new file with mode: 0644]
t/lib/st-blessed.t [new file with mode: 0644]
t/lib/st-canonical.t [new file with mode: 0644]
t/lib/st-dclone.t [new file with mode: 0644]
t/lib/st-dump.pl [new file with mode: 0644]
t/lib/st-forgive.t [new file with mode: 0644]
t/lib/st-freeze.t [new file with mode: 0644]
t/lib/st-lock.t [new file with mode: 0644]
t/lib/st-overload.t [new file with mode: 0644]
t/lib/st-recurse.t [new file with mode: 0644]
t/lib/st-retrieve.t [new file with mode: 0644]
t/lib/st-store.t [new file with mode: 0644]
t/lib/st-tied.t [new file with mode: 0644]
t/lib/st-tiedhook.t [new file with mode: 0644]
t/lib/st-tieditems.t [new file with mode: 0644]
t/lib/st-utf8.t [new file with mode: 0644]
t/lib/symbol.t
t/lib/syslfs.t
t/lib/syslog.t
t/lib/textfill.t
t/lib/texttabs.t
t/lib/textwrap.t
t/lib/thr5005.t
t/lib/tie-push.t
t/lib/tie-stdarray.t
t/lib/tie-stdhandle.t
t/lib/tie-stdpush.t
t/lib/timelocal.t
t/lib/trig.t
t/op/64bitint.t
t/op/append.t
t/op/array.t
t/op/assignwarn.t
t/op/attrs.t
t/op/avhv.t
t/op/bless.t [new file with mode: 0644]
t/op/bop.t
t/op/closure.t
t/op/defins.t
t/op/die_exit.t
t/op/exists_sub.t
t/op/filetest.t
t/op/flip.t
t/op/fork.t
t/op/glob.t
t/op/goto_xs.t
t/op/grent.t
t/op/gv.t
t/op/hashwarn.t
t/op/int.t
t/op/join.t
t/op/lex_assign.t
t/op/lfs.t
t/op/lop.t
t/op/magic.t
t/op/method.t
t/op/misc.t
t/op/mkdir.t
t/op/my.t
t/op/my_stash.t
t/op/nothr5005.t
t/op/oct.t
t/op/pack.t
t/op/pat.t
t/op/pwent.t
t/op/quotemeta.t
t/op/rand.t
t/op/re_tests
t/op/readdir.t
t/op/regexp.t
t/op/regmesg.t [new file with mode: 0644]
t/op/runlevel.t
t/op/sort.t
t/op/split.t
t/op/sprintf.t
t/op/stat.t
t/op/subst.t
t/op/subst_amp.t
t/op/substr.t
t/op/taint.t
t/op/tie.t
t/op/tiearray.t
t/op/tiehandle.t
t/op/tr.t
t/op/undef.t
t/op/universal.t
t/op/vec.t
t/op/ver.t
t/pod/emptycmd.t
t/pod/find.t [new file with mode: 0644]
t/pod/for.t
t/pod/headings.t
t/pod/include.t
t/pod/included.t
t/pod/lref.t
t/pod/multiline_items.t
t/pod/nested_items.t
t/pod/nested_seqs.t
t/pod/oneline_cmds.t
t/pod/pod2usage.t
t/pod/poderrs.t
t/pod/poderrs.xr
t/pod/podselect.t
t/pod/special_seqs.t
t/pod/special_seqs.xr
t/pod/testp2pt.pl
t/pragma/constant.t
t/pragma/diagnostics.t
t/pragma/locale.t
t/pragma/overload.t
t/pragma/strict.t
t/pragma/sub_lval.t
t/pragma/subs.t
t/pragma/utf8.t
t/pragma/warn/7fatal
t/pragma/warn/9enabled
t/pragma/warn/doio
t/pragma/warn/pp_hot
t/pragma/warn/pp_sys
t/pragma/warn/regcomp
t/pragma/warnings.t
thread.h
toke.c
uconfig.h
uconfig.sh
universal.c
unixish.h
utf8.c
utf8.h
util.c
util.h
utils/Makefile
utils/h2xs.PL
utils/perlbc.PL [deleted file]
utils/perlbug.PL
utils/perlcc.PL
utils/perldoc.PL
vms/descrip_mms.template
vms/ext/DCLsym/DCLsym.pm
vms/gen_shrfls.pl
vms/subconfigure.com [deleted file]
vms/test.com
vms/vms.c
vms/vmsish.h
vms/vmspipe.com [new file with mode: 0644]
vos/config.def
vos/config.h
vos/config_h.SH_orig
warnings.pl
win32/Makefile
win32/config.bc
win32/config.gc
win32/config.vc
win32/config_H.bc
win32/config_H.gc
win32/config_H.vc
win32/makefile.mk
win32/perlhost.h
win32/perllib.c
win32/vdir.h
win32/win32.c
win32/win32.h
win32/win32sck.c
win32/win32thread.h
x2p/Makefile.SH
x2p/cflags.SH
x2p/s2p.PL

diff --git a/AUTHORS b/AUTHORS
index 3032d48..b3d240c 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,25 +11,31 @@ cbail               Charles Bailey          bailey@newman.upenn.edu
 dgris          Daniel Grisinger        dgris@dimensional.com
 dmulholl       Daniel Yacob            dmulholl@cs.indiana.edu
 dogcow         Tom Spindler            dogcow@merit.edu
-domo           Dominic Dunlop          domo@slipper.ip.lu
-doug           Doug MacEachern         dougm@pobox.com
+domo           Dominic Dunlop          domo@computer.org
+doug           Doug MacEachern         dougm@covalent.net
 doughera       Andy Dougherty          doughera@lafcol.lafayette.edu
+efifer         Eric Fifer              EFifer@sanwaint.com
+francois       Francois Desarmenien    desar@club-internet.fr
 gbarr          Graham Barr             gbarr@ti.com
+gerben         Gerben Wierda           Gerben_Wierda@RnA.nl
 gerti          Gerd Knops              gerti@BITart.com
 gibreel                Stephen Zander          gibreel@pobox.com
 gnat           Nathan Torkington       gnat@frii.com
 gsar           Gurusamy Sarathy        gsar@activestate.com
 hansmu         Hans Mulder             hansmu@xs4all.nl
+hops           Mike Hopkirk            hops@sco.com
+hugo           Hugo van der Sanden     hv@crypt.demon.co.uk
 ilya           Ilya Zakharevich        ilya@math.ohio-state.edu
 jbuehler       Joe Buehler             jbuehler@hekimian.com
 jfs            John Stoffel            jfs@fluent.com
 jhi            Jarkko Hietaniemi       jhi@iki.fi
-jon            Jon Orwant              orwant@media.mit.edu
+jon            Jon Orwant              orwant@oreilly.com
 jvromans       Johan Vromans           jvromans@squirrel.nl
-k              Andreas Koenig          andreas.koenig@franz.ww.tu-berlin.de
+k              Andreas König           a.koenig@mind.de
 kjahds         Kenneth Albanowski      kjahds@kjahds.com
 krishna                Krishna Sethuraman      krishna@sgi.com
-kstar          Kurt D. Starsinic       kstar@isinet.com
+kstar          Kurt D. Starsinic       kstar@chapin.edu
+lane           Charles Lane            lane@DUPHY4.Physics.Drexel.Edu
 lstein         Lincoln D. Stein        lstein@genome.wi.mit.edu
 lutherh                Luther Huffman          lutherh@stratcom.com
 lutz           Mark P. Lutz            mark.p.lutz@boeing.com
@@ -37,9 +43,11 @@ lwall                Larry Wall              larry@wall.org
 makemaker      MakeMaker list          makemaker@franz.ww.tu-berlin.de
 mbiggar                Mark A Biggar           mab@wdl.loral.com
 mbligh         Martin J. Bligh         mbligh@sequent.com
-mike           Mike Stok               mike@stok.co.uk
+mikestok       Mike Stok               mike@stok.co.uk
 millert                Todd Miller             millert@openbsd.org
 mkvale         Mark Kvale              kvale@phy.ucsf.edu
+mjd            Mark-Jason Dominus      mjd@plover.com
+mjtg           Mike Guy                mjtg@cam.ac.uk
 laszlo.molnar  Laszlo Molnar           Laszlo.Molnar@eth.ericsson.se
 mpeix          Mark Bixby              markb@cccd.edu
 muir           David Muir Sharnoff     muir@idiom.com
@@ -52,8 +60,9 @@ pomeranz      Hal Pomeranz            pomeranz@netcom.com
 pudge          Chris Nandor            pudge@pobox.com
 pueschel       Norbert Pueschel        pueschel@imsdd.meb.uni-bonn.de
 pvhp           Peter Prymmer           pvhp@forte.com
-raphael                Raphael Manfredi        Raphael_Manfredi@pobox.com
+raphael                Raphael Manfredi        Raphael.Manfredi@pobox.com
 rdieter                Rex Dieter              rdieter@math.unl.edu
+richard                Richard Foley           Richard.Foley@m.dasa.de
 rra            Russ Allbery            rra@stanford.edu
 rsanders       Robert Sanders          Robert.Sanders@linux.org        
 roberto                Ollivier Robert         roberto@keltia.freenix.fr
@@ -66,7 +75,8 @@ seibert               Greg Seibert            seibert@Lynx.COM
 simon          Simon Cozens            simon@brecon.co.uk
 spider         Spider Boardman         spider@Orb.Nashua.NH.US
 smccam         Stephen McCamant        smccam@uclink4.berkeley.edu
-sugalskd       Dan Sugalski            sugalskd@osshe.edu
+sthoenna       Yitzchak Scott-Thoennes sthoenna@efn.org
+sugalskd       Dan Sugalski            dan@sidhe.org
 sundstrom      David Sundstrom         sunds@asictest.sc.ti.com
 tchrist                Tom Christiansen        tchrist@perl.com
 thomas.dorner  Dorner Thomas           Thomas.Dorner@start.de
@@ -75,8 +85,9 @@ timb          Tim Bunce               Tim.Bunce@ig.co.uk
 tom.horsley    Tom Horsley             Tom.Horsley@mail.ccur.com
 tye            Tye McQueen             tye@metronet.com
 wayne.thompson Wayne Thompson          Wayne.Thompson@Ebay.sun.com
+wilfredo       Wilfredo Sánchez        wsanchez@apple.com
 
-PUMPKING       gsar
+PUMPKING       jhi
 aix            jhi
 amiga          pueschel
 beos           dogcow
@@ -92,25 +103,28 @@ dgux               roderick
 doc            tchrist
 dos            laszlo.molnar
 dynix/ptx      mbligh
-ebcdic         vms,vmesa,posixbc
+ebcdic         os390,vmesa,posix-bc
 filespec       kjahds
 freebsd                roberto
 hpux           okamoto,jhi
 irix           scotth,krishna,jfs,kstar
 jpl            gibreel
+lexwarn                pmarquess
 linux          kjahds,kstar
 locale         jhi,domo
-lynxos         lynxos
 machten                domo
 mm             makemaker
-mvs            pvhp
 netbsd         jhi
+next           gerben,hansmu
 openbsd                millert
 os2            ilya
+os390          pvhp
 plan9          lutherl
 posix-bc       thomas.dorner
 powerux                tom.horsley
 qnx            allen
+regex          ilya,jfriedl,hugo,mjd
+sco            francois,hops
 solaris                doughera,alan.burlison
 step           gerti,hansmu,rdieter
 sunos4         doughera
index d060166..2d578b4 100644 (file)
@@ -8031,7 +8031,7 @@ This release is beta candidate #5: Our last, best hope for a beta.
    From:  Chip Salzenberg
   Files:  pp_hot.c
 
-  Title:  "Fix grep() with refs in array context"
+  Title:  "Fix grep() with refs in list context"
    From:  Chip Salzenberg
   Files:  pp.c
 
index 6949821..3dc17bc 100644 (file)
@@ -664,7 +664,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  5802] By: jhi                                   on 2000/03/18  17:11:07
         Log: Configure nits: rewording from Sarathy (aka #5796),
-             and installation directories patch from Robin Parker.
+             and installation directories patch from Robin Barker.
      Branch: cfgperl
           ! Configure Porting/Glossary Porting/config.sh Porting/config_H
           ! config_h.SH vos/config.h vos/config_h.SH_orig
@@ -2841,7 +2841,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  5440] By: jhi                                   on 2000/03/02  17:48:15
         Log: Confusion over uselargefiles.cbu and uselfs.cbu (the first one
-             is the correct one), spotted by Robin Parker.
+             is the correct one), spotted by Robin Barker.
      Branch: cfgperl
           ! Configure config_h.SH hints/aix.sh hints/hpux.sh
      Branch: metaconfig/U/perl
@@ -12365,7 +12365,7 @@ ____________________________________________________________________________
 ____________________________________________________________________________
 [  4045] By: jhi                                   on 1999/08/29  15:18:38
         Log: Fix scalar gmtime (and localtime) in quad environments,
-             bug reported by Robin Parker.
+             bug reported by Robin Barker.
              
              From: Robin Barker <rmb1@cise.npl.co.uk>
              To: jhi@iki.fi
index 54c85e2..03004be 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,8 +20,8 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Wed Aug  2 03:07:08 EET DST 2000 [metaconfig 3.0 PL70]
-# (with additional metaconfig patches by perlbug@perl.com)
+# Generated on Thu Oct 19 22:28:50 EET DST 2000 [metaconfig 3.0 PL70]
+# (with additional metaconfig patches by perlbug@perl.org)
 
 cat >/tmp/c1$$ <<EOF
 ARGGGHHHH!!!!!
@@ -160,9 +160,12 @@ esac
 test -d UU || mkdir UU
 cd UU && rm -f ./*
 
+ccname=''
+ccversion=''
 ccsymbols=''
 cppccsymbols=''
 cppsymbols=''
+perllibs=''
 dynamic_ext=''
 extensions=''
 known_extensions=''
@@ -524,6 +527,7 @@ d_sockpair=''
 sockethdr=''
 socketlib=''
 d_socklen_t=''
+d_socks5_init=''
 d_sqrtl=''
 d_statblks=''
 d_statfs_f_flags=''
@@ -727,18 +731,20 @@ libsfiles=''
 libsfound=''
 libspath=''
 lns=''
-d_PRIEldbl=''
-d_PRIFldbl=''
-d_PRIGldbl=''
+d_PRIEUldbl=''
+d_PRIFUldbl=''
+d_PRIGUldbl=''
 d_PRIeldbl=''
 d_PRIfldbl=''
 d_PRIgldbl=''
-sPRIEldbl=''
-sPRIFldbl=''
-sPRIGldbl=''
+d_SCNfldbl=''
+sPRIEUldbl=''
+sPRIFUldbl=''
+sPRIGUldbl=''
 sPRIeldbl=''
 sPRIfldbl=''
 sPRIgldbl=''
+sSCNfldbl=''
 lseeksize=''
 lseektype=''
 make_set_make=''
@@ -756,12 +762,6 @@ installman3dir=''
 man3dir=''
 man3direxp=''
 man3ext=''
-huge=''
-large=''
-medium=''
-models=''
-small=''
-split=''
 modetype=''
 multiarch=''
 mydomain=''
@@ -823,6 +823,13 @@ u8type=''
 uvsize=''
 uvtype=''
 ivdformat=''
+nvEUformat=''
+nvFUformat=''
+nvGUformat=''
+nveformat=''
+nvfformat=''
+nvgformat=''
+uvXUformat=''
 uvoformat=''
 uvuformat=''
 uvxformat=''
@@ -834,13 +841,13 @@ privlib=''
 privlibexp=''
 prototype=''
 ptrsize=''
-d_PRIX64=''
+d_PRIXU64=''
 d_PRId64=''
 d_PRIi64=''
 d_PRIo64=''
 d_PRIu64=''
 d_PRIx64=''
-sPRIX64=''
+sPRIXU64=''
 sPRId64=''
 sPRIi64=''
 sPRIo64=''
@@ -901,6 +908,9 @@ uidtype=''
 archname64=''
 use64bitall=''
 use64bitint=''
+ccflags_uselargefiles=''
+ldflags_uselargefiles=''
+libswanted_uselargefiles=''
 uselargefiles=''
 uselongdouble=''
 usemorebits=''
@@ -934,6 +944,7 @@ vendorlibexp=''
 usevendorprefix=''
 vendorprefix=''
 vendorprefixexp=''
+versiononly=''
 defvoidused=''
 voidflags=''
 pm_apiversion=''
@@ -955,6 +966,9 @@ if test -f /etc/unixtovms.exe; then
 fi
 
 i_whoami=''
+ccname=''
+ccversion=''
+perllibs=''
 : set useposix=false in your hint file to disable the POSIX extension.
 useposix=true
 : set useopcode=false in your hint file to disable the Opcode extension.
@@ -963,6 +977,7 @@ useopcode=true
 _exe=''
 : Extra object files, if any, needed on this platform.
 archobjs=''
+archname=''
 : Possible local include directories to search.
 : Set locincpth to "" in a hint file to defeat local include searches.
 locincpth="/usr/local/include /opt/local/include /usr/gnu/include"
@@ -979,8 +994,7 @@ loclibpth="/usr/local/lib /opt/local/lib /usr/gnu/lib"
 loclibpth="$loclibpth /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib"
 
 : general looking path for locating libraries
-glibpth="/usr/lib/large /lib /usr/lib $xlibpth"
-glibpth="$glibpth /lib/large /usr/lib/small /lib/small"
+glibpth="/lib /usr/lib $xlibpth"
 glibpth="$glibpth /usr/ccs/lib /usr/ucblib /usr/local/lib"
 test -f /usr/shlib/libc.so && glibpth="/usr/shlib $glibpth"
 test -f /shlib/libc.so     && glibpth="/shlib $glibpth"
@@ -994,6 +1008,10 @@ plibpth=''
 libswanted=''
 : some systems want to use only the non-versioned libso:s
 ignore_versioned_solibs=''
+archname64=''
+ccflags_uselargefiles=''
+ldflags_uselargefiles=''
+libswanted_uselargefiles=''
 : set usemultiplicity on the Configure command line to enable multiplicity.
 : set usesocks on the Configure command line to enable socks.
 : set usethreads on the Configure command line to enable threads.
@@ -1048,7 +1066,7 @@ case "$sh" in
 $me:  Fatal Error:  I can't find a Bourne Shell anywhere.  
 
 Usually it's in /bin/sh.  How did you even get this far?
-Please contact me (Perl Maintainers) at perlbug@perl.com and 
+Please contact me (Perl Maintainers) at perlbug@perl.org and 
 we'll try to straighten this all out.
 EOM
        exit 1
@@ -1589,7 +1607,7 @@ THIS PACKAGE SEEMS TO BE INCOMPLETE.
 You have the option of continuing the configuration process, despite the
 distinct possibility that your kit is damaged, by typing 'y'es.  If you
 do, don't blame me if something goes wrong.  I advise you to type 'n'o
-and contact the author (perlbug@perl.com).
+and contact the author (perlbug@perl.org).
 
 EOM
                echo $n "Continue? [n] $c" >&4
@@ -1752,6 +1770,40 @@ persist across sessions for $package.
 You may safely delete it if you wish.
 EOF
 
+xversion=`awk '/define[        ]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+case "$usedevel" in
+$define|true|[yY]*) ;;
+*) case "$xversion" in
+   *[13579])
+       cat >&4 <<EOH
+*** WHOA THERE!!! ***
+
+    This is an UNSTABLE DEVELOPMENT release.
+    The version of this $package distribution is $xversion, that is, odd,
+    (as opposed to even) and that signifies a development release.
+    If you want a maintenance release, you want an even-numbered version.
+
+    Do ***NOT*** install this into production use.
+    Data corruption and crashes are possible.
+
+    It is most seriously suggested that you do not continue any further
+    unless you want to help in developing and debugging Perl.
+
+EOH
+       rp='Do you really want to continue?'
+       dflt='n'
+       . ./myread
+       case "$ans" in
+       [yY]) echo >&4 "Okay, continuing." ;;
+       *) echo >&4 "Okay, bye."
+          exit 1
+          ;;
+       esac
+       ;;
+    esac
+    ;;
+esac
+
 : general instructions
 needman=true
 firsttime=true
@@ -1814,7 +1866,7 @@ Much effort has been expended to ensure that this shell script will run on any
 Unix system.  If despite that it blows up on yours, your best bet is to edit
 Configure and run it again.  If you can't run Configure for some reason,
 you'll have to generate a config.sh file by hand.  Whatever problems you
-have, let me (perlbug@perl.com) know how I blew it.
+have, let me (perlbug@perl.org) know how I blew it.
 
 This installation script affects things in two ways:
 
@@ -2047,7 +2099,7 @@ int main(int argc, char *argv[]) {
   return 0;
 }
 EOM
-    if $cc -o try try.c; then
+    if $cc -o try $ccflags try.c; then
        :
     else
         echo "Uh-oh, the C compiler '$cc' doesn't seem to be working." >&4
@@ -2076,13 +2128,17 @@ EOM
                     fi
                 fi  
                 case "$ans" in
-                [yY]*) cc=gcc; ccflags=''; despair=no ;;
+                [yY]*) cc=gcc; ccname=gcc; ccflags=''; despair=no ;;
                 esac
             fi
         fi
         if $test X"$despair" = Xyes; then
-            echo "You need to find a working C compiler." >&4
-            echo "I cannot continue any further, aborting." >&4
+           $cat >&4 <<EOM
+You need to find a working C compiler.
+Either (purchase and) install the C compiler supplied by your OS vendor,
+or for a free C compiler try http://gcc.gnu.org/
+I cannot continue any further, aborting.
+EOM
             exit 1
         fi
     fi
@@ -2234,7 +2290,7 @@ EOM
        (cd $src/hints; ls -C *.sh) | $sed 's/\.sh/   /g' >&4
        dflt=''
        : Half the following guesses are probably wrong... If you have better
-       : tests or hints, please send them to perlbug@perl.com
+       : tests or hints, please send them to perlbug@perl.org
        : The metaconfig authors would also appreciate a copy...
        $test -f /irix && osname=irix
        $test -f /xenix && osname=sco_xenix
@@ -2370,6 +2426,7 @@ EOM
                        esac
                        ;;
                next*) osname=next ;;
+               NonStop-UX) osname=nonstopux ;;
                POSIX-BC | posix-bc ) osname=posix-bc
                        osvers="$3"
                        ;;
@@ -2832,174 +2889,6 @@ esac
 set usemultiplicity
 eval $setvar
 
-: determine where manual pages are on this system
-echo " "
-case "$sysman" in
-'') 
-       syspath='/usr/man/man1 /usr/man/mann /usr/man/manl /usr/man/local/man1'
-       syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1"
-       syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1"
-       syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1"
-       syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1"
-       sysman=`./loc . /usr/man/man1 $syspath`
-       ;;
-esac
-if $test -d "$sysman"; then
-       echo "System manual is in $sysman." >&4
-else
-       echo "Could not find manual pages in source form." >&4
-fi
-
-: see what memory models we can support
-case "$models" in
-'')
-       $cat >pdp11.c <<'EOP'
-int main() {
-#ifdef pdp11
-       exit(0);
-#else
-       exit(1);
-#endif
-}
-EOP
-       case "$cc" in
-       '') modelcc="$cc" ;;
-       *) modelcc="cc" ;;
-       esac
-       ( $modelcc -o pdp11 pdp11.c ) >/dev/null 2>&1
-       if $test -f pdp11 && ./pdp11 2>/dev/null; then
-               dflt='unsplit split'
-       else
-               tans=`./loc . X /lib/small /lib/large /usr/lib/small /usr/lib/large /lib/medium /usr/lib/medium /lib/huge`
-               case "$tans" in
-               X) dflt='none';;
-               *) if $test -d /lib/small || $test -d /usr/lib/small; then
-                               dflt='small'
-                       else
-                               dflt=''
-                       fi
-                       if $test -d /lib/medium || $test -d /usr/lib/medium; then
-                               dflt="$dflt medium"
-                       fi
-                       if $test -d /lib/large || $test -d /usr/lib/large; then
-                               dflt="$dflt large"
-                       fi
-                       if $test -d /lib/huge || $test -d /usr/lib/huge; then
-                               dflt="$dflt huge"
-                       fi
-               esac
-       fi;;
-*) dflt="$models";;
-esac
-$cat <<EOM
-Some systems have different model sizes.  On most systems they are called
-small, medium, large, and huge.  On the PDP11 they are called unsplit and
-split.  If your system doesn't support different memory models, say "none".
-If you wish to force everything to one memory model, say "none" here and
-put the appropriate flags later when it asks you for other cc and ld flags.
-Venix systems may wish to put "none" and let the compiler figure things out.
-(In the following question multiple model names should be space separated.)
-
-The default for most systems is "none".
-
-EOM
-rp="Which memory models are supported?"
-. ./myread
-models="$ans"
-
-case "$models" in
-none)
-       small=''
-       medium=''
-       large=''
-       huge=''
-       unsplit=''
-       split=''
-       ;;
-*split)
-       case "$split" in
-       '') if $contains '\-i' $sysman/ld.1 >/dev/null 2>&1 || \
-                        $contains '\-i' $sysman/cc.1 >/dev/null 2>&1; then
-                       dflt='-i'
-               else
-                       dflt='none'
-               fi;;
-       *) dflt="$split";;
-       esac
-       rp="What flag indicates separate I and D space?"
-       . ./myread
-       tans="$ans"
-       case "$tans" in
-       none) tans='';;
-       esac
-       split="$tans"
-       unsplit='';;
-*large*|*small*|*medium*|*huge*)
-       case "$models" in
-       *large*)
-               case "$large" in
-               '') dflt='-Ml';;
-               *) dflt="$large";;
-               esac
-       rp="What flag indicates large model?"
-       . ./myread
-       tans="$ans"
-       case "$tans" in
-       none) tans='';
-       esac
-       large="$tans";;
-       *) large='';;
-       esac
-       case "$models" in
-       *huge*) case "$huge" in
-               '') dflt='-Mh';;
-               *) dflt="$huge";;
-               esac
-               rp="What flag indicates huge model?"
-               . ./myread
-               tans="$ans"
-               case "$tans" in
-               none) tans='';
-               esac
-               huge="$tans";;
-       *) huge="$large";;
-       esac
-       case "$models" in
-       *medium*) case "$medium" in
-               '') dflt='-Mm';;
-               *) dflt="$medium";;
-               esac
-               rp="What flag indicates medium model?"
-               . ./myread
-               tans="$ans"
-               case "$tans" in
-               none) tans='';
-               esac
-               medium="$tans";;
-       *) medium="$large";;
-       esac
-       case "$models" in
-       *small*) case "$small" in
-               '') dflt='none';;
-               *) dflt="$small";;
-               esac
-               rp="What flag indicates small model?"
-               . ./myread
-               tans="$ans"
-               case "$tans" in
-               none) tans='';
-               esac
-               small="$tans";;
-       *) small='';;
-       esac
-       ;;
-*)
-       echo "Unrecognized memory models--you may have to edit Makefile.SH" >&4
-       ;;
-esac
-$rm -f pdp11.* pdp11
-
 : make some quick guesses about what we are up against
 echo " "
 $echo $n "Hmm...  $c"
@@ -3056,12 +2945,15 @@ EOI
        ;;
 esac
 : Detect OS2.  The p_ variable is set above in the Head.U unit.
+: Note that this also -- wrongly -- detects e.g. dos-djgpp, which also uses
+: semicolon as a patch separator
 case "$p_" in
 :) ;;
 *)
        $cat <<'EOI'
 I have the feeling something is not exactly right, however...don't tell me...
 lemme think...does HAL ring a bell?...no, of course, you're only running OS/2!
+(Or you may be running DOS with DJGPP.)
 EOI
        echo exit 0 >os2
        ;;
@@ -3092,51 +2984,13 @@ chmod +x bsd usg v7 osf1 eunice xenix venix os2
 $eunicefix bsd usg v7 osf1 eunice xenix venix os2
 $rm -f foo
 
-: see if we need a special compiler
-echo " "
-if ./usg; then
-       case "$cc" in
-       '') case "$Mcc" in
-               /*) dflt='Mcc';;
-               *) case "$large" in
-                       -M*) dflt='cc';;
-                       *)      if $contains '\-M' $sysman/cc.1 >/dev/null 2>&1 ; then
-                                       if $contains '\-M' $sysman/cpp.1 >/dev/null 2>&1; then
-                                               dflt='cc'
-                                       else
-                                               dflt='cc -M'
-                                       fi
-                               else
-                                       dflt='cc'
-                               fi;;
-                       esac;;
-               esac;;
-       *)  dflt="$cc";;
-       esac
-       case "$dflt" in
-       *M*)    $cat <<'EOM'
-On some older systems the default C compiler will not resolve multiple global
-references that happen to have the same name.  On some such systems the "Mcc"
-command may be used to force these to be resolved.  On other systems a "cc -M"
-command is required.  (Note that the -M flag on other systems indicates a
-memory model to use!) If you have the Gnu C compiler, you might wish to use
-that instead.
-
-EOM
-       ;;
-       esac
-       rp="Use which C compiler?"
-       . ./myread
-       cc="$ans"
-else
-       case "$cc" in
-       '') dflt=cc;;
-       *) dflt="$cc";;
-       esac
-       rp="Use which C compiler?"
-       . ./myread
-       cc="$ans"
-fi
+case "$cc" in
+'') dflt=cc;;
+*) dflt="$cc";;
+esac
+rp="Use which C compiler?"
+. ./myread
+cc="$ans"
 : Look for a hint-file generated 'call-back-unit'.  Now that the
 : user has specified the compiler, we may need to set or change some
 : other defaults.
@@ -3160,11 +3014,12 @@ int main() {
        exit(0);
 }
 EOM
-if $cc $ldflags -o gccvers gccvers.c; then
+if $cc -o gccvers $ldflags gccvers.c; then
        gccversion=`./gccvers`
        case "$gccversion" in
        '') echo "You are not using GNU cc." ;;
        *)  echo "You are using GNU cc $gccversion."
+           ccname=gcc  
            ;;
        esac
 else
@@ -3184,7 +3039,9 @@ case "$gccversion" in
 esac
 case "$gccversion" in
 '') gccosandvers='' ;;
-*) gccosandvers=`$cc -v 2>&1|grep '/specs$'|sed 's!.*/[^-]*-[^-]*-\([^/]*\)/'$gccversion'/specs$!\1!'`
+*) gccshortvers=`echo "$gccversion"|sed 's/ .*//'`
+   gccosandvers=`$cc -v 2>&1|grep '/specs$'|sed "s!.*/[^-/]*-[^-/]*-\([^-/]*\)/$gccshortvers/specs!\1!"`
+   gccshortvers=''
    case "$gccosandvers" in
    $osname) gccosandvers='' ;; # linux gccs seem to have no linux osvers, grr
    $osname$osvers) ;; # looking good
@@ -3211,9 +3068,9 @@ EOM
    esac
    ;;
 esac
-
-
-
+case "$ccname" in
+'') ccname="$cc" ;;
+esac
 
 : see how we invoke the C preprocessor
 echo " "
@@ -3995,8 +3852,8 @@ for thisincl in $inclwanted; do
        if $test -d $thisincl; then
                if $test x$thisincl != x$usrinc; then
                        case "$dflt" in
-                       *$thisincl*);;
-                       *) dflt="$dflt -I$thisincl";;
+                        *" -I$thisincl "*);;
+                        *) dflt="$dflt -I$thisincl ";;
                        esac
                fi
        fi
@@ -4032,6 +3889,7 @@ esac
 case "$dflt" in
 ''|' ') dflt=none;;
 esac
+
 $cat <<EOH
 
 Your C compiler may want other flags.  For this question you should include
@@ -4164,7 +4022,7 @@ $cat > try.c <<'EOF'
 #include <stdio.h>
 int main() { printf("Ok\n"); exit(0); }
 EOF
-set X $cc $optimize $ccflags -o try $ldflags try.c $libs
+set X $cc -o try $optimize $ccflags $ldflags try.c $libs
 shift
 $cat >try.msg <<'EOM'
 I've tried to compile and run the following simple program:
@@ -4183,7 +4041,7 @@ and I got the following output:
 
 EOM
 dflt=y
-if sh -c "$cc $optimize $ccflags -o try $ldflags try.c $libs" >>try.msg 2>&1; then
+if sh -c "$cc -o try $optimize $ccflags $ldflags try.c $libs" >>try.msg 2>&1; then
        if sh -c './try' >>try.msg 2>&1; then
                xxx=`./try`
                case "$xxx" in
@@ -4295,12 +4153,12 @@ esac'
 compile='
 mc_file=$1;
 shift;
-$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs > /dev/null 2>&1;'
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs > /dev/null 2>&1;'
 : define a shorthand compile call for compilations that should be ok.
 compile_ok='
 mc_file=$1;
 shift;
-$cc $optimize $ccflags $ldflags -o ${mc_file} $* ${mc_file}.c $libs;'
+$cc -o ${mc_file} $optimize $ccflags $ldflags $* ${mc_file}.c $libs;'
 
 : check for lengths of integral types
 echo " "
@@ -4705,1576 +4563,1743 @@ case "$use64bitall" in
        ;;
 esac
 
-: determine the architecture name
 echo " "
-if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
-       tarch=`arch`"-$osname"
-elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then
-       if uname -m > tmparch 2>&1 ; then
-               tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \
-                       -e 's/$/'"-$osname/" tmparch`
-       else
-               tarch="$osname"
-       fi
-       $rm -f tmparch
+echo "Checking for GNU C Library..." >&4
+cat >gnulibc.c <<EOM
+#include <stdio.h>
+int main()
+{
+#ifdef __GLIBC__
+    exit(0);
+#else
+    exit(1);
+#endif
+}
+EOM
+set gnulibc
+if eval $compile_ok && ./gnulibc; then
+       val="$define"
+       echo "You are using the GNU C Library"
 else
-       tarch="$osname"
+       val="$undef"
+       echo "You are not using the GNU C Library"
 fi
-case "$myarchname" in
-''|"$tarch") ;;
-*)
-       echo "(Your architecture name used to be $myarchname.)"
-       archname=''
-       ;;
-esac
-myarchname="$tarch"
-case "$archname" in
-'') dflt="$tarch";;
-*) dflt="$archname";;
-esac
-rp='What is your architecture name'
-. ./myread
-archname="$ans"
-case "$usethreads" in
-$define)
-       echo "Threads selected." >&4
-       case "$archname" in
-        *-thread*) echo "...and architecture name already has -thread." >&4
-                ;;
-        *)      archname="$archname-thread"
-                echo "...setting architecture name to $archname." >&4
-                ;;
-        esac
-       ;;
-esac
-case "$usemultiplicity" in
-$define)
-       echo "Multiplicity selected." >&4
-       case "$archname" in
-        *-multi*) echo "...and architecture name already has -multi." >&4
-                ;;
-        *)      archname="$archname-multi"
-                echo "...setting architecture name to $archname." >&4
-                ;;
-        esac
-       ;;
-esac
-case "$use64bitint" in
-$define)
-       case "$archname64" in
-       '')
+$rm -f gnulibc*
+set d_gnulibc
+eval $setvar
+
+: see if nm is to be used to determine whether a symbol is defined or not
+case "$usenm" in
+'')
+       dflt=''
+       case "$d_gnulibc" in
+       "$define")
+               echo " "
+               echo "nm probably won't work on the GNU C Library." >&4
+               dflt=n
                ;;
-       *)
-               case "$archname" in
-               *-$archname64*) echo "...and architecture name already has $archname64." >&4
-                       ;;
-               *)      archname="$archname-$archname64"
-                       echo "...setting architecture name to $archname." >&4
-                       ;;
-               esac
+       esac
+       case "$dflt" in
+       '') 
+               if $test "$osname" = aix -a ! -f /lib/syscalls.exp; then
+                       echo " "
+                       echo "Whoops!  This is an AIX system without /lib/syscalls.exp!" >&4
+                       echo "'nm' won't be sufficient on this sytem." >&4
+                       dflt=n
+               fi
+               ;;
+       esac
+       case "$dflt" in
+       '') dflt=`$egrep 'inlibc|csym' $rsrc/Configure | wc -l 2>/dev/null`
+               if $test $dflt -gt 20; then
+                       dflt=y
+               else
+                       dflt=n
+               fi
                ;;
        esac
-esac
-
-: determine root of directory hierarchy where package will be installed.
-case "$prefix" in
-'')
-       dflt=`./loc . /usr/local /usr/local /local /opt /usr`
        ;;
 *)
-       dflt="$prefix"
+       case "$usenm" in
+       true|$define) dflt=y;;
+       *) dflt=n;;
+       esac
        ;;
 esac
 $cat <<EOM
 
-By default, $package will be installed in $dflt/bin, manual pages
-under $dflt/man, etc..., i.e. with $dflt as prefix for all
-installation directories. Typically this is something like /usr/local.
-If you wish to have binaries under /usr/bin but other parts of the
-installation under /usr/local, that's ok: you will be prompted
-separately for each of the installation directories, the prefix being
-only used to set the defaults.
+I can use $nm to extract the symbols from your C libraries. This
+is a time consuming task which may generate huge output on the disk (up
+to 3 megabytes) but that should make the symbols extraction faster. The
+alternative is to skip the 'nm' extraction part and to compile a small
+test program instead to determine whether each symbol is present. If
+you have a fast C compiler and/or if your 'nm' output cannot be parsed,
+this may be the best solution.
+
+You probably shouldn't let me use 'nm' if you are using the GNU C Library.
 
 EOM
-fn=d~
-rp='Installation prefix to use?'
-. ./getfile
-oldprefix=''
-case "$prefix" in
-'') ;;
-*)
-       case "$ans" in
-       "$prefix") ;;
-       *) oldprefix="$prefix";;
+rp="Shall I use $nm to extract C symbols from the libraries?"
+. ./myread
+case "$ans" in
+[Nn]*) usenm=false;;
+*) usenm=true;;
+esac
+
+runnm=$usenm
+case "$reuseval" in
+true) runnm=false;;
+esac
+
+: nm options which may be necessary
+case "$nm_opt" in
+'') if $test -f /mach_boot; then
+               nm_opt=''       # Mach
+       elif $test -d /usr/ccs/lib; then
+               nm_opt='-p'     # Solaris (and SunOS?)
+       elif $test -f /dgux; then
+               nm_opt='-p'     # DG-UX
+       elif $test -f /lib64/rld; then
+               nm_opt='-p'     # 64-bit Irix
+       else
+               nm_opt=''
+       fi;;
+esac
+
+: nm options which may be necessary for shared libraries but illegal
+: for archive libraries.  Thank you, Linux.
+case "$nm_so_opt" in
+'')    case "$myuname" in
+       *linux*)
+               if $nm --help | $grep 'dynamic' > /dev/null 2>&1; then
+                       nm_so_opt='--dynamic'
+               fi
+               ;;
        esac
        ;;
 esac
-prefix="$ans"
-prefixexp="$ansexp"
 
-: is AFS running?
+case "$runnm" in
+true)
+: get list of predefined functions in a handy place
 echo " "
-case "$afs" in
-$define|true)  afs=true ;;
-$undef|false)  afs=false ;;
-*)     if test -d /afs; then
-               afs=true
-       else
-               afs=false
-       fi
+case "$libc" in
+'') libc=unknown
+       case "$libs" in
+       *-lc_s*) libc=`./loc libc_s$_a $libc $libpth`
+       esac
        ;;
 esac
-if $afs; then
-       echo "AFS may be running... I'll be extra cautious then..." >&4
+libnames='';
+case "$libs" in
+'') ;;
+*)  for thislib in $libs; do
+       case "$thislib" in
+       -lc|-lc_s)
+               : Handle C library specially below.
+               ;;
+       -l*)
+               thislib=`echo $thislib | $sed -e 's/^-l//'`
+               if try=`./loc lib$thislib.$so.'*' X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc lib$thislib.$so X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc lib$thislib$_a X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc $thislib$_a X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc lib$thislib X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc $thislib X $libpth`; $test -f "$try"; then
+                       :
+               elif try=`./loc Slib$thislib$_a X $xlibpth`; $test -f "$try"; then
+                       :
+               else
+                       try=''
+               fi
+               libnames="$libnames $try"
+               ;;
+       *) libnames="$libnames $thislib" ;;
+       esac
+       done
+       ;;
+esac
+xxx=normal
+case "$libc" in
+unknown)
+       set /lib/libc.$so
+       for xxx in $libpth; do
+               $test -r $1 || set $xxx/libc.$so
+               : The messy sed command sorts on library version numbers.
+               $test -r $1 || \
+                       set `echo blurfl; echo $xxx/libc.$so.[0-9]* | \
+                       tr ' ' $trnl | egrep -v '\.[A-Za-z]*$' | $sed -e '
+                               h
+                               s/[0-9][0-9]*/0000&/g
+                               s/0*\([0-9][0-9][0-9][0-9][0-9]\)/\1/g
+                               G
+                               s/\n/ /' | \
+                        sort | $sed -e 's/^.* //'`
+               eval set \$$#
+       done
+       $test -r $1 || set /usr/ccs/lib/libc.$so
+       $test -r $1 || set /lib/libsys_s$_a
+       ;;
+*)
+       set blurfl
+       ;;
+esac
+if $test -r "$1"; then
+       echo "Your (shared) C library seems to be in $1."
+       libc="$1"
+elif $test -r /lib/libc && $test -r /lib/clib; then
+       echo "Your C library seems to be in both /lib/clib and /lib/libc."
+       xxx=apollo
+       libc='/lib/clib /lib/libc'
+       if $test -r /lib/syslib; then
+               echo "(Your math library is in /lib/syslib.)"
+               libc="$libc /lib/syslib"
+       fi
+elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       echo "Your C library seems to be in $libc, as you said before."
+elif $test -r $incpath/usr/lib/libc$_a; then
+       libc=$incpath/usr/lib/libc$_a;
+       echo "Your C library seems to be in $libc.  That's fine."
+elif $test -r /lib/libc$_a; then
+       libc=/lib/libc$_a;
+       echo "Your C library seems to be in $libc.  You're normal."
 else
-       echo "AFS does not seem to be running..." >&4
+       if tans=`./loc libc$_a blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then
+               libnames="$libnames "`./loc clib blurfl/dyick $libpth`
+       elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Slibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       elif tans=`./loc Mlibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
+               :
+       else
+               tans=`./loc Llibc$_a blurfl/dyick $xlibpth`
+       fi
+       if $test -r "$tans"; then
+               echo "Your C library seems to be in $tans, of all places."
+               libc=$tans
+       else
+               libc='blurfl'
+       fi
 fi
+if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
+       dflt="$libc"
+       cat <<EOM
 
-: determine installation prefix for where package is to be installed.
-if $afs; then 
-$cat <<EOM
-
-Since you are running AFS, I need to distinguish the directory in which
-files will reside from the directory in which they are installed (and from
-which they are presumably copied to the former directory by occult means).
+If the guess above is wrong (which it might be if you're using a strange
+compiler, or your machine supports multiple models), you can override it here.
 
 EOM
-       case "$installprefix" in
-       '') dflt=`echo $prefix | sed 's#^/afs/#/afs/.#'`;;
-       *) dflt="$installprefix";;
-       esac
 else
-$cat <<EOM
+       dflt=''
+       echo $libpth | tr ' ' $trnl | sort | uniq > libpath
+       cat >&4 <<EOM
+I can't seem to find your C library.  I've looked in the following places:
 
-In some special cases, particularly when building $package for distribution,
-it is convenient to distinguish between the directory in which files should 
-be installed from the directory ($prefix) in which they 
-will eventually reside.  For most users, these two directories are the same.
+EOM
+       $sed 's/^/      /' libpath
+       cat <<EOM
+
+None of these seems to contain your C library. I need to get its name...
 
 EOM
-       case "$installprefix" in
-       '') dflt=$prefix ;;
-       *) dflt=$installprefix;;
-       esac
 fi
-fn=d~
-rp='What installation prefix should I use for installing files?'
+fn=f
+rp='Where is your C library?'
 . ./getfile
-installprefix="$ans"
-installprefixexp="$ansexp"
+libc="$ans"
 
-: set the prefixit variable, to compute a suitable default value
-prefixit='case "$3" in
-""|none)
-       case "$oldprefix" in
-       "") eval "$1=\"\$$2\"";;
-       *)
-               case "$3" in
-               "") eval "$1=";;
-               none)
-                       eval "tp=\"\$$2\"";
-                       case "$tp" in
-                       ""|" ") eval "$1=\"\$$2\"";;
-                       *) eval "$1=";;
-                       esac;;
-               esac;;
-       esac;;
-*)
-       eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\"";
-       case "$tp" in
-       --|/*--|\~*--) eval "$1=\"$prefix/$3\"";;
-       /*-$oldprefix/*|\~*-$oldprefix/*)
-               eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";;
-       *) eval "$1=\"\$$2\"";;
-       esac;;
-esac'
+echo " "
+echo $libc $libnames | tr ' ' $trnl | sort | uniq > libnames
+set X `cat libnames`
+shift
+xxx=files
+case $# in 1) xxx=file; esac
+echo "Extracting names from the following $xxx for later perusal:" >&4
+echo " "
+$sed 's/^/     /' libnames >&4
+echo " "
+$echo $n "This may take a while...$c" >&4
 
+for file in $*; do
+       case $file in
+       *$so*) $nm $nm_so_opt $nm_opt $file 2>/dev/null;;
+       *) $nm $nm_opt $file 2>/dev/null;;
+       esac
+done >libc.tmp
 
-: get the patchlevel
-echo " "
-echo "Getting the current patchlevel..." >&4
-if $test -r $rsrc/patchlevel.h;then
-       revision=`awk '/define[         ]+PERL_REVISION/ {print $3}' $rsrc/patchlevel.h`
-       patchlevel=`awk '/define[       ]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
-       subversion=`awk '/define[       ]+PERL_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
-       api_revision=`awk '/define[     ]+PERL_API_REVISION/ {print $3}' $rsrc/patchlevel.h`
-       api_version=`awk '/define[      ]+PERL_API_VERSION/ {print $3}' $rsrc/patchlevel.h`
-       api_subversion=`awk '/define[   ]+PERL_API_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
-else
-       revision=0
-       patchlevel=0
-       subversion=0
-       api_revision=0
-       api_version=0
-       api_subversion=0
+$echo $n ".$c"
+$grep fprintf libc.tmp > libc.ptf
+xscan='eval "<libc.ptf $com >libc.list"; $echo $n ".$c" >&4'
+xrun='eval "<libc.tmp $com >libc.list"; echo "done" >&4'
+xxx='[ADTSIW]'
+if com="$sed -n -e 's/__IO//' -e 's/^.* $xxx  *_[_.]*//p' -e 's/^.* $xxx  *//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
+                               -e '/ file/d' -e 's/^\([^       ]*\).*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^.*|Proc .*|Text *| *//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e '/Def. Text/s/.* \([^ ]*\)\$/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/^[-0-9a-f ]*_\(.*\)=.*/\1/p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="$sed -n -e 's/.*\.text n\ \ \ \.//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+elif com="sed -n -e 's/^__.*//' -e 's/[       ]*D[    ]*[0-9]*.*//p'";\
+       eval $xscan;\
+       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
+               eval $xrun
+else
+       $nm -p $* 2>/dev/null >libc.tmp
+       $grep fprintf libc.tmp > libc.ptf
+       if com="$sed -n -e 's/^.* [ADTSIW]  *_[_.]*//p' -e 's/^.* [ADTSIW] //p'";\
+               eval $xscan; $contains '^fprintf$' libc.list >/dev/null 2>&1
+       then
+               nm_opt='-p'
+               eval $xrun
+       else
+               echo " "
+               echo "$nm didn't seem to work right. Trying $ar instead..." >&4
+               com=''
+               if $ar t $libc > libc.tmp && $contains '^fprintf$' libc.tmp >/dev/null 2>&1; then
+                       for thisname in $libnames $libc; do
+                               $ar t $thisname >>libc.tmp
+                       done
+                       $sed -e "s/\\$_o\$//" < libc.tmp > libc.list
+                       echo "Ok." >&4
+               elif test "X$osname" = "Xos2" && $ar tv $libc > libc.tmp; then
+                       # Repeat libc to extract forwarders to DLL entries too
+                       for thisname in $libnames $libc; do
+                               $ar tv $thisname >>libc.tmp
+                               # Revision 50 of EMX has bug in $ar.
+                               # it will not extract forwarders to DLL entries
+                               # Use emximp which will extract exactly them.
+                               emximp -o tmp.imp $thisname \
+                                   2>/dev/null && \
+                                   $sed -e 's/^\([_a-zA-Z0-9]*\) .*$/\1/p' \
+                                   < tmp.imp >>libc.tmp
+                               $rm tmp.imp
+                       done
+                       $sed -e "s/\\$_o\$//" -e 's/^ \+//' < libc.tmp > libc.list
+                       echo "Ok." >&4
+               else
+                       echo "$ar didn't seem to work right." >&4
+                       echo "Maybe this is a Cray...trying bld instead..." >&4
+                       if bld t $libc | $sed -e 's/.*\///' -e "s/\\$_o:.*\$//" > libc.list
+                       then
+                               for thisname in $libnames; do
+                                       bld t $libnames | \
+                                       $sed -e 's/.*\///' -e "s/\\$_o:.*\$//" >>libc.list
+                                       $ar t $thisname >>libc.tmp
+                               done
+                               echo "Ok." >&4
+                       else
+                               echo "That didn't work either.  Giving up." >&4
+                               exit 1
+                       fi
+               fi
+       fi
 fi
-$echo $n "(You have $package revision $revision" $c
-$echo $n " patchlevel $patchlevel" $c
-test 0 -eq "$subversion" || $echo $n " subversion $subversion" $c
-echo ".)"
-case "$osname" in
-dos|vms)
-       : XXX Should be a Configure test for double-dots in filenames.
-       version=`echo $revision $patchlevel $subversion | \
-                $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
-       api_versionstring=`echo $api_revision $api_version $api_subversion | \
-                $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
-       ;;
-*)
-       version=`echo $revision $patchlevel $subversion | \
-                $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
-       api_versionstring=`echo $api_revision $api_version $api_subversion | \
-                $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
-       ;;
-esac
-: Special case the 5.005_xx maintenance series, which used 5.005
-: without any subversion label as a subdirectory in $sitelib
-if test "${api_revision}${api_version}${api_subversion}" = "550"; then
-       api_versionstring='5.005'
+nm_extract="$com"
+if $test -f /lib/syscalls.exp; then
+       echo " "
+       echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
+       $sed -n 's/^\([^        ]*\)[   ]*syscall[0-9]*$/\1/p' /lib/syscalls.exp >>libc.list
 fi
+;;
+esac
+$rm -f libnames libpath
 
-: determine installation style
-: For now, try to deduce it from prefix unless it is already set.
-: Reproduce behavior of 5.005 and earlier, maybe drop that in 5.7.
-case "$installstyle" in
-'')    case "$prefix" in
-               *perl*) dflt='lib';;
-               *) dflt='lib/perl5' ;;
-       esac
-       ;;
-*)     dflt="$installstyle" ;;
+: is a C symbol defined?
+csym='tlook=$1;
+case "$3" in
+-v) tf=libc.tmp; tc=""; tdc="";;
+-a) tf=libc.tmp; tc="[0]"; tdc="[]";;
+*) tlook="^$1\$"; tf=libc.list; tc="()"; tdc="()";;
+esac;
+tx=yes;
+case "$reuseval-$4" in
+true-) ;;
+true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
+esac;
+case "$tx" in
+yes)
+       case "$runnm" in
+       true)
+               if $contains $tlook $tf >/dev/null 2>&1;
+               then tval=true;
+               else tval=false;
+               fi;;
+       *)
+               echo "int main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c;
+               if $cc -o t $optimize $ccflags $ldflags t.c $libs >/dev/null 2>&1;
+               then tval=true;
+               else tval=false;
+               fi;
+               $rm -f t t.c;;
+       esac;;
+*)
+       case "$tval" in
+       $define) tval=true;;
+       *) tval=false;;
+       esac;;
+esac;
+eval "$2=$tval"'
+
+: define an is-in-libc? function
+inlibc='echo " "; td=$define; tu=$undef;
+sym=$1; var=$2; eval "was=\$$2";
+tx=yes;
+case "$reuseval$was" in
+true) ;;
+true*) tx=no;;
+esac;
+case "$tx" in
+yes)
+       set $sym tres -f;
+       eval $csym;
+       case "$tres" in
+       true)
+               echo "$sym() found." >&4;
+               case "$was" in $undef) . ./whoa; esac; eval "$var=\$td";;
+       *)
+               echo "$sym() NOT found." >&4;
+               case "$was" in $define) . ./whoa; esac; eval "$var=\$tu";;
+       esac;;
+*)
+       case "$was" in
+       $define) echo "$sym() found." >&4;;
+       *) echo "$sym() NOT found." >&4;;
+       esac;;
+esac'
+
+: see if sqrtl exists
+set sqrtl d_sqrtl
+eval $inlibc
+
+case "$ccflags" in
+*-DUSE_LONG_DOUBLE*|*-DUSE_MORE_BITS*) uselongdouble="$define" ;;
 esac
-: Probably not worth prompting for this since we prompt for all
-: the directories individually, and the prompt would be too long and
-: confusing anyway.
-installstyle=$dflt
 
-: determine where private library files go
-: Usual default is /usr/local/lib/perl5/$version.
-: Also allow things like /opt/perl/lib/$version, since 
-: /opt/perl/lib/perl5... would be redundant.
-: The default "style" setting is made in installstyle.U
-case "$installstyle" in
-*lib/perl5*) set dflt privlib lib/$package/$version ;;
-*)      set dflt privlib lib/$version ;;
+case "$uselongdouble" in
+$define|true|[yY]*)    dflt='y';;
+*) dflt='n';;
 esac
-eval $prefixit
-$cat <<EOM
+cat <<EOM
 
-There are some auxiliary files for $package that need to be put into a
-private library directory that is accessible by everyone.
+Perl can be built to take advantage of long doubles which
+(if available) may give more accuracy and range for floating point numbers.
 
+If this doesn't make any sense to you, just accept the default '$dflt'.
 EOM
-fn=d~+
-rp='Pathname where the private library files will reside?'
-. ./getfile
-privlib="$ans"
-privlibexp="$ansexp"
-: Change installation prefix, if necessary.
-if $test X"$prefix" != X"$installprefix"; then
-       installprivlib=`echo $privlibexp | sed "s#^$prefix#$installprefix#"`
-else
-       installprivlib="$privlibexp"
-fi
-
-: set the prefixup variable, to restore leading tilda escape
-prefixup='case "$prefixexp" in
-"$prefix") ;;
-*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";;
-esac'
-
-: determine where public architecture dependent libraries go
-set archlib archlib
-eval $prefixit
-: privlib default is /usr/local/lib/$package/$version
-: archlib default is /usr/local/lib/$package/$version/$archname
-: privlib may have an optional trailing /share.
-tdflt=`echo $privlib | $sed 's,/share$,,'`
-tdflt=$tdflt/$archname
-case "$archlib" in
-'')    dflt=$tdflt
-       ;;
-*)     dflt="$archlib"
-    ;;
+rp='Try to use long doubles if available?'
+. ./myread
+case "$ans" in
+y|Y)   val="$define"   ;;
+*)      val="$undef"   ;;
 esac
-$cat <<EOM
-
-$spackage contains architecture-dependent library files.  If you are
-sharing libraries in a heterogeneous environment, you might store
-these files in a separate location.  Otherwise, you can just include
-them with the rest of the public library files.
-
-EOM
-fn=d+~
-rp='Where do you want to put the public architecture-dependent libraries?'
-. ./getfile
-archlib="$ans"
-archlibexp="$ansexp"
-if $test X"$archlib" = X"$privlib"; then
-       d_archlib="$undef"
-else
-       d_archlib="$define"
-fi
-: Change installation prefix, if necessary.
-if $test X"$prefix" != X"$installprefix"; then
-       installarchlib=`echo $archlibexp | sed "s#^$prefix#$installprefix#"`
-else
-       installarchlib="$archlibexp"
-fi
-
-
-: Binary compatibility with 5.005 is not possible for builds
-: with advanced features
-case "$usethreads$usemultiplicity" in
-*define*)
-       bincompat5005="$undef"
-       d_bincompat5005="$undef"
-       ;;
-*)     $cat <<EOM
+set uselongdouble
+eval $setvar
 
-This version of Perl can be compiled for binary compatibility with 5.005.
-If you decide to do so, you will be able to continue using most of the
-extensions that were compiled for Perl 5.005.
+case "$uselongdouble" in
+true|[yY]*) uselongdouble="$define" ;;
+esac
 
+case "$uselongdouble" in
+$define)
+: Look for a hint-file generated 'call-back-unit'.  If the
+: user has specified that long doubles should be used,
+: we may need to set or change some other defaults.
+       if $test -f uselongdouble.cbu; then
+               echo "Your platform has some specific hints for long doubles, using them..."
+               . ./uselongdouble.cbu
+       else
+               $cat <<EOM
+(Your platform doesn't have any specific hints for long doubles.)
 EOM
-       case "$bincompat5005$d_bincompat5005" in
-       *"$undef"*) dflt=n ;;
-       *) dflt=y ;;
-       esac
-       rp='Binary compatibility with Perl 5.005?'
-       . ./myread
-       case "$ans" in
-       y*) val="$define" ;;
-       *)  val="$undef" ;;
-       esac
-       set d_bincompat5005
-       eval $setvar
-       case "$d_bincompat5005" in
-       "$define")
-               bincompat5005="$define"
-               ;;
-       *)      bincompat5005="$undef"
-               d_bincompat5005="$undef"
-               ;;
-       esac
+       fi
        ;;
 esac
 
+case "$uselongdouble:$d_sqrtl" in
+$define:$undef)
+               $cat <<EOM >&4
 
-: see if setuid scripts can be secure
-$cat <<EOM
-
-Some kernels have a bug that prevents setuid #! scripts from being
-secure.  Some sites have disabled setuid #! scripts because of this.
-
-First let's decide if your kernel supports secure setuid #! scripts.
-(If setuid #! scripts would be secure but have been disabled anyway,
-don't say that they are secure if asked.)
+*** You requested the use of long doubles but you do not seem to have
+*** the mathematic functions for long doubles.  I'm disabling the use
+*** of long doubles.
 
 EOM
+       uselongdouble=$undef
+       ;;
+esac
 
-val="$undef"
-if $test -d /dev/fd; then
-       echo "#!$ls" >reflect
-       chmod +x,u+s reflect
-       ./reflect >flect 2>&1
-       if $contains "/dev/fd" flect >/dev/null; then
-               echo "Congratulations, your kernel has secure setuid scripts!" >&4
-               val="$define"
+: check for length of double
+echo " "
+case "$doublesize" in
+'')
+       echo "Checking to see how big your double precision numbers are..." >&4
+       $cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+    printf("%d\n", (int)sizeof(double));
+    exit(0);
+}
+EOCP
+       set try
+       if eval $compile_ok; then
+               doublesize=`./try`
+               echo "Your double is $doublesize bytes long."
        else
-               $cat <<EOM
-If you are not sure if they are secure, I can check but I'll need a
-username and password different from the one you are using right now.
-If you don't have such a username or don't want me to test, simply
-enter 'none'.
-
-EOM
-               rp='Other username to test security of setuid scripts with?'
-               dflt='none'
-               . ./myread
-               case "$ans" in
-               n|none)
-                       case "$d_suidsafe" in
-                       '')     echo "I'll assume setuid scripts are *not* secure." >&4
-                               dflt=n;;
-                       "$undef")
-                               echo "Well, the $hint value is *not* secure." >&4
-                               dflt=n;;
-                       *)      echo "Well, the $hint value *is* secure." >&4
-                               dflt=y;;
-                       esac
-                       ;;
-               *)
-                       $rm -f reflect flect
-                       echo "#!$ls" >reflect
-                       chmod +x,u+s reflect
-                       echo >flect
-                       chmod a+w flect
-                       echo '"su" will (probably) prompt you for '"$ans's password."
-                       su $ans -c './reflect >flect'
-                       if $contains "/dev/fd" flect >/dev/null; then
-                               echo "Okay, it looks like setuid scripts are secure." >&4
-                               dflt=y
-                       else
-                               echo "I don't think setuid scripts are secure." >&4
-                               dflt=n
-                       fi
-                       ;;
-               esac
-               rp='Does your kernel have *secure* setuid scripts?'
+               dflt='8'
+               echo "(I can't seem to compile the test program.  Guessing...)"
+               rp="What is the size of a double precision number (in bytes)?"
                . ./myread
-               case "$ans" in
-               [yY]*)  val="$define";;
-               *)      val="$undef";;
-               esac
+               doublesize="$ans"
        fi
+       ;;
+esac
+$rm -f try.c try
+
+: check for long doubles
+echo " "
+echo "Checking to see if you have long double..." >&4
+echo 'int main() { long double x = 7.0; }' > try.c
+set try
+if eval $compile; then
+       val="$define"
+       echo "You have long double."
 else
-       echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
-       echo "(That's for file descriptors, not floppy disks.)"
        val="$undef"
+       echo "You do not have long double."
 fi
-set d_suidsafe
+$rm try.*
+set d_longdbl
 eval $setvar
 
-$rm -f reflect flect
-
-: now see if they want to do setuid emulation
-echo " "
-val="$undef"
-case "$d_suidsafe" in
-"$define")
-       val="$undef"
-       echo "No need to emulate SUID scripts since they are secure here." >& 4
+: check for length of long double
+case "${d_longdbl}${longdblsize}" in
+$define)
+       echo " "
+       echo "Checking to see how big your long doubles are..." >&4
+       $cat >try.c <<'EOCP'
+#include <stdio.h>
+int main()
+{
+       printf("%d\n", sizeof(long double));
+}
+EOCP
+       set try
+       set try
+       if eval $compile; then
+               longdblsize=`./try$exe_ext`
+               echo "Your long doubles are $longdblsize bytes long."
+       else
+               dflt='8'
+               echo " "
+               echo "(I can't seem to compile the test program.  Guessing...)" >&4
+               rp="What is the size of a long double (in bytes)?"
+               . ./myread
+               longdblsize="$ans"
+       fi
+       if $test "X$doublesize" = "X$longdblsize"; then
+               echo "(That isn't any different from an ordinary double.)"
+       fi      
        ;;
-*)
-       $cat <<EOM
-Some systems have disabled setuid scripts, especially systems where
-setuid scripts cannot be secure.  On systems where setuid scripts have
-been disabled, the setuid/setgid bits on scripts are currently
-useless.  It is possible for $package to detect those bits and emulate
-setuid/setgid in a secure fashion.  This emulation will only work if
-setuid scripts have been disabled in your kernel.
+esac
+$rm -f try.* try
 
-EOM
-       case "$d_dosuid" in
-       "$define") dflt=y ;;
-       *) dflt=n ;;
-       esac
-       rp="Do you want to do setuid/setgid emulation?"
-       . ./myread
-       case "$ans" in
-       [yY]*)  val="$define";;
-       *)      val="$undef";;
-       esac
-       ;;
-esac
-set d_dosuid
-eval $setvar
-
-: determine filename position in cpp output
+: determine the architecture name
 echo " "
-echo "Computing filename position in cpp output for #include directives..." >&4
-echo '#include <stdio.h>' > foo.c
-$cat >fieldn <<EOF
-$startsh
-$cppstdin $cppflags $cppminus <foo.c 2>/dev/null | \
-$grep '^[      ]*#.*stdio\.h' | \
-while read cline; do
-       pos=1
-       set \$cline
-       while $test \$# -gt 0; do
-               if $test -r \`echo \$1 | $tr -d '"'\`; then
-                       echo "\$pos"
-                       exit 0
-               fi
-               shift
-               pos=\`expr \$pos + 1\`
-       done
-done
-EOF
-chmod +x fieldn
-fieldn=`./fieldn`
-$rm -f foo.c fieldn
-case $fieldn in
-'') pos='???';;
-1) pos=first;;
-2) pos=second;;
-3) pos=third;;
-*) pos="${fieldn}th";;
-esac
-echo "Your cpp writes the filename in the $pos field of the line."
-
-: locate header file
-$cat >findhdr <<EOF
-$startsh
-wanted=\$1
-name=''
-for usrincdir in $usrinc
-do
-       if test -f \$usrincdir/\$wanted; then
-               echo "\$usrincdir/\$wanted"
-               exit 0
+if xxx=`./loc arch blurfl $pth`; $test -f "$xxx"; then
+       tarch=`arch`"-$osname"
+elif xxx=`./loc uname blurfl $pth`; $test -f "$xxx" ; then
+       if uname -m > tmparch 2>&1 ; then
+               tarch=`$sed -e 's/ *$//' -e 's/ /_/g' \
+                       -e 's/$/'"-$osname/" tmparch`
+       else
+               tarch="$osname"
        fi
-done
-awkprg='{ print \$$fieldn }'
-echo "#include <\$wanted>" > foo\$\$.c
-$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \
-$grep "^[      ]*#.*\$wanted" | \
-while read cline; do
-       name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\`
-       case "\$name" in
-       *[/\\\\]\$wanted) echo "\$name"; exit 1;;
-       *[\\\\/]\$wanted) echo "\$name"; exit 1;;
-       *) exit 2;;
-       esac;
-done;
-#
-# status = 0: grep returned 0 lines, case statement not executed
-# status = 1: headerfile found
-# status = 2: while loop executed, no headerfile found
-#
-status=\$?
-$rm -f foo\$\$.c;
-if test \$status -eq 1; then
-       exit 0;
+       $rm -f tmparch
+else
+       tarch="$osname"
 fi
-exit 1
-EOF
-chmod +x findhdr
-
-: define an alternate in-header-list? function
-inhdr='echo " "; td=$define; tu=$undef; yyy=$@;
-cont=true; xxf="echo \"<\$1> found.\" >&4";
-case $# in 2) xxnf="echo \"<\$1> NOT found.\" >&4";;
-*) xxnf="echo \"<\$1> NOT found, ...\" >&4";;
-esac;
-case $# in 4) instead=instead;; *) instead="at last";; esac;
-while $test "$cont"; do
-       xxx=`./findhdr $1`
-       var=$2; eval "was=\$$2";
-       if $test "$xxx" && $test -r "$xxx";
-       then eval $xxf;
-       eval "case \"\$$var\" in $undef) . ./whoa; esac"; eval "$var=\$td";
-               cont="";
-       else eval $xxnf;
-       eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu"; fi;
-       set $yyy; shift; shift; yyy=$@;
-       case $# in 0) cont="";;
-       2) xxf="echo \"but I found <\$1> $instead.\" >&4";
-               xxnf="echo \"and I did not find <\$1> either.\" >&4";;
-       *) xxf="echo \"but I found <\$1\> instead.\" >&4";
-               xxnf="echo \"there is no <\$1>, ...\" >&4";;
-       esac;
-done;
-while $test "$yyy";
-do set $yyy; var=$2; eval "was=\$$2";
-       eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu";
-       set $yyy; shift; shift; yyy=$@;
-done'
-
-: see if this is a malloc.h system
-set malloc.h i_malloc
-eval $inhdr
-
-: see if stdlib is available
-set stdlib.h i_stdlib
-eval $inhdr
-
-: determine which malloc to compile in
-echo " "
-case "$usemymalloc" in
-''|[yY]*|true|$define) dflt='y' ;;
-*)     dflt='n' ;;
+case "$myarchname" in
+''|"$tarch") ;;
+*)
+       echo "(Your architecture name used to be $myarchname.)"
+       archname=''
+       ;;
 esac
-rp="Do you wish to attempt to use the malloc that comes with $package?"
+myarchname="$tarch"
+case "$archname" in
+'') dflt="$tarch";;
+*) dflt="$archname";;
+esac
+rp='What is your architecture name'
 . ./myread
-usemymalloc="$ans"
-case "$ans" in
-y*|true)
-       usemymalloc='y'
-       mallocsrc='malloc.c'
-       mallocobj="malloc$_o"
-       d_mymalloc="$define"
-       case "$libs" in
-       *-lmalloc*)
-               : Remove malloc from list of libraries to use
-               echo "Removing unneeded -lmalloc from library list" >&4
-               set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'`
-               shift
-               libs="$*"
-               echo "libs = $libs" >&4
+archname="$ans"
+case "$usethreads" in
+$define)
+       echo "Threads selected." >&4
+       case "$archname" in
+        *-thread*) echo "...and architecture name already has -thread." >&4
+                ;;
+        *)      archname="$archname-thread"
+                echo "...setting architecture name to $archname." >&4
+                ;;
+        esac
+       ;;
+esac
+case "$usemultiplicity" in
+$define)
+       echo "Multiplicity selected." >&4
+       case "$archname" in
+        *-multi*) echo "...and architecture name already has -multi." >&4
+                ;;
+        *)      archname="$archname-multi"
+                echo "...setting architecture name to $archname." >&4
+                ;;
+        esac
+       ;;
+esac
+case "$use64bitint$use64bitall" in
+*"$define"*)
+       case "$archname64" in
+       '')
+               echo "This architecture is naturally 64-bit, not changing architecture name." >&4
+               ;;
+       *)
+               case "$use64bitint" in
+               "$define") echo "64 bit integers selected." >&4 ;;
+               esac
+               case "$use64bitall" in
+               "$define") echo "Maximal 64 bitness selected." >&4 ;;
+               esac
+               case "$archname" in
+               *-$archname64*) echo "...and architecture name already has $archname64." >&4
+                       ;;
+               *)      archname="$archname-$archname64"
+                       echo "...setting architecture name to $archname." >&4
+                       ;;
+               esac
+               ;;
+       esac
+esac
+case "$uselongdouble" in
+$define)
+       echo "Long doubles selected." >&4
+       case "$longdblsize" in
+       $doublesize)
+               "...but long doubles are equal to doubles, not changing architecture name." >&4
+               ;;
+       *)
+               case "$archname" in
+               *-ld*) echo "...and architecture name already has -ld." >&4
+                       ;;
+               *)      archname="$archname-ld"
+                       echo "...setting architecture name to $archname." >&4
+                       ;;
+               esac
                ;;
        esac
-       ;;
-*)
-       usemymalloc='n'
-       mallocsrc=''
-       mallocobj=''
-       d_mymalloc="$undef"
        ;;
 esac
 
-: compute the return types of malloc and free
-echo " "
-$cat >malloc.c <<END
-#$i_malloc I_MALLOC
-#$i_stdlib I_STDLIB
-#include <stdio.h>
-#include <sys/types.h>
-#ifdef I_MALLOC
-#include <malloc.h>
-#endif
-#ifdef I_STDLIB
-#include <stdlib.h>
-#endif
-#ifdef TRY_MALLOC
-void *malloc();
-#endif
-#ifdef TRY_FREE
-void free();
-#endif
-END
-case "$malloctype" in
+: determine root of directory hierarchy where package will be installed.
+case "$prefix" in
 '')
-       if $cc $ccflags -c -DTRY_MALLOC malloc.c >/dev/null 2>&1; then
-               malloctype='void *'
-       else
-               malloctype='char *'
-       fi
+       dflt=`./loc . /usr/local /usr/local /local /opt /usr`
+       ;;
+*)
+       dflt="$prefix"
        ;;
 esac
-echo "Your system wants malloc to return '$malloctype', it would seem." >&4
+$cat <<EOM
 
-case "$freetype" in
-'')
-       if $cc $ccflags -c -DTRY_FREE malloc.c >/dev/null 2>&1; then
-               freetype='void'
-       else
-               freetype='int'
-       fi
-       ;;
-esac
-echo "Your system uses $freetype free(), it would seem." >&4
-$rm -f malloc.[co]
-$cat <<EOM
-
-After $package is installed, you may wish to install various
-add-on modules and utilities.  Typically, these add-ons will
-be installed under $prefix with the rest
-of this package.  However, you may wish to install such add-ons
-elsewhere under a different prefix.
-
-If you do not wish to put everything under a single prefix, that's
-ok.  You will be prompted for the individual locations; this siteprefix
-is only used to suggest the defaults.
-
-The default should be fine for most people.
+By default, $package will be installed in $dflt/bin, manual pages
+under $dflt/man, etc..., i.e. with $dflt as prefix for all
+installation directories. Typically this is something like /usr/local.
+If you wish to have binaries under /usr/bin but other parts of the
+installation under /usr/local, that's ok: you will be prompted
+separately for each of the installation directories, the prefix being
+only used to set the defaults.
 
 EOM
-fn=d~+
-rp='Installation prefix to use for add-on modules and utilities?'
-: XXX Here might be another good place for an installstyle setting.
-case "$siteprefix" in
-'') dflt=$prefix ;;
-*)  dflt=$siteprefix ;;
-esac
+fn=d~
+rp='Installation prefix to use?'
 . ./getfile
-: XXX Prefixit unit does not yet support siteprefix and vendorprefix
-oldsiteprefix=''
-case "$siteprefix" in
+oldprefix=''
+case "$prefix" in
 '') ;;
-*)     case "$ans" in
+*)
+       case "$ans" in
        "$prefix") ;;
-       *) oldsiteprefix="$prefix";;
+       *) oldprefix="$prefix";;
        esac
        ;;
 esac
-siteprefix="$ans"
-siteprefixexp="$ansexp"
+prefix="$ans"
+prefixexp="$ansexp"
 
-: determine where site specific libraries go.
-: Usual default is /usr/local/lib/perl5/site_perl/$version
-: The default "style" setting is made in installstyle.U
-: XXX No longer works with Prefixit stuff.
-prog=`echo $package | $sed 's/-*[0-9.]*$//'`
-case "$sitelib" in
-'') case "$installstyle" in
-       *lib/perl5*) dflt=$siteprefix/lib/$package/site_$prog/$version ;;
-       *)       dflt=$siteprefix/lib/site_$prog/$version ;;
-       esac
-       ;;
-*)     dflt="$sitelib"
+: is AFS running?
+echo " "
+case "$afs" in
+$define|true)  afs=true ;;
+$undef|false)  afs=false ;;
+*)     if test -d /afs; then
+               afs=true
+       else
+               afs=false
+       fi
        ;;
 esac
+if $afs; then
+       echo "AFS may be running... I'll be extra cautious then..." >&4
+else
+       echo "AFS does not seem to be running..." >&4
+fi
+
+: determine installation prefix for where package is to be installed.
+if $afs; then 
 $cat <<EOM
 
-The installation process will create a directory for
-site-specific extensions and modules.  Most users find it convenient
-to place all site-specific files in this directory rather than in the
-main distribution directory.
+Since you are running AFS, I need to distinguish the directory in which
+files will reside from the directory in which they are installed (and from
+which they are presumably copied to the former directory by occult means).
 
 EOM
-fn=d~+
-rp='Pathname for the site-specific library files?'
-. ./getfile
-sitelib="$ans"
-sitelibexp="$ansexp"
-sitelib_stem=`echo "$sitelibexp" | sed "s,/$version$,,"`
-: Change installation prefix, if necessary.
-if $test X"$prefix" != X"$installprefix"; then
-       installsitelib=`echo $sitelibexp | $sed "s#^$prefix#$installprefix#"`
+       case "$installprefix" in
+       '') dflt=`echo $prefix | sed 's#^/afs/#/afs/.#'`;;
+       *) dflt="$installprefix";;
+       esac
 else
-       installsitelib="$sitelibexp"
+$cat <<EOM
+
+In some special cases, particularly when building $package for distribution,
+it is convenient to distinguish between the directory in which files should 
+be installed from the directory ($prefix) in which they 
+will eventually reside.  For most users, these two directories are the same.
+
+EOM
+       case "$installprefix" in
+       '') dflt=$prefix ;;
+       *) dflt=$installprefix;;
+       esac
 fi
+fn=d~
+rp='What installation prefix should I use for installing files?'
+. ./getfile
+installprefix="$ans"
+installprefixexp="$ansexp"
 
-: determine where site specific architecture-dependent libraries go.
-: sitelib  default is /usr/local/lib/perl5/site_perl/$version
-: sitearch default is /usr/local/lib/perl5/site_perl/$version/$archname
-: sitelib may have an optional trailing /share.
-case "$sitearch" in
-'')    dflt=`echo $sitelib | $sed 's,/share$,,'`
-       dflt="$dflt/$archname"
+: set the prefixit variable, to compute a suitable default value
+prefixit='case "$3" in
+""|none)
+       case "$oldprefix" in
+       "") eval "$1=\"\$$2\"";;
+       *)
+               case "$3" in
+               "") eval "$1=";;
+               none)
+                       eval "tp=\"\$$2\"";
+                       case "$tp" in
+                       ""|" ") eval "$1=\"\$$2\"";;
+                       *) eval "$1=";;
+                       esac;;
+               esac;;
+       esac;;
+*)
+       eval "tp=\"$oldprefix-\$$2-\""; eval "tp=\"$tp\"";
+       case "$tp" in
+       --|/*--|\~*--) eval "$1=\"$prefix/$3\"";;
+       /*-$oldprefix/*|\~*-$oldprefix/*)
+               eval "$1=\`echo \$$2 | sed \"s,^$oldprefix,$prefix,\"\`";;
+       *) eval "$1=\"\$$2\"";;
+       esac;;
+esac'
+
+
+: get the patchlevel
+echo " "
+echo "Getting the current patchlevel..." >&4
+if $test -r $rsrc/patchlevel.h;then
+       revision=`awk '/define[         ]+PERL_REVISION/ {print $3}' $rsrc/patchlevel.h`
+       patchlevel=`awk '/define[       ]+PERL_VERSION/ {print $3}' $rsrc/patchlevel.h`
+       subversion=`awk '/define[       ]+PERL_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+       api_revision=`awk '/define[     ]+PERL_API_REVISION/ {print $3}' $rsrc/patchlevel.h`
+       api_version=`awk '/define[      ]+PERL_API_VERSION/ {print $3}' $rsrc/patchlevel.h`
+       api_subversion=`awk '/define[   ]+PERL_API_SUBVERSION/ {print $3}' $rsrc/patchlevel.h`
+else
+       revision=0
+       patchlevel=0
+       subversion=0
+       api_revision=0
+       api_version=0
+       api_subversion=0
+fi
+$echo "(You have $package version $patchlevel subversion $subversion.)"
+case "$osname" in
+dos|vms)
+       : XXX Should be a Configure test for double-dots in filenames.
+       version=`echo $revision $patchlevel $subversion | \
+                $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
+       api_versionstring=`echo $api_revision $api_version $api_subversion | \
+                $awk '{ printf "%d_%d_%d\n", $1, $2, $3 }'`
        ;;
-*)     dflt="$sitearch"
+*)
+       version=`echo $revision $patchlevel $subversion | \
+                $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
+       api_versionstring=`echo $api_revision $api_version $api_subversion | \
+                $awk '{ printf "%d.%d.%d\n", $1, $2, $3 }'`
        ;;
 esac
-set sitearch sitearch none
+: Special case the 5.005_xx maintenance series, which used 5.005
+: without any subversion label as a subdirectory in $sitelib
+if test "${api_revision}${api_version}${api_subversion}" = "550"; then
+       api_versionstring='5.005'
+fi
+
+: determine installation style
+: For now, try to deduce it from prefix unless it is already set.
+: Reproduce behavior of 5.005 and earlier, maybe drop that in 5.7.
+case "$installstyle" in
+'')    case "$prefix" in
+               *perl*) dflt='lib';;
+               *) dflt='lib/perl5' ;;
+       esac
+       ;;
+*)     dflt="$installstyle" ;;
+esac
+: Probably not worth prompting for this since we prompt for all
+: the directories individually, and the prompt would be too long and
+: confusing anyway.
+installstyle=$dflt
+
+: determine where private library files go
+: Usual default is /usr/local/lib/perl5/$version.
+: Also allow things like /opt/perl/lib/$version, since 
+: /opt/perl/lib/perl5... would be redundant.
+: The default "style" setting is made in installstyle.U
+case "$installstyle" in
+*lib/perl5*) set dflt privlib lib/$package/$version ;;
+*)      set dflt privlib lib/$version ;;
+esac
 eval $prefixit
 $cat <<EOM
 
-The installation process will also create a directory for
-architecture-dependent site-specific extensions and modules.
+There are some auxiliary files for $package that need to be put into a
+private library directory that is accessible by everyone.
 
 EOM
 fn=d~+
-rp='Pathname for the site-specific architecture-dependent library files?'
+rp='Pathname where the private library files will reside?'
 . ./getfile
-sitearch="$ans"
-sitearchexp="$ansexp"
+privlib="$ans"
+privlibexp="$ansexp"
 : Change installation prefix, if necessary.
 if $test X"$prefix" != X"$installprefix"; then
-       installsitearch=`echo $sitearchexp | sed "s#^$prefix#$installprefix#"`
+       installprivlib=`echo $privlibexp | sed "s#^$prefix#$installprefix#"`
 else
-       installsitearch="$sitearchexp"
+       installprivlib="$privlibexp"
 fi
 
-$cat <<EOM
+: set the prefixup variable, to restore leading tilda escape
+prefixup='case "$prefixexp" in
+"$prefix") ;;
+*) eval "$1=\`echo \$$1 | sed \"s,^$prefixexp,$prefix,\"\`";;
+esac'
 
-The installation process will also create a directory for
-vendor-supplied add-ons.  Vendors who supply perl with their system
-may find it convenient to place all vendor-supplied files in this
-directory rather than in the main distribution directory.  This will
-ease upgrades between binary-compatible maintenance versions of perl.
+: determine where public architecture dependent libraries go
+set archlib archlib
+eval $prefixit
+: privlib default is /usr/local/lib/$package/$version
+: archlib default is /usr/local/lib/$package/$version/$archname
+: privlib may have an optional trailing /share.
+tdflt=`echo $privlib | $sed 's,/share$,,'`
+tdflt=$tdflt/$archname
+case "$archlib" in
+'')    dflt=$tdflt
+       ;;
+*)     dflt="$archlib"
+    ;;
+esac
+$cat <<EOM
 
-Of course you may also use these directories in whatever way you see
-fit.  For example, you might use them to access modules shared over a
-company-wide network.
-
-The default answer should be fine for most people.
-This causes further questions about vendor add-ons to be skipped
-and no vendor-specific directories will be configured for perl.
+$spackage contains architecture-dependent library files.  If you are
+sharing libraries in a heterogeneous environment, you might store
+these files in a separate location.  Otherwise, you can just include
+them with the rest of the public library files.
 
 EOM
-rp='Do you want to configure vendor-specific add-on directories?'
-case "$usevendorprefix" in
-define|true|[yY]*) dflt=y ;;
-*)     : User may have set vendorprefix directly on Configure command line.
-       case "$vendorprefix" in
-       ''|' ') dflt=n ;;
-       *)      dflt=y ;;
-       esac
-       ;;
-esac
-. ./myread
-case "$ans" in
-[yY]*) fn=d~+
-       rp='Installation prefix to use for vendor-supplied add-ons?'
-       case "$vendorprefix" in
-       '') dflt='' ;;
-       *)  dflt=$vendorprefix ;;
-       esac
-       . ./getfile
-       : XXX Prefixit unit does not yet support siteprefix and vendorprefix
-       oldvendorprefix=''
-       case "$vendorprefix" in
-       '') ;;
-       *)      case "$ans" in
-               "$prefix") ;;
-               *) oldvendorprefix="$prefix";;
-               esac
-               ;;
-       esac
-       usevendorprefix="$define"
-       vendorprefix="$ans"
-       vendorprefixexp="$ansexp"
-       ;;
-*)     usevendorprefix="$undef"
-       vendorprefix=''
-       vendorprefixexp=''
-       ;;
-esac
-
-case "$vendorprefix" in
-'')    d_vendorlib="$undef"
-       vendorlib=''
-       vendorlibexp=''
-       ;;
-*)     d_vendorlib="$define"
-       : determine where vendor-supplied modules go.
-       : Usual default is /usr/local/lib/perl5/vendor_perl/$version
-       case "$vendorlib" in
-       '')
-               prog=`echo $package | $sed 's/-*[0-9.]*$//'`
-               case "$installstyle" in
-               *lib/perl5*) dflt=$vendorprefix/lib/$package/vendor_$prog/$version ;;
-               *)           dflt=$vendorprefix/lib/vendor_$prog/$version ;;
-               esac
-               ;;
-       *)      dflt="$vendorlib"
-               ;;
-       esac
-       fn=d~+
-       rp='Pathname for the vendor-supplied library files?'
-       . ./getfile
-       vendorlib="$ans"
-       vendorlibexp="$ansexp"
-       ;;
-esac
-vendorlib_stem=`echo "$vendorlibexp" | sed "s,/$version$,,"`
+fn=d+~
+rp='Where do you want to put the public architecture-dependent libraries?'
+. ./getfile
+archlib="$ans"
+archlibexp="$ansexp"
+if $test X"$archlib" = X"$privlib"; then
+       d_archlib="$undef"
+else
+       d_archlib="$define"
+fi
 : Change installation prefix, if necessary.
 if $test X"$prefix" != X"$installprefix"; then
-       installvendorlib=`echo $vendorlibexp | $sed "s#^$prefix#$installprefix#"`
+       installarchlib=`echo $archlibexp | sed "s#^$prefix#$installprefix#"`
 else
-       installvendorlib="$vendorlibexp"
+       installarchlib="$archlibexp"
 fi
 
-case "$vendorprefix" in
-'')    d_vendorarch="$undef"
-       vendorarch=''
-       vendorarchexp=''
+
+: Binary compatibility with 5.005 is not possible for builds
+: with advanced features
+case "$usethreads$usemultiplicity" in
+*define*)
+       bincompat5005="$undef"
+       d_bincompat5005="$undef"
        ;;
-*)     d_vendorarch="$define"
-       : determine where vendor-supplied architecture-dependent libraries go.
-       : vendorlib  default is /usr/local/lib/perl5/vendor_perl/$version
-       : vendorarch default is /usr/local/lib/perl5/vendor_perl/$version/$archname
-       : vendorlib may have an optional trailing /share.
-       case "$vendorarch" in
-       '')     dflt=`echo $vendorlib | $sed 's,/share$,,'`
-               dflt="$dflt/$archname"
+*)     $cat <<EOM
+
+This version of Perl can be compiled for binary compatibility with 5.005.
+If you decide to do so, you will be able to continue using most of the
+extensions that were compiled for Perl 5.005.
+
+EOM
+       case "$bincompat5005$d_bincompat5005" in
+       *"$undef"*) dflt=n ;;
+       *) dflt=y ;;
+       esac
+       rp='Binary compatibility with Perl 5.005?'
+       . ./myread
+       case "$ans" in
+       y*) val="$define" ;;
+       *)  val="$undef" ;;
+       esac
+       set d_bincompat5005
+       eval $setvar
+       case "$d_bincompat5005" in
+       "$define")
+               bincompat5005="$define"
+               ;;
+       *)      bincompat5005="$undef"
+               d_bincompat5005="$undef"
                ;;
-       *)      dflt="$vendorarch" ;;
        esac
-       fn=d~+
-       rp='Pathname for vendor-supplied architecture-dependent files?'
-       . ./getfile
-       vendorarch="$ans"
-       vendorarchexp="$ansexp"
        ;;
 esac
-: Change installation prefix, if necessary.
-if $test X"$prefix" != X"$installprefix"; then
-       installvendorarch=`echo $vendorarchexp | sed "s#^$prefix#$installprefix#"`
-else
-       installvendorarch="$vendorarchexp"
-fi
 
-: Final catch-all directories to search
-$cat <<EOM
 
-Lastly, you can have perl look in other directories for extensions and
-modules in addition to those already specified.
-These directories will be searched after 
-       $sitearch 
-       $sitelib 
-EOM
-test X"$vendorlib" != "X" && echo '    ' $vendorlib
-test X"$vendorarch" != "X" && echo '   ' $vendorarch
-echo ' '
-case "$otherlibdirs" in
-''|' ') dflt='none' ;;
-*)     dflt="$otherlibdirs" ;;
-esac
+: see if setuid scripts can be secure
 $cat <<EOM
-Enter a colon-separated set of extra paths to include in perl's @INC
-search path, or enter 'none' for no extra paths.
+
+Some kernels have a bug that prevents setuid #! scripts from being
+secure.  Some sites have disabled setuid #! scripts because of this.
+
+First let's decide if your kernel supports secure setuid #! scripts.
+(If setuid #! scripts would be secure but have been disabled anyway,
+don't say that they are secure if asked.)
 
 EOM
 
-rp='Colon-separated list of additional directories for perl to search?'
-. ./myread
-case "$ans" in
-' '|''|none)   otherlibdirs=' ' ;;     
-*)     otherlibdirs="$ans" ;;
-esac
-case "$otherlibdirs" in
-' ') val=$undef ;;
-*)     val=$define ;;
-esac
-set d_perl_otherlibdirs
-eval $setvar
+val="$undef"
+if $test -d /dev/fd; then
+       echo "#!$ls" >reflect
+       chmod +x,u+s reflect
+       ./reflect >flect 2>&1
+       if $contains "/dev/fd" flect >/dev/null; then
+               echo "Congratulations, your kernel has secure setuid scripts!" >&4
+               val="$define"
+       else
+               $cat <<EOM
+If you are not sure if they are secure, I can check but I'll need a
+username and password different from the one you are using right now.
+If you don't have such a username or don't want me to test, simply
+enter 'none'.
 
-: Cruising for prototypes
-echo " "
-echo "Checking out function prototypes..." >&4
-$cat >prototype.c <<'EOCP'
-int main(int argc, char *argv[]) {
-       exit(0);}
-EOCP
-if $cc $ccflags -c prototype.c >prototype.out 2>&1 ; then
-       echo "Your C compiler appears to support function prototypes."
-       val="$define"
+EOM
+               rp='Other username to test security of setuid scripts with?'
+               dflt='none'
+               . ./myread
+               case "$ans" in
+               n|none)
+                       case "$d_suidsafe" in
+                       '')     echo "I'll assume setuid scripts are *not* secure." >&4
+                               dflt=n;;
+                       "$undef")
+                               echo "Well, the $hint value is *not* secure." >&4
+                               dflt=n;;
+                       *)      echo "Well, the $hint value *is* secure." >&4
+                               dflt=y;;
+                       esac
+                       ;;
+               *)
+                       $rm -f reflect flect
+                       echo "#!$ls" >reflect
+                       chmod +x,u+s reflect
+                       echo >flect
+                       chmod a+w flect
+                       echo '"su" will (probably) prompt you for '"$ans's password."
+                       su $ans -c './reflect >flect'
+                       if $contains "/dev/fd" flect >/dev/null; then
+                               echo "Okay, it looks like setuid scripts are secure." >&4
+                               dflt=y
+                       else
+                               echo "I don't think setuid scripts are secure." >&4
+                               dflt=n
+                       fi
+                       ;;
+               esac
+               rp='Does your kernel have *secure* setuid scripts?'
+               . ./myread
+               case "$ans" in
+               [yY]*)  val="$define";;
+               *)      val="$undef";;
+               esac
+       fi
 else
-       echo "Your C compiler doesn't seem to understand function prototypes."
+       echo "I don't think setuid scripts are secure (no /dev/fd directory)." >&4
+       echo "(That's for file descriptors, not floppy disks.)"
        val="$undef"
 fi
-set prototype
+set d_suidsafe
 eval $setvar
-$rm -f prototype*
 
-case "$prototype" in
-"$define") ;;
-*)     ansi2knr='ansi2knr'
-       echo " "
-       cat <<EOM >&4
-
-$me:  FATAL ERROR:
-This version of $package can only be compiled by a compiler that 
-understands function prototypes.  Unfortunately, your C compiler 
-       $cc $ccflags
-doesn't seem to understand them.  Sorry about that.
-
-If GNU cc is available for your system, perhaps you could try that instead.  
+$rm -f reflect flect
 
-Eventually, we hope to support building Perl with pre-ANSI compilers.
-If you would like to help in that effort, please contact <perlbug@perl.org>.
+: now see if they want to do setuid emulation
+echo " "
+val="$undef"
+case "$d_suidsafe" in
+"$define")
+       val="$undef"
+       echo "No need to emulate SUID scripts since they are secure here." >& 4
+       ;;
+*)
+       $cat <<EOM
+Some systems have disabled setuid scripts, especially systems where
+setuid scripts cannot be secure.  On systems where setuid scripts have
+been disabled, the setuid/setgid bits on scripts are currently
+useless.  It is possible for $package to detect those bits and emulate
+setuid/setgid in a secure fashion.  This emulation will only work if
+setuid scripts have been disabled in your kernel.
 
-Aborting Configure now.
 EOM
-       exit 2
+       case "$d_dosuid" in
+       "$define") dflt=y ;;
+       *) dflt=n ;;
+       esac
+       rp="Do you want to do setuid/setgid emulation?"
+       . ./myread
+       case "$ans" in
+       [yY]*)  val="$define";;
+       *)      val="$undef";;
+       esac
        ;;
 esac
+set d_dosuid
+eval $setvar
 
-: determine where public executables go
+: determine filename position in cpp output
 echo " "
-set dflt bin bin
-eval $prefixit
-fn=d~
-rp='Pathname where the public executables will reside?'
-. ./getfile
-if $test "X$ansexp" != "X$binexp"; then
-       installbin=''
-fi
-bin="$ans"
-binexp="$ansexp"
-: Change installation prefix, if necessary.
-: XXX Bug? -- ignores Configure -Dinstallprefix setting.
-if $test X"$prefix" != X"$installprefix"; then
-       installbin=`echo $binexp | sed "s#^$prefix#$installprefix#"`
-else
-       installbin="$binexp"
-fi
-
-: Find perl5.005 or later.
-echo "Looking for a previously installed perl5.005 or later... "
-case "$perl5" in
-'')    for tdir in `echo "$binexp:$PATH" | $sed "s/$path_sep/ /g"`; do
-               : Check if this perl is recent and can load a simple module
-               if $test -x $tdir/perl && $tdir/perl -Mless -e 'use 5.005;' >/dev/null 2>&1; then
-                       perl5=$tdir/perl
-                       break;
-               elif $test -x $tdir/perl5 && $tdir/perl5 -Mless -e 'use 5.005;' >/dev/null 2>&1; then
-                       perl5=$tdir/perl
-                       break;
+echo "Computing filename position in cpp output for #include directives..." >&4
+echo '#include <stdio.h>' > foo.c
+$cat >fieldn <<EOF
+$startsh
+$cppstdin $cppflags $cppminus <foo.c 2>/dev/null | \
+$grep '^[      ]*#.*stdio\.h' | \
+while read cline; do
+       pos=1
+       set \$cline
+       while $test \$# -gt 0; do
+               if $test -r \`echo \$1 | $tr -d '"'\`; then
+                       echo "\$pos"
+                       exit 0
                fi
+               shift
+               pos=\`expr \$pos + 1\`
        done
-       ;;
-*)     perl5="$perl5"
-       ;;
-esac
-case "$perl5" in
-'')    echo "None found.  That's ok.";;
-*)     echo "Using $perl5." ;;
+done
+EOF
+chmod +x fieldn
+fieldn=`./fieldn`
+$rm -f foo.c fieldn
+case $fieldn in
+'') pos='???';;
+1) pos=first;;
+2) pos=second;;
+3) pos=third;;
+*) pos="${fieldn}th";;
 esac
+echo "Your cpp writes the filename in the $pos field of the line."
 
-: Determine list of previous versions to include in @INC
-$cat > getverlist <<EOPL
-#!$perl5 -w
-use File::Basename;
-\$api_versionstring = "$api_versionstring";
-\$version = "$version";
-\$stem = "$sitelib_stem";
-\$archname = "$archname";
-EOPL
-       $cat >> getverlist <<'EOPL'
-# Can't have leading @ because metaconfig interprets it as a command!
-;@inc_version_list=();
-# XXX Redo to do opendir/readdir? 
-if (-d $stem) {
-    chdir($stem);
-    ;@candidates = glob("5.*");
-}
-else {
-    ;@candidates = ();
-}
-
-# XXX ToDo:  These comparisons must be reworked when two-digit
-# subversions come along, so that 5.7.10 compares as greater than
-# 5.7.3!  By that time, hope that 5.6.x is sufficiently
-# widespread that we can use the built-in version vectors rather
-# than reinventing them here.  For 5.6.0, however, we must
-# assume this script will likely be run by 5.005_0x.  --AD 1/2000.
-foreach $d (@candidates) {
-    if ($d lt $version) {
-       if ($d ge $api_versionstring) {
-           unshift(@inc_version_list, grep { -d } "$d/$archname", $d);
-       }
-       elsif ($d ge "5.005") {
-           unshift(@inc_version_list, grep { -d } $d);
-       }
-    }
-    else {
-       # Skip newer version.  I.e. don't look in
-       # 5.7.0 if we're installing 5.6.1.
-    }
-}
-
-if (@inc_version_list) {
-    print join(' ', @inc_version_list);
-}
-else {
-    # Blank space to preserve value for next Configure run.
-    print " ";
-}
-EOPL
-chmod +x getverlist
-case "$inc_version_list" in
-'')    if test -x "$perl5"; then
-               dflt=`$perl5 getverlist`
-       else
-               dflt='none'
+: locate header file
+$cat >findhdr <<EOF
+$startsh
+wanted=\$1
+name=''
+for usrincdir in $usrinc
+do
+       if test -f \$usrincdir/\$wanted; then
+               echo "\$usrincdir/\$wanted"
+               exit 0
        fi
-       ;;
-$undef) dflt='none' ;;
-*)  dflt="$inc_version_list" ;;
-esac
-case "$dflt" in
-''|' ') dflt=none ;;
-esac
-$cat <<'EOM'
+done
+awkprg='{ print \$$fieldn }'
+echo "#include <\$wanted>" > foo\$\$.c
+$cppstdin $cppminus $cppflags < foo\$\$.c 2>/dev/null | \
+$grep "^[      ]*#.*\$wanted" | \
+while read cline; do
+       name=\`echo \$cline | $awk "\$awkprg" | $tr -d '"'\`
+       case "\$name" in
+       *[/\\\\]\$wanted) echo "\$name"; exit 1;;
+       *[\\\\/]\$wanted) echo "\$name"; exit 1;;
+       *) exit 2;;
+       esac;
+done;
+#
+# status = 0: grep returned 0 lines, case statement not executed
+# status = 1: headerfile found
+# status = 2: while loop executed, no headerfile found
+#
+status=\$?
+$rm -f foo\$\$.c;
+if test \$status -eq 1; then
+       exit 0;
+fi
+exit 1
+EOF
+chmod +x findhdr
 
-In order to ease the process of upgrading, this version of perl 
-can be configured to use modules built and installed with earlier 
-versions of perl that were installed under $prefix.  Specify here
-the list of earlier versions that this version of perl should check.
-If Configure detected no earlier versions of perl installed under
-$prefix, then the list will be empty.  Answer 'none' to tell perl
-to not search earlier versions.
+: define an alternate in-header-list? function
+inhdr='echo " "; td=$define; tu=$undef; yyy=$@;
+cont=true; xxf="echo \"<\$1> found.\" >&4";
+case $# in 2) xxnf="echo \"<\$1> NOT found.\" >&4";;
+*) xxnf="echo \"<\$1> NOT found, ...\" >&4";;
+esac;
+case $# in 4) instead=instead;; *) instead="at last";; esac;
+while $test "$cont"; do
+       xxx=`./findhdr $1`
+       var=$2; eval "was=\$$2";
+       if $test "$xxx" && $test -r "$xxx";
+       then eval $xxf;
+       eval "case \"\$$var\" in $undef) . ./whoa; esac"; eval "$var=\$td";
+               cont="";
+       else eval $xxnf;
+       eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu"; fi;
+       set $yyy; shift; shift; yyy=$@;
+       case $# in 0) cont="";;
+       2) xxf="echo \"but I found <\$1> $instead.\" >&4";
+               xxnf="echo \"and I did not find <\$1> either.\" >&4";;
+       *) xxf="echo \"but I found <\$1\> instead.\" >&4";
+               xxnf="echo \"there is no <\$1>, ...\" >&4";;
+       esac;
+done;
+while $test "$yyy";
+do set $yyy; var=$2; eval "was=\$$2";
+       eval "case \"\$$var\" in $define) . ./whoa; esac"; eval "$var=\$tu";
+       set $yyy; shift; shift; yyy=$@;
+done'
 
-The default should almost always be sensible, so if you're not sure,
-just accept the default.
-EOM
+: see if this is a malloc.h system
+set malloc.h i_malloc
+eval $inhdr
 
-rp='List of earlier versions to include in @INC?'
-. ./myread
-case "$ans" in
-[Nn]one|''|' ') inc_version_list=' ' ;;
-*) inc_version_list="$ans" ;;
-esac
-case "$inc_version_list" in
-''|' ') 
-       inc_version_list_init='0';;
-*)     inc_version_list_init=`echo $inc_version_list |
-               $sed -e 's/^/"/' -e 's/ /","/g' -e 's/$/",0/'`
-       ;;
-esac
-$rm -f getverlist
-
-: determine whether to install perl also as /usr/bin/perl
+: see if stdlib is available
+set stdlib.h i_stdlib
+eval $inhdr
 
+: determine which malloc to compile in
 echo " "
-if $test -d /usr/bin -a "X$installbin" != X/usr/bin; then
-       $cat <<EOM
-Many scripts expect perl to be installed as /usr/bin/perl.
-I can install the perl you are about to compile also as /usr/bin/perl
-(in addition to $installbin/perl).
-EOM
-       case "$installusrbinperl" in
-       "$undef"|[nN]*) dflt='n';;
-       *)              dflt='y';;
-       esac
-       rp="Do you want to install perl as /usr/bin/perl?"
-       . ./myread
-       case "$ans" in
-       [yY]*)  val="$define";;
-       *)      val="$undef" ;;
+case "$usemymalloc" in
+''|[yY]*|true|$define) dflt='y' ;;
+*)     dflt='n' ;;
+esac
+rp="Do you wish to attempt to use the malloc that comes with $package?"
+. ./myread
+usemymalloc="$ans"
+case "$ans" in
+y*|true)
+       usemymalloc='y'
+       mallocsrc='malloc.c'
+       mallocobj="malloc$_o"
+       d_mymalloc="$define"
+       case "$libs" in
+       *-lmalloc*)
+               : Remove malloc from list of libraries to use
+               echo "Removing unneeded -lmalloc from library list" >&4
+               set `echo X $libs | $sed -e 's/-lmalloc / /' -e 's/-lmalloc$//'`
+               shift
+               libs="$*"
+               echo "libs = $libs" >&4
+               ;;
        esac
-else
-       val="$undef"
-fi
-set installusrbinperl
-eval $setvar
+       ;;
+*)
+       usemymalloc='n'
+       mallocsrc=''
+       mallocobj=''
+       d_mymalloc="$undef"
+       ;;
+esac
 
+: compute the return types of malloc and free
 echo " "
-echo "Checking for GNU C Library..." >&4
-cat >gnulibc.c <<EOM
+$cat >malloc.c <<END
+#$i_malloc I_MALLOC
+#$i_stdlib I_STDLIB
 #include <stdio.h>
-int main()
-{
-#ifdef __GLIBC__
-    exit(0);
-#else
-    exit(1);
+#include <sys/types.h>
+#ifdef I_MALLOC
+#include <malloc.h>
 #endif
-}
-EOM
-set gnulibc
-if eval $compile_ok && ./gnulibc; then
-       val="$define"
-       echo "You are using the GNU C Library"
-else
-       val="$undef"
-       echo "You are not using the GNU C Library"
-fi
-$rm -f gnulibc*
-set d_gnulibc
-eval $setvar
-
-: see if nm is to be used to determine whether a symbol is defined or not
-case "$usenm" in
+#ifdef I_STDLIB
+#include <stdlib.h>
+#endif
+#ifdef TRY_MALLOC
+void *malloc();
+#endif
+#ifdef TRY_FREE
+void free();
+#endif
+END
+case "$malloctype" in
 '')
-       dflt=''
-       case "$d_gnulibc" in
-       "$define")
-               echo " "
-               echo "nm probably won't work on the GNU C Library." >&4
-               dflt=n
-               ;;
-       esac
-       case "$dflt" in
-       '') 
-               if $test "$osname" = aix -a ! -f /lib/syscalls.exp; then
-                       echo " "
-                       echo "Whoops!  This is an AIX system without /lib/syscalls.exp!" >&4
-                       echo "'nm' won't be sufficient on this sytem." >&4
-                       dflt=n
-               fi
-               ;;
-       esac
-       case "$dflt" in
-       '') dflt=`$egrep 'inlibc|csym' $rsrc/Configure | wc -l 2>/dev/null`
-               if $test $dflt -gt 20; then
-                       dflt=y
-               else
-                       dflt=n
-               fi
-               ;;
-       esac
+       if $cc $ccflags -c -DTRY_MALLOC malloc.c >/dev/null 2>&1; then
+               malloctype='void *'
+       else
+               malloctype='char *'
+       fi
        ;;
-*)
-       case "$usenm" in
-       true|$define) dflt=y;;
-       *) dflt=n;;
-       esac
+esac
+echo "Your system wants malloc to return '$malloctype', it would seem." >&4
+
+case "$freetype" in
+'')
+       if $cc $ccflags -c -DTRY_FREE malloc.c >/dev/null 2>&1; then
+               freetype='void'
+       else
+               freetype='int'
+       fi
        ;;
 esac
+echo "Your system uses $freetype free(), it would seem." >&4
+$rm -f malloc.[co]
 $cat <<EOM
 
-I can use $nm to extract the symbols from your C libraries. This
-is a time consuming task which may generate huge output on the disk (up
-to 3 megabytes) but that should make the symbols extraction faster. The
-alternative is to skip the 'nm' extraction part and to compile a small
-test program instead to determine whether each symbol is present. If
-you have a fast C compiler and/or if your 'nm' output cannot be parsed,
-this may be the best solution.
-
-You probably shouldn't let me use 'nm' if you are using the GNU C Library.
+After $package is installed, you may wish to install various
+add-on modules and utilities.  Typically, these add-ons will
+be installed under $prefix with the rest
+of this package.  However, you may wish to install such add-ons
+elsewhere under a different prefix.
 
-EOM
-rp="Shall I use $nm to extract C symbols from the libraries?"
-. ./myread
-case "$ans" in
-[Nn]*) usenm=false;;
-*) usenm=true;;
-esac
+If you do not wish to put everything under a single prefix, that's
+ok.  You will be prompted for the individual locations; this siteprefix
+is only used to suggest the defaults.
 
-runnm=$usenm
-case "$reuseval" in
-true) runnm=false;;
-esac
+The default should be fine for most people.
 
-: nm options which may be necessary
-case "$nm_opt" in
-'') if $test -f /mach_boot; then
-               nm_opt=''       # Mach
-       elif $test -d /usr/ccs/lib; then
-               nm_opt='-p'     # Solaris (and SunOS?)
-       elif $test -f /dgux; then
-               nm_opt='-p'     # DG-UX
-       elif $test -f /lib64/rld; then
-               nm_opt='-p'     # 64-bit Irix
-       else
-               nm_opt=''
-       fi;;
+EOM
+fn=d~+
+rp='Installation prefix to use for add-on modules and utilities?'
+: XXX Here might be another good place for an installstyle setting.
+case "$siteprefix" in
+'') dflt=$prefix ;;
+*)  dflt=$siteprefix ;;
 esac
-
-: nm options which may be necessary for shared libraries but illegal
-: for archive libraries.  Thank you, Linux.
-case "$nm_so_opt" in
-'')    case "$myuname" in
-       *linux*)
-               if $nm --help | $grep 'dynamic' > /dev/null 2>&1; then
-                       nm_so_opt='--dynamic'
-               fi
-               ;;
+. ./getfile
+: XXX Prefixit unit does not yet support siteprefix and vendorprefix
+oldsiteprefix=''
+case "$siteprefix" in
+'') ;;
+*)     case "$ans" in
+       "$prefix") ;;
+       *) oldsiteprefix="$prefix";;
        esac
        ;;
 esac
+siteprefix="$ans"
+siteprefixexp="$ansexp"
 
-case "$runnm" in
-true)
-: get list of predefined functions in a handy place
-echo " "
-case "$libc" in
-'') libc=unknown
-       case "$libs" in
-       *-lc_s*) libc=`./loc libc_s$_a $libc $libpth`
+: determine where site specific libraries go.
+: Usual default is /usr/local/lib/perl5/site_perl/$version
+: The default "style" setting is made in installstyle.U
+: XXX No longer works with Prefixit stuff.
+prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+case "$sitelib" in
+'') case "$installstyle" in
+       *lib/perl5*) dflt=$siteprefix/lib/$package/site_$prog/$version ;;
+       *)       dflt=$siteprefix/lib/site_$prog/$version ;;
        esac
        ;;
+*)     dflt="$sitelib"
+       ;;
 esac
-libnames='';
-case "$libs" in
-'') ;;
-*)  for thislib in $libs; do
-       case "$thislib" in
-       -lc|-lc_s)
-               : Handle C library specially below.
-               ;;
-       -l*)
-               thislib=`echo $thislib | $sed -e 's/^-l//'`
-               if try=`./loc lib$thislib.$so.'*' X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc lib$thislib.$so X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc lib$thislib$_a X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc $thislib$_a X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc lib$thislib X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc $thislib X $libpth`; $test -f "$try"; then
-                       :
-               elif try=`./loc Slib$thislib$_a X $xlibpth`; $test -f "$try"; then
-                       :
-               else
-                       try=''
-               fi
-               libnames="$libnames $try"
-               ;;
-       *) libnames="$libnames $thislib" ;;
-       esac
-       done
-       ;;
-esac
-xxx=normal
-case "$libc" in
-unknown)
-       set /lib/libc.$so
-       for xxx in $libpth; do
-               $test -r $1 || set $xxx/libc.$so
-               : The messy sed command sorts on library version numbers.
-               $test -r $1 || \
-                       set `echo blurfl; echo $xxx/libc.$so.[0-9]* | \
-                       tr ' ' $trnl | egrep -v '\.[A-Za-z]*$' | $sed -e '
-                               h
-                               s/[0-9][0-9]*/0000&/g
-                               s/0*\([0-9][0-9][0-9][0-9][0-9]\)/\1/g
-                               G
-                               s/\n/ /' | \
-                        sort | $sed -e 's/^.* //'`
-               eval set \$$#
-       done
-       $test -r $1 || set /usr/ccs/lib/libc.$so
-       $test -r $1 || set /lib/libsys_s$_a
+$cat <<EOM
+
+The installation process will create a directory for
+site-specific extensions and modules.  Most users find it convenient
+to place all site-specific files in this directory rather than in the
+main distribution directory.
+
+EOM
+fn=d~+
+rp='Pathname for the site-specific library files?'
+. ./getfile
+sitelib="$ans"
+sitelibexp="$ansexp"
+sitelib_stem=`echo "$sitelibexp" | sed "s,/$version$,,"`
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+       installsitelib=`echo $sitelibexp | $sed "s#^$prefix#$installprefix#"`
+else
+       installsitelib="$sitelibexp"
+fi
+
+: determine where site specific architecture-dependent libraries go.
+: sitelib  default is /usr/local/lib/perl5/site_perl/$version
+: sitearch default is /usr/local/lib/perl5/site_perl/$version/$archname
+: sitelib may have an optional trailing /share.
+case "$sitearch" in
+'')    dflt=`echo $sitelib | $sed 's,/share$,,'`
+       dflt="$dflt/$archname"
        ;;
-*)
-       set blurfl
+*)     dflt="$sitearch"
        ;;
 esac
-if $test -r "$1"; then
-       echo "Your (shared) C library seems to be in $1."
-       libc="$1"
-elif $test -r /lib/libc && $test -r /lib/clib; then
-       echo "Your C library seems to be in both /lib/clib and /lib/libc."
-       xxx=apollo
-       libc='/lib/clib /lib/libc'
-       if $test -r /lib/syslib; then
-               echo "(Your math library is in /lib/syslib.)"
-               libc="$libc /lib/syslib"
-       fi
-elif $test -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
-       echo "Your C library seems to be in $libc, as you said before."
-elif $test -r $incpath/usr/lib/libc$_a; then
-       libc=$incpath/usr/lib/libc$_a;
-       echo "Your C library seems to be in $libc.  That's fine."
-elif $test -r /lib/libc$_a; then
-       libc=/lib/libc$_a;
-       echo "Your C library seems to be in $libc.  You're normal."
-else
-       if tans=`./loc libc$_a blurfl/dyick $libpth`; $test -r "$tans"; then
-               :
-       elif tans=`./loc libc blurfl/dyick $libpth`; $test -r "$tans"; then
-               libnames="$libnames "`./loc clib blurfl/dyick $libpth`
-       elif tans=`./loc clib blurfl/dyick $libpth`; $test -r "$tans"; then
-               :
-       elif tans=`./loc Slibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
-               :
-       elif tans=`./loc Mlibc$_a blurfl/dyick $xlibpth`; $test -r "$tans"; then
-               :
-       else
-               tans=`./loc Llibc$_a blurfl/dyick $xlibpth`
-       fi
-       if $test -r "$tans"; then
-               echo "Your C library seems to be in $tans, of all places."
-               libc=$tans
-       else
-               libc='blurfl'
-       fi
-fi
-if $test $xxx = apollo -o -r "$libc" || (test -h "$libc") >/dev/null 2>&1; then
-       dflt="$libc"
-       cat <<EOM
+set sitearch sitearch none
+eval $prefixit
+$cat <<EOM
 
-If the guess above is wrong (which it might be if you're using a strange
-compiler, or your machine supports multiple models), you can override it here.
+The installation process will also create a directory for
+architecture-dependent site-specific extensions and modules.
 
 EOM
+fn=d~+
+rp='Pathname for the site-specific architecture-dependent library files?'
+. ./getfile
+sitearch="$ans"
+sitearchexp="$ansexp"
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+       installsitearch=`echo $sitearchexp | sed "s#^$prefix#$installprefix#"`
 else
-       dflt=''
-       echo $libpth | tr ' ' $trnl | sort | uniq > libpath
-       cat >&4 <<EOM
-I can't seem to find your C library.  I've looked in the following places:
+       installsitearch="$sitearchexp"
+fi
 
-EOM
-       $sed 's/^/      /' libpath
-       cat <<EOM
+$cat <<EOM
 
-None of these seems to contain your C library. I need to get its name...
+The installation process will also create a directory for
+vendor-supplied add-ons.  Vendors who supply perl with their system
+may find it convenient to place all vendor-supplied files in this
+directory rather than in the main distribution directory.  This will
+ease upgrades between binary-compatible maintenance versions of perl.
 
-EOM
-fi
-fn=f
-rp='Where is your C library?'
-. ./getfile
-libc="$ans"
+Of course you may also use these directories in whatever way you see
+fit.  For example, you might use them to access modules shared over a
+company-wide network.
 
-echo " "
-echo $libc $libnames | tr ' ' $trnl | sort | uniq > libnames
-set X `cat libnames`
-shift
-xxx=files
-case $# in 1) xxx=file; esac
-echo "Extracting names from the following $xxx for later perusal:" >&4
-echo " "
-$sed 's/^/     /' libnames >&4
-echo " "
-$echo $n "This may take a while...$c" >&4
+The default answer should be fine for most people.
+This causes further questions about vendor add-ons to be skipped
+and no vendor-specific directories will be configured for perl.
 
-for file in $*; do
-       case $file in
-       *$so*) $nm $nm_so_opt $nm_opt $file 2>/dev/null;;
-       *) $nm $nm_opt $file 2>/dev/null;;
+EOM
+rp='Do you want to configure vendor-specific add-on directories?'
+case "$usevendorprefix" in
+define|true|[yY]*) dflt=y ;;
+*)     : User may have set vendorprefix directly on Configure command line.
+       case "$vendorprefix" in
+       ''|' ') dflt=n ;;
+       *)      dflt=y ;;
        esac
-done >libc.tmp
+       ;;
+esac
+. ./myread
+case "$ans" in
+[yY]*) fn=d~+
+       rp='Installation prefix to use for vendor-supplied add-ons?'
+       case "$vendorprefix" in
+       '') dflt='' ;;
+       *)  dflt=$vendorprefix ;;
+       esac
+       . ./getfile
+       : XXX Prefixit unit does not yet support siteprefix and vendorprefix
+       oldvendorprefix=''
+       case "$vendorprefix" in
+       '') ;;
+       *)      case "$ans" in
+               "$prefix") ;;
+               *) oldvendorprefix="$prefix";;
+               esac
+               ;;
+       esac
+       usevendorprefix="$define"
+       vendorprefix="$ans"
+       vendorprefixexp="$ansexp"
+       ;;
+*)     usevendorprefix="$undef"
+       vendorprefix=''
+       vendorprefixexp=''
+       ;;
+esac
 
-$echo $n ".$c"
-$grep fprintf libc.tmp > libc.ptf
-xscan='eval "<libc.ptf $com >libc.list"; $echo $n ".$c" >&4'
-xrun='eval "<libc.tmp $com >libc.list"; echo "done" >&4'
-xxx='[ADTSIW]'
-if com="$sed -n -e 's/__IO//' -e 's/^.* $xxx  *_[_.]*//p' -e 's/^.* $xxx  *//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^__*//' -e 's/^\([a-zA-Z_0-9$]*\).*xtern.*/\1/p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e '/|UNDEF/d' -e '/FUNC..GL/s/^.*|__*//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^.* D __*//p' -e 's/^.* D //p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^_//' -e 's/^\([a-zA-Z_0-9]*\).*xtern.*text.*/\1/p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$grep '|' | $sed -n -e '/|COMMON/d' -e '/|DATA/d' \
-                               -e '/ file/d' -e 's/^\([^       ]*\).*/\1/p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^.*|FUNC |GLOB .*|//p' -e 's/^.*|FUNC |WEAK .*|//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^__//' -e '/|Undef/d' -e '/|Proc/s/ .*//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^.*|Proc .*|Text *| *//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e '/Def. Text/s/.* \([^ ]*\)\$/\1/p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/^[-0-9a-f ]*_\(.*\)=.*/\1/p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="$sed -n -e 's/.*\.text n\ \ \ \.//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
-elif com="sed -n -e 's/^__.*//' -e 's/[       ]*D[    ]*[0-9]*.*//p'";\
-       eval $xscan;\
-       $contains '^fprintf$' libc.list >/dev/null 2>&1; then
-               eval $xrun
+case "$vendorprefix" in
+'')    d_vendorlib="$undef"
+       vendorlib=''
+       vendorlibexp=''
+       ;;
+*)     d_vendorlib="$define"
+       : determine where vendor-supplied modules go.
+       : Usual default is /usr/local/lib/perl5/vendor_perl/$version
+       case "$vendorlib" in
+       '')
+               prog=`echo $package | $sed 's/-*[0-9.]*$//'`
+               case "$installstyle" in
+               *lib/perl5*) dflt=$vendorprefix/lib/$package/vendor_$prog/$version ;;
+               *)           dflt=$vendorprefix/lib/vendor_$prog/$version ;;
+               esac
+               ;;
+       *)      dflt="$vendorlib"
+               ;;
+       esac
+       fn=d~+
+       rp='Pathname for the vendor-supplied library files?'
+       . ./getfile
+       vendorlib="$ans"
+       vendorlibexp="$ansexp"
+       ;;
+esac
+vendorlib_stem=`echo "$vendorlibexp" | sed "s,/$version$,,"`
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+       installvendorlib=`echo $vendorlibexp | $sed "s#^$prefix#$installprefix#"`
 else
-       $nm -p $* 2>/dev/null >libc.tmp
-       $grep fprintf libc.tmp > libc.ptf
-       if com="$sed -n -e 's/^.* [ADTSIW]  *_[_.]*//p' -e 's/^.* [ADTSIW] //p'";\
-               eval $xscan; $contains '^fprintf$' libc.list >/dev/null 2>&1
-       then
-               nm_opt='-p'
-               eval $xrun
-       else
-               echo " "
-               echo "$nm didn't seem to work right. Trying $ar instead..." >&4
-               com=''
-               if $ar t $libc > libc.tmp && $contains '^fprintf$' libc.tmp >/dev/null 2>&1; then
-                       for thisname in $libnames $libc; do
-                               $ar t $thisname >>libc.tmp
-                       done
-                       $sed -e "s/\\$_o\$//" < libc.tmp > libc.list
-                       echo "Ok." >&4
-               elif test "X$osname" = "Xos2" && $ar tv $libc > libc.tmp; then
-                       # Repeat libc to extract forwarders to DLL entries too
-                       for thisname in $libnames $libc; do
-                               $ar tv $thisname >>libc.tmp
-                               # Revision 50 of EMX has bug in $ar.
-                               # it will not extract forwarders to DLL entries
-                               # Use emximp which will extract exactly them.
-                               emximp -o tmp.imp $thisname \
-                                   2>/dev/null && \
-                                   $sed -e 's/^\([_a-zA-Z0-9]*\) .*$/\1/p' \
-                                   < tmp.imp >>libc.tmp
-                               $rm tmp.imp
-                       done
-                       $sed -e "s/\\$_o\$//" -e 's/^ \+//' < libc.tmp > libc.list
-                       echo "Ok." >&4
-               else
-                       echo "$ar didn't seem to work right." >&4
-                       echo "Maybe this is a Cray...trying bld instead..." >&4
-                       if bld t $libc | $sed -e 's/.*\///' -e "s/\\$_o:.*\$//" > libc.list
-                       then
-                               for thisname in $libnames; do
-                                       bld t $libnames | \
-                                       $sed -e 's/.*\///' -e "s/\\$_o:.*\$//" >>libc.list
-                                       $ar t $thisname >>libc.tmp
-                               done
-                               echo "Ok." >&4
-                       else
-                               echo "That didn't work either.  Giving up." >&4
-                               exit 1
-                       fi
-               fi
-       fi
+       installvendorlib="$vendorlibexp"
 fi
-nm_extract="$com"
-if $test -f /lib/syscalls.exp; then
+
+case "$vendorprefix" in
+'')    d_vendorarch="$undef"
+       vendorarch=''
+       vendorarchexp=''
+       ;;
+*)     d_vendorarch="$define"
+       : determine where vendor-supplied architecture-dependent libraries go.
+       : vendorlib  default is /usr/local/lib/perl5/vendor_perl/$version
+       : vendorarch default is /usr/local/lib/perl5/vendor_perl/$version/$archname
+       : vendorlib may have an optional trailing /share.
+       case "$vendorarch" in
+       '')     dflt=`echo $vendorlib | $sed 's,/share$,,'`
+               dflt="$dflt/$archname"
+               ;;
+       *)      dflt="$vendorarch" ;;
+       esac
+       fn=d~+
+       rp='Pathname for vendor-supplied architecture-dependent files?'
+       . ./getfile
+       vendorarch="$ans"
+       vendorarchexp="$ansexp"
+       ;;
+esac
+: Change installation prefix, if necessary.
+if $test X"$prefix" != X"$installprefix"; then
+       installvendorarch=`echo $vendorarchexp | sed "s#^$prefix#$installprefix#"`
+else
+       installvendorarch="$vendorarchexp"
+fi
+
+: Final catch-all directories to search
+$cat <<EOM
+
+Lastly, you can have perl look in other directories for extensions and
+modules in addition to those already specified.
+These directories will be searched after 
+       $sitearch 
+       $sitelib 
+EOM
+test X"$vendorlib" != "X" && echo '    ' $vendorlib
+test X"$vendorarch" != "X" && echo '   ' $vendorarch
+echo ' '
+case "$otherlibdirs" in
+''|' ') dflt='none' ;;
+*)     dflt="$otherlibdirs" ;;
+esac
+$cat <<EOM
+Enter a colon-separated set of extra paths to include in perl's @INC
+search path, or enter 'none' for no extra paths.
+
+EOM
+
+rp='Colon-separated list of additional directories for perl to search?'
+. ./myread
+case "$ans" in
+' '|''|none)   otherlibdirs=' ' ;;     
+*)     otherlibdirs="$ans" ;;
+esac
+case "$otherlibdirs" in
+' ') val=$undef ;;
+*)     val=$define ;;
+esac
+set d_perl_otherlibdirs
+eval $setvar
+
+: Cruising for prototypes
+echo " "
+echo "Checking out function prototypes..." >&4
+$cat >prototype.c <<'EOCP'
+int main(int argc, char *argv[]) {
+       exit(0);}
+EOCP
+if $cc $ccflags -c prototype.c >prototype.out 2>&1 ; then
+       echo "Your C compiler appears to support function prototypes."
+       val="$define"
+else
+       echo "Your C compiler doesn't seem to understand function prototypes."
+       val="$undef"
+fi
+set prototype
+eval $setvar
+$rm -f prototype*
+
+case "$prototype" in
+"$define") ;;
+*)     ansi2knr='ansi2knr'
        echo " "
-       echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
-       $sed -n 's/^\([^        ]*\)[   ]*syscall[0-9]*$/\1/p' /lib/syscalls.exp >>libc.list
+       cat <<EOM >&4
+
+$me:  FATAL ERROR:
+This version of $package can only be compiled by a compiler that 
+understands function prototypes.  Unfortunately, your C compiler 
+       $cc $ccflags
+doesn't seem to understand them.  Sorry about that.
+
+If GNU cc is available for your system, perhaps you could try that instead.  
+
+Eventually, we hope to support building Perl with pre-ANSI compilers.
+If you would like to help in that effort, please contact <perlbug@perl.org>.
+
+Aborting Configure now.
+EOM
+       exit 2
+       ;;
+esac
+
+: determine where public executables go
+echo " "
+set dflt bin bin
+eval $prefixit
+fn=d~
+rp='Pathname where the public executables will reside?'
+. ./getfile
+if $test "X$ansexp" != "X$binexp"; then
+       installbin=''
 fi
-;;
+bin="$ans"
+binexp="$ansexp"
+: Change installation prefix, if necessary.
+: XXX Bug? -- ignores Configure -Dinstallprefix setting.
+if $test X"$prefix" != X"$installprefix"; then
+       installbin=`echo $binexp | sed "s#^$prefix#$installprefix#"`
+else
+       installbin="$binexp"
+fi
+
+: Find perl5.005 or later.
+echo "Looking for a previously installed perl5.005 or later... "
+case "$perl5" in
+'')    for tdir in `echo "$binexp:$PATH" | $sed "s/$path_sep/ /g"`; do
+               : Check if this perl is recent and can load a simple module
+               if $test -x $tdir/perl && $tdir/perl -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+                       perl5=$tdir/perl
+                       break;
+               elif $test -x $tdir/perl5 && $tdir/perl5 -Mless -e 'use 5.005;' >/dev/null 2>&1; then
+                       perl5=$tdir/perl
+                       break;
+               fi
+       done
+       ;;
+*)     perl5="$perl5"
+       ;;
+esac
+case "$perl5" in
+'')    echo "None found.  That's ok.";;
+*)     echo "Using $perl5." ;;
 esac
-$rm -f libnames libpath
 
-: see if dld is available
-set dld.h i_dld
-eval $inhdr
+: Determine list of previous versions to include in @INC
+$cat > getverlist <<EOPL
+#!$perl5 -w
+use File::Basename;
+\$api_versionstring = "$api_versionstring";
+\$version = "$version";
+\$stem = "$sitelib_stem";
+\$archname = "$archname";
+EOPL
+       $cat >> getverlist <<'EOPL'
+# Can't have leading @ because metaconfig interprets it as a command!
+;@inc_version_list=();
+# XXX Redo to do opendir/readdir? 
+if (-d $stem) {
+    chdir($stem);
+    ;@candidates = glob("5.*");
+}
+else {
+    ;@candidates = ();
+}
 
-: is a C symbol defined?
-csym='tlook=$1;
-case "$3" in
--v) tf=libc.tmp; tc=""; tdc="";;
--a) tf=libc.tmp; tc="[0]"; tdc="[]";;
-*) tlook="^$1\$"; tf=libc.list; tc="()"; tdc="()";;
-esac;
-tx=yes;
-case "$reuseval-$4" in
-true-) ;;
-true-*) tx=no; eval "tval=\$$4"; case "$tval" in "") tx=yes;; esac;;
-esac;
-case "$tx" in
-yes)
-       case "$runnm" in
-       true)
-               if $contains $tlook $tf >/dev/null 2>&1;
-               then tval=true;
-               else tval=false;
-               fi;;
-       *)
-               echo "int main() { extern short $1$tdc; printf(\"%hd\", $1$tc); }" > t.c;
-               if $cc $optimize $ccflags $ldflags -o t t.c $libs >/dev/null 2>&1;
-               then tval=true;
-               else tval=false;
-               fi;
-               $rm -f t t.c;;
-       esac;;
-*)
-       case "$tval" in
-       $define) tval=true;;
-       *) tval=false;;
-       esac;;
-esac;
-eval "$2=$tval"'
+# XXX ToDo:  These comparisons must be reworked when two-digit
+# subversions come along, so that 5.7.10 compares as greater than
+# 5.7.3!  By that time, hope that 5.6.x is sufficiently
+# widespread that we can use the built-in version vectors rather
+# than reinventing them here.  For 5.6.0, however, we must
+# assume this script will likely be run by 5.005_0x.  --AD 1/2000.
+foreach $d (@candidates) {
+    if ($d lt $version) {
+       if ($d ge $api_versionstring) {
+           unshift(@inc_version_list, grep { -d } "$d/$archname", $d);
+       }
+       elsif ($d ge "5.005") {
+           unshift(@inc_version_list, grep { -d } $d);
+       }
+    }
+    else {
+       # Skip newer version.  I.e. don't look in
+       # 5.7.0 if we're installing 5.6.1.
+    }
+}
 
-: define an is-in-libc? function
-inlibc='echo " "; td=$define; tu=$undef;
-sym=$1; var=$2; eval "was=\$$2";
-tx=yes;
-case "$reuseval$was" in
-true) ;;
-true*) tx=no;;
-esac;
-case "$tx" in
-yes)
-       set $sym tres -f;
-       eval $csym;
-       case "$tres" in
-       true)
-               echo "$sym() found." >&4;
-               case "$was" in $undef) . ./whoa; esac; eval "$var=\$td";;
-       *)
-               echo "$sym() NOT found." >&4;
-               case "$was" in $define) . ./whoa; esac; eval "$var=\$tu";;
-       esac;;
-*)
-       case "$was" in
-       $define) echo "$sym() found." >&4;;
-       *) echo "$sym() NOT found." >&4;;
-       esac;;
-esac'
+if (@inc_version_list) {
+    print join(' ', @inc_version_list);
+}
+else {
+    # Blank space to preserve value for next Configure run.
+    print " ";
+}
+EOPL
+chmod +x getverlist
+case "$inc_version_list" in
+'')    if test -x "$perl5"; then
+               dflt=`$perl5 getverlist`
+       else
+               dflt='none'
+       fi
+       ;;
+$undef) dflt='none' ;;
+*)  dflt="$inc_version_list" ;;
+esac
+case "$dflt" in
+''|' ') dflt=none ;;
+esac
+case "$dflt" in
+5.005) case "$bincompat5005" in
+       $define|true|[yY]*) ;;
+       *) dflt=none ;;
+       esac
+       ;;
+esac
+$cat <<'EOM'
+
+In order to ease the process of upgrading, this version of perl 
+can be configured to use modules built and installed with earlier 
+versions of perl that were installed under $prefix.  Specify here
+the list of earlier versions that this version of perl should check.
+If Configure detected no earlier versions of perl installed under
+$prefix, then the list will be empty.  Answer 'none' to tell perl
+to not search earlier versions.
+
+The default should almost always be sensible, so if you're not sure,
+just accept the default.
+EOM
+
+rp='List of earlier versions to include in @INC?'
+. ./myread
+case "$ans" in
+[Nn]one|''|' ') inc_version_list=' ' ;;
+*) inc_version_list="$ans" ;;
+esac
+case "$inc_version_list" in
+''|' ') 
+       inc_version_list_init='0';;
+*)     inc_version_list_init=`echo $inc_version_list |
+               $sed -e 's/^/"/' -e 's/ /","/g' -e 's/$/",0/'`
+       ;;
+esac
+$rm -f getverlist
+
+: determine whether to install perl also as /usr/bin/perl
+
+echo " "
+if $test -d /usr/bin -a "X$installbin" != X/usr/bin; then
+       $cat <<EOM
+Many scripts expect perl to be installed as /usr/bin/perl.
+I can install the perl you are about to compile also as /usr/bin/perl
+(in addition to $installbin/perl).
+EOM
+       case "$installusrbinperl" in
+       "$undef"|[nN]*) dflt='n';;
+       *)              dflt='y';;
+       esac
+       rp="Do you want to install perl as /usr/bin/perl?"
+       . ./myread
+       case "$ans" in
+       [yY]*)  val="$define";;
+       *)      val="$undef" ;;
+       esac
+else
+       val="$undef"
+fi
+set installusrbinperl
+eval $setvar
+
+: see if dld is available
+set dld.h i_dld
+eval $inhdr
 
 : see if dlopen exists
 xxx_runnm="$runnm"
@@ -6351,13 +6376,13 @@ EOM
                        hpux)   dflt='+z' ;;
                        next)   dflt='none' ;;
                        irix*)  dflt='-KPIC' ;;
-                       svr4*|esix*|solaris) dflt='-KPIC' ;;
+                       svr4*|esix*|solaris|nonstopux) dflt='-KPIC' ;;
                        sunos)  dflt='-pic' ;;
                        *)      dflt='none' ;;
                    esac
                        ;;
                *)  case "$osname" in
-                       svr4*|esix*|solaris) dflt='-fPIC' ;;
+                       svr4*|esix*|solaris|nonstopux) dflt='-fPIC' ;;
                        *)      dflt='-fpic' ;;
                    esac ;;
            esac ;;
@@ -6433,7 +6458,7 @@ EOM
                        next)  dflt='none' ;;
                        solaris) dflt='-G' ;;
                        sunos) dflt='-assert nodefinitions' ;;
-                       svr4*|esix*) dflt="-G $ldflags" ;;
+                       svr4*|esix*|nonstopux) dflt="-G $ldflags" ;;
                *)     dflt='none' ;;
                        esac
                        ;;
@@ -6447,7 +6472,7 @@ EOM
        esac
        for thisflag in $ldflags; do
                case "$thisflag" in
-               -L*)
+               -L*|-R*)
                        case " $dflt " in
                        *" $thisflag "*) ;;
                        *) dflt="$dflt $thisflag" ;;
@@ -6508,7 +6533,7 @@ $undef)
        ;;
 *)     case "$useshrplib" in
        '')     case "$osname" in
-               svr4*|dgux|dynixptx|esix|powerux|beos|cygwin*)
+               svr4*|nonstopux|dgux|dynixptx|esix|powerux|beos|cygwin*)
                        dflt=y
                        also='Building a shared libperl is required for dynamic loading to work on your system.'
                        ;;
@@ -6622,7 +6647,7 @@ case "$shrpdir" in
 *)     $cat >&4 <<EOM
 WARNING:  Use of the shrpdir variable for the installation location of
 the shared $libperl is not supported.  It was never documented and
-will not work in this version.  Let me (perlbug@perl.com)
+will not work in this version.  Let me (perlbug@perl.org)
 know of any problems this may cause.
 
 EOM
@@ -6713,6 +6738,24 @@ case "$ldlibpthname" in
 none)  ldlibpthname='' ;;
 esac
 
+: determine where manual pages are on this system
+echo " "
+case "$sysman" in
+'') 
+       syspath='/usr/man/man1 /usr/man/mann /usr/man/manl /usr/man/local/man1'
+       syspath="$syspath /usr/man/u_man/man1 /usr/share/man/man1"
+       syspath="$syspath /usr/catman/u_man/man1 /usr/man/l_man/man1"
+       syspath="$syspath /usr/local/man/u_man/man1 /usr/local/man/l_man/man1"
+       syspath="$syspath /usr/man/man.L /local/man/man1 /usr/local/man/man1"
+       sysman=`./loc . /usr/man/man1 $syspath`
+       ;;
+esac
+if $test -d "$sysman"; then
+       echo "System manual is in $sysman." >&4
+else
+       echo "Could not find manual pages in source form." >&4
+fi
+
 : determine where manual pages go
 set man1dir man1dir none
 eval $prefixit
@@ -7079,18 +7122,23 @@ case "$myhostname" in
                                        /[       ]$myhostname[  . ]/p" > hosts
                }
                tmp_re="[       . ]"
-               $test x`$awk "/[0-9].*[  ]$myhostname$tmp_re/ { sum++ }
+               if $test -f hosts; then
+                       $test x`$awk "/[0-9].*[  ]$myhostname$tmp_re/ { sum++ }
                             END { print sum }" hosts` = x1 || tmp_re="[         ]"
-               dflt=.`$awk "/[0-9].*[   ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
-                       hosts | $sort | $uniq | \
-                       $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
-               case `$echo X$dflt` in
-               X*\ *)  echo "(Several hosts in /etc/hosts matched hostname)"
+                       dflt=.`$awk "/[0-9].*[   ]$myhostname$tmp_re/ {for(i=2; i<=NF;i++) print \\\$i}" \
+                               hosts | $sort | $uniq | \
+                               $sed -n -e "s/$myhostname\.\([-a-zA-Z0-9_.]\)/\1/p"`
+                       case `$echo X$dflt` in
+                       X*\ *)  echo "(Several hosts in the database matched hostname)"
+                               dflt=.
+                               ;;
+                       X.) echo "(You do not have fully-qualified names in the hosts database)"
+                               ;;
+                       esac
+               else
+                       echo "(I cannot locate a hosts database anywhere)"
                        dflt=.
-                       ;;
-               X.) echo "(You do not have fully-qualified names in /etc/hosts)"
-                       ;;
-               esac
+               fi
                case "$dflt" in
                .)
                        tans=`./loc resolv.conf X /etc /usr/etc`
@@ -7206,7 +7254,7 @@ $cat <<EOM
 If you or somebody else will be maintaining perl at your site, please
 fill in the correct e-mail address here so that they may be contacted
 if necessary. Currently, the "perlbug" program included with perl
-will send mail to this address in addition to perlbug@perl.com. You may
+will send mail to this address in addition to perlbug@perl.org. You may
 enter "none" for no administrator.
 
 EOM
@@ -7342,67 +7390,6 @@ else
        installsitebin="$sitebinexp"
 fi
 
-: see if sqrtl exists
-set sqrtl d_sqrtl
-eval $inlibc
-
-case "$ccflags" in
-*-DUSE_LONG_DOUBLE*|*-DUSE_MORE_BITS*) uselongdouble="$define" ;;
-esac
-
-case "$uselongdouble" in
-$define|true|[yY]*)    dflt='y';;
-*) dflt='n';;
-esac
-cat <<EOM
-
-Perl can be built to take advantage of long doubles which
-(if available) may give more accuracy and range for floating point numbers.
-
-If this doesn't make any sense to you, just accept the default '$dflt'.
-EOM
-rp='Try to use long doubles if available?'
-. ./myread
-case "$ans" in
-y|Y)   val="$define"   ;;
-*)      val="$undef"   ;;
-esac
-set uselongdouble
-eval $setvar
-
-case "$uselongdouble" in
-true|[yY]*) uselongdouble="$define" ;;
-esac
-
-case "$uselongdouble" in
-$define)
-: Look for a hint-file generated 'call-back-unit'.  If the
-: user has specified that long doubles should be used,
-: we may need to set or change some other defaults.
-       if $test -f uselongdouble.cbu; then
-               echo "Your platform has some specific hints for long doubles, using them..."
-               . ./uselongdouble.cbu
-       else
-               $cat <<EOM
-(Your platform doesn't have any specific hints for long doubles.)
-EOM
-       fi
-       ;;
-esac
-
-case "$uselongdouble:$d_sqrtl" in
-$define:$undef)
-               $cat <<EOM >&4
-
-*** You requested the use of long doubles but you do not seem to have
-*** the mathematic functions for long doubles.  I'm disabling the use
-*** of long doubles.
-
-EOM
-       uselongdouble=$undef
-       ;;
-esac
-
 case "$useperlio" in
 $define|true|[yY]*)    dflt='y';;
 *) dflt='n';;
@@ -7458,85 +7445,28 @@ else
        installvendorbin="$vendorbinexp"
 fi
 
-: see if qgcvt exists
-set qgcvt d_qgcvt
-eval $inlibc
-
-: check for length of double
+: determine whether to only install version-specific parts.
 echo " "
-case "$doublesize" in
-'')
-       echo "Checking to see how big your double precision numbers are..." >&4
-       $cat >try.c <<'EOCP'
-#include <stdio.h>
-int main()
-{
-    printf("%d\n", (int)sizeof(double));
-    exit(0);
-}
-EOCP
-       set try
-       if eval $compile_ok; then
-               doublesize=`./try`
-               echo "Your double is $doublesize bytes long."
-       else
-               dflt='8'
-               echo "(I can't seem to compile the test program.  Guessing...)"
-               rp="What is the size of a double precision number (in bytes)?"
-               . ./myread
-               doublesize="$ans"
-       fi
-       ;;
+$cat <<EOM
+Do you want to install only the version-specific parts of the perl
+distribution?  Usually you do *not* want to do this.
+EOM
+case "$versiononly" in
+"$define"|[Yy]*|true) dflt='y' ;;
+*) dflt='n';
 esac
-$rm -f try.c try
-
-: check for long doubles
-echo " "
-echo "Checking to see if you have long double..." >&4
-echo 'int main() { long double x = 7.0; }' > try.c
-set try
-if eval $compile; then
-       val="$define"
-       echo "You have long double."
-else
-       val="$undef"
-       echo "You do not have long double."
-fi
-$rm try.*
-set d_longdbl
+rp="Do you want to install only the version-specific parts of perl?"
+. ./myread
+case "$ans" in
+[yY]*) val="$define";;
+*)     val="$undef" ;;
+esac
+set versiononly
 eval $setvar
 
-: check for length of long double
-case "${d_longdbl}${longdblsize}" in
-$define)
-       echo " "
-       echo "Checking to see how big your long doubles are..." >&4
-       $cat >try.c <<'EOCP'
-#include <stdio.h>
-int main()
-{
-       printf("%d\n", sizeof(long double));
-}
-EOCP
-       set try
-       set try
-       if eval $compile; then
-               longdblsize=`./try$exe_ext`
-               echo "Your long doubles are $longdblsize bytes long."
-       else
-               dflt='8'
-               echo " "
-               echo "(I can't seem to compile the test program.  Guessing...)" >&4
-               rp="What is the size of a long double (in bytes)?"
-               . ./myread
-               longdblsize="$ans"
-       fi
-       if $test "X$doublesize" = "X$longdblsize"; then
-               echo "(That isn't any different from an ordinary double.)"
-       fi      
-       ;;
-esac
-$rm -f try.* try
+: see if qgcvt exists
+set qgcvt d_qgcvt
+eval $inlibc
 
 echo " "
 
@@ -7559,7 +7489,7 @@ EOCP
                case "$yyy" in
                123.456)
                        sPRIfldbl='"f"'; sPRIgldbl='"g"'; sPRIeldbl='"e"';
-                       sPRIFldbl='"F"'; sPRIGldbl='"G"'; sPRIEldbl='"E"';
+                       sPRIFUldbl='"F"'; sPRIGUldbl='"G"'; sPRIEUldbl='"E"';
                        echo "We will use %f."
                        ;;
                esac
@@ -7581,7 +7511,7 @@ EOCP
                case "$yyy" in
                123.456)
                        sPRIfldbl='"llf"'; sPRIgldbl='"llg"'; sPRIeldbl='"lle"';
-                       sPRIFldbl='"llF"'; sPRIGldbl='"llG"'; sPRIEldbl='"llE"';
+                       sPRIFUldbl='"llF"'; sPRIGUldbl='"llG"'; sPRIEUldbl='"llE"';
                        echo "We will use %llf."
                        ;;
                esac
@@ -7603,7 +7533,7 @@ EOCP
                case "$yyy" in
                123.456)
                        sPRIfldbl='"Lf"'; sPRIgldbl='"Lg"'; sPRIeldbl='"Le"';
-                       sPRIFldbl='"LF"'; sPRIGldbl='"LG"'; sPRIEldbl='"LE"';
+                       sPRIFUldbl='"LF"'; sPRIGUldbl='"LG"'; sPRIEUldbl='"LE"';
                        echo "We will use %Lf."
                        ;;
                esac
@@ -7625,7 +7555,7 @@ EOCP
                case "$yyy" in
                123.456)
                        sPRIfldbl='"lf"'; sPRIgldbl='"lg"'; sPRIeldbl='"le"';
-                       sPRIFldbl='"lF"'; sPRIGldbl='"lG"'; sPRIEldbl='"lE"';
+                       sPRIFUldbl='"lF"'; sPRIGUldbl='"lG"'; sPRIEUldbl='"lE"';
                        echo "We will use %lf."
                        ;;
                esac
@@ -7634,6 +7564,8 @@ fi
 
 if $test X"$sPRIfldbl" = X; then
        echo "Cannot figure out how to print long doubles." >&4
+else
+       sSCNfldbl=$sPRIfldbl    # expect consistency
 fi
 
 $rm -f try try.*
@@ -7642,28 +7574,29 @@ fi # d_longdbl
 
 case "$sPRIfldbl" in
 '')    d_PRIfldbl="$undef"; d_PRIgldbl="$undef"; d_PRIeldbl="$undef"; 
-       d_PRIFldbl="$undef"; d_PRIGldbl="$undef"; d_PRIEldbl="$undef"; 
+       d_PRIFUldbl="$undef"; d_PRIGUldbl="$undef"; d_PRIEUldbl="$undef"; 
+       d_SCNfldbl="$undef";
        ;;
 *)     d_PRIfldbl="$define"; d_PRIgldbl="$define"; d_PRIeldbl="$define"; 
-       d_PRIFldbl="$define"; d_PRIGldbl="$define"; d_PRIEldbl="$define"; 
+       d_PRIFUldbl="$define"; d_PRIGUldbl="$define"; d_PRIEUldbl="$define"; 
+       d_SCNfldbl="$define";
        ;;
 esac
 
 : Check how to convert floats to strings.
-if test "X$d_Gconvert" = X; then
-       echo " "
-       echo "Checking for an efficient way to convert floats to strings."
-       echo " " > try.c
-       case "$uselongdouble" in
-       "$define") echo "#define USE_LONG_DOUBLE" >>try.c ;;
-       esac
-       case "$d_longdbl" in
-       "$define") echo "#define HAS_LONG_DOUBLE" >>try.c ;;
-       esac
-       case "$d_PRIgldbl" in
-       "$define") echo "#define HAS_PRIgldbl"    >>try.c ;;
-       esac
-       $cat >>try.c <<EOP
+echo " "
+echo "Checking for an efficient way to convert floats to strings."
+echo " " > try.c
+case "$uselongdouble" in
+"$define") echo "#define USE_LONG_DOUBLE" >>try.c ;;
+esac
+case "$d_longdbl" in
+"$define") echo "#define HAS_LONG_DOUBLE" >>try.c ;;
+esac
+case "$d_PRIgldbl" in
+"$define") echo "#define HAS_PRIgldbl"    >>try.c ;;
+esac
+$cat >>try.c <<EOP
 #ifdef TRY_gconvert
 #define Gconvert(x,n,t,b) gconvert((x),(n),(t),(b))
 char *myname = "gconvert";
@@ -7758,49 +7691,58 @@ int main()
        Gconvert((DOUBLETYPE)-100000.0, 8, 0, buf); 
        checkit("-100000", buf);
 
+       Gconvert((DOUBLETYPE)123.456, 8, 0, buf); 
+       checkit("123.456", buf);
+
        exit(0);
 }
 EOP
-       case "$d_Gconvert" in
-       gconvert*) xxx_list='gconvert gcvt sprintf' ;;
-       gcvt*) xxx_list='gcvt gconvert sprintf' ;;
-       sprintf*) xxx_list='sprintf gconvert gcvt' ;;
-       *) xxx_list='gconvert gcvt sprintf' ;;
-       esac
-
-        case "$d_longdbl$uselongdouble$d_qgcvt" in
-        "$define$define$define") xxx_list="`echo $xxx_list|sed 's/gcvt/qgcvt gcvt/'`" ;;
-       esac
+case "$d_Gconvert" in
+gconvert*) xxx_list='gconvert gcvt sprintf' ;;
+gcvt*) xxx_list='gcvt gconvert sprintf' ;;
+sprintf*) xxx_list='sprintf gconvert gcvt' ;;
+*) xxx_list='gconvert gcvt sprintf' ;;
+esac
+
+case "$d_longdbl$uselongdouble$d_PRIgldbl" in
+"$define$define$define")
+    # for long doubles prefer first qgcvt, then sprintf
+    xxx_list="`echo $xxx_list|sed s/sprintf//`" 
+    xxx_list="sprintf $xxx_list"
+    case "$d_qgcvt" in
+    "$define") xxx_list="qgcvt $xxx_list" ;;
+    esac
+    ;;
+esac
 
-       for xxx_convert in $xxx_list; do
-               echo "Trying $xxx_convert..."
-               $rm -f try try$_o
-               set try -DTRY_$xxx_convert
-               if eval $compile; then
-                       echo "$xxx_convert() found." >&4
-                       if ./try; then
-                               echo "I'll use $xxx_convert to convert floats into a string." >&4
-                               break;
-                       else
-                               echo "...But $xxx_convert didn't work as I expected."
-                       fi
+for xxx_convert in $xxx_list; do
+       echo "Trying $xxx_convert..."
+       $rm -f try try$_o
+       set try -DTRY_$xxx_convert
+       if eval $compile; then
+               echo "$xxx_convert() found." >&4
+               if ./try; then
+                       echo "I'll use $xxx_convert to convert floats into a string." >&4
+                       break;
                else
-                       echo "$xxx_convert NOT found." >&4
+                       echo "...But $xxx_convert didn't work as I expected."
                fi
-       done
-               
-       case "$xxx_convert" in
-       gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
-       gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
-       qgcvt) d_Gconvert='qgcvt((x),(n),(b))' ;;
-       *) case "$uselongdouble$d_longdbl$d_PRIgldbl" in
-          "$define$define$define")
-             d_Gconvert="sprintf((b),\"%.*$sPRIgldbl\",(n),(x))" ;;
-          *) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;
-          esac
-          ;;  
-       esac
-fi
+       else
+               echo "$xxx_convert NOT found." >&4
+       fi
+done
+       
+case "$xxx_convert" in
+gconvert) d_Gconvert='gconvert((x),(n),(t),(b))' ;;
+gcvt) d_Gconvert='gcvt((x),(n),(b))' ;;
+qgcvt) d_Gconvert='qgcvt((x),(n),(b))' ;;
+*) case "$uselongdouble$d_longdbl$d_PRIgldbl" in
+   "$define$define$define")
+      d_Gconvert="sprintf((b),\"%.*\"$sPRIgldbl,(n),(x))" ;;
+   *) d_Gconvert='sprintf((b),"%.*g",(n),(x))' ;;
+   esac
+   ;;  
+esac
 
 : Initialize h_fcntl
 h_fcntl=false
@@ -7833,15 +7775,15 @@ int main() {
 EOCP
        : check sys/file.h first, no particular reason here
        if $test `./findhdr sys/file.h` && \
-               $cc $cppflags -DI_SYS_FILE -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_SYS_FILE access.c >/dev/null 2>&1 ; then
                h_sysfile=true;
                echo "<sys/file.h> defines the *_OK access constants." >&4
        elif $test `./findhdr fcntl.h` && \
-               $cc $cppflags -DI_FCNTL -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_FCNTL access.c >/dev/null 2>&1 ; then
                h_fcntl=true;
                echo "<fcntl.h> defines the *_OK access constants." >&4
        elif $test `./findhdr unistd.h` && \
-               $cc $cppflags -DI_UNISTD -o access access.c >/dev/null 2>&1 ; then
+               $cc -o access $cppflags -DI_UNISTD access.c >/dev/null 2>&1 ; then
                echo "<unistd.h> defines the *_OK access constants." >&4
        else
                echo "I can't find the four *_OK access constants--I'll use mine." >&4
@@ -7931,10 +7873,10 @@ int main()
        exit(1);
 }
 EOP
-       if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       if $cc -o set -DTRY_BSD_PGRP $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo "You have to use getpgrp(pid) instead of getpgrp()." >&4
                val="$define"
-       elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       elif $cc -o set $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo "You have to use getpgrp() instead of getpgrp(pid)." >&4
                val="$undef"
        else
@@ -7993,10 +7935,10 @@ int main()
        exit(1);
 }
 EOP
-       if $cc -DTRY_BSD_PGRP $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       if $cc -o set -DTRY_BSD_PGRP $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo 'You have to use setpgrp(pid,pgrp) instead of setpgrp().' >&4
                val="$define"
-       elif $cc $ccflags $ldflags -o set set.c $libs >/dev/null 2>&1 && ./set; then
+       elif $cc -o set $ccflags $ldflags set.c $libs >/dev/null 2>&1 && ./set; then
                echo 'You have to use setpgrp() instead of setpgrp(pid,pgrp).' >&4
                val="$undef"
        else
@@ -8548,8 +8490,8 @@ EOM
        : Call the object file tmp-dyna.o in case dlext=o.
        if $cc $ccflags $cccdlflags -c dyna.c > /dev/null 2>&1 && 
                mv dyna${_o} tmp-dyna${_o} > /dev/null 2>&1 && 
-               $ld $lddlflags -o dyna.$dlext tmp-dyna${_o} > /dev/null 2>&1 && 
-               $cc $ccflags -o fred $ldflags $cccdlflags $ccdlflags fred.c $libs > /dev/null 2>&1; then
+               $ld -o dyna.$dlext $lddlflags tmp-dyna${_o} > /dev/null 2>&1 && 
+               $cc -o fred $ccflags $ldflags $cccdlflags $ccdlflags fred.c $libs > /dev/null 2>&1; then
                xxx=`./fred`
                case $xxx in
                1)      echo "Test program failed using dlopen." >&4
@@ -10338,7 +10280,6 @@ EOP
 esac
 
 
-
 : check for off64_t
 echo " "
 echo "Checking to see if you have off64_t..." >&4
@@ -11196,10 +11137,19 @@ $define)
        *) dflt='n';;
        esac
        echo "$package can use the sfio library, but it is experimental."
+       case "$useperlio" in
+       "$undef")
+           echo "For sfio also the PerlIO abstraction layer is needed."
+           echo "Earlier you said you wouldn't want that."
+           ;;
+       esac
        rp="You seem to have sfio available, do you want to try using it?"
        . ./myread
        case "$ans" in
-       y|Y) ;;
+       y|Y)    echo "Ok, turning on both sfio and PerlIO, then."
+               useperlio="$define"
+               val="$define"
+               ;;
        *)      echo "Ok, avoiding sfio this time.  I'll use stdio instead."
                val="$undef"
                : Remove sfio from list of libraries to use
@@ -11212,8 +11162,9 @@ $define)
        ;;
 *)     case "$usesfio" in
        true|$define|[yY]*)
-               echo "Sorry, cannot find sfio on this machine" >&4
-               echo "Ignoring your setting of usesfio=$usesfio" >&4
+               echo "Sorry, cannot find sfio on this machine." >&4
+               echo "Ignoring your setting of usesfio=$usesfio." >&4
+               val="$undef"
                ;;
        esac
        ;;
@@ -11382,6 +11333,10 @@ set d_sigsetjmp
 eval $setvar
 $rm -f try.c try
 
+: see if socks5_init exists
+set socks5_init d_socks5_init
+eval $inlibc
+
 : see if sys/stat.h is available
 set sys/stat.h i_sysstat
 eval $inhdr
@@ -11688,6 +11643,9 @@ EOM
 #ifdef __hpux
 #define strtoll __strtoll
 #endif
+#ifdef __EMX__
+#define strtoll _strtoll
+#endif
 #include <stdio.h>
 extern long long int strtoll(char *s, char **, int); 
 static int bad = 0;
@@ -11714,7 +11672,8 @@ int main() {
 EOCP
        set try
        if eval $compile; then
-               case "`./try`" in
+               yyy=`./try`
+               case "$yyy" in
                ok) echo "Your strtoll() seems to be working okay." ;;
                *) cat <<EOM >&4
 Your strtoll() doesn't seem to be working okay.
@@ -11722,6 +11681,9 @@ EOM
                   d_strtoll="$undef"
                   ;;
                esac
+       else
+               echo "(I can't seem to compile the test program--assuming it doesn't)"
+               d_strtoll="$undef"
        fi
        ;;
 esac
@@ -12610,14 +12572,14 @@ val=$undef
 set tebcdic
 if eval $compile_ok; then
        if ./tebcdic; then
-               echo "You have EBCDIC." >&4
+               echo "You seem to speak EBCDIC." >&4
                val="$define"
        else
-               echo "Nope, no EBCDIC, probably ASCII or some ISO Latin." >&4
+               echo "Nope, no EBCDIC, probably ASCII or some ISO Latin. Or UTF8." >&4
        fi
 else
        echo "I'm unable to compile the test program." >&4
-       echo "I'll assume ASCII or some ISO Latin." >&4
+       echo "I'll assume ASCII or some ISO Latin. Or UTF8." >&4
 fi
 $rm -f tebcdic.c tebcdic
 set ebcdic
@@ -13025,7 +12987,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64='"d"'; sPRIi64='"i"'; sPRIu64='"u"';
-                       sPRIo64='"o"'; sPRIx64='"x"'; sPRIX64='"X"';
+                       sPRIo64='"o"'; sPRIx64='"x"'; sPRIXU64='"X"';
                        echo "We will use %d."
                        ;;
                esac
@@ -13047,7 +13009,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64='"ld"'; sPRIi64='"li"'; sPRIu64='"lu"';
-                       sPRIo64='"lo"'; sPRIx64='"lx"'; sPRIX64='"lX"';
+                       sPRIo64='"lo"'; sPRIx64='"lx"'; sPRIXU64='"lX"';
                        echo "We will use %ld."
                        ;;
                esac
@@ -13070,7 +13032,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64=PRId64; sPRIi64=PRIi64; sPRIu64=PRIu64;
-                       sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIX64=PRIX64;
+                       sPRIo64=PRIo64; sPRIx64=PRIx64; sPRIXU64=PRIXU64;
                        echo "We will use the C9X style."
                        ;;
                esac
@@ -13082,7 +13044,7 @@ if $test X"$sPRId64" = X -a X"$quadtype" = X"long long"; then
 #include <sys/types.h>
 #include <stdio.h>
 int main() {
-  long long q = 12345678901LL; /* AIX cc requires the LL prefix. */
+  long long q = 12345678901LL; /* AIX cc requires the LL suffix. */
   printf("%lld\n", q);
 }
 EOCP
@@ -13092,7 +13054,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64='"lld"'; sPRIi64='"lli"'; sPRIu64='"llu"';
-                       sPRIo64='"llo"'; sPRIx64='"llx"'; sPRIX64='"llX"';
+                       sPRIo64='"llo"'; sPRIx64='"llx"'; sPRIXU64='"llX"';
                        echo "We will use the %lld style."
                        ;;
                esac
@@ -13114,7 +13076,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64='"Ld"'; sPRIi64='"Li"'; sPRIu64='"Lu"';
-                       sPRIo64='"Lo"'; sPRIx64='"Lx"'; sPRIX64='"LX"';
+                       sPRIo64='"Lo"'; sPRIx64='"Lx"'; sPRIXU64='"LX"';
                        echo "We will use %Ld."
                        ;;
                esac
@@ -13136,7 +13098,7 @@ EOCP
                case "$yyy" in
                12345678901)
                        sPRId64='"qd"'; sPRIi64='"qi"'; sPRIu64='"qu"';
-                       sPRIo64='"qo"'; sPRIx64='"qx"'; sPRIX64='"qX"';
+                       sPRIo64='"qo"'; sPRIx64='"qx"'; sPRIXU64='"qX"';
                        echo "We will use %qd."
                        ;;
                esac
 
 case "$sPRId64" in
 '')    d_PRId64="$undef"; d_PRIi64="$undef"; d_PRIu64="$undef"; 
-       d_PRIo64="$undef"; d_PRIx64="$undef"; d_PRIX64="$undef"; 
+       d_PRIo64="$undef"; d_PRIx64="$undef"; d_PRIXU64="$undef"; 
        ;;
 *)     d_PRId64="$define"; d_PRIi64="$define"; d_PRIu64="$define"; 
-       d_PRIo64="$define"; d_PRIx64="$define"; d_PRIX64="$define"; 
+       d_PRIo64="$define"; d_PRIx64="$define"; d_PRIXU64="$define"; 
        ;;
 esac
 
@@ -13169,18 +13131,21 @@ if $test X"$ivsize" = X8; then
        uvuformat="$sPRIu64"
        uvoformat="$sPRIo64"
        uvxformat="$sPRIx64"
+       uvXUformat="$sPRIXU64"
 else
        if $test X"$ivsize" = X"$longsize"; then
                ivdformat='"ld"'
                uvuformat='"lu"'
                uvoformat='"lo"'
                uvxformat='"lx"'
+               uvXUformat='"lX"'
        else
                if $test X"$ivsize" = X"$intsize"; then
                        ivdformat='"d"'
                        uvuformat='"u"'
                        uvoformat='"o"'
                        uvxformat='"x"'
+                       uvXUformat='"X"'
                else
                        : far out
                        if $test X"$ivsize" = X"$shortsize"; then
@@ -13188,11 +13153,28 @@ else
                                uvuformat='"hu"'
                                uvoformat='"ho"'
                                uvxformat='"hx"'
+                               uvXUformat='"hX"'
                        fi
                fi
        fi
 fi
 
+if $test X"$uselongdouble" = X"$define" -a X"$d_longdbl" = X"$define" -a X"$d_PRIgldbl" = X"$define"; then
+       nveformat="$sPRIeldbl"
+       nvfformat="$sPRIfldbl"
+       nvgformat="$sPRIgldbl"
+       nvEUformat="$sPRIEUldbl"
+       nvFUformat="$sPRIFUldbl"
+       nvGUformat="$sPRIGUldbl"
+else
+       nveformat='"e"'
+       nvfformat='"f"'
+       nvgformat='"g"'
+       nvEUformat='"E"'
+       nvFUformat='"F"'
+       nvGUformat='"G"'
+fi
+
 case "$ivdformat" in
 '') echo "$0: Fatal: failed to find format strings, cannot continue." >& 4
     exit 1
@@ -13471,12 +13453,15 @@ case "$pager" in
        dflt=''
        case "$pg" in
        /*) dflt=$pg;;
+       [a-zA-Z]:/*) dflt=$pg;;
        esac
        case "$more" in
        /*) dflt=$more;;
+       [a-zA-Z]:/*) dflt=$more;;
        esac
        case "$less" in
        /*) dflt=$less;;
+       [a-zA-Z]:/*) dflt=$less;;
        esac
        case "$dflt" in
        '') dflt=/usr/ucb/more;;
@@ -13549,13 +13534,13 @@ $cc $ccflags -c bar1.c >/dev/null 2>&1
 $cc $ccflags -c bar2.c >/dev/null 2>&1
 $cc $ccflags -c foo.c >/dev/null 2>&1
 $ar rc bar$_a bar2$_o bar1$_o >/dev/null 2>&1
-if $cc $ccflags $ldflags -o foobar foo$_o bar$_a $libs > /dev/null 2>&1 &&
+if $cc -o foobar $ccflags $ldflags foo$_o bar$_a $libs > /dev/null 2>&1 &&
        ./foobar >/dev/null 2>&1; then
        echo "$ar appears to generate random libraries itself."
        orderlib=false
        ranlib=":"
 elif $ar ts bar$_a >/dev/null 2>&1 &&
-       $cc $ccflags $ldflags -o foobar foo$_o bar$_a $libs > /dev/null 2>&1 &&
+       $cc -o foobar $ccflags $ldflags foo$_o bar$_a $libs > /dev/null 2>&1 &&
        ./foobar >/dev/null 2>&1; then
                echo "a table of contents needs to be added with '$ar ts'."
                orderlib=false
@@ -14496,7 +14481,7 @@ mert MiNT mips MIPS_FPSET MIPS_ISA MIPS_SIM MIPS_SZINT
 MIPS_SZLONG MIPS_SZPTR MIPSEB MIPSEL MODERN_C motorola
 mpeix MSDOS MTXINU MULTIMAX mvs MVS n16 ncl_el ncl_mr
 NetBSD news1500 news1700 news1800 news1900 news3700
-news700 news800 news900 NeXT NLS ns16000 ns32000
+news700 news800 news900 NeXT NLS nonstopux ns16000 ns32000
 ns32016 ns32332 ns32k nsc32000
 OCS88 OEMVS OpenBSD os OS2 OS390 osf OSF1 OSF_SOURCE
 pa_risc PA_RISC1_1 PA_RISC2_0 PARAGON parisc
@@ -14528,8 +14513,9 @@ $osname
 EOSH
 ./tr '[a-z]' '[A-Z]' < Cppsym.know > Cppsym.a
 ./tr '[A-Z]' '[a-z]' < Cppsym.know > Cppsym.b
-$cat Cppsym.a Cppsym.b | $tr ' ' $trnl | sort | uniq > Cppsym.know
-$rm -f Cppsym.a Cppsym.b
+$cat Cppsym.know > Cppsym.c
+$cat Cppsym.a Cppsym.b Cppsym.c | $tr ' ' $trnl | sort | uniq > Cppsym.know
+$rm -f Cppsym.a Cppsym.b Cppsym.c
 cat <<EOSH > Cppsym
 $startsh
 if $test \$# -gt 0; then
@@ -14568,8 +14554,9 @@ cat <<EOSH >> Cppsym.try
 ccflags="$ccflags"
 case "$osname-$gccversion" in
 irix-) ccflags="\$ccflags -woff 1178" ;;
+os2-*) ccflags="\$ccflags -Zlinker /PM:VIO" ;;
 esac
-$cc $optimize \$ccflags $ldflags -o try try.c $libs && ./try$exe_ext
+$cc -o try $optimize \$ccflags $ldflags try.c $libs && ./try$exe_ext
 EOSH
 chmod +x Cppsym.try
 $eunicefix Cppsym.try
@@ -14623,7 +14610,7 @@ if $test -z ccsym.raw; then
 else
        if $test -s ccsym.com; then
                echo "Your C compiler and pre-processor define these symbols:"
-               $sed -e 's/\(.*\)=.*/\1/' ccsym.com
+               $sed -e 's/\(..*\)=.*/\1/' ccsym.com
                also='also '
                symbols='ones'
                cppccsymbols=`$cat ccsym.com`
@@ -14633,7 +14620,7 @@ else
        if $test -s ccsym.cpp; then
                $test "$also" && echo " "
                echo "Your C pre-processor ${also}defines the following symbols:"
-               $sed -e 's/\(.*\)=.*/\1/' ccsym.cpp
+               $sed -e 's/\(..*\)=.*/\1/' ccsym.cpp
                also='further '
                cppsymbols=`$cat ccsym.cpp`
                cppsymbols=`echo $cppsymbols`
@@ -14642,14 +14629,14 @@ else
        if $test -s ccsym.own; then
                $test "$also" && echo " "
                echo "Your C compiler ${also}defines the following cpp symbols:"
-               $sed -e 's/\(.*\)=1/\1/' ccsym.own
-               $sed -e 's/\(.*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true
+               $sed -e 's/\(..*\)=1/\1/' ccsym.own
+               $sed -e 's/\(..*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true
                ccsymbols=`$cat ccsym.own`
                ccsymbols=`echo $ccsymbols`
                $test "$silent" || sleep 1
        fi
 fi
-$rm -f ccsym*
+$rm -f ccsym* Cppsym.*
 
 : see if this is a termio system
 val="$undef"
@@ -15183,6 +15170,25 @@ set X $dynamic_ext $static_ext $nonxs_ext
 shift
 extensions="$*"
 
+: Remove libraries needed only for extensions
+: The appropriate ext/Foo/Makefile.PL will add them back in, if necessary.
+: The exception is SunOS 4.x, which needs them.
+case "${osname}X${osvers}" in
+sunos*X4*)
+    perllibs="$libs"
+    ;;
+*) case "$usedl" in
+    $define|true|[yY]*)
+           set X `echo " $libs " | sed -e 's@ -lndbm @ @' -e 's@ -lgdbm @ @' -e 's@ -ldbm @ @' -e 's@ -ldb @ @'` 
+           shift
+           perllibs="$*"
+           ;;
+    *) perllibs="$libs"
+           ;;
+    esac
+    ;;
+esac
+
 : Remove build directory name from cppstdin so it can be used from
 : either the present location or the final installed location.
 echo " "
@@ -15294,7 +15300,10 @@ cc='$cc'
 cccdlflags='$cccdlflags'
 ccdlflags='$ccdlflags'
 ccflags='$ccflags'
+ccflags_uselargefiles='$ccflags_uselargefiles'
+ccname='$ccname'
 ccsymbols='$ccsymbols'
+ccversion='$ccversion'
 cf_by='$cf_by'
 cf_email='$cf_email'
 cf_time='$cf_time'
@@ -15321,10 +15330,10 @@ crosscompile='$crosscompile'
 cryptlib='$cryptlib'
 csh='$csh'
 d_Gconvert='$d_Gconvert'
-d_PRIEldbl='$d_PRIEldbl'
-d_PRIFldbl='$d_PRIFldbl'
-d_PRIGldbl='$d_PRIGldbl'
-d_PRIX64='$d_PRIX64'
+d_PRIEUldbl='$d_PRIEUldbl'
+d_PRIFUldbl='$d_PRIFUldbl'
+d_PRIGUldbl='$d_PRIGUldbl'
+d_PRIXU64='$d_PRIXU64'
 d_PRId64='$d_PRId64'
 d_PRIeldbl='$d_PRIeldbl'
 d_PRIfldbl='$d_PRIfldbl'
@@ -15333,6 +15342,7 @@ d_PRIi64='$d_PRIi64'
 d_PRIo64='$d_PRIo64'
 d_PRIu64='$d_PRIu64'
 d_PRIx64='$d_PRIx64'
+d_SCNfldbl='$d_SCNfldbl'
 d_access='$d_access'
 d_accessx='$d_accessx'
 d_alarm='$d_alarm'
@@ -15562,6 +15572,7 @@ d_sigsetjmp='$d_sigsetjmp'
 d_socket='$d_socket'
 d_socklen_t='$d_socklen_t'
 d_sockpair='$d_sockpair'
+d_socks5_init='$d_socks5_init'
 d_sqrtl='$d_sqrtl'
 d_statblks='$d_statblks'
 d_statfs_f_flags='$d_statfs_f_flags'
@@ -15663,7 +15674,6 @@ h_fcntl='$h_fcntl'
 h_sysfile='$h_sysfile'
 hint='$hint'
 hostcat='$hostcat'
-huge='$huge'
 i16size='$i16size'
 i16type='$i16type'
 i32size='$i32size'
@@ -15778,10 +15788,10 @@ ivsize='$ivsize'
 ivtype='$ivtype'
 known_extensions='$known_extensions'
 ksh='$ksh'
-large='$large'
 ld='$ld'
 lddlflags='$lddlflags'
 ldflags='$ldflags'
+ldflags_uselargefiles='$ldflags_uselargefiles'
 ldlibpthname='$ldlibpthname'
 less='$less'
 lib_ext='$lib_ext'
@@ -15794,6 +15804,7 @@ libsfiles='$libsfiles'
 libsfound='$libsfound'
 libspath='$libspath'
 libswanted='$libswanted'
+libswanted_uselargefiles='$libswanted_uselargefiles'
 line='$line'
 lint='$lint'
 lkflags='$lkflags'
@@ -15822,11 +15833,9 @@ man1ext='$man1ext'
 man3dir='$man3dir'
 man3direxp='$man3direxp'
 man3ext='$man3ext'
-medium='$medium'
 mips_type='$mips_type'
 mkdir='$mkdir'
 mmaptype='$mmaptype'
-models='$models'
 modetype='$modetype'
 more='$more'
 multiarch='$multiarch'
@@ -15845,6 +15854,12 @@ nm_opt='$nm_opt'
 nm_so_opt='$nm_so_opt'
 nonxs_ext='$nonxs_ext'
 nroff='$nroff'
+nvEUformat='$nvEUformat'
+nvFUformat='$nvFUformat'
+nvGUformat='$nvGUformat'
+nveformat='$nveformat'
+nvfformat='$nvfformat'
+nvgformat='$nvgformat'
 nvsize='$nvsize'
 nvtype='$nvtype'
 o_nonblock='$o_nonblock'
@@ -15863,6 +15878,7 @@ path_sep='$path_sep'
 perl5='$perl5'
 perl='$perl'
 perladmin='$perladmin'
+perllibs='$perllibs'
 perlpath='$perlpath'
 pg='$pg'
 phostname='$phostname'
@@ -15888,10 +15904,10 @@ revision='$revision'
 rm='$rm'
 rmail='$rmail'
 runnm='$runnm'
-sPRIEldbl='$sPRIEldbl'
-sPRIFldbl='$sPRIFldbl'
-sPRIGldbl='$sPRIGldbl'
-sPRIX64='$sPRIX64'
+sPRIEUldbl='$sPRIEUldbl'
+sPRIFUldbl='$sPRIFUldbl'
+sPRIGUldbl='$sPRIGUldbl'
+sPRIXU64='$sPRIXU64'
 sPRId64='$sPRId64'
 sPRIeldbl='$sPRIeldbl'
 sPRIfldbl='$sPRIfldbl'
@@ -15900,6 +15916,7 @@ sPRIi64='$sPRIi64'
 sPRIo64='$sPRIo64'
 sPRIu64='$sPRIu64'
 sPRIx64='$sPRIx64'
+sSCNfldbl='$sSCNfldbl'
 sched_yield='$sched_yield'
 scriptdir='$scriptdir'
 scriptdirexp='$scriptdirexp'
@@ -15934,7 +15951,6 @@ sizesize='$sizesize'
 sizetype='$sizetype'
 sleep='$sleep'
 smail='$smail'
-small='$small'
 so='$so'
 sockethdr='$sockethdr'
 socketlib='$socketlib'
@@ -15942,7 +15958,6 @@ socksizetype='$socksizetype'
 sort='$sort'
 spackage='$spackage'
 spitshell='$spitshell'
-split='$split'
 src='$src'
 ssizetype='$ssizetype'
 startperl='$startperl'
@@ -16007,6 +16022,7 @@ usevendorprefix='$usevendorprefix'
 usevfork='$usevfork'
 usrinc='$usrinc'
 uuname='$uuname'
+uvXUformat='$uvXUformat'
 uvoformat='$uvoformat'
 uvsize='$uvsize'
 uvtype='$uvtype'
@@ -16022,6 +16038,7 @@ vendorlibexp='$vendorlibexp'
 vendorprefix='$vendorprefix'
 vendorprefixexp='$vendorprefixexp'
 version='$version'
+versiononly='$versiononly'
 vi='$vi'
 voidflags='$voidflags'
 xlibpth='$xlibpth'
@@ -16116,7 +16133,7 @@ EOM
        . UU/myread
        case "$ans" in
        y*)
-               $make depend && echo "Now you must run a $make."
+               $make depend && echo "Now you must run '$make'."
                ;;
        *)
                echo "You must run '$make depend' then '$make'."
diff --git a/INSTALL b/INSTALL
index 2b21edb..50e7773 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -24,6 +24,15 @@ with all the defaults are:
 
 Each of these is explained in further detail below.
 
+B<NOTE>: starting from the release 5.6.0 Perl will use a version
+scheme where even-numbered subreleases (like 5.6) are stable
+maintenance releases and odd-numbered subreleases (like 5.7) are
+unstable development releases.  Development releases should not be
+used in production environments.  Fixes and new features are first
+carefully tested in development releases and only if they prove
+themselves to be worthy will they be migrated to the maintenance
+releases.
+
 The above commands will install Perl to /usr/local or /opt, depending
 on the platform.  If that's not okay with you, use
 
@@ -76,7 +85,7 @@ extensions that have not been updated for the new naming convention
 with:
 
        perl Makefile.PL POLLUTE=1
-       
+
 Alternatively, you can enable CPP symbol pollution wholesale by
 building perl itself with:
 
@@ -159,7 +168,7 @@ run, you may have to run it on a platform where GCC is available, and move
 the sources back to the platform without GCC.
 
 If you succeed in automatically converting the sources to a K&R compatible
-form, be sure to email perlbug@perl.com to let us know the steps you
+form, be sure to email perlbug@perl.org to let us know the steps you
 followed.  This will enable us to officially support this option.
 
 =back
@@ -327,7 +336,14 @@ output, you can run
 
        sh Configure -des
 
-For my Solaris system, I usually use
+Note: for development releases (odd subreleases, like 5.7, as opposed
+to maintenance releases which have even subreleases, like 5.6)
+if you want to use Configure -d, you will also need to supply -Dusedevel
+to Configure, because the default answer to the question "do you really
+want to Configure a development version?" is "no".  The -Dusedevel
+skips that sanity check.
+
+For example for my Solaris system, I usually use
 
        sh Configure -Dprefix=/opt/perl -Doptimize='-xpentium -xO4' -des
 
@@ -670,6 +686,52 @@ or by
 Eventually (by perl v5.6.0) this internal confusion ought to disappear,
 and these options may disappear as well.
 
+=head2 64 bit support.
+
+If your platform does not have 64 bits natively, but can simulate them with
+compiler flags and/or C<long long> or C<int64_t>, you can build a perl that
+uses 64 bits.
+
+There are actually two modes of 64-bitness: the first one is achieved
+using Configure -Duse64bitint and the second one using Configure
+-Duse64bitall.  The difference is that the first one is minimal and
+the second one maximal.  The first works in more places than the second.
+
+The C<use64bitint> does only as much as is required to get 64-bit
+integers into Perl (this may mean, for example, using "long longs")
+while your memory may still be limited to 2 gigabytes (because your
+pointers could still be 32-bit).  Note that the name C<64bitint> does
+not imply that your C compiler will be using 64-bit C<int>s (it might,
+but it doesn't have to): the C<use64bitint> means that you will be
+able to have 64 bits wide scalar values.
+
+The C<use64bitall> goes all the way by attempting to switch also
+integers (if it can), longs (and pointers) to being 64-bit.  This may
+create an even more binary incompatible Perl than -Duse64bitint: the
+resulting executable may not run at all in a 32-bit box, or you may
+have to reboot/reconfigure/rebuild your operating system to be 64-bit
+aware.
+
+Natively 64-bit systems like Alpha and Cray need neither -Duse64bitint
+nor -Duse64bitall.
+
+    NOTE: 64-bit support is still experimental on most platforms.
+    Existing support only covers the LP64 data model.  In particular, the
+    LLP64 data model is not yet supported.  64-bit libraries and system
+    APIs on many platforms have not stabilized--your mileage may vary.
+
+=head2 Long doubles
+
+In some systems you may be able to use long doubles to enhance the
+range and precision of your double precision floating point numbers
+(that is, Perl's numbers).  Use Configure -Duselongdouble to enable
+this support (if it is available).
+
+=head2 "more bits"
+
+You can "Configure -Dusemorebits" to turn on both the 64-bit support
+and the long double support.
+
 =head2 Selecting File IO mechanisms
 
 Previous versions of perl used the standard IO mechanisms as defined in
@@ -701,7 +763,7 @@ extension modules or external libraries may not work.  This
 configuration exists to allow these issues to be worked on.
 
 This option requires the 'sfio' package to have been built and installed.
-A (fairly old) version of sfio is in CPAN.
+The latest sfio is available from http://www.research.att.com/sw/tools/sfio/
 
 You select this option by
 
@@ -718,9 +780,6 @@ Configure should detect this problem and warn you about problems with
 _exit vs. exit.  If you have this problem, the fix is to go back to
 your sfio sources and correct iffe's guess about atexit.
 
-There also might be a more recent release of Sfio that fixes your
-problem.
-
 =item 2.
 
 Normal stdio IO, but with all IO going through calls to the PerlIO
@@ -739,6 +798,13 @@ detect sfio, then this will be the default suggested by Configure.
 
 =back
 
+=head2 SOCKS
+
+Perl can be configured to be 'socksified', that is, to use the SOCKS
+TCP/IP proxy protocol library.  SOCKS is used to give applications
+access to transport layer network proxies.  Perl supports only SOCKS
+Version 5.  You can find more about SOCKS from http://www.socks.nec.com/
+
 =head2 Dynamic Loading
 
 By default, Configure will compile perl to use dynamic loading if
@@ -1682,6 +1748,51 @@ test, it does not necessarily mean you have a broken perl.  This test
 tries to exercise the regular expression subsystem quite thoroughly,
 and may well be far more demanding than your normal usage.
 
+=item Test failures from lib/ftmp-security saying "system possibly insecure"
+
+Firstly, test failures from the ftmp-security are not necessarily
+serious or indicative of a real security threat.  That being said,
+they bear investigating.
+
+The tests may fail for the following reasons.   Note that each of the
+tests is run both in the building directory and the temporary
+directory, as returned by File::Spec->tmpdir().
+
+(1) If the directory the tests are being run is owned by somebody else
+than the user running the tests, or root (uid 0).  This failure can
+happen if the Perl source code distribution is unpacked in a way that
+the user ids in the distribution package are used as-is.  Some tar
+programs do this.
+
+(2) If the directory the test are being run in is writable by group
+or by other (remember: with UNIX/POSIX semantics, write access to
+a directory means the right to add/remove files in that directory),
+and there is no sticky bit set in the directory.  'Sticky bit' is
+a feature used in some UNIXes to give extra protection to files: if
+the bit is on a directory, no one but the owner (or the root) can remove
+that file even if the permissions of the directory would allow file
+removal by others.  This failure can happen if the permissions in the
+directory simply are a bit too liberal for the tests' liking.  This
+may or may not be a real problem: it depends on the permissions policy
+used on this particular directory/project/system/site.  This failure
+can also happen if the system either doesn't support the sticky bit
+(this is the case with many non-UNIX platforms: in principle the
+File::Temp should know about these platforms and skip the tests), or
+if the system supports the sticky bit but for some reason or reasons
+it is not being used.  This is for example the case with HP-UX: as of
+HP-UX release 11.00, the sticky bit is very much supported, but HP-UX
+doesn't use it on its /tmp directory as shipped.  Also as with the
+permissions, some local policy might dictate that the stickiness is
+not used.
+
+(3) If the system supports the POSIX 'chown giveaway' feature and if
+any of the parent directories of the temporary file back to the root
+directory are 'unsafe', using the definitions given above in (1) and
+(2).
+
+See the documentation for the File::Temp module for more information
+about the various security aspects.
+
 =back
 
 =head1 make install
@@ -1720,12 +1831,17 @@ anything, you can run
 
 make install will install the following:
 
+    binaries
+
        perl,
            perl5.nnn   where nnn is the current release number.  This
                        will be a link to perl.
        suidperl,
            sperl5.nnn  If you requested setuid emulation.
        a2p             awk-to-perl translator
+
+    scripts
+
        cppstdin        This is used by perl -P, if your cc -E can't
                        read from stdin.
        c2ph, pstruct   Scripts for handling C structures in header files.
@@ -1738,13 +1854,21 @@ make install will install the following:
        pl2pm           Convert Perl 4 .pl files to Perl 5 .pm modules
        pod2html,       Converters from perl's pod documentation format
        pod2latex,      to other useful formats.
-       pod2man, and
-       pod2text
+       pod2man,
+       pod2text,
+       pod2checker,
+       pod2select,
+       pod2usage
        splain          Describe Perl warnings and errors
        dprofpp         Perl code profile post-processor
 
-       library files   in $privlib and $archlib specified to
+    library files
+
+                       in $privlib and $archlib specified to
                        Configure, usually under /usr/local/lib/perl5/.
+
+    documentation
+
        man pages       in $man1dir, usually /usr/local/man/man1.
        module man
        pages           in $man3dir, usually /usr/local/man/man3.
@@ -1753,11 +1877,28 @@ make install will install the following:
 Installperl will also create the directories listed above
 in L<"Installation Directories">.
 
-Perl's *.h header files and the libperl.a library are also installed
+Perl's *.h header files and the libperl library are also installed
 under $archlib so that any user may later build new modules, run the
 optional Perl compiler, or embed the perl interpreter into another
 program even if the Perl source is no longer available.
 
+Sometimes you only want to install the version-specific parts of the perl
+installation.  For example, you may wish to install a newer version of
+perl alongside an already installed production version of perl without
+disabling installation of new modules for the production version.
+To only install the version-specific parts of the perl installation, run
+
+       Configure -Dversiononly
+
+or answer 'y' to the appropriate Configure prompt.  Alternatively,
+you can just manually run
+
+       ./perl installperl -v
+
+and skip installman altogether.
+See also L<"Maintaining completely separate versions"> for another
+approach.
+
 =head1 Coexistence with earlier versions of perl5
 
 In general, you can usually safely upgrade from one version of Perl (e.g.
@@ -1944,7 +2085,7 @@ available in TeX format.  Type
 If you have difficulty building perl, and none of the advice in this file
 helps, and careful reading of the error message and the relevant manual
 pages on your system doesn't help either, then you should send a message
-to either the comp.lang.perl.misc newsgroup or to perlbug@perl.com with
+to either the comp.lang.perl.misc newsgroup or to perlbug@perl.org with
 an accurate description of your problem.
 
 Please include the output of the ./myconfig shell script that comes with
index b2e370d..cd1e4ed 100644 (file)
--- a/MAINTAIN
+++ b/MAINTAIN
@@ -60,7 +60,7 @@ README.machten                        machten
 README.micro                   simon
 README.mpeix                   mpeix
 README.os2                     os2
-README.os390                   mvs
+README.os390                   os390
 README.plan9                   plan9
 README.posix-bc                        posix-bc
 README.qnx                     qnx
@@ -313,7 +313,7 @@ hints/broken-db.msg
 hints/bsdos.sh                 bsdos
 hints/convexos.sh      
 hints/cxux.sh                  cxux
-hints/cygwin.sh                        cygwinx
+hints/cygwin.sh                        cygwin
 hints/dcosx.sh 
 hints/dec_osf.sh               dec_osf
 hints/dgux.sh                  dgux
@@ -332,7 +332,7 @@ hints/irix*                 irix
 hints/isc.sh   
 hints/isc_2.sh 
 hints/linux.sh                 linux
-hints/lynxos.sh                        lynxos
+hints/lynxos.sh
 hints/machten.sh               machten
 hints/machten_2.sh     
 hints/mips.sh  
@@ -345,7 +345,7 @@ hints/next*                 step
 hints/openbsd.sh               openbsd
 hints/opus.sh  
 hints/os2.sh                   os2
-hints/os390.sh                 mvs
+hints/os390.sh                 os390
 hints/posix-bc.sh              posix-bc
 hints/powerux.sh               powerux
 hints/qnx.sh                   qnx
@@ -452,6 +452,7 @@ lib/Shell.pm
 lib/Symbol.pm  
 lib/Sys/Hostname.pm            sundstrom
 lib/Sys/Syslog.pm              tchrist
+lib/Term/ANSIcolor.pm          rra
 lib/Term/Cap.pm        
 lib/Term/Complete.pm           wayne.thompson
 lib/Term/ReadLine.pm   
@@ -459,7 +460,7 @@ lib/Test.pm
 lib/Test/Harness.pm            k
 lib/Text/Abbrev.pm     
 lib/Text/ParseWords.pm         pomeranz
-lib/Text/Soundex.pm            stok
+lib/Text/Soundex.pm            mikestok
 lib/Text/Tabs.pm               muir
 lib/Text/Wrap.pm               muir
 lib/Tie/Array.pm               nik
@@ -581,13 +582,16 @@ pod/perldebug.pod
 pod/perldelta.pod      
 pod/perl5005delta.pod  
 pod/perl5004delta.pod  
+pod/perldebtut.pod             richard
 pod/perldiag.pod       
 pod/perldsc.pod                        tchrist
 pod/perlembed.pod              doug,jon
+pod/perlebcdic.pod             pvhp
 pod/perlfaq*                   gnat
 pod/perlform.pod       
 pod/perlfunc.pod       
 pod/perlguts.pod       
+pod/perlhack.pod               simon
 pod/perlhist.pod               jhi
 pod/perlipc.pod                        tchrist
 pod/perllocale.pod             locale
@@ -601,6 +605,7 @@ pod/perlobj.pod
 pod/perlop.pod 
 pod/perlpod.pod                        lwall
 pod/perlport.pod               pudge
+pod/perlposix-bc.pod           posix-bc
 pod/perlre.pod                 regex
 pod/perlref.pod        
 pod/perlreftut.pod             mjd
@@ -615,6 +620,8 @@ pod/perltie.pod                     tchrist
 pod/perltoc.pod        
 pod/perltoot.pod               tchrist
 pod/perltrap.pod       
+pod/perlunicode.pod            simon
+pod/perlutil.pod               simon
 pod/perlvar.pod        
 pod/perlxs.pod                 roehrich
 pod/perlxstut.pod              okamoto
@@ -687,6 +694,7 @@ t/io/read.t
 t/io/tell.t    
 t/lib/abbrev.t 
 t/lib/anydbm.t 
+t/lib/ansicolor.t              rra
 t/lib/autoloader.t     
 t/lib/basename.t       
 t/lib/bigint.t 
@@ -717,6 +725,9 @@ t/lib/filepath.t
 t/lib/filespec.t               kjahds
 t/lib/findbin.t        
 t/lib/ftmp-*.t                 tjenness
+t/lib/gol-basic.t              jvromans
+t/lib/gol-compat.t             jvromans
+t/lib/gol-linkage.t            jvromans
 t/lib/gdbm.t   
 t/lib/getopt.t                 jvromans
 t/lib/h2ph*                    kstar
index 96eec9c..dbe97ca 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -34,6 +34,7 @@ Porting/patchls               Flexible patch file listing utility
 Porting/pumpkin.pod    Guidelines and hints for Perl maintainers
 README                 The Instructions
 README.Y2K             Notes about Year 2000 concerns
+README.aix             Notes about AIX port
 README.amiga           Notes about AmigaOS port
 README.apollo          Notes about Apollo DomainOS port
 README.beos            Notes about BeOS port
@@ -43,7 +44,7 @@ README.epoc           Notes about EPOC port
 README.hpux            Notes about HP-UX port
 README.hurd            Notes about GNU/Hurd port
 README.machten         Notes about Power MachTen port
-README.micro           Notes about microperl 
+README.micro           Notes about microperl
 README.mint            Notes about Atari MiNT port
 README.mpeix           Notes about MPE/iX port
 README.os2             Notes about OS/2 port
@@ -73,8 +74,8 @@ configure.com         Configure-equivalent for VMS
 configure.gnu          Crude emulation of GNU configure
 cop.h                  Control operator header
 cv.h                   Code value header
-cygwin/cygwin.c                Additional code for Cygwin port
 cygwin/Makefile.SHs    Shared library generation for Cygwin port
+cygwin/cygwin.c                Additional code for Cygwin port
 cygwin/ld2.in          ld wrapper template for Cygwin port
 cygwin/perlld.in       dll generator template for Cygwin port
 deb.c                  Debugging routines
@@ -88,71 +89,6 @@ doop.c                       Support code for various operations
 dosish.h               Some defines for MS/DOSish machines
 dump.c                 Debugging output
 ebcdic.c               EBCDIC support routines
-eg/ADB                 An adb wrapper to put in your crash dir
-eg/README              Intro to example perl scripts
-eg/cgi/RunMeFirst              Setup script for CGI examples
-eg/cgi/caution.xbm             CGI example
-eg/cgi/clickable_image.cgi     CGI example
-eg/cgi/cookie.cgi              CGI example
-eg/cgi/crash.cgi               CGI example
-eg/cgi/customize.cgi           CGI example
-eg/cgi/diff_upload.cgi         CGI example
-eg/cgi/dna_small_gif.uu                Small image for CGI examples
-eg/cgi/file_upload.cgi         CGI example
-eg/cgi/frameset.cgi            CGI example
-eg/cgi/index.html              Index page for CGI examples
-eg/cgi/internal_links.cgi      CGI example
-eg/cgi/javascript.cgi          CGI example
-eg/cgi/monty.cgi               CGI example
-eg/cgi/multiple_forms.cgi      CGI example
-eg/cgi/nph-clock.cgi           CGI example
-eg/cgi/nph-multipart.cgi       CGI example
-eg/cgi/popup.cgi               CGI example
-eg/cgi/save_state.cgi          CGI example
-eg/cgi/tryit.cgi               CGI example
-eg/cgi/wilogo_gif.uu           Small image for CGI examples
-eg/changes             A program to list recently changed files
-eg/client              A sample client
-eg/down                        A program to do things to subdirectories
-eg/dus                 A program to do du -s on non-mounted dirs
-eg/findcp              A find wrapper that implements a -cp switch
-eg/findtar             A find wrapper that pumps out a tar file
-eg/g/gcp               A program to do a global rcp
-eg/g/gcp.man           Manual page for gcp
-eg/g/ged               A program to do a global edit
-eg/g/ghosts            A sample /etc/ghosts file
-eg/g/gsh               A program to do a global rsh
-eg/g/gsh.man           Manual page for gsh
-eg/muck                        A program to find missing make dependencies
-eg/muck.man            Manual page for muck
-eg/myrup               A program to find lightly loaded machines
-eg/nih                 Script to insert #! workaround
-eg/relink              A program to change symbolic links
-eg/rename              A program to rename files
-eg/rmfrom              A program to feed doomed filenames to
-eg/scan/scan_df                Scan for filesystem anomalies
-eg/scan/scan_last      Scan for login anomalies
-eg/scan/scan_messages  Scan for console message anomalies
-eg/scan/scan_passwd    Scan for passwd file anomalies
-eg/scan/scan_ps                Scan for process anomalies
-eg/scan/scan_sudo      Scan for sudo anomalies
-eg/scan/scan_suid      Scan for setuid anomalies
-eg/scan/scanner                An anomaly reporter
-eg/server              A sample server
-eg/shmkill             A program to remove unused shared memory
-eg/sysvipc/README      Intro to Sys V IPC examples
-eg/sysvipc/ipcmsg      Example of SYS V IPC message queues
-eg/sysvipc/ipcsem      Example of Sys V IPC semaphores
-eg/sysvipc/ipcshm      Example of Sys V IPC shared memory
-eg/travesty            A program to print travesties of its input text
-eg/unuc                        Un-uppercases an all-uppercase text
-eg/uudecode            A version of uudecode
-eg/van/empty           A program to empty the trashcan
-eg/van/unvanish                A program to undo what vanish does
-eg/van/vanexp          A program to expire vanished files
-eg/van/vanish          A program to put files in a trashcan
-eg/who                 A sample who program
-eg/wrapsuid            A setuid script wrapper generator
 emacs/cperl-mode.el    An alternate perl-mode
 emacs/e2ctags.pl       etags to ctags converter
 emacs/ptags            Creates smart TAGS file
@@ -253,6 +189,79 @@ ext/DynaLoader/hints/aix.pl        Hint for DynaLoader for named architecture
 ext/DynaLoader/hints/linux.pl  Hint for DynaLoader for named architecture
 ext/DynaLoader/hints/netbsd.pl Hint for DynaLoader for named architecture
 ext/DynaLoader/hints/openbsd.pl        Hint for DynaLoader for named architecture
+ext/Encode/Encode.pm           Encode extension
+ext/Encode/Encode.xs           Encode extension
+ext/Encode/Makefile.PL         Encode extension
+ext/Encode/Todo                        Encode extension
+ext/Encode/Encode/ascii.enc    Encoding tables
+ext/Encode/Encode/big5.enc     Encoding tables
+ext/Encode/Encode/cp1250.enc   Encoding tables
+ext/Encode/Encode/cp1251.enc   Encoding tables
+ext/Encode/Encode/cp1252.enc   Encoding tables
+ext/Encode/Encode/cp1253.enc   Encoding tables
+ext/Encode/Encode/cp1254.enc   Encoding tables
+ext/Encode/Encode/cp1255.enc   Encoding tables
+ext/Encode/Encode/cp1256.enc   Encoding tables
+ext/Encode/Encode/cp1257.enc   Encoding tables
+ext/Encode/Encode/cp1258.enc   Encoding tables
+ext/Encode/Encode/cp437.enc    Encoding tables
+ext/Encode/Encode/cp737.enc    Encoding tables
+ext/Encode/Encode/cp775.enc    Encoding tables
+ext/Encode/Encode/cp850.enc    Encoding tables
+ext/Encode/Encode/cp852.enc    Encoding tables
+ext/Encode/Encode/cp855.enc    Encoding tables
+ext/Encode/Encode/cp857.enc    Encoding tables
+ext/Encode/Encode/cp860.enc    Encoding tables
+ext/Encode/Encode/cp861.enc    Encoding tables
+ext/Encode/Encode/cp862.enc    Encoding tables
+ext/Encode/Encode/cp863.enc    Encoding tables
+ext/Encode/Encode/cp864.enc    Encoding tables
+ext/Encode/Encode/cp865.enc    Encoding tables
+ext/Encode/Encode/cp866.enc    Encoding tables
+ext/Encode/Encode/cp869.enc    Encoding tables
+ext/Encode/Encode/cp874.enc    Encoding tables
+ext/Encode/Encode/cp932.enc    Encoding tables
+ext/Encode/Encode/cp936.enc    Encoding tables
+ext/Encode/Encode/cp949.enc    Encoding tables
+ext/Encode/Encode/cp950.enc    Encoding tables
+ext/Encode/Encode/dingbats.enc Encoding tables
+ext/Encode/Encode/euc-cn.enc   Encoding tables
+ext/Encode/Encode/euc-jp.enc   Encoding tables
+ext/Encode/Encode/euc-kr.enc   Encoding tables
+ext/Encode/Encode/gb12345.enc  Encoding tables
+ext/Encode/Encode/gb1988.enc   Encoding tables
+ext/Encode/Encode/gb2312.enc   Encoding tables
+ext/Encode/Encode/iso2022-jp.enc       Encoding tables
+ext/Encode/Encode/iso2022-kr.enc       Encoding tables
+ext/Encode/Encode/iso2022.enc          Encoding tables
+ext/Encode/Encode/iso8859-1.enc                Encoding tables
+ext/Encode/Encode/iso8859-2.enc                Encoding tables
+ext/Encode/Encode/iso8859-3.enc                Encoding tables
+ext/Encode/Encode/iso8859-4.enc                Encoding tables
+ext/Encode/Encode/iso8859-5.enc                Encoding tables
+ext/Encode/Encode/iso8859-6.enc                Encoding tables
+ext/Encode/Encode/iso8859-7.enc                Encoding tables
+ext/Encode/Encode/iso8859-8.enc                Encoding tables
+ext/Encode/Encode/iso8859-9.enc                Encoding tables
+ext/Encode/Encode/jis0201.enc          Encoding tables
+ext/Encode/Encode/jis0208.enc          Encoding tables
+ext/Encode/Encode/jis0212.enc          Encoding tables
+ext/Encode/Encode/koi8-r.enc           Encoding tables
+ext/Encode/Encode/ksc5601.enc          Encoding tables
+ext/Encode/Encode/macCentEuro.enc      Encoding tables
+ext/Encode/Encode/macCroatian.enc      Encoding tables
+ext/Encode/Encode/macCyrillic.enc      Encoding tables
+ext/Encode/Encode/macDingbats.enc      Encoding tables
+ext/Encode/Encode/macGreek.enc         Encoding tables
+ext/Encode/Encode/macIceland.enc       Encoding tables
+ext/Encode/Encode/macJapan.enc         Encoding tables
+ext/Encode/Encode/macRoman.enc         Encoding tables
+ext/Encode/Encode/macRomania.enc       Encoding tables
+ext/Encode/Encode/macThai.enc          Encoding tables
+ext/Encode/Encode/macTurkish.enc       Encoding tables
+ext/Encode/Encode/macUkraine.enc       Encoding tables
+ext/Encode/Encode/shiftjis.enc         Encoding tables
+ext/Encode/Encode/symbol.enc           Encoding tables
 ext/Errno/ChangeLog            Errno perl module change log
 ext/Errno/Errno_pm.PL          Errno perl module create script
 ext/Errno/Makefile.PL          Errno extension makefile writer
@@ -306,8 +315,8 @@ ext/NDBM_File/NDBM_File.xs  NDBM extension external subroutines
 ext/NDBM_File/hints/cygwin.pl  Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/dec_osf.pl Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/dynixptx.pl        Hint for NDBM_File for named architecture
-ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/sco.pl     Hint for NDBM_File for named architecture
+ext/NDBM_File/hints/solaris.pl Hint for NDBM_File for named architecture
 ext/NDBM_File/hints/svr4.pl    Hint for NDBM_File for named architecture
 ext/NDBM_File/typemap          NDBM extension interface types
 ext/ODBM_File/Makefile.PL      ODBM extension makefile writer
@@ -372,9 +381,15 @@ ext/SDBM_File/typemap              SDBM extension interface types
 ext/Socket/Makefile.PL Socket extension makefile writer
 ext/Socket/Socket.pm   Socket extension Perl module
 ext/Socket/Socket.xs   Socket extension external subroutines
-ext/Sys/Hostname/Makefile.PL   Sys::Hostname extension makefile writer
+ext/Storable/ChangeLog         Storable extension
+ext/Storable/Makefile.PL       Storable extension
+ext/Storable/MANIFEST          Storable extension
+ext/Storable/README            Storable extension
+ext/Storable/Storable.pm       Storable extension
+ext/Storable/Storable.xs       Storable extension
 ext/Sys/Hostname/Hostname.pm   Sys::Hostname extension Perl module
 ext/Sys/Hostname/Hostname.xs   Sys::Hostname extension external subroutines
+ext/Sys/Hostname/Makefile.PL   Sys::Hostname extension makefile writer
 ext/Sys/Syslog/Makefile.PL     Sys::Syslog extension makefile writer
 ext/Sys/Syslog/Syslog.pm       Sys::Syslog extension Perl module
 ext/Sys/Syslog/Syslog.xs       Sys::Syslog extension external subroutines
@@ -485,6 +500,7 @@ hints/newsos4.sh    Hints for named architecture
 hints/next_3.sh                Hints for named architecture
 hints/next_3_0.sh      Hints for named architecture
 hints/next_4.sh                Hints for named architecture
+hints/nonstopux.sh     Hints for named architecture
 hints/openbsd.sh       Hints for named architecture
 hints/opus.sh          Hints for named architecture
 hints/os2.sh           Hints for named architecture
@@ -575,6 +591,28 @@ lib/CGI/Pretty.pm  Output nicely formatted HTML
 lib/CGI/Push.pm                Support for server push
 lib/CGI/Switch.pm      Simple interface for multiple server types
 lib/CGI/Util.pm                Utility functions
+lib/CGI/eg/RunMeFirst          Setup script for CGI examples
+lib/CGI/eg/caution.xbm         CGI example
+lib/CGI/eg/clickable_image.cgi CGI example
+lib/CGI/eg/cookie.cgi          CGI example
+lib/CGI/eg/crash.cgi           CGI example
+lib/CGI/eg/customize.cgi       CGI example
+lib/CGI/eg/diff_upload.cgi     CGI example
+lib/CGI/eg/dna_small_gif.uu    Small image for CGI examples
+lib/CGI/eg/file_upload.cgi     CGI example
+lib/CGI/eg/frameset.cgi                CGI example
+lib/CGI/eg/index.html          Index page for CGI examples
+lib/CGI/eg/internal_links.cgi  CGI example
+lib/CGI/eg/javascript.cgi      CGI example
+lib/CGI/eg/make_links.pl       CGI example
+lib/CGI/eg/monty.cgi           CGI example
+lib/CGI/eg/multiple_forms.cgi  CGI example
+lib/CGI/eg/nph-clock.cgi       CGI example
+lib/CGI/eg/nph-multipart.cgi   CGI example
+lib/CGI/eg/popup.cgi           CGI example
+lib/CGI/eg/save_state.cgi      CGI example
+lib/CGI/eg/tryit.cgi           CGI example
+lib/CGI/eg/wilogo_gif.uu       CGI example
 lib/CPAN.pm            Interface to Comprehensive Perl Archive Network
 lib/CPAN/FirstTime.pm  Utility for creating CPAN config files
 lib/CPAN/Nox.pm                Runs CPAN while avoiding compiled extensions
@@ -687,6 +725,7 @@ lib/Time/tm.pm              Internal object for Time::{gm,local}time
 lib/UNIVERSAL.pm       Base class for ALL classes
 lib/User/grent.pm      By-name interface to Perl's builtin getgr*
 lib/User/pwent.pm      By-name interface to Perl's builtin getpw*
+lib/Win32.pod          Documentation for Win32 extras
 lib/abbrev.pl          An abbreviation table builder
 lib/assert.pl          assertion and panic with stack trace
 lib/attributes.pm      For "sub foo : attrlist"
@@ -700,7 +739,6 @@ lib/bytes.pm                Pragma to enable byte operations
 lib/bytes_heavy.pl     Support routines for byte pragma
 lib/cacheout.pl                Manages output filehandles when you need too many
 lib/charnames.pm       Character names
-lib/chat2.pl            Obsolete ipc library (use Comm.pm etc instead)
 lib/complete.pl                A command completion subroutine
 lib/constant.pm                For "use constant"
 lib/ctime.pl           A ctime workalike
@@ -744,9 +782,11 @@ lib/timelocal.pl   Perl library supporting inverse of localtime, gmtime
 lib/unicode/ArabLink.pl                                Unicode character database
 lib/unicode/ArabLnkGrp.pl                      Unicode character database
 lib/unicode/ArabShap.txt                       Unicode character database
+lib/unicode/BidiMirr.txt                       Unicode character database
 lib/unicode/Bidirectional.pl                   Unicode character database
 lib/unicode/Block.pl                           Unicode character database
 lib/unicode/Blocks.txt                         Unicode character database
+lib/unicode/CaseFold.txt                       Unicode character database
 lib/unicode/Category.pl                                Unicode character database
 lib/unicode/CombiningClass.pl                  Unicode character database
 lib/unicode/CompExcl.txt                       Unicode character database
@@ -991,17 +1031,18 @@ lib/unicode/Name.pl                              Unicode character database
 lib/unicode/Names.txt                          Unicode character database
 lib/unicode/NamesList.html                     Unicode character database
 lib/unicode/Number.pl                          Unicode character database
-lib/unicode/Props.txt                          Unicode character database
+lib/unicode/PropList.txt                       Unicode character database
 lib/unicode/README.Ethiopic                    Unicode character database
+lib/unicode/README.perl                                Unicode character database
 lib/unicode/ReadMe.txt                         Unicode character database info
 lib/unicode/SpecCase.txt                       Unicode character database
 lib/unicode/To/Digit.pl                                Unicode character database
 lib/unicode/To/Lower.pl                                Unicode character database
 lib/unicode/To/Title.pl                                Unicode character database
 lib/unicode/To/Upper.pl                                Unicode character database
-lib/unicode/UCD300.html                                Unicode character database
-lib/unicode/Unicode.300                                Unicode character database
-lib/unicode/Unicode3.html                      Unicode character database
+lib/unicode/UCD301.html                                Unicode character database
+lib/unicode/UCDFF301.html                      Unicode character database
+lib/unicode/Unicode.301                                Unicode character database
 lib/unicode/mktables.PL                                Unicode character database generator
 lib/unicode/syllables.txt                      Unicode character database
 lib/utf8.pm                                    Pragma to control Unicode support
@@ -1010,7 +1051,6 @@ lib/validate.pl           Perl library supporting wholesale file mode validation
 lib/vars.pm            Declare pseudo-imported global variables
 lib/warnings.pm                For "use warnings"
 lib/warnings/register.pm       For "use warnings::register"
-lib/Win32.pod          Documentation for Win32 extras
 makeaperl.SH           perl script that produces a new perl binary
 makedef.pl             Create symbol export lists for linking
 makedepend.SH          Precursor to makedepend
@@ -1061,12 +1101,12 @@ os2/OS2/Process/Makefile.PL     system() constants in a module
 os2/OS2/Process/Process.pm     system() constants in a module
 os2/OS2/Process/Process.xs     system() constants in a module
 os2/OS2/REXX/Changes           DLL access module
-os2/OS2/REXX/MANIFEST          DLL access module
 os2/OS2/REXX/DLL/Changes               DLL access module
 os2/OS2/REXX/DLL/DLL.pm                DLL access module
 os2/OS2/REXX/DLL/DLL.xs                DLL access module
 os2/OS2/REXX/DLL/MANIFEST      DLL access module
 os2/OS2/REXX/DLL/Makefile.PL   DLL access module
+os2/OS2/REXX/MANIFEST          DLL access module
 os2/OS2/REXX/Makefile.PL       DLL access module
 os2/OS2/REXX/REXX.pm           DLL access module
 os2/OS2/REXX/REXX.xs           DLL access module
@@ -1137,10 +1177,12 @@ pod/perlcompile.pod     Info on using the Compiler suite
 pod/perldata.pod       Data structure info
 pod/perldbmfilter.pod  Info about DBM Filters
 pod/perldebguts.pod    Debugger guts info
+pod/perldebtut.pod     Perl debugging tutorial
 pod/perldebug.pod      Debugger info
 pod/perldelta.pod      Changes since last version
 pod/perldiag.pod       Diagnostic info
 pod/perldsc.pod                Data Structures Cookbook
+pod/perlebcdic.pod     Considerations for running Perl on EBCDIC platforms
 pod/perlembed.pod      Embedding info
 pod/perlfaq.pod                Frequently Asked Questions, Top Level
 pod/perlfaq1.pod       Frequently Asked Questions, Part 1
@@ -1166,10 +1208,10 @@ pod/perllocale.pod      Locale support info
 pod/perllol.pod                How to use lists of lists
 pod/perlmod.pod                Module mechanism info
 pod/perlmodinstall.pod Installing CPAN Modules
-pod/perlmodlib.pod     Module policy info
 pod/perlmodlib.PL      Generate pod/perlmodlib.pod
-pod/perlnumber.pod     Semantics of numbers and numeric operations
+pod/perlmodlib.pod     Module policy info
 pod/perlnewmod.pod     Preparing a new module for distribution
+pod/perlnumber.pod     Semantics of numbers and numeric operations
 pod/perlobj.pod                Object info
 pod/perlop.pod         Operator info
 pod/perlopentut.pod    open() tutorial
@@ -1313,8 +1355,9 @@ t/lib/dprof/test6_v       Perl code profiler tests
 t/lib/dumper-ovl.t     See if Data::Dumper works for overloaded data
 t/lib/dumper.t         See if Data::Dumper works
 t/lib/english.t                See if English works
-t/lib/env.t            See if Env works
 t/lib/env-array.t      See if Env works for arrays
+t/lib/encode.t         See if Encode works
+t/lib/env.t            See if Env works
 t/lib/errno.t          See if Errno works
 t/lib/fatal.t           See if Fatal works
 t/lib/fields.t          See if base/fields works
@@ -1339,6 +1382,7 @@ t/lib/glob-taint.t        See if File::Glob works
 t/lib/gol-basic.t      See if Getopt::Long works
 t/lib/gol-compat.t     See if Getopt::Long works
 t/lib/gol-linkage.t    See if Getopt::Long works
+t/lib/gol-oo.t         See if Getopt::Long works
 t/lib/h2ph.h           Test header file for h2ph
 t/lib/h2ph.pht         Generated output from h2ph.h by h2ph, for comparison
 t/lib/h2ph.t           See if h2ph works like it should
@@ -1376,13 +1420,29 @@ t/lib/selectsaver.t     See if SelectSaver works
 t/lib/selfloader.t     See if SelfLoader works
 t/lib/socket.t         See if Socket works
 t/lib/soundex.t                See if Soundex works
+t/lib/st-06compat.t    See if Storable works
+t/lib/st-blessed.t     See if Storable works
+t/lib/st-canonical.t   See if Storable works
+t/lib/st-dclone.t      See if Storable works
+t/lib/st-dump.pl       See if Storable works
+t/lib/st-forgive.t     See if Storable works
+t/lib/st-freeze.t      See if Storable works
+t/lib/st-lock.t                See if Storable works
+t/lib/st-overload.t    See if Storable works
+t/lib/st-recurse.t     See if Storable works
+t/lib/st-retrieve.t    See if Storable works
+t/lib/st-store.t       See if Storable works
+t/lib/st-tied.t                See if Storable works
+t/lib/st-tiedhook.t    See if Storable works
+t/lib/st-tieditems.t   See if Storable works
+t/lib/st-utf8.t                See if Storable works
 t/lib/symbol.t         See if Symbol works
 t/lib/syslfs.t         See if large files work for sysio
 t/lib/syslog.t         See if Sys::Syslog works
 t/lib/textfill.t       See if Text::Wrap::fill works
 t/lib/texttabs.t       See if Text::Tabs works
 t/lib/textwrap.t       See if Text::Wrap::wrap works
-t/lib/thr5005.t                Test 5.005-style threading (skipped if no use5005threads) 
+t/lib/thr5005.t                Test 5.005-style threading (skipped if no use5005threads)
 t/lib/tie-push.t       Test for Tie::Array
 t/lib/tie-stdarray.t   Test for Tie::StdArray
 t/lib/tie-stdhandle.t  Test for Tie::StdHandle
@@ -1398,6 +1458,7 @@ t/op/assignwarn.t See if OP= operators warn correctly for undef targets
 t/op/attrs.t           See if attributes on declarations work
 t/op/auto.t            See if autoincrement et all work
 t/op/avhv.t            See if pseudo-hashes work
+t/op/bless.t           See if bless works
 t/op/bop.t             See if bitops work
 t/op/chars.t           See if character escapes work
 t/op/chop.t            See if chop works
@@ -1461,6 +1522,7 @@ t/op/recurse.t            See if deep recursion works
 t/op/ref.t             See if refs and objects work
 t/op/regexp.t          See if regular expressions work
 t/op/regexp_noamp.t    See if regular expressions work with optimizations
+t/op/regmesg.t         See if one can get regular expression errors
 t/op/repeat.t          See if x operator works
 t/op/runlevel.t                See if die() works from perl_call_*()
 t/op/sleep.t           See if sleep works
@@ -1490,6 +1552,7 @@ t/op/wantarray.t  See if wantarray works
 t/op/write.t           See if write works
 t/pod/emptycmd.t       Test empty pod directives
 t/pod/emptycmd.xr      Expected results for emptycmd.t
+t/pod/find.t           See if Pod::Find works
 t/pod/for.t            Test =for directive
 t/pod/for.xr           Expected results for for.t
 t/pod/headings.t       Test =head directives
@@ -1529,8 +1592,8 @@ t/pragma/strict-refs      Tests of "use strict 'refs'" for strict.t
 t/pragma/strict-subs   Tests of "use strict 'subs'" for strict.t
 t/pragma/strict-vars   Tests of "use strict 'vars'" for strict.t
 t/pragma/strict.t      See if strictures work
-t/pragma/subs.t                See if subroutine pseudo-importation works
 t/pragma/sub_lval.t    See if lvalue subroutines work
+t/pragma/subs.t                See if subroutine pseudo-importation works
 t/pragma/utf8.t                See if utf8 operations work
 t/pragma/warn/1global  Tests of global warnings for warnings.t
 t/pragma/warn/2use     Tests for "use warnings" for warnings.t
@@ -1583,7 +1646,6 @@ utils/c2ph.PL             program to translate dbx stabs to perl
 utils/dprofpp.PL       Perl code profile post-processor
 utils/h2ph.PL          A thing to turn C .h files into perl .ph files
 utils/h2xs.PL          Program to make .xs files from C header files
-utils/perlbc.PL                Front-end for byte compiler
 utils/perlbug.PL       A simple tool to submit a bug report
 utils/perlcc.PL                Front-end for compiler
 utils/perldoc.PL       A simple tool to find & display perl's documentation
@@ -1620,11 +1682,11 @@ vms/perly_c.vms         perly.c with fixed declarations for global syms
 vms/perly_h.vms                perly.h with fixed declarations for global syms
 vms/sockadapt.c                glue for SockshShr socket support
 vms/sockadapt.h                glue for SockshShr socket support
-vms/subconfigure.com    performs compiler checks and writes config.sh, config.h, and descrip.mms
 vms/test.com           DCL driver for regression tests
 vms/vms.c              VMS-specific C code for Perl core
 vms/vms_yfix.pl                convert Unix perly.[ch] to VMS perly_[ch].vms
 vms/vmsish.h           VMS-specific C header for Perl core
+vms/vmspipe.com                VMS-specific piped command helper script
 vms/writemain.pl       Generate perlmain.c from miniperlmain.c+extensions
 vos/Changes            Changes made to port Perl to the VOS operating system
 vos/build.cm           VOS command macro to build Perl
@@ -1652,7 +1714,7 @@ win32/config_H.bc Win32 config header (Borland C++ build)
 win32/config_H.gc      Win32 config header (GNU build)?
 win32/config_H.vc      Win32 config header (Visual C++ build)
 win32/config_h.PL      Perl code to convert Win32 config.sh to config.h
-win32/config_sh.PL     Perl code to update Win32 config.sh from Makefile 
+win32/config_sh.PL     Perl code to update Win32 config.sh from Makefile
 win32/des_fcrypt.patch Win32 port
 win32/dl_win32.xs      Win32 port
 win32/genmk95.pl        Perl code to generate command.com-usable makefile.95
@@ -1673,7 +1735,7 @@ win32/win32.c             Win32 port
 win32/win32.h          Win32 port
 win32/win32iop.h       Win32 port
 win32/win32sck.c       Win32 port
-win32/win32thread.c    Win32 functions for threads 
+win32/win32thread.c    Win32 functions for threads
 win32/win32thread.h    Win32 port mapping to threads
 writemain.SH           Generate perlmain.c from miniperlmain.c+extensions
 x2p/EXTERN.h           Same as above
index caa647b..5418fc4 100644 (file)
@@ -70,7 +70,7 @@ true)
                *)      shrpldflags="$shrpldflags -b noentry"
                        ;;
                esac
-               shrpldflags="$shrpldflags $ldflags $libs $cryptlib"
+               shrpldflags="$shrpldflags $ldflags $perllibs $cryptlib"
                linklibperl="-L $archlibexp/CORE -L `pwd | sed 's/\/UU$//'` -lperl"
                ;;
        hpux*)
@@ -134,8 +134,6 @@ LD = $ld
 LDFLAGS = $ldflags
 CLDFLAGS = $ldflags
 
-SMALL = $small
-LARGE = $large $split
 mallocsrc = $mallocsrc
 mallocobj = $mallocobj
 LNS = $lns
@@ -176,7 +174,7 @@ nonxs_ext = $nonxs_list
 ext = \$(dynamic_ext) \$(static_ext) \$(nonxs_ext)
 DYNALOADER = lib/auto/DynaLoader/DynaLoader\$(LIB_EXT)
 
-libs = $libs $cryptlib
+libs = $perllibs $cryptlib
 
 public = perl $suidperl utilities translators
 
@@ -206,11 +204,12 @@ SHELL = $sh
 # how to tr(anslate) newlines
 TRNL = '$trnl'
 
+!GROK!THIS!
 # not used by Makefile but by installperl;
-# mentioned here so that metaconfig picks it up
-INSTALL_USR_BIN_PERL = $installusrbinperl
+# mentioned here so that metaconfig picks these up
+# $installusrbinperl
+# $versiononly
 
-!GROK!THIS!
 
 ## In the following dollars and backticks do not need the extra backslash.
 $spitshell >>Makefile <<'!NO!SUBS!'
@@ -329,10 +328,9 @@ ext.libs: $(static_ext)
 # patchlevel.h: .patch
 #      perl fix_pl || (make -f Makefile.micro && ./microperl fix_pl)
 #      $(SHELL) Makefile.SH
-
-!NO!SUBS!
-
-fi
+# fi
+# 
+# !NO!SUBS!
 
 # How to build libperl.  This is still rather convoluted.
 # Load up custom Makefile.SH fragment for shared loading and executables:
@@ -345,7 +343,7 @@ esac
 case "$osname" in
 aix)
        $spitshell >>Makefile <<!GROK!THIS!
-LIBS                   = $libs
+LIBS                   = $perllibs
 # In AIX we need to change this for building Perl itself from
 # its earlier definition (which is for building external
 # extensions *after* Perl has been built and installed)
@@ -470,7 +468,7 @@ miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
        *)
                $spitshell >>Makefile <<'!NO!SUBS!'
 miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
-       $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl \
+       $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl \
            miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
        $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
 !NO!SUBS!
@@ -480,16 +478,16 @@ miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL) opmini$(OBJ_EXT)
        $spitshell >>Makefile <<'!NO!SUBS!'
 
 perl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
-       $(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
-       $(SHRPENV) $(LDLIBPTH) purify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) purify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
-       $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
-       $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 # This version, if specified in Configure, does ONLY those scripts which need
 # set-id emulation.  Suidperl must be setuid root.  It contains the "taint"
@@ -497,7 +495,7 @@ quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
 # has been invoked correctly.
 
 suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs $(PERLEXPORT)
-       $(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 !NO!SUBS!
 
@@ -546,15 +544,25 @@ extra.pods: miniperl
        -@rm -f extra.pods
        -@for x in `grep -l '^=[a-z]' README.* | grep -v README.vms` ; do \
            nx=`echo $$x | sed -e "s/README\.//"`; \
-           $(LNS) ../$$x "pod/perl"$$nx".pod" ; \
+           cd pod ; $(LNS) ../$$x "perl"$$nx".pod" ; cd .. ; \
            echo "pod/perl"$$nx".pod" >> extra.pods ; \
        done
-       -@test -f vms/perlvms.pod && $(LNS) ../vms/perlvms.pod pod/perlvms.pod && echo "pod/perlvms.pod" >> extra.pods
+       -@test -f vms/perlvms.pod && cd pod && $(LNS) ../vms/perlvms.pod perlvms.pod && cd .. && echo "pod/perlvms.pod" >> extra.pods
 
 install-strip:
        $(MAKE) STRIPFLAGS=-s install
 
-install: all install.perl install.man
+install:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS)
+
+install-verbose:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-V
+
+install-silent:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-S
+
+no-install:
+       $(MAKE) install.perl install.man STRIPFLAGS=$(STRIPFLAGS) INSTALLFLAGS=-n
 
 install.perl:  all installperl
        if [ -n "$(COMPILE)" ]; \
@@ -564,15 +572,15 @@ install.perl:     all installperl
                cd ../pod; $(MAKE) compile; \
        else :; \
        fi
-       $(LDLIBPTH) ./perl installperl $(STRIPFLAGS)
+       $(LDLIBPTH) ./perl installperl $(INSTALLFLAGS) $(STRIPFLAGS)
 
 install.man:   all installman
-       $(LDLIBPTH) ./perl installman
+       $(LDLIBPTH) ./perl installman $(INSTALLFLAGS)
 
 # XXX Experimental. Hardwired values, but useful for testing.
 # Eventually Configure could ask for some of these values.
 install.html: all installhtml
-       -@test -f README.vms && $(LNS) ../README.vms vms/README_vms.pod
+       -@test -f README.vms && cd vms && $(LNS) ../README.vms README_vms.pod && cd ..
        $(LDLIBPTH) ./perl installhtml                   \
       --podroot=. --podpath=. --recurse  \
       --htmldir=$(privlib)/html     \
@@ -677,20 +685,26 @@ n_dummy $(nonxs_ext):     miniperl preplibrary $(DYNALOADER) FORCE
 
 clean:         _tidy _mopup
 
-realclean:     _cleaner _mopup
+realclean:     _realcleaner _mopup
        @echo "Note that make realclean does not delete config.sh or Policy.sh"
 
-clobber:       _cleaner _mopup
+_clobber:
        rm -f config.sh cppstdin Policy.sh
 
+clobber:       _realcleaner _mopup _clobber
+
 distclean:     clobber
 
+# Like distclean but also removes emacs backups and *.orig.
+veryclean:     _verycleaner _mopup _clobber
+       -@rm -f Obsolete Wanted
+
 # Do not 'make _mopup' directly.
 _mopup:
        rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c
        -@test -f extra.pods && rm -f `cat extra.pods`
        -@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
-       -rm -f perl.exp ext.libs extra.pods
+       -rm -f perl.exp ext.libs extra.pods opmini.o
        -rm -f perl.export perl.dll perl.libexp perl.map perl.def
        -rm -f perl.loadmap miniperl.loadmap perl.prelmap miniperl.prelmap
        rm -f perl suidperl miniperl $(LIBPERL) libperl.* microperl
@@ -705,16 +719,17 @@ _tidy:
        done
        rm -f testcompile compilelog
 
-# Do not 'make _cleaner' directly.
-_cleaner:
+_cleaner1:
        -cd os2; rm -f Makefile
-       -cd pod; $(LDLIBPTH) $(MAKE) realclean
-       -cd utils; $(LDLIBPTH) $(MAKE) realclean
-       -cd x2p; $(LDLIBPTH) $(MAKE) realclean
+       -cd pod; $(LDLIBPTH) $(MAKE) $(CLEAN)
+       -cd utils; $(LDLIBPTH) $(MAKE) $(CLEAN)
+       -cd x2p; $(LDLIBPTH) $(MAKE) $(CLEAN)
        -@for x in $(DYNALOADER) $(dynamic_ext) $(static_ext) $(nonxs_ext) ; do \
-       $(LDLIBPTH) sh ext/util/make_ext realclean $$x MAKE=$(MAKE) ; \
+       $(LDLIBPTH) sh ext/util/make_ext $(CLEAN) $$x MAKE=$(MAKE) ; \
        done
-       rm -f core core.*perl.*.? *perl.core t/core t/core.perl.*.? t/*perl.core t/misctmp* t/forktmp* t/tmp* t/c t/perl .?*.c so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
+
+_cleaner2:
+       rm -f core core.*perl.*.? *perl.core t/core t/core.perl.*.? t/*perl.core t/misctmp* t/forktmp* t/tmp* t/c t/perl t/rantests .?*.c so_locations $(LIBPERL_NONSHR) $(MINIPERL_NONSHR)
        rm -rf $(addedbyconf)
        rm -f $(FIRSTMAKEFILE) $(FIRSTMAKEFILE).old
        rm -f $(private)
@@ -723,7 +738,16 @@ _cleaner:
        rm -f h2ph.man pstruct
        rm -rf .config
        rm -f testcompile compilelog
-       -rmdir lib/B lib/Data lib/IO/Socket lib/IO
+       -rmdir lib/B lib/Data lib/Encode lib/IO/Socket lib/IO lib/Sys lib/Thread
+
+_realcleaner: 
+       @$(LDLIBPTH) $(MAKE) _cleaner1 CLEAN=realclean
+       @$(LDLIBPTH) $(MAKE) _cleaner2
+
+_verycleaner: 
+       @$(LDLIBPTH) $(MAKE) _cleaner1 CLEAN=veryclean
+       @$(LDLIBPTH) $(MAKE) _cleaner2
+       -rm -f *~ *.orig */*~ */*.orig */*/*~ */*/*.orig
 
 # The following lint has practically everything turned on.  Unfortunately,
 # you have to wade through a lot of mumbo jumbo that can't be suppressed.
@@ -768,6 +792,7 @@ test check: test-prep
        else \
          cd t && PERL_SKIP_TTY_TEST=1 $(LDLIBPTH) ./perl TEST; \
        fi
+       @echo "Ran tests" > t/rantests
 
 utest ucheck: test-prep
        if (true </dev/tty) >/dev/null 2>&1; then \
index 0d9c1df..fec18b9 100644 (file)
@@ -7,18 +7,33 @@ $startsh
 #
 #  This file was produced by running the Policy_sh.SH script, which
 #  gets its values from config.sh, which is generally produced by
-#  running Configure.  The Policy.sh file gets overwritten each time
-#  Configure is run.  Any variables you add to Policy.sh will be lost
-#  unless you copy Policy.sh somewhere else before running Configure.
+#  running Configure.  
 #
 #  The idea here is to distill in one place the common site-wide
 #  "policy" answers (such as installation directories) that are
 #  to be "sticky".  If you keep the file Policy.sh around in
 #  the same directory as you are building Perl, then Configure will
 #  (by default) load up the Policy.sh file just before the
-#  platform-specific hints file.
+#  platform-specific hints file and rewrite it at the end.
+#
+#   The sequence of events is as follows:
+#   A:  If you are NOT re-using an old config.sh:
+#   1.  At start-up, Configure loads up the defaults from the
+#      os-specific  hints/osname_osvers.sh file and any previous
+#      Policy.sh file.
+#   2.  At the end, Configure runs Policy_sh.SH, which creates
+#      Policy.sh, overwriting a previous Policy.sh if necessary.
+#
+#   B: If you are re-using an old config.sh:
+#   1.  At start-up, Configure loads up the defaults from config.sh, 
+#      ignoring any previous Policy.sh file.
+#   2.  At the end, Configure runs Policy_sh.SH, which creates
+#      Policy.sh, overwriting a previous Policy.sh if necessary.
+#
+#  Thus the Policy.sh file gets overwritten each time
+#  Configure is run.  Any variables you add to Policy.sh will be lost
+#  unless you copy Policy.sh somewhere else before running Configure.
 #
-
 #  Allow Configure command-line overrides; usually these won't be
 #  needed, but something like -Dprefix=/test/location can be quite
 #  useful for testing out new versions.
@@ -37,16 +52,37 @@ esac
 case "\$prefix" in
 '') prefix='$prefix' ;;
 esac
+
+# By default, the next three are the same as \$prefix.  
+# If the user changes \$prefix, and previously \$siteprefix was the
+# same as \$prefix, then change \$siteprefix as well.
+# Use similar logic for \$vendorprefix and \$installprefix.
+
 case "\$siteprefix" in
-'') siteprefix='$siteprefix' ;;
+'') if test "$siteprefix" = "$prefix"; then
+       siteprefix="\$prefix"
+    else
+       siteprefix='$siteprefix'
+    fi
+    ;;
 esac
 case "\$vendorprefix" in
-'') vendorprefix='$vendorprefix' ;;
+'') if test "$vendorprefix" = "$prefix"; then
+       vendorprefix="\$prefix"
+    else
+       vendorprefix='$vendorprefix'
+    fi
+    ;;
 esac
 
 # Where installperl puts things.
 case "\$installprefix" in
-'') installprefix='$installprefix' ;;
+'') if test "$installprefix" = "$prefix"; then
+       installprefix="\$prefix"
+    else
+       installprefix='$installprefix'
+    fi
+    ;;
 esac
 
 # Installation directives.  Note that each one comes in three flavors.
index f1e7b8e..1b93821 100644 (file)
@@ -174,7 +174,8 @@ cat (Loc.U):
 cc (cc.U):
        This variable holds the name of a command to execute a C compiler which
        can resolve multiple global references that happen to have the same
-       name.  Usual values are 'cc', 'Mcc', 'cc -M', and 'gcc'.
+       name.  Usual values are 'cc' and 'gcc'.
+       Fervent ANSI compilers may be called 'c89'.  AIX has xlc.
 
 cccdlflags (dlsrc.U):
        This variable contains any special flags that might need to be
@@ -192,12 +193,28 @@ ccflags (ccflags.U):
        This variable contains any additional C compiler flags desired by
        the user.  It is up to the Makefile to use this.
 
+ccflags_uselargefiles (uselfs.U):
+       This variable contains the compiler flags needed by large file builds
+       and added to ccflags by hints files.
+
+ccname (Checkcc.U):
+       This can set either by hints files or by Configure.  If using
+       gcc, this is gcc, and if not, usually equal to cc, unimpressive, no?
+       Some platforms, however, make good use of this by storing the
+       flavor of the C compiler being used here.  For example if using
+       the Sun WorkShop suite, ccname will be 'workshop'.
+
 ccsymbols (Cppsym.U):
        The variable contains the symbols defined by the C compiler alone.
        The symbols defined by cpp or by cc when it calls cpp are not in
        this list, see cppsymbols and cppccsymbols.
        The list is a space-separated list of symbol=value tokens.
 
+ccversion (Checkcc.U):
+       This can set either by hints files or by Configure.  If using
+       a (non-gcc) vendor cc, this variable may contain a version for
+       the compiler.
+
 cf_by (cf_who.U):
        Login name of the person who ran the Configure script and answered the
        questions. This is used to tag both config.sh and config_h.SH.
@@ -1086,28 +1103,34 @@ d_PRId64 (quadfio.U):
        indiciates that stdio has a symbol to print 64-bit decimal numbers.
 
 d_PRIeldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
 
-d_PRIEldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+d_PRIEUldbl (longdblfio.U):
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
+       The 'U' in the name is to separate this from d_PRIeldbl so that even
+       case-blind systems can see the difference.
 
 d_PRIfldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
 
-d_PRIFldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+d_PRIFUldbl (longdblfio.U):
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
+       The 'U' in the name is to separate this from d_PRIfldbl so that even
+       case-blind systems can see the difference.
 
 d_PRIgldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
 
-d_PRIGldbl (longdblfio.U):
-       This variable conditionally defines the PERL_PRIfldlbl symbol, which
+d_PRIGUldbl (longdblfio.U):
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
        indiciates that stdio has a symbol to print long doubles.
+       The 'U' in the name is to separate this from d_PRIgldbl so that even
+       case-blind systems can see the difference.
 
 d_PRIi64 (quadfio.U):
        This variable conditionally defines the PERL_PRIi64 symbol, which
@@ -1126,9 +1149,11 @@ d_PRIx64 (quadfio.U):
        This variable conditionally defines the PERL_PRIx64 symbol, which
        indiciates that stdio has a symbol to print 64-bit hexadecimal numbers.
 
-d_PRIX64 (quadfio.U):
-       This variable conditionally defines the PERL_PRIX64 symbol, which
+d_PRIXU64 (quadfio.U):
+       This variable conditionally defines the PERL_PRIXU64 symbol, which
        indiciates that stdio has a symbol to print 64-bit hExADECimAl numbers.
+       The 'U' in the name is to separate this from d_PRIx64 so that even
+       case-blind systems can see the difference.
 
 d_pthread_yield (d_pthread_y.U):
        This variable conditionally defines the HAS_PTHREAD_YIELD
@@ -1220,6 +1245,10 @@ d_scm_rights (d_socket.U):
        which indicates that the SCM_RIGHTS is available.  #ifdef is
        not enough because it may be an enum, glibc has been known to do this.
 
+d_SCNfldbl (longdblfio.U):
+       This variable conditionally defines the PERL_PRIfldbl symbol, which
+       indiciates that stdio has a symbol to scan long doubles.
+
 d_seekdir (d_readdir.U):
        This variable conditionally defines HAS_SEEKDIR if seekdir() is
        available.
@@ -1312,6 +1341,11 @@ d_setprior (d_setprior.U):
        This variable conditionally defines HAS_SETPRIORITY if setpriority()
        is available to set a process's priority.
 
+d_setproctitle (d_setproctitle.U):
+       This variable conditionally defines the HAS_SETPROCTITLE symbol,
+       which indicates to the C program that the setproctitle() routine
+       is available.
+
 d_setpwent (d_setpwent.U):
        This variable conditionally defines the HAS_SETPWENT symbol, which
        indicates to the C program that the setpwent() routine is available
@@ -1409,6 +1443,10 @@ d_sockpair (d_socket.U):
        This variable conditionally defines the HAS_SOCKETPAIR symbol, which
        indicates that the BSD socketpair() is supported.
 
+d_socks5_init (d_socks5_init.U):
+       This variable conditionally defines the HAS_SOCKS5_INIT symbol, which
+       indicates to the C program that the socks5_init() routine is available.
+
 d_sqrtl (d_sqrtl.U):
        This variable conditionally defines the HAS_SQRTL symbol, which
        indicates to the C program that the sqrtl() routine is available.
@@ -1803,7 +1841,12 @@ full_sed (Loc_sed.U):
        can share this executable will have the same full pathname to
        'sed.'
 
-gccversion (cc.U):
+gccosandvers (gccvers.U):
+       If GNU cc (gcc) is used, this variable the operating system and
+       version used to compile the gcc.  It is set to '' if not gcc,
+       or if nothing useful can be parsed as the os version.
+
+gccversion (gccvers.U):
        If GNU cc (gcc) is used, this variable holds '1' or '2' to 
        indicate whether the compiler is version 1 or 2.  This is used in
        setting some of the default cflags.  It is set to '' if not gcc.
@@ -1870,12 +1913,6 @@ hostcat (nis.U):
        On some systems, such as os390, there may be no equivalent
        command, in which case this variable is unset.
 
-huge (models.U):
-       This variable contains a flag which will tell the C compiler and loader
-       to produce a program running with a huge memory model.  If the
-       huge model is not supported, contains the flag to produce large
-       model programs.  It is up to the Makefile to use this.
-
 i16size (perlxv.U):
        This variable is the size of an I16 in bytes.
 
@@ -1962,6 +1999,10 @@ i_inttypes (i_inttypes.U):
        This variable conditionally defines the I_INTTYPES symbol,
        and indicates whether a C program should include <inttypes.h>.
 
+i_libutil (i_libutil.U):
+       This variable conditionally defines the I_LIBUTIL symbol, and indicates
+       whether a C program should include <libutil.h>.
+
 i_limits (i_limits.U):
        This variable conditionally defines the I_LIMITS symbol, and indicates
        whether a C program may include <limits.h> to get symbols like WORD_BIT
@@ -2385,11 +2426,6 @@ ksh (Loc.U):
        This variable is defined but not used by Configure.
        The value is a plain '' and is not useful.
 
-large (models.U):
-       This variable contains a flag which will tell the C compiler and loader
-       to produce a program running with a large memory model.  It is up to
-       the Makefile to use this.
-
 ld (dlsrc.U):
        This variable indicates the program to be used to link
        libraries for dynamic loading.  On some systems, it is 'ld'.
@@ -2406,6 +2442,10 @@ ldflags (ccflags.U):
        This variable contains any additional C loader flags desired by
        the user.  It is up to the Makefile to use this.
 
+ldflags_uselargefiles (uselfs.U):
+       This variable contains the loader flags needed by large file builds
+       and added to ldflags by hints files.
+
 ldlibpthname (libperl.U):
        This variable holds the name of the shared library
        search path, often LD_LIBRARY_PATH.  To get an empty
@@ -2458,6 +2498,12 @@ libswanted (Myinit.U):
        search.  The order is chosen to pick up the c library
        ahead of ucb or bsd libraries for SVR4.
 
+libswanted_uselargefiles (uselfs.U):
+       This variable contains the libraries needed by large file builds
+       and added to ldflags by hints files.  It is a space separated list
+       of the library names without the "lib" prefix or any suffix, just
+       like libswanted..
+
 line (Loc.U):
        This variable is defined but not used by Configure.
        The value is a plain '' and is not useful.
@@ -2603,12 +2649,6 @@ Mcc (Loc.U):
        full pathname (if any) of the Mcc program.  After Configure runs,
        the value is reset to a plain "Mcc" and is not useful.
 
-medium (models.U):
-       This variable contains a flag which will tell the C compiler and loader
-       to produce a program running with a medium memory model.  If the
-       medium model is not supported, contains the flag to produce large
-       model programs.  It is up to the Makefile to use this.
-
 mips_type (usrinc.U):
        This variable holds the environment type for the mips system.
        Possible values are "BSD 4.3" and "System V".
@@ -2623,11 +2663,6 @@ mmaptype (d_mmap.U):
        (and simultaneously the type of the first argument).
        It can be 'void *' or 'caddr_t'.
 
-models (models.U):
-       This variable contains the list of memory models supported by this
-       system.  Possible component values are none, split, unsplit, small,
-       medium, large, and huge.  The component values are space separated.
-
 modetype (modetype.U):
        This variable defines modetype to be something like mode_t, 
        int, unsigned short, or whatever type is used to declare file 
@@ -2720,6 +2755,30 @@ nroff (Loc.U):
        full pathname (if any) of the nroff program.  After Configure runs,
        the value is reset to a plain "nroff" and is not useful.
 
+nveformat (perlxvf.U):
+       This variable contains the format string used for printing
+       a Perl NV using %e-ish floating point format.
+
+nvEUformat (perlxvf.U):
+       This variable contains the format string used for printing
+       a Perl NV using %E-ish floating point format.
+
+nvfformat (perlxvf.U):
+       This variable confains the format string used for printing
+       a Perl NV using %f-ish floating point format.
+
+nvFUformat (perlxvf.U):
+       This variable confains the format string used for printing
+       a Perl NV using %F-ish floating point format.
+
+nvgformat (perlxvf.U):
+       This variable contains the format string used for printing
+       a Perl NV using %g-ish floating point format.
+
+nvGUformat (perlxvf.U):
+       This variable contains the format string used for printing
+       a Perl NV using %G-ish floating point format.
+
 nvsize (perlxv.U):
        This variable is the size of an NV in bytes.
 
@@ -2827,6 +2886,10 @@ PERL_VERSION (Oldsyms.U):
 perladmin (perladmin.U):
        Electronic mail address of the perl5 administrator.
 
+perllibs (End.U):
+       The list of libraries needed by Perl only (any libraries needed
+       by extensions only will by dropped, if using dynamic loading).
+
 perlpath (perlpath.U):
        This variable contains the eventual value of the PERLPATH symbol,
        which contains the name of the perl interpreter to be used in
@@ -3149,11 +3212,6 @@ smail (Loc.U):
        This variable is defined but not used by Configure.
        The value is a plain '' and is not useful.
 
-small (models.U):
-       This variable contains a flag which will tell the C compiler and loader
-       to produce a program running with a small memory model.  It is up to
-       the Makefile to use this.
-
 so (so.U):
        This variable holds the extension used to identify shared libraries
        (also known as shared objects) on the system. Usually set to 'so'.
@@ -3183,12 +3241,6 @@ spitshell (spitshell.U):
        This variable contains the command necessary to spit out a runnable
        shell on this system.  It is either cat or a grep '-v' for # comments.
 
-split (models.U):
-       This variable contains a flag which will tell the C compiler and loader
-       to produce a program that will run in separate I and D space, for those
-       machines that support separation of instruction and data space.  It is
-       up to the Makefile to use this.
-
 sPRId64 (quadfio.U):
        This variable, if defined, contains the string used by stdio to
        format 64-bit decimal numbers (format 'd') for output.
@@ -3197,25 +3249,31 @@ sPRIeldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'e') for output.
 
-sPRIEldbl (longdblfio.U):
+sPRIEUldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'E') for output.
+       The 'U' in the name is to separate this from sPRIeldbl so that even
+       case-blind systems can see the difference.
 
 sPRIfldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'f') for output.
 
-sPRIFldbl (longdblfio.U):
+sPRIFUldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'F') for output.
+       The 'U' in the name is to separate this from sPRIfldbl so that even
+       case-blind systems can see the difference.
 
 sPRIgldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'g') for output.
 
-sPRIGldbl (longdblfio.U):
+sPRIGUldbl (longdblfio.U):
        This variable, if defined, contains the string used by stdio to
        format long doubles (format 'G') for output.
+       The 'U' in the name is to separate this from sPRIgldbl so that even
+       case-blind systems can see the difference.
 
 sPRIi64 (quadfio.U):
        This variable, if defined, contains the string used by stdio to
@@ -3233,15 +3291,21 @@ sPRIx64 (quadfio.U):
        This variable, if defined, contains the string used by stdio to
        format 64-bit hexadecimal numbers (format 'x') for output.
 
-sPRIX64 (quadfio.U):
+sPRIXU64 (quadfio.U):
        This variable, if defined, contains the string used by stdio to
        format 64-bit hExADECimAl numbers (format 'X') for output.
+       The 'U' in the name is to separate this from sPRIx64 so that even
+       case-blind systems can see the difference.
 
 src (src.U):
        This variable holds the path to the package source. It is up to
        the Makefile to use this variable and set VPATH accordingly to
        find the sources remotely.
 
+sSCNfldbl (longdblfio.U):
+       This variable, if defined, contains the string used by stdio to
+       format long doubles (format 'f') for input.
+
 ssizetype (ssizetype.U):
        This variable defines ssizetype to be something like ssize_t, 
        long or int.  It is used by functions that return a count 
@@ -3556,7 +3620,11 @@ uvuformat (perlxvf.U):
 
 uvxformat (perlxvf.U):
        This variable contains the format string used for printing
-       a Perl UV as an unsigned hexadecimal integer. 
+       a Perl UV as an unsigned hexadecimal integer in lowercase abcdef.
+
+uvXUformat (perlxvf.U):
+       This variable contains the format string used for printing
+       a Perl UV as an unsigned hexadecimal integer in uppercase ABCDEF.
 
 vendorarch (vendorarch.U):
        This variable contains the value of the PERL_VENDORARCH symbol.
@@ -3618,6 +3686,18 @@ version (patchlevel.U):
        This is suitable for use as a directory name, and hence is
        filesystem dependent.
 
+versiononly (versiononly.U):
+       If set, this symbol indicates that only the version-specific
+       components of a perl installation should be installed.
+       This may be useful for making a test installation of a new
+       version without disturbing the existing installation.
+       Setting versiononly is equivalent to setting installperl's -v option.
+       In particular, the non-versioned scripts and programs such as
+       a2p, c2ph, h2xs, pod2*, and perldoc are not installed
+       (see INSTALL for a more complete list).  Nor are the man
+       pages installed.
+       Usually, this is undef.
+
 vi (Loc.U):
        This variable is defined but not used by Configure.
        The value is a plain '' and is not useful.
index c9e9f71..632c469 100644 (file)
@@ -7,8 +7,8 @@
 #
 
 # Package name      : perl5
-# Source directory  : .
-# Configuration time: Wed May 31 01:48:08 EET DST 2000
+# Source directory  : /m/fs/work/work/permanent/perl/pp4/perl
+# Configuration time: Fri Oct 13 02:12:22 EET DST 2000
 # Configured by     : jhi
 # Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
 
@@ -35,10 +35,10 @@ api_subversion='0'
 api_version='5'
 api_versionstring='5.005'
 ar='ar'
-archlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
-archlibexp='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+archlib='/opt/perl/lib/5.7.0/alpha-dec_osf-thread'
+archlibexp='/opt/perl/lib/5.7.0/alpha-dec_osf-thread'
 archname64=''
-archname='alpha-dec_osf-thread-multi'
+archname='alpha-dec_osf-thread'
 archobjs=''
 awk='awk'
 baserev='5.0'
@@ -54,12 +54,15 @@ castflags='0'
 cat='cat'
 cc='cc'
 cccdlflags=' '
-ccdlflags='  -Wl,-rpath,/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi/CORE'
+ccdlflags='  -Wl,-rpath,/opt/perl/lib/5.7.0/alpha-dec_osf-thread/CORE'
 ccflags='-pthread -std -DLANGUAGE_C'
+ccflags_uselargefiles=''
+ccname='cc'
 ccsymbols='__alpha=1 __LANGUAGE_C__=1 __osf__=1 __unix__=1 _LONGLONG=1 _SYSTYPE_BSD=1 SYSTYPE_BSD=1 unix=1'
+ccversion='V5.6-082'
 cf_by='jhi'
 cf_email='yourname@yourhost.yourplace.com'
-cf_time='Wed May 31 01:48:08 EET DST 2000'
+cf_time='Fri Oct 13 02:12:22 EET DST 2000'
 charsize='1'
 chgrp=''
 chmod=''
@@ -83,10 +86,10 @@ crosscompile='undef'
 cryptlib=''
 csh='csh'
 d_Gconvert='gcvt((x),(n),(b))'
-d_PRIEldbl='define'
-d_PRIFldbl='define'
-d_PRIGldbl='define'
-d_PRIX64='define'
+d_PRIEUldbl='define'
+d_PRIFUldbl='define'
+d_PRIGUldbl='define'
+d_PRIXU64='define'
 d_PRId64='define'
 d_PRIeldbl='define'
 d_PRIfldbl='define'
@@ -95,6 +98,7 @@ d_PRIi64='define'
 d_PRIo64='define'
 d_PRIu64='define'
 d_PRIx64='define'
+d_SCNfldbl='define'
 d_access='define'
 d_accessx='undef'
 d_alarm='define'
@@ -301,6 +305,7 @@ d_setpgid='define'
 d_setpgrp2='undef'
 d_setpgrp='define'
 d_setprior='define'
+d_setproctitle='undef'
 d_setpwent='define'
 d_setregid='define'
 d_setresgid='undef'
@@ -323,6 +328,7 @@ d_sigsetjmp='define'
 d_socket='define'
 d_socklen_t='undef'
 d_sockpair='define'
+d_socks5_init='undef'
 d_sqrtl='define'
 d_statblks='define'
 d_statfs_f_flags='define'
@@ -388,7 +394,7 @@ dlext='so'
 dlsrc='dl_dlopen.xs'
 doublesize='8'
 drand01='drand48()'
-dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog Thread attrs re'
+dynamic_ext='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
 eagain='EAGAIN'
 ebcdic='undef'
 echo='echo'
@@ -397,7 +403,7 @@ emacs=''
 eunicefix=':'
 exe_ext=''
 expr='expr'
-extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog Thread attrs re Errno'
+extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re Errno'
 fflushNULL='define'
 fflushall='undef'
 find=''
@@ -409,6 +415,7 @@ freetype='void'
 full_ar='/usr/bin/ar'
 full_csh='/usr/bin/csh'
 full_sed='/usr/bin/sed'
+gccosandvers=''
 gccversion=''
 gidformat='"u"'
 gidsign='1'
@@ -423,7 +430,6 @@ h_fcntl='false'
 h_sysfile='true'
 hint='recommended'
 hostcat='cat /etc/hosts'
-huge=''
 i16size='2'
 i16type='short'
 i32size='4'
@@ -446,6 +452,7 @@ i_grp='define'
 i_iconv='define'
 i_ieeefp='undef'
 i_inttypes='undef'
+i_libutil='undef'
 i_limits='define'
 i_locale='define'
 i_machcthr='undef'
@@ -515,17 +522,17 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi'
+installarchlib='/opt/perl/lib/5.7.0/alpha-dec_osf-thread'
 installbin='/opt/perl/bin'
 installman1dir='/opt/perl/man/man1'
 installman3dir='/opt/perl/man/man3'
 installprefix='/opt/perl'
 installprefixexp='/opt/perl'
-installprivlib='/opt/perl/lib/5.6.0'
+installprivlib='/opt/perl/lib/5.7.0'
 installscript='/opt/perl/bin'
-installsitearch='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+installsitearch='/opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread'
 installsitebin='/opt/perl/bin'
-installsitelib='/opt/perl/lib/site_perl/5.6.0'
+installsitelib='/opt/perl/lib/site_perl/5.7.0'
 installstyle='lib'
 installusrbinperl='define'
 installvendorarch=''
@@ -535,24 +542,25 @@ intsize='4'
 ivdformat='"ld"'
 ivsize='8'
 ivtype='long'
-known_extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Fcntl File/Glob GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Sys/Hostname Sys/Syslog Thread attrs re'
+known_extensions='B ByteLoader DB_File Data/Dumper Devel/DProf Devel/Peek Encode Fcntl File/Glob GDBM_File IO IPC/SysV NDBM_File ODBM_File Opcode POSIX SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread attrs re'
 ksh=''
-large=''
 ld='ld'
 lddlflags='-shared -expect_unresolved "*" -msym -std -s'
 ldflags=''
+ldflags_uselargefiles=''
 ldlibpthname='LD_LIBRARY_PATH'
 less='less'
 lib_ext='.a'
 libc='/usr/shlib/libc.so'
 libperl='libperl.so'
 libpth='/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /var/shlib'
-libs='-lgdbm -ldbm -ldb -lm -liconv -lpthread -lexc'
+libs='-lgdbm -ldbm -ldb -lm -liconv -lutil -lpthread -lexc'
 libsdirs=' /usr/shlib /usr/ccs/lib'
-libsfiles=' libgdbm.so libdbm.a libdb.so libm.so libiconv.so libpthread.so libexc.so'
-libsfound=' /usr/shlib/libgdbm.so /usr/ccs/lib/libdbm.a /usr/shlib/libdb.so /usr/shlib/libm.so /usr/shlib/libiconv.so /usr/shlib/libpthread.so /usr/shlib/libexc.so'
+libsfiles=' libgdbm.so libdbm.a libdb.so libm.so libiconv.so libutil.a libpthread.so libexc.so'
+libsfound=' /usr/shlib/libgdbm.so /usr/ccs/lib/libdbm.a /usr/shlib/libdb.so /usr/shlib/libm.so /usr/shlib/libiconv.so /usr/ccs/lib/libutil.a /usr/shlib/libpthread.so /usr/shlib/libexc.so'
 libspath=' /usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /var/shlib'
-libswanted='sfio socket bind inet nsl nm gdbm dbm db malloc dld ld sun m cposix posix ndir dir crypt sec ucb BSD x iconv pthread exc'
+libswanted='sfio socket bind inet nsl nm gdbm dbm db malloc dld ld sun m cposix posix ndir dir crypt sec ucb BSD x iconv util pthread exc'
+libswanted_uselargefiles=''
 line=''
 lint=''
 lkflags=''
@@ -581,11 +589,9 @@ man1ext='1'
 man3dir='/opt/perl/man/man3'
 man3direxp='/opt/perl/man/man3'
 man3ext='3'
-medium=''
 mips_type=''
 mkdir='mkdir'
 mmaptype='void *'
-models='none'
 modetype='mode_t'
 more='more'
 multiarch='undef'
@@ -604,6 +610,12 @@ nm_opt='-p'
 nm_so_opt=''
 nonxs_ext='Errno'
 nroff='nroff'
+nvEUformat='"E"'
+nvFUformat='"F"'
+nvGUformat='"G"'
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
 nvsize='8'
 nvtype='double'
 o_nonblock='O_NONBLOCK'
@@ -612,16 +624,17 @@ old_pthread_create_joinable=''
 optimize='-O'
 orderlib='false'
 osname='dec_osf'
-osvers='4.0'
+osvers='4.0d'
 otherlibdirs=' '
 package='perl5'
 pager='/c/bin/less'
 passcat='cat /etc/passwd'
-patchlevel='6'
+patchlevel='7'
 path_sep=':'
 perl5='/u/vieraat/vieraat/jhi/Perl/bin/perl'
 perl=''
 perladmin='yourname@yourhost.yourplace.com'
+perllibs='-lm -liconv -lutil -lpthread -lexc'
 perlpath='/opt/perl/bin/perl'
 pg='pg'
 phostname=''
@@ -632,8 +645,8 @@ pmake=''
 pr=''
 prefix='/opt/perl'
 prefixexp='/opt/perl'
-privlib='/opt/perl/lib/5.6.0'
-privlibexp='/opt/perl/lib/5.6.0'
+privlib='/opt/perl/lib/5.7.0'
+privlibexp='/opt/perl/lib/5.7.0'
 prototype='define'
 ptrsize='8'
 quadkind='2'
@@ -647,10 +660,10 @@ revision='5'
 rm='rm'
 rmail=''
 runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
 sPRId64='"ld"'
 sPRIeldbl='"e"'
 sPRIfldbl='"f"'
@@ -659,6 +672,7 @@ sPRIi64='"li"'
 sPRIo64='"lo"'
 sPRIu64='"lu"'
 sPRIx64='"lx"'
+sSCNfldbl='"f"'
 sched_yield='sched_yield()'
 scriptdir='/opt/perl/bin'
 scriptdirexp='/opt/perl/bin'
@@ -680,20 +694,19 @@ sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE"
 sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 6 6 16 20 23 23 23 29 48 '
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 6, 6, 16, 20, 23, 23, 23, 29, 48, 0'
 signal_t='void'
-sitearch='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
-sitearchexp='/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi'
+sitearch='/opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread'
+sitearchexp='/opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread'
 sitebin='/opt/perl/bin'
 sitebinexp='/opt/perl/bin'
-sitelib='/opt/perl/lib/site_perl/5.6.0'
+sitelib='/opt/perl/lib/site_perl/5.7.0'
 sitelib_stem='/opt/perl/lib/site_perl'
-sitelibexp='/opt/perl/lib/site_perl/5.6.0'
+sitelibexp='/opt/perl/lib/site_perl/5.7.0'
 siteprefix='/opt/perl'
 siteprefixexp='/opt/perl'
 sizesize='8'
 sizetype='size_t'
 sleep=''
 smail=''
-small=''
 so='so'
 sockethdr=''
 socketlib=''
@@ -701,8 +714,7 @@ socksizetype='int'
 sort='sort'
 spackage='Perl5'
 spitshell='cat'
-split=''
-src='.'
+src='/m/fs/work/work/permanent/perl/pp4/perl'
 ssizetype='ssize_t'
 startperl='#!/opt/perl/bin/perl'
 startsh='#!/bin/sh'
@@ -744,15 +756,15 @@ uidtype='uid_t'
 uname='uname'
 uniq='uniq'
 uquadtype='unsigned long'
-use5005threads='undef'
+use5005threads='define'
 use64bitall='define'
 use64bitint='define'
 usedl='define'
-useithreads='define'
+useithreads='undef'
 uselargefiles='define'
 uselongdouble='undef'
 usemorebits='undef'
-usemultiplicity='define'
+usemultiplicity='undef'
 usemymalloc='n'
 usenm='true'
 useopcode='true'
@@ -766,6 +778,7 @@ usevendorprefix='undef'
 usevfork='false'
 usrinc='/usr/include'
 uuname=''
+uvXUformat='"lX"'
 uvoformat='"lo"'
 uvsize='8'
 uvtype='unsigned long'
@@ -780,30 +793,33 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.6.0'
+version='5.7.0'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth='/usr/lib/386 /lib/386'
-xs_apiversion='5.6.0'
+xs_apiversion='5.7.0'
 zcat=''
 zip='zip'
 # Configure command line arguments.
-config_arg0='Configure'
-config_args='-Dprefix=/opt/perl -Doptimize=-O -Dusethreads -Duse64bitint -Duselargefiles -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -dE'
-config_argc=11
+config_arg0='./Configure'
+config_args='-Dprefix=/opt/perl -Doptimize=-O -Dusethreads -Duse5005threads -Duse64bitint -Duselargefiles -Dcf_by=yourname -Dcf_email=yourname@yourhost.yourplace.com -Dperladmin=yourname@yourhost.yourplace.com -Dmydomain=.yourplace.com -Dmyhostname=yourhost -dE -Dusedevel'
+config_argc=13
 config_arg1='-Dprefix=/opt/perl'
 config_arg2='-Doptimize=-O'
 config_arg3='-Dusethreads'
-config_arg4='-Duse64bitint'
-config_arg5='-Duselargefiles'
-config_arg6='-Dcf_by=yourname'
-config_arg7='-Dcf_email=yourname@yourhost.yourplace.com'
-config_arg8='-Dperladmin=yourname@yourhost.yourplace.com'
-config_arg9='-Dmydomain=.yourplace.com'
-config_arg10='-Dmyhostname=yourhost'
-config_arg11='-dE'
+config_arg4='-Duse5005threads'
+config_arg5='-Duse64bitint'
+config_arg6='-Duselargefiles'
+config_arg7='-Dcf_by=yourname'
+config_arg8='-Dcf_email=yourname@yourhost.yourplace.com'
+config_arg9='-Dperladmin=yourname@yourhost.yourplace.com'
+config_arg10='-Dmydomain=.yourplace.com'
+config_arg11='-Dmyhostname=yourhost'
+config_arg12='-dE'
+config_arg13='-Dusedevel'
 PERL_REVISION=5
-PERL_VERSION=6
+PERL_VERSION=7
 PERL_SUBVERSION=0
 PERL_API_REVISION=5
 PERL_API_VERSION=5
index a2c196d..149760c 100644 (file)
@@ -16,8 +16,8 @@
 
 /*
  * Package name      : perl5
- * Source directory  : .
- * Configuration time: Wed May 31 01:48:08 EET DST 2000
+ * Source directory  : /m/fs/work/work/permanent/perl/pp4/perl
+ * Configuration time: Fri Oct 13 02:12:22 EET DST 2000
  * Configured by     : jhi
  * Target system     : osf1 alpha.hut.fi v4.0 878 alpha 
  */
  */
 #define HAS_GETPGID            /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#define HAS_GETPGRP            /**/
-/*#define USE_BSD_GETPGRP      / **/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
  */
 #define HAS_SETPGID    /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-#define HAS_SETPGRP            /**/
-#define USE_BSD_SETPGRP        /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi"               /**/
-#define ARCHLIB_EXP "/opt/perl/lib/5.6.0/alpha-dec_osf-thread-multi"           /**/
+#define ARCHLIB "/opt/perl/lib/5.7.0/alpha-dec_osf-thread"             /**/
+#define ARCHLIB_EXP "/opt/perl/lib/5.7.0/alpha-dec_osf-thread"         /**/
 
 /* ARCHNAME:
  *     This symbol holds a string representing the architecture name.
  *     where library files may be held under a private library, for
  *     instance.
  */
-#define ARCHNAME "alpha-dec_osf-thread-multi"          /**/
+#define ARCHNAME "alpha-dec_osf-thread"                /**/
 
 /* HAS_ATOLF:
  *     This symbol, if defined, indicates that the atolf routine is
  *     This macro surrounds its token with double quotes.
  */
 #if 42 == 1
-#  define CAT2(a,b)    a/**/b
-#  define STRINGIFY(a) "a"
+#define CAT2(a,b)      a/**/b
+#define STRINGIFY(a)   "a"
                /* If you can get stringification with catify, tell me how! */
 #endif
 #if 42 == 42
-#  define PeRl_CaTiFy(a, b)    a ## b  
-#  define PeRl_StGiFy(a)       #a
+#define PeRl_CaTiFy(a, b)      a ## b  
+#define PeRl_StGiFy(a) #a
 /* the additional level of indirection enables these macros to be
  * used as arguments to other macros.  See K&R 2nd ed., page 231. */
-#  define CAT2(a,b)    PeRl_CaTiFy(a,b)
-#  define StGiFy(a)    PeRl_StGiFy(a)
-#  define STRINGIFY(a) PeRl_StGiFy(a)
+#define CAT2(a,b)      PeRl_CaTiFy(a,b)
+#define StGiFy(a)      PeRl_StGiFy(a)
+#define STRINGIFY(a)   PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
 #   include "Bletch: How does this C preprocessor catenate tokens?"
  */
 #define HAS_SETPROTOENT                /**/
 
+/* HAS_SETPROCTITLE:
+ *     This symbol, if defined, indicates that the setproctitle routine is
+ *     available to set process title.
+ */
+/*#define HAS_SETPROCTITLE             / **/
+
 /* HAS_SETPWENT:
  *     This symbol, if defined, indicates that the setpwent routine is
  *     available for initializing sequential access of the passwd database.
 /*#define      HAS_MSG_PROXY   / **/
 #define        HAS_SCM_RIGHTS  /**/
 
+/* HAS_SOCKS5_INIT:
+ *     This symbol, if defined, indicates that the socks5_init routine is
+ *     available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT              / **/
+
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
  */
 /*#define   I_INTTYPES                / **/
 
+/* I_LIBUTIL:
+ *     This symbol, if defined, indicates that <libutil.h> exists and
+ *     should be included.
+ */
+/*#define      I_LIBUTIL               / **/
+
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <mach/cthreads.h>.
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'g') for output.
  */
+/* PERL_PRIeldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'f') for input.
+ */
 #define PERL_PRIfldbl  "f"     /**/
 #define PERL_PRIgldbl  "g"     /**/
+#define PERL_PRIeldbl  "e"     /**/
+#define PERL_SCNfldbl  "f"     /**/
 
 /* Off_t:
  *     This symbol holds the type used to declare offsets in the kernel.
  */
 /* UVxf:
  *     This symbol defines the format string used for printing a Perl UV
- *     as an unsigned hexadecimal integer.
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
  */
 #define        IVdf            "ld"            /**/
 #define        UVuf            "lu"            /**/
 #define        UVof            "lo"            /**/
 #define        UVxf            "lx"            /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/opt/perl/lib/5.6.0"          /**/
-#define PRIVLIB_EXP "/opt/perl/lib/5.6.0"              /**/
+#define PRIVLIB "/opt/perl/lib/5.7.0"          /**/
+#define PRIVLIB_EXP "/opt/perl/lib/5.7.0"              /**/
 
 /* PTRSIZE:
  *     This symbol contains the size of a pointer, so that the C preprocessor
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi"            /**/
-#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi"                /**/
+#define SITEARCH "/opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread"          /**/
+#define SITEARCH_EXP "/opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread"              /**/
 
 /* SITELIB:
  *     This symbol contains the name of the private library for this package.
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "/opt/perl/lib/site_perl/5.6.0"                /**/
-#define SITELIB_EXP "/opt/perl/lib/site_perl/5.6.0"            /**/
+#define SITELIB "/opt/perl/lib/site_perl/5.7.0"                /**/
+#define SITELIB_EXP "/opt/perl/lib/site_perl/5.7.0"            /**/
 #define SITELIB_STEM "/opt/perl/lib/site_perl"         /**/
 
 /* Size_t_size:
  *     be built to use multiplicity.
  */
 #ifndef MULTIPLICITY
-#define        MULTIPLICITY            /**/
+/*#define      MULTIPLICITY            / **/
 #endif
 
 /* USE_PERLIO:
  *     This symbol, if defined, indicates that Perl should
  *     be built to use the old draft POSIX threads API.
  */
-/*#define      USE_5005THREADS         / **/
-#define        USE_ITHREADS            /**/
+#define        USE_5005THREADS         /**/
+/*#define      USE_ITHREADS            / **/
 #if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
 #define                USE_THREADS             /* until src is revised*/
 #endif
 /* PERL_XS_APIVERSION:
  *     This variable contains the version of the oldest perl binary
  *     compatible with the present perl.  perl.c:incpush() and
- *     lib/lib.pm will automatically search in /opt/perl/lib/site_perl/5.6.0/alpha-dec_osf-thread-multi for older
+ *     lib/lib.pm will automatically search in /opt/perl/lib/site_perl/5.7.0/alpha-dec_osf-thread for older
  *     directories across major versions back to xs_apiversion.
  *     This is only useful if you have a perl library directory tree
  *     structured like the default one.
  *     compatible with the present perl.  (That is, pure perl modules
  *     written for pm_apiversion will still work for the current
  *     version).  perl.c:incpush() and lib/lib.pm will automatically
- *     search in /opt/perl/lib/site_perl/5.6.0 for older directories across major versions
+ *     search in /opt/perl/lib/site_perl/5.7.0 for older directories across major versions
  *     back to pm_apiversion.  This is only useful if you have a perl
  *     library directory tree structured like the default one.  The
  *     versioned site_perl library was introduced in 5.005, so that's
  *     (presumably) be similar.
  *     See the INSTALL file for how this works.
  */
-#define PERL_XS_APIVERSION "5.6.0"
+#define PERL_XS_APIVERSION "5.7.0"
 #define PERL_PM_APIVERSION "5.005"
 
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#define HAS_GETPGRP            /**/
+/*#define USE_BSD_GETPGRP      / **/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+#define HAS_SETPGRP            /**/
+#define USE_BSD_SETPGRP        /**/
+
 #endif
index efb7ef8..218da41 100755 (executable)
@@ -20,7 +20,7 @@ use Text::Wrap;
 $0 =~ s|^.*/||;
 unless (@ARGV) {
     die <<USAGE;
-        $0 [-p \$P4PORT] <change numbers or from..to>
+        $0 [-p \$P4PORT] [-bi branch_include] [-be branch_exclude] <change numbers or from..to>
 USAGE
 }
 
@@ -32,6 +32,11 @@ my %editkind;
 
 my $p4port = $ENV{P4PORT} || 'localhost:1666';
 
+my @branch_include;
+my @branch_exclude;
+my %branch_include;
+my %branch_exclude;
+
 while (@ARGV) {
     $_ = shift;
     if (/^(\d+)\.\.(\d+)$/) {
@@ -43,6 +48,12 @@ while (@ARGV) {
     elsif (/^-p(.*)$/) {
         $p4port = $1 || shift;
     }
+    elsif (/^-bi(.*)$/) {
+        push @branch_include, $1 || shift;
+    }
+    elsif (/^-be(.*)$/) {
+        push @branch_exclude, $1 || shift;
+    }
     else {
         warn "Arguments must be change numbers, ignoring `$_'\n";
     }
@@ -50,6 +61,9 @@ while (@ARGV) {
 
 @changes = sort { $b <=> $a } @changes;
 
+@branch_include{@branch_include} = @branch_include if @branch_include;
+@branch_exclude{@branch_exclude} = @branch_exclude if @branch_exclude;
+
 my @desc = `p4 -p $p4port describe -s @changes`;
 if ($?) {
     die "$0: `p4 -p $p4port describe -s @changes` failed, status[$?]\n";
@@ -58,6 +72,7 @@ else {
     chomp @desc;
     while (@desc) {
        my ($change,$who,$date,$time,@log,$branch,$file,$type,%files);
+       my $skip = 0;
        $_ = shift @desc;
        if (/^Change (\d+) by (\w+)\@.+ on (\S+) (\S+)\s*$/) {
            ($change, $who, $date, $time) = ($1,$2,$3,$4);
@@ -73,6 +88,11 @@ else {
                    last unless /^\.\.\./;
                    if (m{^\.\.\. //depot/(.*?perl|[^/]*)/([^#]+)#\d+ (\w+)\s*$}) {
                        ($branch,$file,$type) = ($1,$2,$3);
+                       if (exists $branch_exclude{$branch} or
+                           @branch_include and
+                           not exists $branch_include{$branch}) {
+                           $skip++;
+                       }
                        $files{$branch} = {} unless exists $files{$branch};
                        $files{$branch}{$type} = [] unless exists $files{$branch}{$type};
                        push @{$files{$branch}{$type}}, $file;
@@ -83,7 +103,7 @@ else {
                }
            }
        }
-       next unless $change;
+       next if not $change or $skip;
        print "_" x 76, "\n";
        printf <<EOT, $change, $who, $date, $time;
 [%6s] By: %-25s             on %9s %9s
index 99776b5..d761059 100644 (file)
@@ -701,6 +701,34 @@ supports dynamic loading, you can also test static loading with
 You can also hand-tweak your config.h to try out different #ifdef
 branches.
 
+=head2 Other tests
+
+=over 4
+
+=item CHECK_FORMAT
+
+To test the correct use of printf-style arguments, C<Configure> with
+S<-Dccflags='-DCHECK_FORMAT -Wformat'> and run C<make>.  The compiler
+will produce warning of incorrect use of format arguments.  CHECK_FORMAT
+changes perl-defined formats to common formats, so DO NOT USE the executable
+produced by this process. 
+
+A more accurate approach is the following commands:
+
+    sh Configure -des -Dccflags=-Wformat ...
+    make miniperl              # without -DCHECK_FORMAT
+    perl -i.orig -pwe 's/-Wformat/-DCHECK_FORMAT $&/' config.sh
+    sh Configure -S
+    make >& make.log           # build from correct miniperl
+    make clean
+    make miniperl >& mini.log  # build miniperl with -DCHECK_FORMAT 
+    perl -nwe 'print if /^\S+:/ and not /^make\b/' mini.log make.log
+    make clean
+
+(-Wformat support by Robin Barker.)
+
+=back
+
 =head1 Running Purify
 
 Purify is a commercial tool that is helpful in identifying memory
diff --git a/README b/README
index e846c30..b828893 100644 (file)
--- a/README
+++ b/README
@@ -72,7 +72,7 @@ corresponding README.
 2) Read the manual entries before running perl.
 
 3) IMPORTANT!  Help save the world!  Communicate any problems and suggested
-patches to perlbug@perl.com so we can keep the world in sync.
+patches to perlbug@perl.org so we can keep the world in sync.
 If you have a problem, there's someone else out there who either has had
 or will have the same problem.  It's usually helpful if you send the
 output of the "myconfig" script in the main perl directory.
index 378db15..be7ff51 100644 (file)
@@ -21,7 +21,7 @@ Long answer: The question belies a true understanding of the
        localtime) supply adequate information to determine the
        year well beyond 2000 (2038 is when trouble strikes for
        32-bit machines).  The year returned by these functions
-       when used in an array context is the year minus 1900.  For
+       when used in a list context is the year minus 1900.  For
        years between 1910 and 1999 this happens to be a 2-digit
        decimal number. To avoid the year 2000 problem simply do
        not treat the year as a 2-digit number.  It isn't.
diff --git a/README.aix b/README.aix
new file mode 100644 (file)
index 0000000..6346a18
--- /dev/null
@@ -0,0 +1,100 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's Unix operating system
+(AIX) that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+=head2 Compiling Perl 5 on AIX
+
+When compiling Perl, you must use an ANSI C compiler. AIX does not shif
+an ANSI compliant C-compiler with AIX by default, but binary builds of
+gcc for AIX are widely available.
+
+At the moment of writing, AIX supports two different native C compilers,
+for which you have to pay: B<xlc> and B<VAC>. If you decide to use eiter
+of these two (which is quite a lot easier than using gcc), be sure to
+upgrade to the latest available patch level. Currently:
+
+    xlC.C     3.1.4.0
+    vac.C     4.4.0.3  (5.0 is already available)
+
+Perl can be compiled with either IBM's ANSI C compiler or with gcc.  The
+former is recommended, as not only can it compile Perl with no
+difficulty, but also can take advantage of features listed later that
+require the use of IBM compiler-specific command-line flags.
+
+If you decide to use gcc, make sure your installation is recent and
+complete, and be sure to read the Perl README file for more gcc-specific
+details.
+
+=head2 OS level
+
+Before installing the patches to the IBM C-compiler you need to know the
+level of patching for the Operating System. IBM's command 'oslevel' will
+show the base, but is not allways complete:
+
+    # oslevel
+    4.3.0.0
+    # lslpp -l | grep 'bos.rte '
+    bos.rte      4.3.2.1  COMMITTED  Base Operating System Runtime
+    bos.rte      4.3.2.0  COMMITTED  Base Operating System Runtime
+    #
+
+=head2 Building Dynamic Extensions on AIX
+
+AIX supports dynamically loadable libraries (shared libraries).
+Shared libraries end with the suffix .a, which is a bit misleading,
+cause *all* libraries are shared ;-).
+
+=head2 The IBM ANSI C Compiler
+
+All defaults for Configure can be used.
+
+If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
+will turn up nasty later on.
+
+=head2 Using GNU's gcc for building perl
+
+... ?
+
+Wait, I'll have to scan perlbug ...
+
+=head2 Using Large Files with Perl
+
+... ?
+
+=head2 Threaded Perl
+
+... ?
+
+=head2 64-bit Perl
+
+... ?
+
+=head2 GDBM and Threads
+
+... ?
+
+=head2 NFS filesystems and utime(2)
+
+... ?
+
+=head1 AUTHOR
+
+H.Merijn Brand <h.m.brand@hccnet.nl>
+
+Structure copied from README.hpux
+
+=head1 DATE
+
+Version 0.0.1: 16-10-2000
+
+=cut
index 2a95ab9..9718bb5 100644 (file)
@@ -27,20 +27,19 @@ platforms.  They run thanks to the Cygwin library which provides the UNIX
 system calls and environment these programs expect.  More information
 about this project can be found at:
 
-  http://sourceware.cygnus.com/cygwin/
+  http://sources.redhat.com/cygwin/
 
 A recent net or commercial release of Cygwin is required.
 
-At the time this document was last updated, Cygwin 1.1.2 was current.
+At the time this document was last updated, Cygwin 1.1.4 was current.
 
 B<NOTE:> At this point, minimal effort has been made to provide
 compatibility with old (beta) Cygwin releases.  The focus has been to
 provide a high quality release and not worry about working around old
-Cygwin bugs.  If you wish to use Perl with Cygwin B20.1 or earlier,
-consider using perl5.005_03, which is available in source and binary
-form at C<http://cygutils.netpedia.net/> or on the Cygwin CD.  If there
-is significant demand, a patch kit can be developed to port back to
-earlier Cygwin versions.
+bugs.  If you wish to use Perl with Cygwin B20.1 or earlier, consider
+using perl5.005_03, which is available in source and binary form at
+C<http://cygutils.netpedia.net/>.  If there is significant demand,
+a patch kit can be developed to port back to earlier Cygwin versions.
 
 =head2 Cygwin Configuration
 
@@ -49,11 +48,11 @@ that Perl builds cleanly.  These changes are B<not> required for normal
 Perl usage.
 
 B<NOTE:> The binaries that are built will run on all Win32 versions.
-They do not depend on your host system (Win9x, WinNT) or your Cygwin
-configuration (I<ntea>, I<ntsec>, binary/text mounts).  The only
-dependencies come from hard-coded pathnames like C</usr/local>.  However,
-your host system and Cygwin configuration will affect Perl's runtime
-behavior (see L</"TEST">).
+They do not depend on your host system (Win9x/WinME, WinNT/Win2K)
+or your Cygwin configuration (I<ntea>, I<ntsec>, binary/text mounts).
+The only dependencies come from hard-coded pathnames like C</usr/local>.
+However, your host system and Cygwin configuration will affect Perl's
+runtime behavior (see L</"TEST">).
 
 =over 4
 
@@ -72,7 +71,7 @@ Configure will B<not> prompt you to install I<man> pages.
 
 On WinNT with either the I<ntea> or I<ntsec> C<CYGWIN> settings, directory
 and file permissions may not be set correctly.  Since the build process
-creates files and directories, to be safe you may want to run a `C<chmod
+creates directories and files, to be safe you may want to run a `C<chmod
 -R +w *>' on the entire Perl source tree.
 
 Also, it is a well known WinNT "feature" that files created by a login
@@ -125,7 +124,10 @@ C<http://cygutils.netpedia.net/>.
 
 =item * C<-lcrypt>
 
-The crypt libraries in GNU libc have been ported to Cygwin.
+The crypt package distributed with Cygwin is a Linux compatible 56-bit
+DES crypt port by Corinna Vinschen.
+
+Alternatively, the crypt libraries in GNU libc have been ported to Cygwin.
 
 The DES based Ultra Fast Crypt port was done by Alexey Truhan:
 
@@ -138,22 +140,21 @@ The MD5 port was done by Andy Piper:
 
   ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz
 
-There is also a Linux compatible 56 bit DES crypt port by Corinna
-Vinschen:
-
-  ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Vinschen_Corinna/V1.1.1/crypt-1.0.tar.gz
-
 =item * C<-lgdbm> (C<use GDBM_File>)
 
 GDBM is available for Cygwin.  GDBM's ndbm/dbm compatibility feature
 also makes C<NDBM_File> and C<ODBM_File> possible (although they add
 little extra value).
 
+NOTE: The ndbm/dbm emulations only completely work on NTFS partitions.
+
 =item * C<-ldb> (C<use DB_File>)
 
 BerkeleyDB is available for Cygwin.  Some details can be found in
 F<ext/DB_File/DB_File.pm>.
 
+NOTE: The BerkeleyDB library only completely works on NTFS partitions.
+
 =item * C<-lcygipc> (C<use IPC::SysV>)
 
 A port of SysV IPC is available for Cygwin.
@@ -204,7 +205,7 @@ These are B<not> yet available with Cygwin.
 
 I<gcc> supports long doubles (12 bytes).  However, several additional
 long double math functions are necessary to use them within Perl
-(I<{atan2,cos,exp,floor,fmod,frexp,log,modf,pow,sin,sqrt}l,strtold>).
+(I<{atan2,cos,exp,floor,fmod,frexp,isnan,log,modf,pow,sin,sqrt}l,strtold>).
 These are B<not> yet available with Cygwin.
 
 =item * C<-Dusethreads>
@@ -224,18 +225,6 @@ You may see some messages during Configure that seem suspicious.
 
 =over 4
 
-=item * Whoa There
-
-Cygwin does not yet implement chroot() functionality, but has a stub
-function that returns C<ENOSYS>.  You will see a message when Configure
-detects that its guess conflicts with the hint file.
-
-  *** WHOA THERE!!! ***
-      The recommended value for $d_chroot on this machine was "undef"!
-      Keep the recommended value? [y]
-
-You should keep the recommended value.
-
 =item * I<dlsym()>
 
 I<ld2> is needed to build dynamic libraries, but it does not exist
@@ -278,7 +267,7 @@ The following error occurs because of the Cygwin C<#define> of
 C<_LONG_DOUBLE>:
 
   Guessing which symbols your C compiler and preprocessor define...
-  try.c:3847: parse error
+  try.c:<line#>: parse error
 
 This failure does not seem to cause any problems.
 
@@ -297,8 +286,8 @@ Warnings like these are normal:
   warning: overriding commands for target <file>
   warning: ignoring old commands for target <file>
 
-  Warning: no export definition file provided
-  dllwrap will create one, but may not be what you want
+  dllwrap: no export definition file provided
+  dllwrap: creating one, but that may not be what you want
 
 =head2 ld2
 
@@ -326,8 +315,8 @@ running as `C<./perl harness>'.
 Test results vary depending on your host system and your Cygwin
 configuration.  If a test can pass in some Cygwin setup, it is always
 attempted and explainable test failures are documented.  It is possible
-that Perl will pass all the tests, but it is more likely that some tests
-will fail for one of these reasons.
+for Perl to pass all the tests, but it is more likely that some tests
+will fail for one of the reasons listed below.
 
 =head2 File Permissions
 
@@ -360,7 +349,7 @@ these options, these tests will fail:
 FAT partitions do not support hard links (whereas NTFS does), in which
 case Cygwin implements link() by copying the file.  On remote (network)
 drives Cygwin's stat() always sets C<st_nlink> to 1, so the link count
-for remote directories and files is not available.  In both cases,
+for remote directories and files is not available.  In either case,
 these tests will fail:
 
   Failed Test           List of failed
@@ -389,7 +378,7 @@ the system with messages like:
     A required .DLL file, CYGWIN1.DLL, was not found
 
   WinNT
-    perl.exe or sh.exe - Unable to Locate DLL
+    perl.exe - Unable to Locate DLL
     The dynamic link library cygwin1.dll could not be found in the
       specified path ...
 
@@ -404,7 +393,7 @@ will fail:
 Alternatively, you can copy F<cygwin1.dll> into the directory where the
 tests run:
 
-  cp `type -p cygwin1.dll` t
+  cp /bin/cygwin1.dll t
 
 or one of the Windows system directories (although, this is B<not>
 recommended).
@@ -439,9 +428,9 @@ printable characters except these:
 
   : * ? " < > |
 
-File names are case insensitive, but case preserving.  A pathname
-that contains a backslash is a Win32 pathname (and not subject to the
-translations applied to POSIX style pathnames).
+File names are case insensitive, but case preserving.  A pathname that
+contains a backslash or drive letter is a Win32 pathname (and not subject
+to the translations applied to POSIX style pathnames).
 
 =item * Text/Binary
 
@@ -480,6 +469,9 @@ returns C<ENOSYS>.
 
 Win9x can not rename() an open file (although WinNT can).
 
+The Cygwin chroot() implementation has holes (it can not restrict file
+access by native Win32 programs).
+
 =back
 
 =head1 INSTALL
@@ -509,10 +501,11 @@ be kept as clean as possible.
 =item Documentation
 
   INSTALL README.cygwin
-  Changes Changes5.005 Changes5.004
+  Changes Changes5.005 Changes5.004 Changes5.6
   AUTHORS MAINTAIN MANIFEST README.win32
-  pod/perl.pod pod/perlfaq3.pod pod/perlhist.pod pod/perlmodlib.pod
-  pod/perlport.pod pod/perltoc.pod pod/perldelta.pod pod/perl5004delta.pod
+  pod/buildtoc.PL pod/perl.pod pod/perl5004delta.pod pod/perl56delta.pod
+  pod/perlfaq3.pod pod/perlhist.pod pod/perlmodlib.pod pod/perlport.pod
+  pod/perltoc.pod
 
 =item Build, Configure, Make, Install
 
@@ -534,6 +527,7 @@ be kept as clean as possible.
 =item Tests
 
   t/io/tell.t           - binmode
+  t/lib/b.t             - ignore Cwd from os_extras
   t/lib/glob-basic.t    - Win32 directory list access differs from read mode
   t/op/magic.t          - $^X/symlink WORKAROUND, s/.exe//
   t/op/stat.t           - no /dev, skip Win32 ftCreationTime quirk
@@ -570,8 +564,8 @@ be kept as clean as possible.
                         - canonpath, cflags, manifypods, perl_archive
   lib/File/Find.pm      - on remote drives stat() always sets st_nlink to 1
   lib/File/Spec/Unix.pm - preserve //unc
+  lib/File/Temp.pm      - no directory sticky bit
   lib/perl5db.pl        - use stdin not /dev/tty
-  utils/perlcc.PL       - DynaLoader.a in compile, -DUSEIMPORTLIB
   utils/perldoc.PL      - version comment
 
 =back
@@ -580,12 +574,17 @@ be kept as clean as possible.
 
 When I<make> starts, it warns about overriding commands for F<perlmain.o>.
 
-`C<make clean>' does not remove library F<.def> and F<.exe.stackdump>
+`C<make clean>' does not remove library F<.def> or F<.exe.stackdump>
 files.
 
 The I<ld2> script contains references to the source directory.  You should
 change these to $installbin after `C<make install>'.
 
+Support for swapping real and effective user and group IDs is incomplete.
+On WinNT Cygwin provides setuid(), seteuid(), setgid() and setegid().
+However, additional Cygwin calls for manipulating WinNT access tokens
+and security contexts are required.
+
 =head1 AUTHORS
 
 Charles Wilson <cwilson@ece.gatech.edu>,
@@ -597,4 +596,4 @@ Teun Burgers <burgers@ecn.nl>.
 
 =head1 HISTORY
 
-Last updated: 20 June 2000
+Last updated: 15 August 2000
index 9c3240e..51cd1d6 100644 (file)
@@ -100,9 +100,11 @@ sockets
 =item *
 
 Unpack the source package F<perl5.6*.tar.gz> with djtarx. If you want
-to use long file names under w95, don't forget to use
+to use long file names under w95 and also to get Perl to pass all its
+tests, don't forget to use
 
         set LFN=y
+       set FNCASE=y
 
 before unpacking the archive.
 
index 2163c46..06290c3 100644 (file)
@@ -3,8 +3,8 @@ Perl 5 README file for the EPOC operating system.
 =====================================================================
 
 Olaf Flebbe <o.flebbe@gmx.de>
-http://www.linuxstart.com/~oflebbe/perl/perl5.html
-2000-05-15
+http://members.linuxstart.com/~oflebbe/perl/perl5.html
+2000-09-18
 
 =====================================================================
 Introduction
@@ -13,10 +13,10 @@ Introduction
 EPOC is a OS for palmtops and mobile phones. For more informations look at:
 http://www.symbian.com/
 
-This is a port of Perl version 5.6.0 to EPOC. It runs on the Perl
-Series 5, Series 5mx and the Psion Revo and on the Ericson M128.
-
-Features are left out, because of restrictions of the POSIX support.
+This is a port of perl to EPOC. It runs on the Psion Series 5, 5mx,
+5mx Pro, Psion Revo and on the Ericson M128. I have no report about
+the Psion Netbook or the S7. For information about this hardware
+please refer to http://www.psion.com.
 
 =====================================================================
 Installation/Usage
@@ -32,12 +32,12 @@ left out unicode support modules and modules which will not work with
 this version. (For details look into epoc/createpkg.pl). If you like
 to use them, you are free to copy them from a current perl release.
 
-Copy eshell.exe from the same page you got perl to your EPOC device.
-Start eshell.exe with a double tap.
+Get ESHELL from symbian: 
+http://developer.epocworld.com/downloads/progs/Eshell.zip
 
 Now you can enter: perl -de 0 in order to run the perl debugger. If
 you are leaving perl, you get into the system screen. You have to
-switch back manually to eshell.exe When perl is running, you will see
+switch back manually to ESHELL. When perl is running, you will see
 a task with the name STDOUT in the task list.
 
 ======================================================================
@@ -58,35 +58,47 @@ output to stdout.
 PATH Names
 ======================================================================
 
-Pathnames to executables in eshell.exe have to be written with
-backslashes '\', file arguments to perl with slashes '/'. The default
-drive of perl is the same as the drive perl.exe is located on, the
-default path seems to be '/'.
+ESHELL looks for executables in ?:/System/Programs. The SIS file
+installs perl in this special folder directory. The default drive and
+path are the same as folder the executable resides. The EPOC
+filesystem is case-preserving, not case-sensitive.
+
+EPOC uses the ?: syntax for establishing a search order: First in C: (RAM),
+then on D: (CF Card) and last in Z: (ROM).
+
+The perl @INC search path is now implemented with '?:'. Your perl
+executable can now live on a different drive than the perl library or
+even your scripts.
 
-i.e. command lines look a little bit funny:
+ESHELL paths have to be written with backslashes '\', file arguments
+to perl with slashes '/'. Remember that I/O redirection is done
+internally in perl, so please use slashes for redirects.
 
-D:\perl.exe C:/test.pl >C:/output.txt
+perl.exe C:/test.pl >C:/output.txt
 
 You can automatically search for file on all EPOC drives with a ? as
-the driver letter. For instance ?:\a.txt seraches for C:\a.txt,
+the driver letter. For instance ?:\a.txt searches for C:\a.txt,
 D:\b.txt (and Z:\a.txt).
 
 ======================================================================
 Editors
 ======================================================================
 
-You may have a problem to create perl scripts. A cumbersome workaround
-is to use the OPL Editor and exporting to text.
+A suitable text-editor can be downloaded 
+from symbian http://developer.epocworld.com/downloads/progs/Editor.zip
+
+====================================================================
+Features
+====================================================================
 
-The OPL+ Editor is quite good. (Shareware: http://www.twiddlebit.com)
-There is a port of vim around: 
-        http://www.starship.freeserve.co.uk/index.html
+The built-in function EPOC::getcwd returns the current directory.
 
 ======================================================================
 Restrictions
 ======================================================================
 
-The following things are left out of this perl port:
+Features are left out, because of restrictions of the POSIX support in
+EPOC:
 
 + backquoting, pipes etc.
 
@@ -118,7 +130,7 @@ Sorry, this is far too short.
     You will need the C++ SDK from http://developer.epocworld.com/. 
 
     You will need to set up the cross SDK from 
-    http://www.linuxstart.com/~oflebbe
+    http://members.linuxstart.com/~oflebbe
 
     You may have to adjust config.sh (cc, cppflags) for your epoc 
     install location.
@@ -130,30 +142,27 @@ Sorry, this is far too short.
     Unpack the sources. 
 
       Build a native perl from this sources... 
+
       cp epoc/* .
       ./Configure -S
-      make perl
+      make perl.a
       cp miniperl.native miniperl
       make perl
+      make ext/Errno/pm_to_blib 
       perl link.pl perlmain.o lib/auto/DynaLoader/DynaLoader.a \
-         lib/auto/Data/Dumper.a \
+         lib/auto/Data/Dumper/Dumper.a \
          lib/auto/File/Glob/Glob.a lib/auto/IO/IO.a \
-         lib/auto/Socket/Socket.a perl.a `cat ext.libs`
+         lib/auto/Socket/Socket.a \
+         lib/auto/Fcntl/Fcntl.a lib/auto/Sys/Hostname/Hostname.a \
+       perl.a `cat ext.libs`
       perl createpkg.pl 
-      wine "G:/bin/makesis perl.pkg perl.sis"
-
 
-====================================================================
-Wish List
-====================================================================
+      wine G:/bin/makesis perl.pkg perl.sis
 
-- Threads ?
-- Acess to the GUI?
 
 ====================================================================
 Support Status
 ====================================================================
 
-I'm offering this port "as is".  You can ask me questions, but I can't
-guarantee I'll be able to answer them; I don't know much about Perl
-internals myself.
+I'm offering this port "as is". You can ask me questions, but I can't
+guarantee I'll be able to answer them.
index 47d1afc..e12c60d 100644 (file)
@@ -124,7 +124,7 @@ If these dependent libraries are not listed at shared library creation
 time, you will get fatal "Unresolved symbol" errors at run time when the
 library is loaded.
 
-You may create a shared library that referers to another library, which
+You may create a shared library that refers to another library, which
 may be either an archive library or a shared library.  If this second
 library is a shared library, this is called a "dependent library".  The
 dependent library's name is recorded in the main shared library, but it
index 1e7464b..b46fa7a 100644 (file)
@@ -178,13 +178,14 @@ has much more functions working (like C<fork>, C<popen> and so on). In
 fact RSX is required if there is no VCPI present. Note the
 RSX requires DPMI.
 
-Only the latest runtime is supported, currently C<0.9c>. Perl may run
+Only the latest runtime is supported, currently C<0.9d fix 03>. Perl may run
 under earlier versions of EMX, but this is not tested.
 
 One can get different parts of EMX from, say
 
-  ftp://ftp.cdrom.com/pub/os2/emx09c/
-  ftp://hobbes.nmsu.edu/os2/unix/emx09c/
+  http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/
+  http://powerusersbbs.com/pub/os2/dev/   [EMX+GCC Development]
+  http://hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/
 
 The runtime component should have the name F<emxrt.zip>.
 
@@ -723,7 +724,7 @@ can be constructed using C<pod2latex>.
 =head1 BUILD
 
 Here we discuss how to build Perl under OS/2. There is an alternative
-(but maybe older) view on L<http://www.shadow.net/~troc/os2perl.html>.
+(but maybe older) view on http://www.shadow.net/~troc/os2perl.html
 
 =head2 Prerequisites
 
@@ -1060,6 +1061,10 @@ You did not run C<omflibs>. See L<Prerequisites>.
 
 You use an old version of GNU make. See L<Prerequisites>.
 
+=head2 op/sprintf test failure
+
+This can result from a bug in emx sprintf which was fixed in 0.9d fix 03.
+
 =head1 Specific (mis)features of OS/2 port
 
 =head2 C<setpriority>, C<getpriority>
index 1821846..571d027 100644 (file)
@@ -115,7 +115,7 @@ character sets are different.  Perl builtin functions that may behave
 differently under EBCDIC are mentioned in the perlport.pod document.
 
 OpenEdition (UNIX System Services) does not (yet) support the #! means 
-of script invokation.
+of script invocation.
 See:
 
     head `whence perldoc`
index 3dd8ea2..3ae711d 100644 (file)
@@ -146,7 +146,7 @@ L<INSTALL>, L<perlport>.
 
 The Perl Institute (http://www.perl.org/) maintains a perl-mvs mailing
 list of interest to all folks building and/or using perl on EBCDIC
-platforms.  To subscibe, send a message of:
+platforms.  To subscribe, send a message of:
 
     subscribe perl-mvs
 
index a6bb96b..d3f8516 100644 (file)
@@ -62,7 +62,7 @@ have perl run your scripts for you.
 If you are interested in the VM and OS/390 ports of perl then see the
 perl-mvs mailing list: The Perl Institute (http://www.perl.org/)
 maintains a mailing list of interest to all folks building and/or
-using perl on EBCDIC platforms.  To subscibe, send a message of:
+using perl on EBCDIC platforms.  To subscribe, send a message of:
 
     subscribe perl-mvs
 
index f7bf25c..8e29acc 100644 (file)
@@ -287,29 +287,38 @@ If you are accustomed to using perl from various command-line
 shells found in UNIX environments, you will be less than pleased
 with what Windows offers by way of a command shell.
 
-The crucial thing to understand about the "cmd" shell (which is
-the default on Windows NT) is that it does not do any wildcard
-expansions of command-line arguments (so wildcards need not be
-quoted).  It also provides only rudimentary quoting.  The only
-(useful) quote character is the double quote (").  It can be used to
-protect spaces in arguments and other special characters.  The
-Windows NT documentation has almost no description of how the
-quoting rules are implemented, but here are some general observations
-based on experiments:  The shell breaks arguments at spaces and
-passes them to programs in argc/argv.  Doublequotes can be used
-to prevent arguments with spaces in them from being split up.
-You can put a double quote in an argument by escaping it with
-a backslash and enclosing the whole argument within double quotes.
-The backslash and the pair of double quotes surrounding the
-argument will be stripped by the shell.
-
-The file redirection characters "<", ">", and "|" cannot be quoted
-by double quotes (there are probably more such).  Single quotes
-will protect those three file redirection characters, but the
-single quotes don't get stripped by the shell (just to make this
-type of quoting completely useless).  The caret "^" has also
-been observed to behave as a quoting character (and doesn't get
-stripped by the shell also).
+The crucial thing to understand about the Windows environment is that
+the command line you type in is processed twice before Perl sees it.
+First, your command shell (usually CMD.EXE on Windows NT, and
+COMMAND.COM on Windows 9x) preprocesses the command line, to handle
+redirection, environment variable expansion, and location of the
+executable to run. Then, the perl executable splits the remaining
+command line into individual arguments, using the C runtime library
+upon which Perl was built.
+
+It is particularly important to note that neither the shell nor the C
+runtime do any wildcard expansions of command-line arguments (so
+wildcards need not be quoted).  Also, the quoting behaviours of the
+shell and the C runtime are rudimentary at best (and may, if you are
+using a non-standard shell, be inconsistent).  The only (useful) quote
+character is the double quote (").  It can be used to protect spaces in
+arguments and other special characters.  The Windows NT documentation
+has almost no description of how the quoting rules are implemented, but
+here are some general observations based on experiments:  The C runtime
+breaks arguments at spaces and passes them to programs in argc/argv.
+Doublequotes can be used to prevent arguments with spaces in them from
+being split up.  You can put a double quote in an argument by escaping
+it with a backslash and enclosing the whole argument within double
+quotes.  The backslash and the pair of double quotes surrounding the
+argument will be stripped by the C runtime.
+
+The file redirection characters "<", ">", and "|" can be quoted by
+double quotes (although there are suggestions that this may not always
+be true).  Single quotes are not treated as quotes by the shell or the C
+runtime.  The caret "^" has also been observed to behave as a quoting
+character, but this appears to be a shell feature, and the caret is not
+stripped from the command line, so Perl still sees it (and the C runtime
+phase does not treat the caret as a quote character).
 
 Here are some examples of usage of the "cmd" shell:
 
@@ -349,6 +358,13 @@ This pipes "foo" to the pager and writes "bar" in the file "blurch":
 Discovering the usefulness of the "command.com" shell on Windows 9x
 is left as an exercise to the reader :)
 
+One particularly pernicious problem with the 4NT command shell for
+Windows NT is that it (nearly) always treats a % character as indicating
+that environment variable expansion is needed.  Under this shell, it is
+therefore important to always double any % characters which you want
+Perl to see (for example, for hash variables), even when they are
+quoted.
+
 =item Building Extensions
 
 The Comprehensive Perl Archive Network (CPAN) offers a wealth
diff --git a/Todo b/Todo
index ba01d33..eb13f65 100644 (file)
--- a/Todo
+++ b/Todo
@@ -47,10 +47,6 @@ Would be nice to have
             to be used in re-entrant (=multithreaded) code
             Icky things: the _r API is not standardized and
             the _r-forms require per-thread data to store their state
-       memory profiler: turn malloc.c:Perl_get_mstats() into
-           an extension (Devel::MProf?) that would return the malloc
-           stats in a nice Perl datastructure (also a simple interface
-           to return just the grand total would be good)
        cross-compilation support
            host vs target: compile in the host, get the executable to
            the target, get the possible input files to the target,
index d438969..8dcb9be 100644 (file)
--- a/Todo-5.6
+++ b/Todo-5.6
@@ -16,6 +16,20 @@ Unicode support
        to work similarly to Unicode tech reports and Java
        notation \uXXXX (and already existing \x{XXXX))?
        more than four hexdigits? make also \U+XXXX work?
+    overloadable regex assertions? e.g. in Thai \b cannot
+        be deduced by any simple character class boundary rules,
+        word boundaries must algorithmically computed
+
+    see ext/Encode/Todo for notes and references about proper detection
+    of malformed UTF-8
+
+    SCSU?          http://www.unicode.org/unicode/reports/tr6/
+    Collation?     http://www.unicode.org/unicode/reports/tr10/
+    Normalization? http://www.unicode.org/unicode/reports/tr15/
+    EBCDIC?        http://www.unicode.org/unicode/reports/tr16/
+    Regexes?       http://www.unicode.org/unicode/reports/tr18/
+    Case Mappings? http://www.unicode.org/unicode/reports/tr21/
+
     See also "Locales", "Regexen", and "Miscellaneous".
 
 Multi-threading
@@ -130,6 +144,7 @@ Win32 stuff
     work out DLL versioning
 
 Miscellaneous
+    introduce @( and @) because group names can have spaces
     add new modules (Archive::Tar, Compress::Zlib, CPAN::FTP?)
     sub-second sleep()? alarm()? time()? (integrate Time::HiRes?
        Configure doesn't yet probe for usleep/nanosleep/ualarm but
@@ -145,10 +160,11 @@ Miscellaneous
        PREFERABLY AS AN EXTENSION.
        As of 5.6.1 there is cpp macro Perl_isnan().
     fix the basic arithmetics (+ - * / %) to preserve IVness/UVness if
-       both arguments are IVs/UVs
+       both arguments are IVs/UVs: it sucks that one cannot see
+       the 'carry flag' (or equivalent) of the CPU from C,
+       C is too high-level...
     replace pod2html with new PodtoHtml? (requires other modules from CPAN)
     automate testing with large parts of CPAN
-    Unicode collation? http://www.unicode.org/unicode/reports/tr10/
     turn Cwd into an XS module?  (Configure already probes for getcwd())
     mmap for speeding up input? (Configure already probes for the mmap family)
     sendmsg, recvmsg? (Configure doesn't probe for these but the units exist)
index d1e1c70..9321604 100644 (file)
@@ -13,7 +13,7 @@ my @optype= qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
 
 # Nullsv *must* come first in the following so that the condition
 # ($$sv == 0) can continue to be used to test (sv == Nullsv).
-my @specialsv = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no);
+my @specialsv = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE);
 
 my (%alias_from, $from, $tos);
 while (($from, $tos) = each %alias_to) {
@@ -82,7 +82,7 @@ print BYTERUN_C $c_header, <<'EOT';
 #include "bytecode.h"
 
 
-static int optype_size[] = {
+static const int optype_size[] = {
 EOT
 my $i = 0;
 for ($i = 0; $i < @optype - 1; $i++) {
@@ -92,33 +92,28 @@ printf BYTERUN_C "    sizeof(%s)\n", $optype[$i], $i;
 print BYTERUN_C <<'EOT';
 };
 
-static SV *specialsv_list[4];
-
-static int bytecode_iv_overflows = 0;
-static SV *bytecode_sv;
-static XPV bytecode_pv;
-static void **bytecode_obj_list;
-static I32 bytecode_obj_list_fill = -1;
-
 void *
-bset_obj_store(pTHXo_ void *obj, I32 ix)
+bset_obj_store(pTHXo_ struct byteloader_state *bstate, void *obj, I32 ix)
 {
-    if (ix > bytecode_obj_list_fill) {
-       if (bytecode_obj_list_fill == -1)
-           New(666, bytecode_obj_list, ix + 1, void*);
-       else
-           Renew(bytecode_obj_list, ix + 1, void*);
-       bytecode_obj_list_fill = ix;
+    if (ix > bstate->bs_obj_list_fill) {
+       Renew(bstate->bs_obj_list, ix + 32, void*);
+       bstate->bs_obj_list_fill = ix + 31;
     }
-    bytecode_obj_list[ix] = obj;
+    bstate->bs_obj_list[ix] = obj;
     return obj;
 }
 
 void
-byterun(pTHXo_ struct bytestream bs)
+byterun(pTHXo_ register struct byteloader_state *bstate)
 {
     dTHR;
-    int insn;
+    register int insn;
+    U32 ix;
+    SV *specialsv_list[6];
+
+    BYTECODE_HEADER_CHECK;     /* croak if incorrect platform */
+    New(666, bstate->bs_obj_list, 32, void*); /* set op objlist */
+    bstate->bs_obj_list_fill = 31;
 
 EOT
 
@@ -198,13 +193,25 @@ EOT
 #
 open(BYTERUN_H, ">ext/ByteLoader/byterun.h") or die "ext/ByteLoader/byterun.h: $!";
 print BYTERUN_H $c_header, <<'EOT';
-struct bytestream {
-    void *data;
-    int (*pfgetc)(void *);
-    int (*pfread)(char *, size_t, size_t, void *);
-    void (*pfreadpv)(U32, void *, XPV *);
+struct byteloader_fdata {
+    SV *datasv;
+    int next_out;
+    int        idx;
 };
 
+struct byteloader_state {
+    struct byteloader_fdata    *bs_fdata;
+    SV                         *bs_sv;
+    void                       **bs_obj_list;
+    int                                bs_obj_list_fill;
+    XPV                                bs_pv;
+    int                                bs_iv_overflows;
+};
+
+int bl_getc(struct byteloader_fdata *);
+int bl_read(struct byteloader_fdata *, char *, size_t, size_t);
+extern void byterun(pTHXo_ struct byteloader_state *);
+
 enum {
 EOT
 
@@ -233,18 +240,6 @@ for ($i = 0; $i < @optype - 1; $i++) {
 }
 printf BYTERUN_H "    OPt_%s\t\t/* %d */\n};\n\n", $optype[$i], $i;
 
-print BYTERUN_H <<'EOT';
-extern void byterun(pTHXo_ struct bytestream bs);
-
-#define INIT_SPECIALSV_LIST STMT_START { \
-EOT
-for ($i = 0; $i < @specialsv; $i++) {
-    print BYTERUN_H "\tPL_specialsv_list[$i] = $specialsv[$i]; \\\n";
-}
-print BYTERUN_H <<'EOT';
-    } STMT_END
-EOT
-
 #
 # Finish off insn_data and create array initialisers in Asmdata.pm
 #
@@ -294,85 +289,86 @@ nop               none                    none
 #opcode                lvalue                                  argtype         flags   
 #
 ret            none                                    none            x
-ldsv           bytecode_sv                             svindex
+ldsv           bstate->bs_sv                           svindex
 ldop           PL_op                                   opindex
-stsv           bytecode_sv                             U32             s
+stsv           bstate->bs_sv                           U32             s
 stop           PL_op                                   U32             s
-ldspecsv       bytecode_sv                             U8              x
-newsv          bytecode_sv                             U8              x
+stpv           bstate->bs_pv.xpv_pv                    U32             x
+ldspecsv       bstate->bs_sv                           U8              x
+newsv          bstate->bs_sv                           U8              x
 newop          PL_op                                   U8              x
 newopn         PL_op                                   U8              x
 newpv          none                                    PV
-pv_cur         bytecode_pv.xpv_cur                     STRLEN
-pv_free                bytecode_pv                             none            x
-sv_upgrade     bytecode_sv                             char            x
-sv_refcnt      SvREFCNT(bytecode_sv)                   U32
-sv_refcnt_add  SvREFCNT(bytecode_sv)                   I32             x
-sv_flags       SvFLAGS(bytecode_sv)                    U32
-xrv            SvRV(bytecode_sv)                       svindex
-xpv            bytecode_sv                             none            x
-xiv32          SvIVX(bytecode_sv)                      I32
-xiv64          SvIVX(bytecode_sv)                      IV64
-xnv            SvNVX(bytecode_sv)                      NV
-xlv_targoff    LvTARGOFF(bytecode_sv)                  STRLEN
-xlv_targlen    LvTARGLEN(bytecode_sv)                  STRLEN
-xlv_targ       LvTARG(bytecode_sv)                     svindex
-xlv_type       LvTYPE(bytecode_sv)                     char
-xbm_useful     BmUSEFUL(bytecode_sv)                   I32
-xbm_previous   BmPREVIOUS(bytecode_sv)                 U16
-xbm_rare       BmRARE(bytecode_sv)                     U8
-xfm_lines      FmLINES(bytecode_sv)                    I32
-xio_lines      IoLINES(bytecode_sv)                    long
-xio_page       IoPAGE(bytecode_sv)                     long
-xio_page_len   IoPAGE_LEN(bytecode_sv)                 long
-xio_lines_left IoLINES_LEFT(bytecode_sv)               long
-xio_top_name   IoTOP_NAME(bytecode_sv)                 pvcontents
-xio_top_gv     *(SV**)&IoTOP_GV(bytecode_sv)           svindex
-xio_fmt_name   IoFMT_NAME(bytecode_sv)                 pvcontents
-xio_fmt_gv     *(SV**)&IoFMT_GV(bytecode_sv)           svindex
-xio_bottom_name        IoBOTTOM_NAME(bytecode_sv)              pvcontents
-xio_bottom_gv  *(SV**)&IoBOTTOM_GV(bytecode_sv)        svindex
-xio_subprocess IoSUBPROCESS(bytecode_sv)               short
-xio_type       IoTYPE(bytecode_sv)                     char
-xio_flags      IoFLAGS(bytecode_sv)                    char
-xcv_stash      *(SV**)&CvSTASH(bytecode_sv)            svindex
-xcv_start      CvSTART(bytecode_sv)                    opindex
-xcv_root       CvROOT(bytecode_sv)                     opindex
-xcv_gv         *(SV**)&CvGV(bytecode_sv)               svindex
-xcv_file       CvFILE(bytecode_sv)                     pvcontents
-xcv_depth      CvDEPTH(bytecode_sv)                    long
-xcv_padlist    *(SV**)&CvPADLIST(bytecode_sv)          svindex
-xcv_outside    *(SV**)&CvOUTSIDE(bytecode_sv)          svindex
-xcv_flags      CvFLAGS(bytecode_sv)                    U16
-av_extend      bytecode_sv                             SSize_t         x
-av_push                bytecode_sv                             svindex         x
-xav_fill       AvFILLp(bytecode_sv)                    SSize_t
-xav_max                AvMAX(bytecode_sv)                      SSize_t
-xav_flags      AvFLAGS(bytecode_sv)                    U8
-xhv_riter      HvRITER(bytecode_sv)                    I32
-xhv_name       HvNAME(bytecode_sv)                     pvcontents
-hv_store       bytecode_sv                             svindex         x
-sv_magic       bytecode_sv                             char            x
-mg_obj         SvMAGIC(bytecode_sv)->mg_obj            svindex
-mg_private     SvMAGIC(bytecode_sv)->mg_private        U16
-mg_flags       SvMAGIC(bytecode_sv)->mg_flags          U8
-mg_pv          SvMAGIC(bytecode_sv)                    pvcontents      x
-xmg_stash      *(SV**)&SvSTASH(bytecode_sv)            svindex
-gv_fetchpv     bytecode_sv                             strconst        x
-gv_stashpv     bytecode_sv                             strconst        x
-gp_sv          GvSV(bytecode_sv)                       svindex
-gp_refcnt      GvREFCNT(bytecode_sv)                   U32
-gp_refcnt_add  GvREFCNT(bytecode_sv)                   I32             x
-gp_av          *(SV**)&GvAV(bytecode_sv)               svindex
-gp_hv          *(SV**)&GvHV(bytecode_sv)               svindex
-gp_cv          *(SV**)&GvCV(bytecode_sv)               svindex
-gp_file                GvFILE(bytecode_sv)                     pvcontents
-gp_io          *(SV**)&GvIOp(bytecode_sv)              svindex
-gp_form                *(SV**)&GvFORM(bytecode_sv)             svindex
-gp_cvgen       GvCVGEN(bytecode_sv)                    U32
-gp_line                GvLINE(bytecode_sv)                     line_t
-gp_share       bytecode_sv                             svindex         x
-xgv_flags      GvFLAGS(bytecode_sv)                    U8
+pv_cur         bstate->bs_pv.xpv_cur                   STRLEN
+pv_free                bstate->bs_pv                           none            x
+sv_upgrade     bstate->bs_sv                           char            x
+sv_refcnt      SvREFCNT(bstate->bs_sv)                 U32
+sv_refcnt_add  SvREFCNT(bstate->bs_sv)                 I32             x
+sv_flags       SvFLAGS(bstate->bs_sv)                  U32
+xrv            SvRV(bstate->bs_sv)                     svindex
+xpv            bstate->bs_sv                           none            x
+xiv32          SvIVX(bstate->bs_sv)                    I32
+xiv64          SvIVX(bstate->bs_sv)                    IV64
+xnv            SvNVX(bstate->bs_sv)                    NV
+xlv_targoff    LvTARGOFF(bstate->bs_sv)                STRLEN
+xlv_targlen    LvTARGLEN(bstate->bs_sv)                STRLEN
+xlv_targ       LvTARG(bstate->bs_sv)                   svindex
+xlv_type       LvTYPE(bstate->bs_sv)                   char
+xbm_useful     BmUSEFUL(bstate->bs_sv)                 I32
+xbm_previous   BmPREVIOUS(bstate->bs_sv)               U16
+xbm_rare       BmRARE(bstate->bs_sv)                   U8
+xfm_lines      FmLINES(bstate->bs_sv)                  I32
+xio_lines      IoLINES(bstate->bs_sv)                  long
+xio_page       IoPAGE(bstate->bs_sv)                   long
+xio_page_len   IoPAGE_LEN(bstate->bs_sv)               long
+xio_lines_left IoLINES_LEFT(bstate->bs_sv)             long
+xio_top_name   IoTOP_NAME(bstate->bs_sv)               pvcontents
+xio_top_gv     *(SV**)&IoTOP_GV(bstate->bs_sv)         svindex
+xio_fmt_name   IoFMT_NAME(bstate->bs_sv)               pvcontents
+xio_fmt_gv     *(SV**)&IoFMT_GV(bstate->bs_sv)         svindex
+xio_bottom_name        IoBOTTOM_NAME(bstate->bs_sv)            pvcontents
+xio_bottom_gv  *(SV**)&IoBOTTOM_GV(bstate->bs_sv)      svindex
+xio_subprocess IoSUBPROCESS(bstate->bs_sv)             short
+xio_type       IoTYPE(bstate->bs_sv)                   char
+xio_flags      IoFLAGS(bstate->bs_sv)                  char
+xcv_stash      *(SV**)&CvSTASH(bstate->bs_sv)          svindex
+xcv_start      CvSTART(bstate->bs_sv)                  opindex
+xcv_root       CvROOT(bstate->bs_sv)                   opindex
+xcv_gv         *(SV**)&CvGV(bstate->bs_sv)             svindex
+xcv_file       CvFILE(bstate->bs_sv)                   pvindex
+xcv_depth      CvDEPTH(bstate->bs_sv)                  long
+xcv_padlist    *(SV**)&CvPADLIST(bstate->bs_sv)        svindex
+xcv_outside    *(SV**)&CvOUTSIDE(bstate->bs_sv)        svindex
+xcv_flags      CvFLAGS(bstate->bs_sv)                  U16
+av_extend      bstate->bs_sv                           SSize_t         x
+av_push                bstate->bs_sv                           svindex         x
+xav_fill       AvFILLp(bstate->bs_sv)                  SSize_t
+xav_max                AvMAX(bstate->bs_sv)                    SSize_t
+xav_flags      AvFLAGS(bstate->bs_sv)                  U8
+xhv_riter      HvRITER(bstate->bs_sv)                  I32
+xhv_name       HvNAME(bstate->bs_sv)                   pvcontents
+hv_store       bstate->bs_sv                           svindex         x
+sv_magic       bstate->bs_sv                           char            x
+mg_obj         SvMAGIC(bstate->bs_sv)->mg_obj          svindex
+mg_private     SvMAGIC(bstate->bs_sv)->mg_private      U16
+mg_flags       SvMAGIC(bstate->bs_sv)->mg_flags        U8
+mg_pv          SvMAGIC(bstate->bs_sv)                  pvcontents      x
+xmg_stash      *(SV**)&SvSTASH(bstate->bs_sv)          svindex
+gv_fetchpv     bstate->bs_sv                           strconst        x
+gv_stashpv     bstate->bs_sv                           strconst        x
+gp_sv          GvSV(bstate->bs_sv)                     svindex
+gp_refcnt      GvREFCNT(bstate->bs_sv)                 U32
+gp_refcnt_add  GvREFCNT(bstate->bs_sv)                 I32             x
+gp_av          *(SV**)&GvAV(bstate->bs_sv)             svindex
+gp_hv          *(SV**)&GvHV(bstate->bs_sv)             svindex
+gp_cv          *(SV**)&GvCV(bstate->bs_sv)             svindex
+gp_file                GvFILE(bstate->bs_sv)                   pvindex
+gp_io          *(SV**)&GvIOp(bstate->bs_sv)            svindex
+gp_form                *(SV**)&GvFORM(bstate->bs_sv)           svindex
+gp_cvgen       GvCVGEN(bstate->bs_sv)                  U32
+gp_line                GvLINE(bstate->bs_sv)                   line_t
+gp_share       bstate->bs_sv                           svindex         x
+xgv_flags      GvFLAGS(bstate->bs_sv)                  U8
 op_next                PL_op->op_next                          opindex
 op_sibling     PL_op->op_sibling                       opindex
 op_ppaddr      PL_op->op_ppaddr                        strconst        x
@@ -399,9 +395,9 @@ op_pv_tr    cPVOP->op_pv                            op_tr_array
 op_redoop      cLOOP->op_redoop                        opindex
 op_nextop      cLOOP->op_nextop                        opindex
 op_lastop      cLOOP->op_lastop                        opindex
-cop_label      cCOP->cop_label                         pvcontents
-cop_stashpv    cCOP                                    pvcontents      x
-cop_file       cCOP                                    pvcontents      x
+cop_label      cCOP->cop_label                         pvindex
+cop_stashpv    cCOP                                    pvindex         x
+cop_file       cCOP                                    pvindex         x
 cop_seq                cCOP->cop_seq                           U32
 cop_arybase    cCOP->cop_arybase                       I32
 cop_line       cCOP                                    line_t          x
@@ -409,3 +405,6 @@ cop_warnings        cCOP->cop_warnings                      svindex
 main_start     PL_main_start                           opindex
 main_root      PL_main_root                            opindex
 curpad         PL_curpad                               svindex         x
+push_begin     PL_beginav                              svindex         x
+push_init      PL_initav                               svindex         x
+push_end       PL_endav                                svindex         x
index ec6dc35..d215255 100755 (executable)
--- a/cflags.SH
+++ b/cflags.SH
@@ -129,8 +129,8 @@ for file do
        fi
 
     : Can we perhaps use $ansi2knr here
-    echo "$cc -c -DPERL_CORE $ccflags $optimize $perltype $large $split"
-    eval "$also "'"$cc -DPERL_CORE -c $ccflags $optimize $perltype $large $split"'
+    echo "$cc -c -DPERL_CORE $ccflags $optimize $perltype"
+    eval "$also "'"$cc -DPERL_CORE -c $ccflags $optimize $perltype"'
 
     . $TOP/config.sh
 
index e66e0c5..a209e6d 100644 (file)
@@ -244,17 +244,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_getpgid HAS_GETPGID                /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#$d_getpgrp HAS_GETPGRP                /**/
-#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
@@ -509,18 +498,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_setpgid HAS_SETPGID        /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-#$d_setpgrp HAS_SETPGRP                /**/
-#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
@@ -2003,6 +1980,12 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #$d_msg_proxy  HAS_MSG_PROXY   /**/
 #$d_scm_rights HAS_SCM_RIGHTS  /**/
 
+/* HAS_SOCKS5_INIT:
+ *     This symbol, if defined, indicates that the socks5_init routine is
+ *     available to initialize SOCKS 5.
+ */
+#$d_socks5_init HAS_SOCKS5_INIT                /**/
+
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
@@ -2338,6 +2321,12 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$i_inttypes   I_INTTYPES                /**/
 
+/* I_LIBUTIL:
+ *     This symbol, if defined, indicates that <libutil.h> exists and
+ *     should be included.
+ */
+#$i_libutil    I_LIBUTIL               /**/
+
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <mach/cthreads.h>.
@@ -2536,8 +2525,18 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'g') for output.
  */
+/* PERL_PRIeldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'f') for input.
+ */
 #$d_PRIfldbl PERL_PRIfldbl     $sPRIfldbl      /**/
 #$d_PRIgldbl PERL_PRIgldbl     $sPRIgldbl      /**/
+#$d_PRIeldbl PERL_PRIeldbl     $sPRIeldbl      /**/
+#$d_SCNfldbl PERL_SCNfldbl     $sSCNfldbl      /**/
 
 /* Off_t:
  *     This symbol holds the type used to declare offsets in the kernel.
@@ -2752,12 +2751,27 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 /* UVxf:
  *     This symbol defines the format string used for printing a Perl UV
- *     as an unsigned hexadecimal integer.
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
  */
 #define        IVdf            $ivdformat              /**/
 #define        UVuf            $uvuformat              /**/
 #define        UVof            $uvoformat              /**/
 #define        UVxf            $uvxformat              /**/
+#define        NVef            $nveformat              /**/
+#define        NVff            $nvfformat              /**/
+#define        NVgf            $nvgformat              /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
@@ -3156,11 +3170,28 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #define PERL_XS_APIVERSION "$xs_apiversion"
 #define PERL_PM_APIVERSION "$pm_apiversion"
 
-/* I_LIBUTIL:
- *     This symbol, if defined, indicates that <libutil.h> exists and
- *     should be included.
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
  */
-#$i_libutil    I_LIBUTIL               /**/
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#$d_getpgrp HAS_GETPGRP                /**/
+#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+#$d_setpgrp HAS_SETPGRP                /**/
+#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
 
 #endif
 !GROK!THIS!
index c64af8a..31b416b 100755 (executable)
--- a/configpm
+++ b/configpm
@@ -128,41 +128,84 @@ sub FETCH {
 
     # Search for it in the big string 
     my($value, $start, $marker, $quote_type);
-    $marker = "$_[1]=";
+
     $quote_type = "'";
-    # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
-    # Check for the common case, ' delimeted
-    $start = index($config_sh, "\n$marker$quote_type");
-    # If that failed, check for " delimited
-    if ($start == -1) {
-      $quote_type = '"';
-      $start = index($config_sh, "\n$marker$quote_type");
-    }
-    return undef if ( ($start == -1) &&  # in case it's first 
-        (substr($config_sh, 0, length($marker)) ne $marker) );
-    if ($start == -1) { 
-      # It's the very first thing we found. Skip $start forward
-      # and figure out the quote mark after the =.
-      $start = length($marker) + 1;
-      $quote_type = substr($config_sh, $start - 1, 1);
-    } 
-    else { 
-      $start += length($marker) + 2;
+    # Virtual entries.
+    if ($_[1] eq 'byteorder') {
+       # byteorder does exist on its own but we overlay a virtual
+       # dynamically recomputed value. 
+        my $t = $Config{ivtype};
+        my $s = $Config{ivsize};
+        my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I';
+        if ($s == 4 || $s == 8) {
+           my $i = 0;
+           foreach my $c (reverse(2..$s)) { $i |= ord($c); $i <<= 8 }
+           $i |= ord(1);
+            $value = join('', unpack('a'x$s, pack($f, $i)));
+        } else {
+            $value = '?'x$s;
+        }
+    } elsif ($_[1] =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) {
+       # These are purely virtual, they do not exist, but need to
+       # be computed on demand for largefile-incapable extensions.
+       my $key = "${1}_uselargefiles";
+       $value = $Config{$1};
+       my $withlargefiles = $Config{$key};
+       if ($key =~ /^(?:cc|ld)flags_/) {
+           $value =~ s/\Q$withlargefiles\E\b//;
+       } elsif ($key =~ /^libs/) {
+           my @lflibswanted = split(' ', $Config{libswanted_uselargefiles});
+           if (@lflibswanted) {
+               my %lflibswanted;
+               @lflibswanted{@lflibswanted} = ();
+               if ($key =~ /^libs_/) {
+                   my @libs = grep { /^-l(.+)/ &&
+                                      not exists $lflibswanted{$1} }
+                                   split(' ', $Config{libs});
+                   $Config{libs} = join(' ', @libs);
+               } elsif ($key =~ /^libswanted_/) {
+                   my @libswanted = grep { not exists $lflibswanted{$_} }
+                                         split(' ', $Config{libswanted});
+                   $Config{libswanted} = join(' ', @libswanted);
+               }
+           }
+       }
+    } else {
+       $marker = "$_[1]=";
+       # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m);
+       # Check for the common case, ' delimeted
+       $start = index($config_sh, "\n$marker$quote_type");
+       # If that failed, check for " delimited
+       if ($start == -1) {
+           $quote_type = '"';
+           $start = index($config_sh, "\n$marker$quote_type");
+       }
+       return undef if ( ($start == -1) &&  # in case it's first 
+                         (substr($config_sh, 0, length($marker)) ne $marker) );
+       if ($start == -1) { 
+           # It's the very first thing we found. Skip $start forward
+           # and figure out the quote mark after the =.
+           $start = length($marker) + 1;
+           $quote_type = substr($config_sh, $start - 1, 1);
+       } 
+       else { 
+           $start += length($marker) + 2;
+       }
+       $value = substr($config_sh, $start, 
+                       index($config_sh, "$quote_type\n", $start) - $start);
     }
-    $value = substr($config_sh, $start, 
-        index($config_sh, "$quote_type\n", $start) - $start);
     # If we had a double-quote, we'd better eval it so escape
     # sequences and such can be interpolated. Since the incoming
     # value is supposed to follow shell rules and not perl rules,
     # we escape any perl variable markers
     if ($quote_type eq '"') {
-      $value =~ s/\$/\\\$/g;
-      $value =~ s/\@/\\\@/g;
-      eval "\$value = \"$value\"";
+       $value =~ s/\$/\\\$/g;
+       $value =~ s/\@/\\\@/g;
+       eval "\$value = \"$value\"";
     }
     #$value = sprintf($value) if $quote_type eq '"';
-    $value = undef if $value eq 'undef'; # So we can say "if $Config{'foo'}".
+    # So we can say "if $Config{'foo'}".
+    $value = undef if $value eq 'undef';
     $_[0]->{$_[1]} = $value; # cache it
     return $value;
 }
@@ -191,7 +234,8 @@ sub EXISTS {
     index($config_sh, "\n$_[1]='") != -1 or
     substr($config_sh, 0, length($_[1])+2) eq "$_[1]='" or
     index($config_sh, "\n$_[1]=\"") != -1 or
-    substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"";
+    substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"" or
+    $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/;
 }
 
 sub STORE  { die "\%Config::Config is read-only\n" }
index 003a047..28ce5e8 100644 (file)
@@ -1,7 +1,7 @@
 $ sav_ver = 'F$VERIFY(0)'
 $! SET VERIFY
 $!
-$! For example, if you unpacked perl into: [USER.PERL5_00n...] then you will 
+$! For example, if you unpacked perl into: [USER.PERL-5n...] then you will 
 $! want to cd into the tree and execute Configure:
 $!
 $! $ SET DEFAULT [USER.PERL5_xxx]
@@ -35,7 +35,9 @@ $!
 $! VMS-isms we will need:
 $ echo = "write sys$output "
 $ cat  = "type"
+$ delete := delete ! local symbol overrides globals with qualifiers
 $ gcc_symbol = "gcc"
+$ ld = "Link"
 $ ans = ""
 $ macros = ""
 $ extra_flags = ""
@@ -50,12 +52,10 @@ $ Thread_Live_Dangerously = "MT="
 $ use_two_pot_malloc = "N"
 $ use_pack_malloc = "N"
 $ use_debugmalloc = "N"
-$ d_secintgenv = "N"
-$ cc_flags = ""
-$ use_multiplicity = "N"
+$ ccflags = ""
 $ vms_default_directory_name = F$ENVIRONMENT("DEFAULT")
-$ max_allowed_dir_depth = 3  ! e.g. [A.B.PERL5_xxx] not [A.B.C.PERL5_xxx]
-$! max_allowed_dir_depth = 2  ! e.g. [A.PERL5_xxx] not [A.B.PERL5_xxx]
+$ max_allowed_dir_depth = 3  ! e.g. [A.B.PERLxxx] not [A.B.C.PERLxxx]
+$! max_allowed_dir_depth = 2 ! e.g. [A.PERLxxx] not [A.B.PERLxxx]
 $!
 $ vms_filcnt = F$GETJPI ("","FILCNT")
 $!
@@ -118,16 +118,18 @@ $!: set up default values
 $ fastread=""
 $ reuseval="false"
 $ maniskip = "false"
-$ config_sh=""
+$ IF F$TYPE(config_sh) .EQS. "" THEN config_sh=""
 $ alldone=""
 $ error=""
 $ silent=""
 $ extractsh=""
 $ override=""
 $ knowitall=""
-$ Using_Dec_C = ""
-$ Using_Gnu_C = ""
+$ Using_Dec_C = "n"
+$ Using_Gnu_C = "n"
+$ using_cxx = "n"
 $ Dec_C_Version = ""
+$ cxxversion = ""
 $ use_threads = "F"
 $ use_5005_threads = "N"
 $ use_ithreads = "N"
@@ -170,7 +172,7 @@ $     gotopt = "t"
 $     P'i' = P'i' - "e"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "f") !"-f")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "f") ! "-f"
 $   THEN
 $     P'i' = P'i' - "f"
 $     config_sh = P'i'
@@ -179,6 +181,7 @@ $     THEN
 $       test_config_sh = F$FILE_ATTRIBUTES(config_sh,"PRO")
 $       IF (F$LOCATE("R",test_config_sh).NE.F$LENGTH(test_config_sh)) 
 $       THEN
+$         config_dflt = "y"
 $         CONTINUE !at this point check UIC && if test allows...
 $                  !to be continued ?
 $       ELSE
@@ -191,100 +194,103 @@ $       error="true"
 $     ENDIF
 $     gotopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "h")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "h") ! "-h"
 $   THEN
 $     error = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "h"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "m")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "m")  ! "-m"
 $   THEN
 $     maniskip = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "m"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "r")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "r")  ! "-r"
 $   THEN
 $     reuseval = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "r"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "s")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "s") ! "-s"
 $   THEN
 $     silent = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "s"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "E") !"-E")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "E") ! "-E"
 $   THEN
 $     alldone = "exit"
 $     gotopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "K") !"-K")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "K") ! "-K"
 $   THEN
 $     knowitall = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "K"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "O")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "O") ! "-O"
 $   THEN
 $     override = "true"
 $     gotopt = "t"
 $     P'i' = P'i' - "O"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "S") !"-S")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "S") ! "-S"
 $   THEN
-$     extractsh = "true" !VMS?
+$     extractsh = "true"  !VMS?  Yes with munchconfig
 $     gotopt = "t"
 $     P'i' = P'i' - "S"
 $     gotshortopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "D") !"-D")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "D") ! "-D"
 $   THEN
 $     P'i' = P'i' - "D"
-$!Hmm.. this part needs work
-$!       P'i'
 $     IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
 $     THEN
-$       P'i' = "define"
+$       tmp = P'i' + "=""define"""
+$       'tmp'
+$       DELETE/SYMBOL tmp
 $     ELSE 
 $       IF (F$LOCATE("=",P'i') .EQ. (F$LENGTH(P'i') - 1))
 $       THEN
 $         me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$         echo "''me': use '-Usymbol=val' not '-Dsymbol='."
+$         echo "''me': use ""-Usymbol=val"" not ""-Dsymbol=""."
 $         echo "''me': ignoring -D",P'i'
 $       ELSE
-$!Hmm.. this part needs work
-$!           'F$EXTRACT(0,F$LOCATE("=",P'i'),P'i')' = -
-$! 'F$EXTRACT(F$LOCATE("=",P'i'),P'i'),F$LENGTH(P'i'),P'i')'
+$          tmp = F$EXTRACT(0,F$LOCATE("=",P'i'),P'i')
+$          tmp = tmp + "=""" + F$EXTRACT(F$LOCATE("=",P'i')+1,F$LENGTH(P'i'),P'i') + """"
+$         'tmp'
+$         DELETE/SYMBOL tmp
 $       ENDIF
 $     ENDIF
-$     ECHO "P''i' =>",P'i',"<="  !Diag
 $     gotopt = "t"
 $   ENDIF
-$   IF (F$EXTRACT(0,1,P'i') .EQS. "U") !"-U")
+$   IF (F$EXTRACT(0,1,P'i') .EQS. "U") ! "-U"
 $   THEN
 $     P'i' = P'i' - "U"
 $     IF (F$LOCATE("=",P'i') .EQ. F$LENGTH(P'i'))
 $     THEN
-$       P'i' = ""
+$       tmp = P'i' + "="""""
+$       'tmp'
+$       DELETE/SYMBOL tmp
 $     ELSE 
 $       IF (F$LOCATE("=",P'i') .LT. (F$LENGTH(P'i') - 1))
 $       THEN
 $         me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
-$         echo "''me': use '-Dsymbol=val' not '-Usymbol=val'."
+$         echo "''me': use ""-Dsymbol=val"" not ""-Usymbol=val""."
 $         echo "''me': ignoring -U",P'i'
 $       ELSE
-$         P'i' = "undef"
+$         tmp = P'i' + "=""undef"""
+$         'tmp'
+$         DELETE/SYMBOL tmp
 $       ENDIF
 $     ENDIF
-$     ECHO "P''i' =>",P'i',"<="  !Diag
 $     gotopt = "t"
 $   ENDIF
 $   IF (F$EXTRACT(0,1,P'i') .EQS. "V")
@@ -292,7 +298,7 @@ $   THEN
 $     me = F$PARSE(me,,,"NAME") + F$PARSE(me,,,"TYPE")
 $     echo "''me' generated by an unknown version of EDT."
 $     STOP
-$     EXIT !0
+$     EXIT
 $   ENDIF
 $   IF .NOT.gotopt 
 $   THEN
@@ -309,9 +315,10 @@ $!
 $ IF (error)
 $ THEN
 $   me = F$PARSE(me,,,"DIRECTORY")+ F$PARSE(me,,,"NAME")
-$   echo "Usage: @''me' [-dehmrEKOSV] [-fconfig.sh] [-Dsymbol] [-Dsymbol=value]"
+$   echo "Usage: @''me' [-dehmr""EKOSV""] [-fconfig.sh] [""-Dsymbol""] [""-Dsymbol=value""]"
 $   echo "                [-Usymbol]  [-Usymbol=]"
-$   TYPE SYS$INPUT
+$   TYPE SYS$INPUT:
+$   DECK
  "-d" : use defaults for all answers.
  "-e" : go on without questioning past the production of config.sh.    *
  "-f" : specify an alternate default configuration file.
@@ -330,6 +337,7 @@ $   TYPE SYS$INPUT
          -"Usymbol"    symbol gets the value 'undef'
          -"Usymbol="   symbol gets completely empty
   -V  : print version number and exit (with a zero status).
+$   EOD
 $   echo "%Config-I-VMS, lower case switches must be enclosed"
 $   echo "-Config-I-VMS, in double quotation marks, e.g.:"
 $   echo "-Config-I-VMS,   @Configure ""-des"""
@@ -393,7 +401,7 @@ $ echo ""
 $ echo4 "First let's make sure your kit is complete.  Checking..."
 $ manifestfound = "" 
 $ miss_list = "" 
-$! Here I assume we are in the [foo.PERL5xxx.VMS...] tree
+$! Here I assume we are in the [foo.PERLxxx...] tree
 $! because the search routine simply does set def [-] if necessary.
 $ file_2_find = "MANIFEST" !I hope this one is not in [foo.PERL5xxx.VMS...] 
 $Research_manifest:
@@ -418,10 +426,12 @@ $ IF (tmp .GES. "7.2") .AND. (F$GETSYI("HW_MODEL") .GE. 1024) THEN GOTO Beyond_d
 $   IF (F$ELEMENT(max_allowed_dir_depth,".",F$ENVIRONMENT("Default")).nes.".")
 $   THEN
 $     TYPE SYS$INPUT:
+$     DECK
 %Config-E-VMS, ERROR:
  Sorry! It apears as though your perl build sub-directory is already too
  deep into the VMS file system. Please try moving stuff into a shallower 
  directory (or altering the "max_allowed_dir_depth" parameter).
+$     EOD
 $     echo4 "ABORTING..."
 $     SET DEFAULT 'vms_default_directory_name' !be kind rewind
 $     STOP
@@ -537,6 +547,8 @@ $   ENDIF
 $   IF ((miss_list .NES. "").OR.(manifestfound .EQS. ""))
 $   THEN
 $     TYPE SYS$INPUT:
+$     DECK
+
 
 THIS PACKAGE SEEMS TO BE INCOMPLETE.
 
@@ -545,6 +557,7 @@ distinct possibility that your kit is damaged, by typing 'y'es.  If you
 do, don't blame me if something goes wrong.  I advise you to type 'n'o
 and contact the author (dan@sidhe.org)
 
+$     EOD
 $     READ SYS$COMMAND/PROMPT="Continue? [n] " ans
 $     IF ans
 $     THEN
@@ -575,13 +588,23 @@ $ If (fastread)
 $ Then
 $   echo4 "''rp'"
 $ Else
-$   If (silent)
-$   Then
+$   If (.NOT. silent) Then echo ""
+$   READ SYS$COMMAND/PROMPT="''rp'" ans
+$   IF (ans .EQS. "&-d")
+$   THEN
+$     echo4 "(OK, I will run with -d after this question.)"
+$     IF (.NOT. silent) THEN echo ""
 $     READ SYS$COMMAND/PROMPT="''rp'" ans
-$   Else
+$     fastread := yes
+$   ENDIF
+$   IF (ans .EQS. "&-s")
+$   THEN
+$     echo4 "(OK, I will run with -s after this question.)"
 $     echo ""
 $     READ SYS$COMMAND/PROMPT="''rp'" ans
-$   Endif
+$     silent := true
+$     GOSUB Shut_up
+$   ENDIF
 $ Endif
 $ RETURN
 $!
@@ -602,6 +625,58 @@ $   WRITE CONFIG -
 $   CLOSE CONFIG
 $ ENDIF
 $!
+$ IF F$TYPE(usedevel) .EQS. "" THEN usedevel := n
+$ patchlevel_h = F$SEARCH("[-]patchlevel.h")
+$ IF (patchlevel_h.NES."")
+$ THEN
+$   SEARCH 'patchlevel_h' "define","PERL_VERSION","epoch"/match=and/out=[]ver.out
+$   IF .NOT. usedevel .AND. usedevel .NES. "define"
+$   THEN
+$     OPEN/READ CONFIG []ver.out
+$     READ CONFIG line
+$     CLOSE CONFIG
+$     tmp = F$EDIT(line,"TRIM,COMPRESS")
+$     xpatchlevel = F$INTEGER(F$ELEMENT(2," ",tmp))
+$     line = xpatchlevel / 2
+$     tmp = xpatchlevel - ( line * 2 )
+$     IF tmp .NE. 0
+$     THEN
+$       echo4 "patchlevel is " + F$STRING(xpatchlevel)
+$       cat4 SYS$INPUT:
+$       DECK
+*** WHOA THERE!!! ***
+
+    This is an UNSTABLE DEVELOPMENT release.
+    (The patchlevel, is odd--as opposed to even,
+     and that signifies a development release.  If you want a
+     maintenance release, you want an even-numbered release.)
+
+    Do ***NOT*** install this into production use.
+    Data corruption and crashes are possible.
+
+    It is most seriously suggested that you do not continue any further
+    unless you want to help in developing and debugging Perl.
+
+$       EOD
+$       dflt="n"
+$       rp="Do you really want to continue? [''dflt'] "
+$       IF (fastread) THEN fastread := FALSE
+$       GOSUB myread
+$       IF ans .EQS. "" THEN ans = dflt
+$       IF ans
+$       THEN
+$         echo4 "Okay, continuing."
+$       ELSE
+$         echo4 "Okay, bye."
+$         DELETE/NOLOG/NOCONFIRM []ver.out;
+$         GOTO Clean_up
+$       ENDIF
+$     ENDIF
+$     DELETE/SYMBOL line
+$     DELETE/SYMBOL tmp
+$   ENDIF
+$   DELETE/NOLOG/NOCONFIRM []ver.out;
+$ ENDIF
 $!: general instructions
 $ needman = "true"
 $ firsttime = "true"
@@ -626,6 +701,7 @@ $!
 $ IF (needman)
 $ THEN
 $   TYPE SYS$INPUT:
+$   DECK
 
 This installation shell script will examine your system and ask you questions
 to determine how the perl5 package should be installed. If you get
@@ -634,16 +710,20 @@ process, edit something, then restart this process as you just did.
 Many of the questions will have default answers in square
 brackets; typing carriage return will give you the default.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
 $   TYPE SYS$INPUT:
+$   DECK
 
 In a hurry? You may run '@Configure "-d"'.  This will bypass nearly all
 the questions and use the computed defaults (or the previous answers provided 
 there was already a config.sh file). Type '@Configure "-h"' for a list of 
 options.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Type carriage return to continue " ans
 $   TYPE SYS$INPUT:
+$   DECK
 
 Much effort has been expended to ensure that this shell script will
 run on any VMS system.  If despite that it blows up on yours, your
@@ -651,6 +731,7 @@ best bet is to edit Configure.com and @ it again.  Whatever problems
 you have with Configure.com, let me (dan@sidhe.org) know how I blew
 it.
 
+$   EOD
 $!This installation script affects things in two ways:
 $!
 $!1) it may do direct variable substitutions on some of the files included
@@ -675,7 +756,7 @@ $ sharpbang = "$ "
 $!: figure out how to guarantee sh startup !sfn
 $!: find out where common programs are     !sfn
 $!loclist="awk/cat/comm/cp/echo/expr/find/grep/ln/ls/mkdir/rm/sed/sort/touch/tr/uniq"
-$!trylist="Mcc/byacc/cpp/csh/date/egrep/less/line/more/nroff/perl/pg/sendmail/test/uname"
+$!trylist="byacc/cpp/csh/date/egrep/less/line/more/nroff/perl/pg/sendmail/test/uname"
 $! echo "I don't know where '$file' is, and my life depends on it."
 $! echo "Go find a public domain implementation or fix your PATH setting!"
 $! echo ""
@@ -699,15 +780,49 @@ $   configshfound = F$SEARCH(config_sh)
 $   IF (configshfound.NES."") THEN GOTO Config_sh_found
 $ ENDIF
 $ IF (i.LT.max) THEN GOTO Config_sh_look
-$ IF (configshfound.EQS."") THEN GOTO Beyond_config_sh
+$! genconfig.pl has "osname='VMS'"
+$ osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE")
+$ IF (configshfound.EQS."")
+$ THEN
+$   config_sh = "[-]config.sh" ! the fallback default
+$   GOTO Beyond_config_sh
+$ ENDIF
 $Config_sh_found:
-$ echo ""
-$ echo "Fetching default answers from ''config_sh'..."
+$ IF F$TYPE(osname) .EQS. "" THEN osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE")
+$ IF F$TYPE(config_dflt) .EQS. "" THEN config_dflt = "n"
+$ rp = "Shall I @ ''config_sh' for default answers? [''config_dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = config_dflt
+$ IF ans
+$ THEN
+$   echo ""
+$   echo "Fetching default answers from ''config_sh'..."
+$!
+$! This @ is why config_sh must employ DCL syntax.  Note that for
+$! symbols to be returned to this procedure they must be global.
+$! Which implies that assignments must be of the :== or == variety.
+$! Note further that the [-]config.sh file written by this procedure
+$! employs shell syntax.  In order to convert shell syntax to DCL
+$! you might try:
+$!
+$! perl -ni -e "s/^#/!#/;s/='/==""/;s/'$/""/;print ""\$ $_"";" config.sh
+$!
+$! However, watch out for sig_nam, sig_nam_init, sig_num, startperl 
+$! and any of the lower case double quoted variables such as the *format
+$! variables in such a config."sh".
+$!
+$   @'config_sh'
+$!
+$ ENDIF
+$ DELETE/SYMBOL config_dflt
+$!
 $!we actually do not have "hints/" for VMS
 $!     TYPE SYS$INPUT:
+$!     DECK
 $!
 $!First time through, eh?  I have some defaults handy for the following systems:
 $!
+$!     EOD
 $!     echo "     ","VMS_VAX"
 $!     echo "     ","VMS_AXP"
 $!        : Now look for a hint file osname_osvers, unless one has been
@@ -723,20 +838,20 @@ $Beyond_config_sh:
 $!
 $!: Restore computed paths          !sfn
 $!
-$! genconfig.pl has "osname='VMS'"
-$ osname = F$EDIT(F$GETSYI("NODE_SWTYPE"),"COLLAPSE") 
 $! %Config-I-VMS, a necessary error trap (could be PC running VCL)
 $!
 $ IF (osname .NES. "VMS")
 $ THEN
 $   echo4 "Hmm.. I wonder what ''osname' is (?)"
 $   TYPE SYS$INPUT:
+$   DECK
 
 %Config-E-VMS, ERROR:
 
            Err, you do not appear to be running VMS!
  This procedure is intended to Configure the building of Perl for VMS.
 
+$   EOD
 $   READ SYS$COMMAND/PROMPT="Continue anyway? [n] " ans
 $   IF ans
 $   THEN
@@ -750,11 +865,13 @@ $   ENDIF
 $ ELSE           !we are on VMS huzzah!
 $   IF .NOT.silent 
 $   THEN TYPE SYS$INPUT:
+$   DECK
 
 Configure uses the operating system name and version to set some defaults.
 The default value is probably right if the name rings a bell. Otherwise,
 since spelling matters for me, either accept the default or answer "none"
 to leave it blank.
+$   EOD
 $   ENDIF
 $   rp = "Operating system name? [''osname'] "
 $   GOSUB myread
@@ -768,9 +885,7 @@ $   ENDIF
 $ ENDIF !(osname .NES./.EQS. "VMS")
 $!
 $!: who configured the system
-$! see 'user' above.
 $ cf_by = F$EDIT(user,"LOWERCASE")
-$! cf_time = F$CVTIME()                 !superceded by procedure below
 $ osvers = F$EDIT(F$GETSYI("VERSION"),"TRIM")
 $!
 $! Peter Prymmer has seen:
@@ -793,7 +908,6 @@ $!   "WIN$Time_Zone"
 $!
 $! This snippet o' DCL returns a string in default Unix `date` format,
 $! and it will prompt to set SYS$TIMEZONE_DIFFERENTIAL.
-$! Peter Prymmer pvhp@lns62.lns.cornell.edu
 $!
 $ MIN_TZO = -840  !units are minutes here
 $ MAX_TZO =  840
@@ -832,7 +946,6 @@ $     tzhour = -1*tzhour                          !keeps !UL happy
 $     direction = "west of "
 $   ENDIF
 $   echo ""
-$   echo "%Config-I-VMS,"
 $   echo "According to the setting of your ""SYS$TIMEZONE_DIFFERENTIAL"" (= ''systz')"
 $   IF tzminrem.ne.0
 $   THEN
@@ -842,7 +955,7 @@ $     tzspan = "''tzhour' hours"
 $   ENDIF
 $   dflt = "y"
 $   echo "Your system is ''tzspan' ''direction'UTC in England."
-$   rp = "%Config-I-VMS, (''systz') Is this UTC Time Zone Offset correct? [''dflt'] "
+$   rp = "(''systz') Is this UTC Time Zone Offset correct? [''dflt'] "
 $   GOSUB myread
 $   IF ans.OR.(ans.EQS."") 
 $   THEN 
@@ -852,7 +965,6 @@ $     GOTO Beyond_TimeZone
 $   ENDIF
 $ ELSE
 $   echo ""
-$   echo4 "%Config-I-VMS,"
 $   echo4 """SYS$TIMEZONE_DIFFERENTIAL"" does not appear to be DEFINEd on your system"
 $ ENDIF
 $!
@@ -899,6 +1011,8 @@ $ cf_time = "''wkday' ''mon' ''mday' ''hour':''min':''sec' ''tz' ''year'"
 $!
 $!: determine the architecture name  
 $! genconfig.pl has either archname='VMS_AXP' or 'VMS_VAX'
+$! Note that DCL in VMS V5.4 does not have F$GETSYI("ARCH_NAME")
+$! but does have F$GETSYI("HW_MODEL").
 $!
 $ IF (F$GETSYI("HW_MODEL") .LT. 1024)
 $ THEN 
@@ -923,7 +1037,9 @@ $     echo4 "I'll go with ''archname' anyway..."
 $   ENDIF
 $ ENDIF
 $ dflt = "n"
-$ rp = "Will you be sharing your PERL_ROOT with ''otherarch'? [''dflt'] "
+$ vms_prefix = "perl_root"
+$ vms_prefixup = F$EDIT(vms_prefix,"UPCASE")
+$ rp = "Will you be sharing your ''vms_prefixup' with ''otherarch'? [''dflt'] "
 $ GOSUB myread
 $ if ans.NES.""
 $ THEN
@@ -946,22 +1062,26 @@ $!: set up shell script to do ~ expansion !sfn
 $!: expand filename                       !sfn
 $!: now set up to get a file name         !sfn
 $!
-$ prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
-$ prefix = F$PARSE(prefix,,,,"NO_CONCEAL") - "][" - ".;"
-$ prefixbase = prefix - "]"
-$ prefix = prefixbase + ".]"
+$ IF F$TYPE(prefix) .EQS. ""
+$ THEN
+$   prefix = F$ENVIRONMENT("DEFAULT") - ".UU]" + "]"
+$   prefix = F$PARSE(prefix,,,,"NO_CONCEAL") - "][" - ".;"
+$   prefixbase = prefix - "]"
+$   prefix = prefixbase + ".]"
+$ ENDIF
+$ src = prefix
 $!: determine root of directory hierarchy where package will be installed.
 $ dflt = prefix
 $ IF .NOT.silent 
 $ THEN 
 $   echo ""
 $   echo "By default, ''package' will be installed in ''dflt', pod"
-$   echo "pages under ''prefixbase'LIB.POD], etc..., i.e. with ''dflt' as prefix for"
+$   echo "pages under ''prefixbase'.LIB.POD], etc..., i.e. with ''dflt' as prefix for"
 $   echo "all installation directories."
-$   echo "On ''osname' the ''prefix' is used to DEFINE the ''packageup'_ROOT prior to installation"
+$   echo "On ''osname' the prefix is used to DEFINE the ''vms_prefixup' prior to installation"
 $   echo "as well as during subsequent use of ''package' via ''packageup'_SETUP.COM."
 $ ENDIF
-$ rp = "Installation prefix to use (for ''packageup'_ROOT)? [ ''dflt' ] "
+$ rp = "Installation prefix to use (for ''vms_prefixup')? [ ''dflt' ] "
 $ GOSUB myread
 $ IF ans.NES.""
 $ THEN 
@@ -970,6 +1090,7 @@ $   IF F$LOCATE(".]",ans) .EQ. F$LENGTH(ans) THEN prefix = prefix - "]" + ".]"
 $ ELSE 
 $   prefix = dflt
 $ ENDIF
+$ perl_root = prefix
 $!
 $! Check here for pre-existing PERL_ROOT.
 $!  -> ask if removal desired.
@@ -979,7 +1100,7 @@ $!
 $ vms_skip_install = "true"
 $ dflt = "y"
 $! echo ""
-$ rp = "%Config-I-VMS, Skip the remaining """"where install"""" questions? [''dflt'] "
+$ rp = "Skip the remaining """"where install"""" questions? [''dflt'] "
 $ GOSUB myread
 $ IF (.NOT.ans).AND.(ans.NES."") THEN vms_skip_install = "false"
 $ IF (.NOT.vms_skip_install)
@@ -991,12 +1112,18 @@ $!: determine where private library files go
 $!: Usual default is /usr/local/lib/perl5.  Also allow things like 
 $!: /opt/perl/lib, since /opt/perl/lib/perl5 would be redundant.
 $   IF .NOT.silent 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 
 There are some auxiliary files for perl5 that need to be put into a
 private library directory that is accessible by everyone.
+$     EOD
+$   ENDIF
+$   IF F$TYPE(privlib) .NES. ""
+$   THEN dflt = privlib
+$   ELSE dflt = "''vms_prefix':[lib]"
 $   ENDIF
-$   dflt = prefix - ".]" + ".LIB]"
 $   rp = "Pathname where the private library files will reside? " 
 $   rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
 $   GOSUB myread
@@ -1013,12 +1140,12 @@ $ dflt = "y"
 $ IF .NOT.silent 
 $ THEN 
 $   echo ""
-$   echo "%Config-I-VMS, You may choose to write ''packageup'_SETUP.COM to assign a foreign"
-$   echo "-Config-I-VMS, symbol to invoke ''package', which is the usual method."
-$   echO "-Config-I-VMS, If you do not do so then you would need a DCL command verb at the"
-$   echo "-Config-I-VMS, process or the system wide level."
+$   echo "You may choose to write ''packageup'_SETUP.COM to assign a foreign"
+$   echo "symbol to invoke ''package', which is the usual method."
+$   echO "If you do not do so then you would need a DCL command verb at the"
+$   echo "process or the system wide level."
 $ ENDIF
-$ rp = "Invoke perl as a global symbol foreign command [''dflt'] "
+$ rp = "Invoke perl as a global symbol foreign command? [''dflt'] "
 $ GOSUB myread
 $ IF (.NOT.ans).AND.(ans.NES."") THEN perl_symbol = "false"
 $!
@@ -1028,11 +1155,11 @@ $   dflt = "y"
 $   IF .NOT.silent 
 $   THEN 
 $     echo ""
-$     echo "%Config-I-VMS, Since you won't be using a symbol you must choose to put the ''packageup'"
-$     echo "-Config-I-VMS, verb in a per-process table or in the system wide DCLTABLES (which"
-$     echo "-Config-I-VMS, would require write privilege)."
+$     echo "Since you won't be using a symbol you must choose to put the ''packageup'"
+$     echo "verb in a per-process table or in the system wide DCLTABLES (which"
+$     echo "would require write privilege)."
 $   ENDIF
-$   rp = "Invoke perl as a per process command verb [ ''dflt' ] "
+$   rp = "Invoke perl as a per process command verb? [ ''dflt' ] "
 $   GOSUB myread
 $   IF (.NOT.ans).AND.(ans.NES."")
 $   THEN perl_verb = "DCLTABLES"
@@ -1045,7 +1172,7 @@ $ baserev="5.0"
 $ revision = baserev - ".0"
 $!: get the patchlevel
 $ echo ""
-$ echo4 "Getting the current patchlevel..." !>&4
+$ echo4 "Getting the current patchlevel..."
 $ patchlevel_h = F$SEARCH("[-]patchlevel.h")
 $ IF (patchlevel_h.NES."")
 $ THEN
@@ -1056,7 +1183,7 @@ $   got_api_version    = "false"
 $   got_api_subversion = "false"
 $   OPEN/READONLY CONFIG 'patchlevel_h' 
 $Patchlevel_h_loop:
-$   READ/END_Of_File=Close_patch CONFIG line
+$   READ/END_Of_File=Close_patch/ERROR=Close_patch CONFIG line
 $   IF ((F$LOCATE("#define PERL_VERSION",line).NE.F$LENGTH(line)).AND.(.NOT.got_patch))
 $   THEN
 $     line = F$EDIT(line,"COMPRESS, TRIM")
@@ -1090,9 +1217,9 @@ $   ENDIF
 $   IF (.NOT.got_patch).OR.(.NOT.got_sub) THEN GOTO Patchlevel_h_loop
 $Close_patch:
 $   CLOSE CONFIG
-$   ELSE
-$     patchlevel="0"
-$     subversion="0"
+$ ELSE
+$   patchlevel="0"
+$   subversion="0"
 $ ENDIF
 $ IF (F$STRING(subversion) .NES. "0")
 $ THEN
@@ -1105,7 +1232,6 @@ $ version = revision + "_" + patchlevel + "_" + subversion
 $!
 $ IF (.NOT.vms_skip_install)
 $ THEN
-$!: set the prefixup variable, to restore leading tilda escape !sfn
 $!: set the prefixup variable, to restore leading tilde escape !sfn
 $!
 $!: determine where public architecture dependent libraries go
@@ -1115,12 +1241,18 @@ $     echo ""
 $     echo "''package' contains architecture-dependent library files.  If you are"
 $   ENDIF
 $   IF (.NOT.silent) 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 sharing libraries in a heterogeneous environment, you might store
 these files in a separate location.  Otherwise, you can just include
 them with the rest of the public library files.
+$     EOD
+$   ENDIF
+$   IF F$TYPE(archlib) .NES. ""
+$   THEN dflt = archlib
+$   ELSE dflt = privlib - "]" + "." + archname + "." + version + "]"
 $   ENDIF
-$   dflt = privlib - "]" + "." + archname + "." + version + "]"
 $   rp = "Where do you want to put the public architecture-dependent libraries? "
 $   rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
 $   GOSUB myread
@@ -1129,16 +1261,16 @@ $   THEN archlib = ans
 $   ELSE archlib = dflt
 $   ENDIF
 $!
-$!: set up the script used to warn in case of inconsistency !sfn
-$!: function used to set $1 to $val                         !sfn
-$!
 $ ENDIF !%Config-I-VMS, skip "where install" questions
+$!
 $! This quotation from Configure has to be included on VMS:
+$!
 $ TYPE SYS$INPUT:
+$ DECK
 
 There is, however, a strange, musty smell in the air that reminds me of
 something...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit.
-$ CONTINUE
+$ EOD
 $ IF (.NOT.vms_skip_install)
 $ THEN
 $!: it so happens the Eunice I know will not run shell scripts in Unix format
@@ -1148,14 +1280,20 @@ $!: now see if they want to do setuid emulation   !sfn
 $!
 $!: determine where site specific libraries go.
 $   IF .NOT.silent 
-$   THEN TYPE SYS$INPUT:
+$   THEN
+$     TYPE SYS$INPUT:
+$     DECK
 
 The installation process will also create a directory for
 site-specific extensions and modules.  Some users find it convenient
 to place all local files in this directory rather than in the main
 distribution directory.
+$     EOD
+$   ENDIF
+$   IF F$TYPE(sitelib) .NES. ""
+$   THEN dflt = sitelib
+$   ELSE dflt = privlib - "]" + ".SITE_PERL]"
 $   ENDIF
-$   dflt = privlib - "]" + ".SITE_PERL]"
 $   rp = "Pathname for the site-specific library files? "
 $   rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
 $   GOSUB myread
@@ -1167,11 +1305,16 @@ $!
 $!: determine where site specific architecture-dependent libraries go.
 $   IF .NOT.silent 
 $   THEN TYPE SYS$INPUT:
+$     DECK
 
 The installation process will also create a directory for
 architecture-dependent site-specific extensions and modules.
+$     EOD
+$   ENDIF
+$   IF F$TYPE(sitearch) .NES. ""
+$   THEN dflt = sitearch
+$   ELSE dflt = sitelib - "]" + "." + archname + "]"
 $   ENDIF
-$   dflt = sitelib - "]" + "." + archname + "]"
 $   rp = "Pathname for the site-specific architecture-dependent library files? "
 $   rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
 $   GOSUB myread
@@ -1183,7 +1326,11 @@ $!
 $!: determine where old public architecture dependent libraries might be
 $!
 $!: determine where public executables go
-$   dflt = prefix - ".]" + ".BIN]"
+$   IF F$TYPE(bin) .NES. ""
+$   THEN dflt = bin
+$!   ELSE dflt = prefix - ".]" + ".BIN]"
+$   ELSE dflt = "/''vms_prefix'/000000"
+$   ENDIF
 $   rp = "Pathname where the public executables will reside? "
 $   rp = F$FAO("!AS!/!AS",rp,"[ ''dflt' ] ")
 $   GOSUB myread
@@ -1199,8 +1346,57 @@ $!: determine where library module manual pages go
 $!: What suffix to use on installed man pages
 $!: see what memory models we can support
 $!
+$ ELSE ! skipping "where install" questions, we must set some symbols
+$   IF F$TYPE(archlib).EQS."" THEN -
+      archlib="''vms_prefix':[lib.''archname'.''version']"
+$   IF F$TYPE(bin) .EQS. "" THEN -
+      bin="/''vms_prefix'/000000"
+$   IF F$TYPE(privlib) .EQS. "" THEN -
+      privlib ="''vms_prefix':[lib]"
+$   IF F$TYPE(sitearch) .EQS. "" THEN -
+      sitearch="''vms_prefix':[lib.site_perl.''archname']"
+$   IF F$TYPE(sitelib) .EQS. "" THEN -
+      sitelib ="''vms_prefix':[lib.site_perl]"
 $ ENDIF !%Config-I-VMS, skip "where install" questions
 $!
+$! These derived locations can be set whether we've opted to
+$! skip the where install questions or not.
+$!
+$ IF F$TYPE(archlibexp) .EQS. "" THEN -
+    archlibexp="''vms_prefix':[lib.''archname'.''version']"
+$ IF F$TYPE(binexp) .EQS. "" THEN -
+    binexp ="''vms_prefix':[000000]"
+$ IF F$TYPE(builddir) .EQS. "" THEN -
+    builddir ="''vms_prefix':[000000]"
+$ IF F$TYPE(installarchlib) .EQS. "" THEN -
+    installarchlib="''vms_prefix':[lib.''archname'.''version']"
+$ IF F$TYPE(installbin) .EQS. "" THEN -
+    installbin ="''vms_prefix':[000000]"
+$ IF F$TYPE(installscript) .EQS. "" THEN -
+    installscript ="''vms_prefix':[utils]"
+$ IF F$TYPE(installman1dir) .EQS. "" THEN -
+    installman1dir ="''vms_prefix':[man.man1]"
+$ IF F$TYPE(installman3dir) .EQS. "" THEN -
+    installman3dir ="''vms_prefix':[man.man3]"
+$ IF F$TYPE(installprivlib) .EQS. "" THEN -
+    installprivlib ="''vms_prefix':[lib]"
+$ IF F$TYPE(installsitearch) .EQS. "" THEN -
+    installsitearch="''vms_prefix':[lib.site_perl.''archname']"
+$ IF F$TYPE(installsitelib) .EQS. "" THEN -
+    installsitelib ="''vms_prefix':[lib.site_perl]"
+$ IF F$TYPE(oldarchlib) .EQS. "" THEN -
+    oldarchlib="''vms_prefix':[lib.''archname']"
+$ IF F$TYPE(oldarchlibexp) .EQS. "" THEN -
+    oldarchlibexp="''vms_prefix':[lib.''archname']"
+$ IF F$TYPE(privlibexp) .EQS. "" THEN -
+    privlibexp ="''vms_prefix':[lib]"
+$ IF F$TYPE(sitearchexp) .EQS. "" THEN -
+    sitearchexp ="''vms_prefix':[lib.site_perl.''archname']"
+$ IF F$TYPE(sitelib_stem) .EQS. "" THEN -
+    sitelib_stem ="''vms_prefix':[lib.site_perl]"
+$ IF F$TYPE(sitelibexp) .EQS. "" THEN -
+    sitelibexp ="''vms_prefix':[lib.site_perl]"
+$!
 $!: see if we need a special compiler
 $! cc_list = "cc/decc|gcc" !%Config-I-VMS, compiler symbols/commands
 $!
@@ -1209,7 +1405,9 @@ $ vms_cc_dflt = ""
 $ vms_cc_available = ""
 $!
 $ OPEN/WRITE CONFIG ccvms.c
+$ WRITE CONFIG "#ifdef __DECC"
 $ WRITE CONFIG "#include <stdlib.h>"  !DECC is sooo picky
+$ WRITE CONFIG "#endif"
 $ WRITE CONFIG "#include <stdio.h>"
 $ WRITE CONFIG "int main() {"
 $ WRITE CONFIG "#ifdef __DECC"
@@ -1228,8 +1426,6 @@ $ tmp = $status
 $! DEASSIGN SYS$OUTPUT
 $! DEASSIGN SYS$ERROR
 $ IF (silent) THEN GOSUB Shut_up
-$! echo "%Config-I-VMS, After cc compile $status = >''tmp'<" !diagnostic
-$!
 $ IF tmp.NE.%X10B90001
 $ THEN 
 $  IF tmp.NE.%X10000001
@@ -1241,28 +1437,26 @@ $ ENDIF
 $!
 $ GOSUB List_Parse
 $ IF .NOT.silent THEN echo ""
-$ echo "%Config-I-VMS, Default ""cc"" is ''line' ''archsufx' ''F$GETSYI("VERSION")'" 
+$ echo "Default ""cc"" is ''line' ''archsufx' ''F$GETSYI("VERSION")'" 
 $ IF F$LOCATE("VAX",line).NE.F$LENGTH(line) 
 $ THEN 
 $   IF .NOT.silent
 $   THEN 
-$     echo "%Config-I-VMS, Will try cc/decc..."
+$     echo "Will try cc/decc..."
 $   ENDIF
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
 $   SET NOON
 $   cc/decc/NoObj/list=ccvms.lis ccvms.c
 $   tmp = $status
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
 $   SET ON
 $   IF (silent) THEN GOSUB Shut_up
 $   IF tmp.NE.%X10B90001
 $   THEN
-$     echo "%Config-I-VMS, Apparently you don't have that one."
+$     echo "Apparently you don't have that one."
 $   ELSE
 $     GOSUB List_parse
-$     echo "%Config-I-VMS, You also have: ''line' ''archsufx' ''F$GETSYI("VERSION")'"
+$     echo "You also have: ''line' ''archsufx' ''F$GETSYI("VERSION")'"
 $     vms_cc_available = vms_cc_available + "cc/decc "
 $   ENDIF
 $ ELSE
@@ -1274,20 +1468,19 @@ $   ENDIF
 $ ENDIF
 $!
 $Gcc_initial_check:
-$ echo "%Config-I-VMS, Checking for Gcc"
+$ echo "Checking for gcc"
 $ OPEN/WRITE CONFIG gccvers.lis
-$ DEFINE SYS$ERROR CONFIG
-$ DEFINE SYS$OUTPUT CONFIG
+$ DEFINE/USER_MODE SYS$ERROR CONFIG
+$ DEFINE/USER_MODE SYS$OUTPUT CONFIG
 $ 'gcc_symbol'/noobj/version _nla0:
 $ tmp = $status
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
 $ IF (silent) THEN GOSUB Shut_up
 $ CLOSE CONFIG
 $ IF (tmp.NE.%X10000001).and.(tmp.ne.%X00030001)
 $ THEN
-$   echo "%Config-I-VMS, Symbol ""''gcc_symbol'"" is not defined. I guess you don't have it."
-$   goto cc_cleanup
+$   echo "Symbol ""''gcc_symbol'"" is not defined. I guess you do not have it."
+$   DELETE/NOLOG/NOCONFIRM gccvers.lis;
+$   GOTO Cxx_initial_check
 $ ENDIF
 $ OPEN/READ CONFIG gccvers.lis
 $GCC_List_Read:
@@ -1299,12 +1492,93 @@ $ echo line
 $ vms_cc_available = vms_cc_available + "''gcc_symbol' "
 $ DELETE/NOLOG/NOCONFIRM gccvers.lis;
 $!
+$Cxx_initial_check:
+$!
+$! Do note that [vms]perl source files have a ways to go before they will 
+$! compile under CXX.
+$! In order to test Configure.com with CXX invoke it with "-Dtry_cxx" on
+$! the command line.
+$!
+$ IF F$TYPE(try_cxx) .EQS. "" THEN try_cxx := n
+$ IF try_cxx .OR. try_cxx .EQS. "define"
+$!
+$ THEN
+$!
+$ echo "Checking for CXX..."
+$ OPEN/WRITE CONFIG ccvms.c
+$ WRITE CONFIG "#include <iostream>"
+$ WRITE CONFIG "int main() {"
+$ WRITE CONFIG "#ifdef __DECCXX"
+$ WRITE CONFIG "        cout << __DECCXX, endl;"
+$ WRITE CONFIG "#else"
+$ WRITE CONFIG "        cout << 0,endl;"
+$ WRITE CONFIG "#endif"
+$! Todo: add G++ identifier check ??
+$ WRITE CONFIG "        return(0);"
+$ WRITE CONFIG "}"
+$ CLOSE CONFIG
+$ SET NOON
+$ DEFINE/USER_MODE SYS$OUTPUT NL:
+$ DEFINE/USER_MODE SYS$ERROR NL:
+$ cxx ccvms.c
+$ tmp = $status
+$ SET ON
+$! success $status with:
+$! DEC C++ V1.1-001 on VMS VAX V5.5-2
+$! DEC C++ V5.6-013 on OpenVMS VAX V7.1
+$! DEC C++ V6.1-003 on OpenVMS Alpha V7.1
+$! Compaq C++ V6.2-016 for OpenVMS Alpha V7.2-1
+$ IF tmp .eq. %X15F60001  
+$ THEN
+$! Which linker?
+$   SET NOON
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   link ccvms.obj
+$   tmp = $status
+$   SET ON
+$   ! success $status with:
+$   ! link && DEC C++ V1.1-001 on VMS VAX V5.5-2
+$   ! link && DEC C++ V5.6-013 on OpenVMS VAX V7.1
+$   IF tmp .eq. %X10000001
+$   THEN
+$     ld_try = "Link"
+$     vms_cc_available = vms_cc_available + "cxx "
+$     echo "CXX and LINK are available."
+$   ELSE
+$     IF F$SEARCH("ccvms.exe") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.exe;
+$     SET NOON
+$     DEFINE/USER_MODE SYS$OUTPUT NL:
+$     DEFINE/USER_MODE SYS$ERROR NL:
+$     cxxlink ccvms.obj
+$     tmp = $status
+$     SET ON
+$     ! success $status with:
+$     ! cxxlink && DEC C++ V6.1-003 on OpenVMS Alpha V7.1
+$     ! cxxlink && Compaq C++ V6.2-016 for OpenVMS Alpha V7.2-1
+$     IF tmp .eq. %X10000001 
+$     THEN 
+$       ld_try = "cxxlink"
+$       vms_cc_available = vms_cc_available + "cxx "
+$       echo "CXX and CXXLINK are available."
+$     ENDIF
+$   ENDIF
+$   IF F$SEARCH("ccvms.exe") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.exe;
+$ ELSE
+$   echo "Nope."
+$ ENDIF
+$ DELETE/NOLOG/NOCONFIRM ccvms.c;
+$ IF F$SEARCH("ccvms.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM ccvms.obj;
+$ CALL Cxx_demangler_cleanup
+$!
+$ ENDIF ! 1 .eq. 0 or 1 .eq. 1
+$!
 $CC_Cleanup:
 $ DELETE/NOLOG/NOCONFIRM ccvms.*;
 $CC_Desired:
 $!: see if we need a special compiler
 $! echo ""
-$ echo "%Config-I-VMS, available compiler(s):"
+$ echo "Available compiler(s):"
 $ echo "( ''vms_cc_available')"
 $ IF .NOT.nocc 
 $ THEN
@@ -1321,42 +1595,52 @@ $   Mcc = ans
 $   IF (F$LOCATE("dec",ans).NE.F$LENGTH(ans)).or.(F$LOCATE("compaq",ans).NE.F$LENGTH(ans))
 $   THEN
 $     Mcc = "cc/decc"
-$     Using_Dec_C = "Yes"
+$     Using_Dec_C := Y
 $     C_COMPILER_Replace = "CC=cc=''Mcc'"
 $   ENDIF
-$   IF Mcc.NES.dflt
+$   IF F$LOCATE("cxx",F$EDIT(ans,"COLLAPSE,LOWERCASE")) .NE. F$LENGTH(ans)
 $   THEN
-$     IF (F$LOCATE("dec",dflt).NE.F$LENGTH(dflt)).or(F$LOCATE("compaq",dflt).NE.F$LENGTH(dflt))
-$     THEN 
-$       C_COMPILER_Replace = "CC=cc=''Mcc'"
-$     ELSE
-$       Using_Dec_C = "Yes"
-$     ENDIF
-$   ELSE
-$     IF Mcc .EQS. "cc/decc"
+$     Mcc = "cxx"
+$     using_cxx := Y
+$     ld = ld_try
+$     C_COMPILER_Replace = "CC=cc=''Mcc'"
+$   ELSE ! Not_cxx
+$     IF Mcc.NES.dflt
 $     THEN
-$       Using_Dec_C = "Yes"
-$       C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       IF F$LOCATE("dec",dflt) .NE. F$LENGTH(dflt) .or. -
+           F$LOCATE("compaq",dflt) .NE. F$LENGTH(dflt)
+$       THEN 
+$         C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       ELSE
+$         Using_Dec_C := Y
+$       ENDIF
+$     ELSE
+$       IF Mcc .EQS. "cc/decc"
+$       THEN
+$         Using_Dec_C := Y
+$         C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       ENDIF
 $     ENDIF
 $   ENDIF
 $ ELSE 
 $   Mcc = dflt
 $   IF Mcc .EQS. "cc/decc"
 $   THEN
-$     Using_Dec_C = "Yes"
+$     Using_Dec_C := Y
 $     C_COMPILER_Replace = "CC=cc=''Mcc'"
 $   ENDIF
 $   IF Mcc .EQS. "gcc"
 $   THEN
-$     Using_Gnu_C = "Yes"
+$     Using_Gnu_C := Y
 $     C_COMPILER_Replace = "CC=cc=''Mcc'"
 $   ENDIF
 $ ENDIF
 $Decc_Version_check:
-$ IF "''Using_Dec_C'".EQS."Yes"
+$ ccversion=""
+$ IF Using_Dec_C
 $ THEN
 $   echo ""
-$   echo4 "Checking for Dec C's version number..." !>&4
+$   echo4 "Checking for the Dec C version number..."
 $   OPEN/WRITE CONFIG deccvers.c
 $   WRITE CONFIG "#include <stdlib.h>"  !DECC is sooo picky
 $   WRITE CONFIG "#include <stdio.h>"
@@ -1371,153 +1655,219 @@ $   WRITE CONFIG "#endif"
 $   WRITE CONFIG "        exit(0);"
 $   WRITE CONFIG "}"
 $   CLOSE CONFIG
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
+$   SET NOON
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
 $   'Mcc' deccvers.c
 $   tmp = $status
-$   DEASSIGN SYS$ERROR _NLA0:
-$   DEASSIGN SYS$OUTPUT _NLA0:
 $   IF (silent) THEN GOSUB Shut_up
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
 $   link deccvers.obj
 $   tmp = $status
-$   DEASSIGN SYS$ERROR
-$   DEASSIGN SYS$OUTPUT
 $   IF (silent) THEN GOSUB Shut_up
 $   OPEN/WRITE CONFIG deccvers.out
-$   DEFINE SYS$ERROR CONFIG
-$   DEFINE SYS$OUTPUT CONFIG
+$   DEFINE/USER_MODE SYS$ERROR CONFIG
+$   DEFINE/USER_MODE SYS$OUTPUT CONFIG
 $   mcr []deccvers.exe
 $   tmp = $status
+$   SET ON
 $   CLOSE CONFIG
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
 $   IF (silent) THEN GOSUB Shut_up
 $   OPEN/READ CONFIG deccvers.out
 $   READ/END_OF_FILE=Dec_c_cleanup CONFIG line
 $Dec_c_cleanup:
 $   CLOSE CONFIG
-$!   DELETE/NOLOG/NOCONFIRM deccvers.*;
 $   echo "You are using Dec C ''line'"
-$   Dec_C_Version = line
-$   Dec_C_Version = Dec_C_Version + 0
-$   if Dec_C_Version.ge.60200000 THEN CC_FLAGS = CC_FLAGS + "/NOANSI_ALIAS"
+$   ccversion = line
+$   Dec_C_Version = F$INTEGER(line)
+$   IF Dec_C_Version .GE. 60200000
+$   THEN
+$     echo4 "adding /NOANSI_ALIAS qualifier to ccflags."
+$     ccflags = ccflags + "/NOANSI_ALIAS"
+$   ENDIF
+$   DELETE/NOLOG/NOCONFIRM deccvers.*;
 $ ENDIF
 $Gcc_check:
-$ if "''using_gnu_c'" .eqs. "Yes"
+$ gccversion = ""
+$ IF Using_Gnu_C
 $ THEN
-$ vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$ vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE")
-$ gcclib_olb  = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB")
-$ IF gcclib_olb .EQS. "" 
-$ THEN 
-$! These objects/libs come w/ gcc 2.7.2 for AXP:
-$   tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb")
-$   IF tmp .NES. "" then gcclib_olb = tmp
-$   tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb")
-$   IF tmp .NES. "" 
+$   vaxcrtl_olb = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
+$   vaxcrtl_exe = F$SEARCH("SYS$SHARE:VAXCRTL.EXE")
+$   gcclib_olb  = F$SEARCH("GNU_CC:[000000]GCCLIB.OLB")
+$   IF gcclib_olb .EQS. "" 
 $   THEN 
-$     IF gcclib_olb .EQS. "" 
-$     THEN gcclib_olb = tmp
-$     ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$!    These objects/libs come w/ gcc 2.7.2 for AXP:
+$     tmp = F$SEARCH("GNU_CC:[000000]libgcc2.olb")
+$     IF tmp .NES. "" then gcclib_olb = tmp
+$     tmp = F$SEARCH("GNU_CC:[000000]libgcclib.olb")
+$     IF tmp .NES. "" 
+$     THEN 
+$       IF gcclib_olb .EQS. "" 
+$       THEN gcclib_olb = tmp
+$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$       ENDIF
 $     ENDIF
-$   ENDIF
-$   tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
-$   IF tmp .NES. "" 
-$   THEN 
-$     IF gcclib_olb .EQS. "" 
-$     THEN gcclib_olb = tmp
-$     ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$     tmp = F$SEARCH("SYS$LIBRARY:VAXCRTL.OLB")
+$     IF tmp .NES. "" 
+$     THEN 
+$       IF gcclib_olb .EQS. "" 
+$       THEN gcclib_olb = tmp
+$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$       ENDIF
 $     ENDIF
-$   ENDIF
-$   tmp = F$SEARCH("GNU_CC:[000000]crt0.obj")
-$   IF tmp .NES. "" 
-$   THEN 
-$     IF gcclib_olb .EQS. "" 
-$     THEN gcclib_olb = tmp
-$     ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$     tmp = F$SEARCH("GNU_CC:[000000]crt0.obj")
+$     IF tmp .NES. "" 
+$     THEN 
+$       IF gcclib_olb .EQS. "" 
+$       THEN gcclib_olb = tmp
+$       ELSE gcclib_olb = gcclib_olb + "/lib," + tmp
+$       ENDIF
 $     ENDIF
+$     IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs
+$   ELSE
+$     gcclib_olb = gcclib_olb + "/lib"
 $   ENDIF
-$   IF gcclib_olb .EQS. vaxcrtl_olb THEN gcclib_olb = "" !goofy order of axplibs
-$ ELSE
-$   gcclib_olb = gcclib_olb + "/lib"
-$ ENDIF
-$ IF   gcclib_olb .NES. "" .AND. -
+$   IF   gcclib_olb .NES. "" .AND. -
      (vaxcrtl_olb .NES. "" .OR. -
       vaxcrtl_exe .NES. "" )
+$   THEN
+$     echo ""
+$     echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
+$     OPEN/WRITE CONFIG gccvers.c
+$     WRITE CONFIG "#include <stdio.h>"
+$     WRITE CONFIG "int main() {"
+$     WRITE CONFIG "#ifdef __GNUC__"
+$     WRITE CONFIG "#ifdef __VERSION__"
+$     WRITE CONFIG "        printf(""%s\n"", __VERSION__);"
+$     WRITE CONFIG "#else"
+$     WRITE CONFIG "        printf(""%s\n"", ""1"");"
+$     WRITE CONFIG "#endif"
+$     WRITE CONFIG "#endif"
+$     WRITE CONFIG "        exit(0);"
+$     WRITE CONFIG "}"
+$     CLOSE CONFIG
+$     DEFINE SYS$ERROR _NLA0:
+$     DEFINE SYS$OUTPUT _NLA0:
+$     'Mcc' gccvers.c
+$     tmp = $status
+$     DEASSIGN SYS$ERROR _NLA0:
+$     DEASSIGN SYS$OUTPUT _NLA0:
+$     IF (silent) THEN GOSUB Shut_up
+$     DEFINE SYS$ERROR _NLA0:
+$     DEFINE SYS$OUTPUT _NLA0:
+$     IF vaxcrtl_exe .EQS. ""
+$     THEN 
+$       IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb)
+$       THEN 
+$         link gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library
+$         tmp = $status
+$       ELSE
+$         link gccvers.obj,'gcclib_olb'
+$         tmp = $status
+$       ENDIF
+$     ELSE
+$       OPEN/WRITE CONFIG GCCVERS.OPT
+$       WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE"
+$       CLOSE CONFIG
+$       link gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb'
+$       tmp = $status
+$     ENDIF
+$     DEASSIGN SYS$ERROR
+$     DEASSIGN SYS$OUTPUT
+$     IF (silent) THEN GOSUB Shut_up
+$     OPEN/WRITE CONFIG gccvers.out
+$     DEFINE SYS$ERROR CONFIG
+$     DEFINE SYS$OUTPUT CONFIG
+$     mcr []gccvers.exe
+$     tmp = $status
+$     CLOSE CONFIG
+$     DEASSIGN SYS$OUTPUT
+$     DEASSIGN SYS$ERROR
+$     IF (silent) THEN GOSUB Shut_up
+$     OPEN/READ CONFIG gccvers.out
+$     READ/END_OF_FILE=Gcc_cleanup CONFIG line
+$Gcc_cleanup:
+$     CLOSE CONFIG
+$     DELETE/NOLOG/NOCONFIRM gccvers.*;
+$     IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line)
+$     THEN 
+$       echo "You are not using GNU cc."
+$       GOTO Host_name
+$     ELSE 
+$       echo "You are using GNU cc ''line'"
+$       gccversion = line
+$       Using_Gnu_C := Y
+$       C_COMPILER_Replace = "CC=cc=''Mcc'"
+$       GOTO Include_dirs
+$     ENDIF
+$   ENDIF
+$ ENDIF
+$Cxx_Version_check:
+$ IF using_cxx
 $ THEN
-$   echo ""
-$   echo4 "Checking for GNU cc in disguise and/or its version number..." !>&4
-$   OPEN/WRITE CONFIG gccvers.c
-$   WRITE CONFIG "#include <stdlib.h>"  !DECC is sooo picky
+$   OPEN/WRITE CONFIG cxxvers.c
 $   WRITE CONFIG "#include <stdio.h>"
 $   WRITE CONFIG "int main() {"
-$   WRITE CONFIG "#ifdef __GNUC__"
-$   WRITE CONFIG "#ifdef __VERSION__"
-$   WRITE CONFIG "        printf(""%s\n"", __VERSION__);"
+$   WRITE CONFIG "#ifdef __DECCXX_VER"
+$   WRITE CONFIG "        printf(""%i\n"", __DECCXX_VER);"
 $   WRITE CONFIG "#else"
-$   WRITE CONFIG "        printf(""%s\n"", ""1"");"
-$   WRITE CONFIG "#endif"
+$   WRITE CONFIG "        printf(""%i\n"", ""0"");"
 $   WRITE CONFIG "#endif"
-$   WRITE CONFIG "        exit(0);"
+$   WRITE CONFIG "        return(0);"
 $   WRITE CONFIG "}"
 $   CLOSE CONFIG
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   'Mcc' gccvers.c
+$   SET NOON
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
+$   'Mcc' cxxvers.c
 $   tmp = $status
-$   DEASSIGN SYS$ERROR _NLA0:
-$   DEASSIGN SYS$OUTPUT _NLA0:
+$   SET ON
 $   IF (silent) THEN GOSUB Shut_up
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   IF vaxcrtl_exe .EQS. ""
-$   THEN 
-$     IF F$LOCATE("VAXCRTL",gcclib_olb).NE.F$LENGTH(gcclib_olb)
-$     THEN 
-$       link gccvers.obj,'gcclib_olb',SYS$LIBRARY:VAXCRTL/Library
-$       tmp = $status
-$     ELSE
-$       link gccvers.obj,'gcclib_olb'
-$       tmp = $status
-$     ENDIF
-$   ELSE
-$     OPEN/WRITE CONFIG GCCVERS.OPT
-$     WRITE CONFIG "SYS$SHARE:VAXCRTL/SHARE"
-$     CLOSE CONFIG
-$     link gccvers.obj,GCCVERS.OPT/OPT,'gcclib_olb'
-$     tmp = $status
-$   ENDIF
-$   DEASSIGN SYS$ERROR
-$   DEASSIGN SYS$OUTPUT
+$   SET NOON
+$   DEFINE/USER_MODE SYS$ERROR NL:
+$   DEFINE/USER_MODE SYS$OUTPUT NL:
+$   'ld' cxxvers.obj
+$   tmp = $status
+$   SET ON
 $   IF (silent) THEN GOSUB Shut_up
-$   OPEN/WRITE CONFIG gccvers.out
-$   DEFINE SYS$ERROR CONFIG
-$   DEFINE SYS$OUTPUT CONFIG
-$   mcr []gccvers.exe
+$   OPEN/WRITE CONFIG cxxvers.out
+$   SET NOON
+$   DEFINE/USER_MODE SYS$ERROR CONFIG
+$   DEFINE/USER_MODE SYS$OUTPUT CONFIG
+$   mcr []cxxvers.exe
 $   tmp = $status
+$   SET ON
 $   CLOSE CONFIG
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
 $   IF (silent) THEN GOSUB Shut_up
-$   OPEN/READ CONFIG gccvers.out
-$   READ/END_OF_FILE=Gcc_cleanup CONFIG line
-$Gcc_cleanup:
+$   OPEN/READ CONFIG cxxvers.out
+$   READ/END_OF_FILE=Cxx_cleanup CONFIG line
+$Cxx_cleanup:
 $   CLOSE CONFIG
-$   DELETE/NOLOG/NOCONFIRM gccvers.*;
-$   IF F$LOCATE("GNU C version ",line).NE.F$LENGTH(line)
-$   THEN 
-$     echo "You are not using GNU cc."
-$     GOTO Host_name
-$   ELSE 
-$     echo "You are using GNU cc ''line'"
-$     Using_Gnu_C = "Yes"
-$     C_COMPILER_Replace = "CC=cc=''Mcc'"
-$     GOTO Include_dirs
-$   ENDIF
+$   DELETE/NOLOG/NOCONFIRM cxxvers.*;
+$   echo "You are using CXX ''line'"
+$   cxxversion = line
+$   ccversion = line
+$   CALL Cxx_demangler_cleanup
+$ ENDIF
+$!
+$Cxx_demangler_cleanup: SUBROUTINE
+$!
+$!  If we do build with CXX these demangler Dbs will be left all over.
+$!  However, configure.com does try to remove the [.UU] sub directory.
+$!  Be sure to set default to the correct place before calling this sub.
+$!
+$ SET NOON
+$ IF F$SEARCH("[.CXX_REPOSITORY]*.*") .NES. "" THEN DELETE/NOLOG/NOCONFIRM [.CXX_REPOSITORY]*.*;*
+$ IF F$SEARCH("CXX_REPOSITORY.DIR") .NES. ""
+$ THEN
+$   SET PROTECTION=(SYSTEM:RWED,OWNER:RWED) CXX_REPOSITORY.DIR
+$   DELETE/NOLOG/NOCONFIRM CXX_REPOSITORY.DIR;
 $ ENDIF
-$endif
+$ SET ON
+$ EXIT
+$ ENDSUBROUTINE ! Cxx_demangler_cleanup
+$!
 $ GOTO Host_name
 $!
 $List_Parse:
@@ -1542,7 +1892,7 @@ $ DELETE/NOLOG/NOCONFIRM ccvms.lis;
 $ RETURN
 $!
 $Include_dirs:
-$!: What should the include directory be ?
+$!: What should the include directory be ? (.TLB text libraries)
 $ dflt = gcclib_olb 
 $ rp = "Where are the include files you want to use? "
 $ IF f$length( rp + "[''dflt'] " ).gt.76
@@ -1608,13 +1958,16 @@ $ ENDIF
 $ myhostname = myhostname - mydomain
 $ echo "(Trimming domain name from host name--host name is now ''myhostname')"
 $ IF .NOT.silent 
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$   TYPE SYS$INPUT:
+$   DECK
 
 I need to get your e-mail address in Internet format if possible, i.e.
 something like user@host.domain. Please answer accurately since I have
 no easy means to double check it. The default value provided below
 is most probably close to the reality but may not be valid from outside
 your organization...
+$   EOD
 $ ENDIF
 $ dflt = "''cf_by'@''myhostname'"+"''mydomain'"
 $ rp = "What is your e-mail address? [''dflt'] "
@@ -1625,13 +1978,16 @@ $ ELSE cf_email = dflt
 $ ENDIF
 $!
 $ IF .NOT.silent 
-$ THEN TYPE SYS$INPUT:
+$ THEN
+$   TYPE SYS$INPUT:
+$   DECK
 
 If you or somebody else will be maintaining perl at your site, please
 fill in the correct e-mail address here so that they may be contacted
 if necessary. Currently, the "perlbug" program included with perl
 will send mail to this address in addition to perlbug@perl.com. You may
 enter "none" for no administrator.
+$   EOD
 $ ENDIF
 $ dflt = "''cf_email'"
 $ rp = "Perl administrator e-mail address [''dflt'] "
@@ -1667,40 +2023,44 @@ $!: see if we have sigaction
 $!: see whether socketshr exists
 $ IF (F$SEARCH(F$PARSE("SocketShr","Sys$Share:.Exe")).NES."")
 $ THEN
-$   has_socketshr     = "T"
+$   Has_socketshr     = "T"
 $   echo ""
-$   echo4 "Hmm... Looks like you have SOCKETSHR's Berkeley networking support."
-$ endif
-$ if (Dec_C_Version .ge. 50200000)
+$   echo4 "Hmm... Looks like you have SOCKETSHR Berkeley networking support."
+$ ELSE
+$   Has_socketshr     = "F"
+$ ENDIF
+$ IF (Dec_C_Version .GE. 50200000) .or. using_cxx
 $ THEN
 $   Has_Dec_C_Sockets = "T"
 $   echo ""
-$   echo4 "Hmm... Looks like you've got Dec C's Berkeley networking support."
+$   echo4 "Hmm... Looks like you have Dec C Berkeley networking support."
+$ ELSE
+$   Has_Dec_C_Sockets = "F"
 $ ENDIF
 $ ! Hey, we've got both. Default to Dec C, then, since it's better
-$ if ("''Has_socketshr'".eq."T") .or.("''has_dec_c_sockets'".eq."T")
+$ IF Has_socketshr .OR. Has_Dec_C_Sockets
 $ THEN
 $   echo ""
-$   echo "You've got sockets available. Which socket stack do you want to"
-$   echo "build into perl?"
-$   if "''has_dec_c_sockets'".eqs."T"
+$   echo "You have sockets available.  Which socket stack do you want to"
+$   echo "build into Perl?"
+$   IF Has_Dec_C_Sockets
 $   THEN
 $     dflt = "DECC"
 $   else
 $     dflt = "SOCKETSHR"
 $   endif
 $   rp = "Choose socket stack (NONE"
-$   if "''has_socketshr'".eqs."T" THEN rp = rp + ",SOCKETSHR"
-$   if "''has_dec_c_sockets'".eqs."T" THEN rp = rp + ",DECC"
+$   IF Has_socketshr THEN rp = rp + ",SOCKETSHR"
+$   IF Has_Dec_C_Sockets THEN rp = rp + ",DECC"
 $   rp = rp + ") [''dflt'] "
 $   GOSUB myread
-$   IF "''ans'".eqs."" THEN ans = "''dflt'"
-$   has_dec_c_sockets = "F"
-$   has_socketshr = "F"
+$   IF ans .EQS. "" THEN ans = "''dflt'"
+$   Has_Dec_C_Sockets = "F"
+$   Has_socketshr = "F"
 $   ans = F$EDIT(ans,"TRIM,COMPRESS,LOWERCASE")
-$   IF ans.eqs."decc" then has_dec_c_sockets = "T"
-$   IF ans.eqs."socketshr" then has_socketshr = "T"
-$ endif
+$   IF ans.eqs."decc" then Has_Dec_C_Sockets = "T"
+$   IF ans.eqs."socketshr" then Has_socketshr = "T"
+$ ENDIF
 $!
 $!
 $! Ask if they want to build with VMS_DEBUG perl
@@ -1723,11 +2083,11 @@ $ ENDIF
 $!
 $! Ask if they want to build with DEBUGGING
 $ echo ""
-$ echo "Perl can be built with extra runtime debugging enabled. This
-$ echo "enables the -D switch, at the cost of some performance. It
-$ echo "was mandatory on perl 5.005 and before on VMS, but is now
-$ echo "optional. If you don't generally use it you should probably
-$ echo "leave this off and gain a bit of extra speed.
+$ echo "Perl can be built with extra runtime debugging enabled. This"
+$ echo "enables the -D switch, at the cost of some performance.  It"
+$ echo "was mandatory on perl 5.005 and before on VMS, but is now"
+$ echo "optional.  If you do not generally use it you should probably"
+$ echo "leave this off and gain a bit of extra speed."
 $ dflt = "y"
 $ rp = "Build a DEBUGGING version of Perl? [''dflt'] "
 $ GOSUB myread
@@ -1741,77 +2101,72 @@ $ ENDIF
 $!
 $! Ask if they want to build with MULTIPLICITY
 $ echo ""
-$ echo "The perl interpreter engine can be built in a way that makes it
-$ echo "possible for a program that embeds perl into it (and yes, you can
-$ echo "do that--it's pretty keen) to have multiple perl interpreters active
-$ echo "at once. There is some performance overhead, however, so you
-$ echo "probably don't want to choose this unless you're going to be doing
-$ echo "funky perl embedding."
+$ echo "Perl can be built so that multiple Perl interpreters can coexist"
+$ echo "within the same Perl executable."
+$ echo "There is some performance overhead, however, so you"
+$ echo "probably do not want to choose this unless you are going to be" 
+$ echo "doing things with embedded perl."
 $ dflt = "n"
-$ rp = "Build with MULTIPLICITY? [''dflt'] "
+$ rp = "Build Perl for multiplicity? [''dflt'] "
 $ GOSUB myread
-$ if ans.eqs."" then ans = dflt
-$ IF F$EXTRACT(0, 1, F$EDIT(ans,"COLLAPSE,UPCASE")) .eqs. "Y"
+$ IF ans.eqs."" then ans = dflt
+$ IF ans
 $ THEN
-$   use_multiplicity="Y"
+$   usemultiplicity="define"
 $ ELSE
-$   use_multiplicity="N"
+$   usemultiplicity="undef"
 $ ENDIF
 $!
 $! Ask if they want to build with 64-bit support
-$ IF (Archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
+$ IF (archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
 $ THEN
 $   dflt = use64bitint
 $   echo ""
-$   echo "You can have native 64-bit long integers.
+$   echo "You can have native 64-bit long integers."
 $   echo ""
-$   echo "Perl can be built to take advantage of 64-bit integer types
-$   echo "on some systems, which provide a much larger range for perl's 
-$   echo "mathematical operations.  (Note that does *not* enable 64-bit 
+$   echo "Perl can be built to take advantage of 64-bit integer types"
+$   echo "on some systems, which provide a much larger range for perl's"
+$   echo "mathematical operations.  (Note that does *not* enable 64-bit"
 $   echo "fileops at the moment, as Dec C doesn't do that yet)."
-$   echo "Choosing this option will most probably introduce binary incompatibilities.
+$   echo "Choosing this option will most probably introduce binary incompatibilities."
 $   echo ""
-$   echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$   echo "If this does not make any sense to you, just accept the default ''dflt'."
 $   rp = "Try to use 64-bit integers, if available? [''dflt'] "
 $   GOSUB myread
 $   IF ans .EQS. "" THEN ans = dflt
-$   IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$   THEN
-$     use64bitint="Y"
-$   ELSE
-$     use64bitint="N"
+$   IF ans
+$   THEN use64bitint="Y"
+$   ELSE use64bitint="N"
 $   ENDIF
 $   IF (use64bitint)
 $   THEN
 $     dflt = use64bitall
 $     echo ""
-$     echo "Since you chose 64-bitness you may want to try maximal 64-bitness.
-$     echo "What you have chosen is minimal 64-bitness which means just enough
-$     echo "to get 64-bit integers.  The maximal means using as much 64-bitness
-$     echo "as is possible on the platform.  This in turn means even more binary
-$     echo "incompatibilities.  On the other hand, your platform may not have
-$     echo "any more maximal 64-bitness than what you already have chosen.
+$     echo "Since you chose 64-bitness you may want to try maximal 64-bitness."
+$     echo "What you have chosen is minimal 64-bitness which means just enough"
+$     echo "to get 64-bit integers.  The maximal means using as much 64-bitness"
+$     echo "as is possible on the platform.  This in turn means even more binary"
+$     echo "incompatibilities.  On the other hand, your platform may not have"
+$     echo "any more maximal 64-bitness than what you already have chosen."
 $     echo ""
-$     echo "If this doesn't make any sense to you, just accept the default ''dflt'.
+$     echo "If this does not make any sense to you, just accept the default ''dflt'."
 $     rp = "Try to use full 64-bit support, if available? [''dflt'] "
 $     GOSUB myread
 $     IF ans .EQS. "" THEN ans = dflt
-$     IF (f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE")) .EQS. "Y")
-$     THEN
-$       use64bitall="Y"
-$     ELSE
-$       use64bitall="N"
+$     IF ans
+$     THEN use64bitall="Y"
+$     ELSE use64bitall="N"
 $     ENDIF
 $   ENDIF
 $ ENDIF ! AXP && >= 7.1
 $!
 $! Ask about threads, if appropriate
-$ if (Using_Dec_C.eqs."Yes")
+$ IF Using_Dec_C .OR. using_cxx
 $ THEN
 $   echo ""
-$   echo "This version of Perl can be built with threads. While really nifty,
-$   echo "they are a beta feature, and there is a speed penalty for perl
-$   echo "programs if you build with threads *even if you don't use them*
+$   echo "This version of Perl can be built with threads. While really nifty,"
+$   echo "they are a beta feature, and there is a speed penalty for perl"
+$   echo "programs if you build with threads *even if you do not use them*."
 $   dflt = "n"
 $   rp = "Build with threads? [''dflt'] "
 $   GOSUB myread
@@ -1819,22 +2174,21 @@ $   if ans.eqs."" then ans = dflt
 $   if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
 $   THEN
 $     use_threads="T"
-$!
 $     ! Shall we do the 5.005-stype threads, or IThreads?
-$     echo "As of 5.5.640, Perl has two different internal threading
-$     echo "implementations, the 5.005 version (5005threads) and an
-$     echo "interpreter-based version (ithreads) that has one
-$     echo "interpreter per thread.  Both are very experimental.  This
-$     echo "arrangement exists to help developers work out which one
-$     echo "is better.
-$     echo "
-$     echo "If you're a casual user, you probably don't want
-$     echo "interpreter-threads at this time.  There doesn't yet exist
-$     echo "a way to create threads from within Perl in this model,
-$     echo "i.e., ""use Thread;"" will NOT work.
-$     echo "
+$     echo "As of 5.5.640, Perl has two different internal threading"
+$     echo "implementations, the 5.005 version (5005threads) and an"
+$     echo "interpreter-based version (ithreads) that has one"
+$     echo "interpreter per thread.  Both are very experimental.  This"
+$     echo "arrangement exists to help developers work out which one"
+$     echo "is better."
+$     echo ""
+$     echo "If you are a casual user, you probably do not want"
+$     echo "interpreter-threads at this time.  There doesn't yet exist"
+$     echo "a way to create threads from within Perl in this model,"
+$     echo "i.e., ""use Thread;"" will NOT work."
+$     echo ""
 $     dflt = "n"
-$     rp = "Build with Interpreter threads? [''dflt']
+$     rp = "Build with Interpreter threads? [''dflt'] "
 $     GOSUB myread
 $     if ans.eqs."" then ans = dflt
 $     if (f$extract(0, 1, "''ans'").eqs."Y").or.(f$extract(0, 1, "''ans'").eqs."y")
@@ -1846,17 +2200,17 @@ $       use_ithreads="N"
 $       use_5005_threads="Y"
 $     ENDIF
 $     ! Are they on VMS 7.1 on an alpha?
-$     if (Archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
+$     if (archname.eqs."VMS_AXP").and.("''f$extract(1,3, f$getsyi(""version""))'".ges."7.1")
 $     THEN
 $       echo ""
-$       echo "Threaded perl can be linked to use multiple kernel threads
-$       echo "and system upcalls on VMS 7.1+ on Alpha systems. This feature
-$       echo "allows multiple threads to execute simultaneously on an SMP
-$       echo "system as well as preventing a single thread from blocking
-$       echo "all the threads in a program, even on a single-processor
-$       echo "machine. Unfortunately this feature isn't safe on an
-$       echo "unpatched 7.1 system. (Several OS patches were required when
-$       echo "this procedure was written)
+$       echo "Threaded perl can be linked to use multiple kernel threads"
+$       echo "and system upcalls on VMS 7.1+ on Alpha systems.  This feature"
+$       echo "allows multiple threads to execute simultaneously on an SMP"
+$       echo "system as well as preventing a single thread from blocking"
+$       echo "all the threads in a program, even on a single-processor"
+$       echo "machine.  Unfortunately, this feature isn't safe on an"
+$       echo "unpatched 7.1 system (several OS patches were required when"
+$       echo "this procedure was written)."
 $       dflt = "n"
 $       rp = "Enable multiple kernel threads and upcalls? [''dflt'] "
 $       gosub myread
@@ -1868,47 +2222,48 @@ $       ENDIF
 $     ENDIF
 $   ENDIF
 $ ENDIF
-$ if archname .eqs. "VMS_AXP"
-$ then
-$!
+$ IF archname .EQS. "VMS_AXP"
+$ THEN
 $! Case sensitive?
-$ echo ""
-$ echo "By default, perl (and pretty much everything else on VMS) uses
-$ echo "case-insensitive linker symbols. Which is to say, when the
-$ echo "underlying C code makes a call to a routine called Perl_foo in
-$ echo "the source, the name in the object modules or shareable images
-$ echo "is really PERL_FOO. There are some packages that use an
-$ echo "embedded perl interpreter that instead require case-sensitive
-$ echo "linker symbols.
-$ echo ""
-$ echo "If you have no idea what this means, and don't have
-$ echo "any program requiring anything, choose the default.
-$ dflt = be_case_sensitive
-$ rp = "Case-sensitive symbols [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ be_case_sensitive = "''ans'"
-$!
+$   echo ""
+$   echo "By default, perl (and pretty much everything else on VMS) uses"
+$   echo "case-insensitive linker symbols. Which is to say, when the"
+$   echo "underlying C code makes a call to a routine called Perl_foo in"
+$   echo "the source, the name in the object modules or shareable images"
+$   echo "is really PERL_FOO. There are some packages that use an"
+$   echo "embedded perl interpreter that instead require case-sensitive"
+$   echo "linker symbols."
+$   echo ""
+$   echo "If you have no idea what this means, and do not have"
+$   echo "any program requiring anything, choose the default."
+$   dflt = be_case_sensitive
+$   rp = "Build with case-sensitive symbols? [''dflt'] "
+$   GOSUB myread
+$   IF ans .EQS. "" THEN ans="''dflt'"
+$   be_case_sensitive = "''ans'"
 $! IEEE math?
-$ echo ""
-$ echo "Perl normally uses G_FLOAT format floating point numbers
-$ echo "internally, as do most things on VMS. You can, however, build
-$ echo "with IEEE floating point numbers instead if you need to.
-$ dflt = use_ieee_math
-$ rp = "Use IEEE math [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
-$ use_ieee_math = "''ans'"
-$ endif
+$   echo ""
+$   echo "Perl normally uses G_FLOAT format floating point numbers"
+$   echo "internally, as do most things on VMS.  You can, however, build"
+$   echo "with IEEE floating point numbers instead if you need to."
+$   dflt = use_ieee_math
+$   rp = "Use IEEE math? [''dflt'] "
+$   GOSUB myread
+$   IF ans .eqs. "" THEN ans = "''dflt'"
+$   use_ieee_math = "''ans'"
+$ ENDIF
 $! CC Flags
 $ echo ""
-$ echo "You can, if you need to, pass extra flags on to the C
-$ echo "compiler. In general you should only do this if you really,
-$ echo "really know what you're doing.
+$ echo "Your compiler may want other flags.  For this question you should include"
+$ echo "/INCLUDE=(whatever) and /DEFINE=(whatever), flags and any other flags"
+$ echo "or qualifiers used by the compiler."
+$ echo ""
+$ echo "To use no flags, specify the word ""none""."
 $ dflt = user_c_flags
-$ rp = "Extra C flags [''dflt'] "
-$ gosub myread
-$ if ans.eqs."" then ans="''dflt'"
+$ rp = "Any additional cc flags? [''dflt'] "
+$ GOSUB myread
+$ IF ans .EQS. "" THEN ans = "''dflt'"
+$ IF ans .EQS. "none" THEN ans = ""
 $ user_c_flags = "''ans'"
 $!
 $! Ask whether they want to use secure logical translation when tainting
@@ -1929,8 +2284,11 @@ $ echo "name translation."
 $ dflt = "y"
 $ rp = "Use secure logical name translation? [''dflt'] "
 $ GOSUB myread
-$ if ans.eqs."" then ans="''dflt'"
-$ d_secintgenv = f$extract(0, 1, f$edit(ans,"TRIM,COMPRESS,UPCASE"))
+$ IF ans .eqs. "" THEN ans = dflt
+$ IF ans
+$ THEN d_secintgenv := Y
+$ ELSE d_secintgenv := N
+$ ENDIF
 $!
 $! Ask whether they want to default filetypes
 $ echo ""
@@ -1942,47 +2300,56 @@ $ echo "file types of nothing, .pl, and .com, in that order (e.g. typing"
 $ echo """$ perl foo"" would cause Perl to look for foo., then foo.pl, and"
 $ echo "finally foo.com)."
 $ echo ""
-$ echo "This is currently broken in some configurations. Only enable it if
-$ echo "you know what you're doing. "
-$ dflt = "N"
+$ echo "This is currently broken in some configurations. Only enable it if"
+$ echo "you know what you are doing."
+$ dflt = "n"
 $ rp = "Always use default file types? [''dflt'] "
 $ GOSUB myread
-$ if ans.eqs."" then ans="''dflt'"
-$ d_alwdeftype = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
-$!
+$ IF ans .EQS. "" THEN ans = dflt
+$ IF ans
+$ THEN d_alwdeftype := Y
+$ ELSE d_alwdeftype := N
+$ ENDIF
 $! Ask if they want to use perl's memory allocator
 $ echo ""
-$ echo "Perl has a built-in memory allocator that's tuned for perl's
-$ echo "normal memory usage. It's oftentimes better than the standard
-$ echo "system memory allocator. It also has the advantage of providing
-$ echo "memory allocation statistics, if you choose to enable them.
+$ echo "Perl has a built-in memory allocator that is tuned for normal"
+$ echo "memory usage.  It is oftentimes better than the standard system"
+$ echo "memory allocator.  It also has the advantage of providing memory"
+$ echo "allocation statistics, if you choose to enable them."
 $ dflt = "n"
-$ rp = "Build with perl's memory allocator? [''dflt'] "
+$ IF F$TYPE(usemymalloc) .EQS. "STRING"
+$ THEN
+$   IF usemymalloc THEN dflt = "y"
+$ ENDIF
+$ rp = "Do you wish to attempt to use the malloc that comes with ''package'? [''dflt'] "
 $ GOSUB myread
-$ if ans.eqs."" then ans="''dflt'"
-$ mymalloc = f$extract(0, 1, f$edit(ans,"COLLAPSE,UPCASE"))
-$ if mymalloc.eqs."Y"
+$ IF ans .eqs. "" THEN ans = dflt
+$ IF ans
+$ THEN mymalloc := Y
+$ ELSE mymalloc := N
+$ ENDIF
+$ IF mymalloc
 $ THEN
-$   if use_debugging_perl.eqs."Y"
+$   IF use_debugging_perl
 $   THEN
 $     echo ""
-$     echo "Perl can keep statistics on memory usage if you choose to use
-$     echo "them. This is useful for debugging, but does have some
-$     echo "performance overhead.
+$     echo "Perl can keep statistics on memory usage if you choose to use"
+$     echo "them.  This is useful for debugging, but does have some"
+$     echo "performance overhead."
 $     dflt = "n"
 $     rp = "Do you want the debugging memory allocator? [''dflt'] "
 $     gosub myread
-$     if ans.eqs."" then ans="''dflt'"
+$     IF ans .eqs. "" THEN ans = "''dflt'"
 $     use_debugmalloc = f$extract(0, 1, f$edit(ans, "COLLAPSE,UPCASE"))
 $   ENDIF
 $   ! Check which memory allocator we want
 $   echo ""
-$   echo "There are currently three different memory allocators: the
-$   echo "default (which is a pretty good general-purpose memory manager),
-$   echo "the TWO_POT allocator (which is optimized to save memory for
-$   echo "larger allocations), and PACK_MALLOC (which is optimized to save
-$   echo "memory for smaller allocations). They're all good, but if your
-$   echo "usage tends towards larger chunks use TWO_POT, otherwise use
+$   echo "There are currently three different memory allocators: the"
+$   echo "default (which is a pretty good general-purpose memory manager),"
+$   echo "the TWO_POT allocator (which is optimized to save memory for"
+$   echo "larger allocations), and PACK_MALLOC (which is optimized to save"
+$   echo "memory for smaller allocations). They're all good, but if your"
+$   echo "usage tends towards larger chunks use TWO_POT, otherwise use"
 $   echo "PACK_MALLOC."
 $   dflt = "DEFAULT"
 $   rp = "Memory allocator (DEFAULT, TWO_POT, PACK_MALLOC) [''dflt'] "
@@ -1994,17 +2361,15 @@ $ ENDIF
 $!
 $! Ask for their default list of extensions to build
 $ echo ""
-$ echo "It's time to specify which modules you want to build into
-$ echo "perl. Most of these are standard and should be chosen, though
-$ echo "you might, for example, want to build GDBM_File instead of
-$ echo "SDBM_File if you have the GDBM library built on your machine.
-$ echo "Whatever you do, make sure the re module is first or things will
-$ echo "break badly"
-$ echo "
+$ echo "It is time to specify which modules you want to build into"
+$ echo "perl. Most of these are standard and should be chosen, though"
+$ echo "you might, for example, want to build GDBM_File instead of"
+$ echo "SDBM_File if you have the GDBM library built on your machine."
+$ echo ""
 $ echo "Which modules do you want to build into perl?"
 $! dflt = "Fcntl Errno File::Glob IO Opcode Byteloader Devel::Peek Devel::DProf Data::Dumper attrs re VMS::Stdio VMS::DCLsym B SDBM_File"
-$ dflt = "re Fcntl Errno File::Glob IO Opcode Devel::Peek Devel::DProf Data::Dumper attrs VMS::Stdio VMS::DCLsym B SDBM_File Thread Sys::Hostname"
-$ if Using_Dec_C.eqs."Yes"
+$ dflt = "re Fcntl Errno File::Glob IO Opcode Devel::Peek Devel::DProf Data::Dumper attrs VMS::Stdio VMS::DCLsym B SDBM_File Storable Thread Sys::Hostname"
+$ IF Using_Dec_C .OR. using_cxx
 $ THEN
 $   dflt = dflt + " POSIX"
 $ ENDIF
@@ -2046,11 +2411,11 @@ $ exloop3:
 $ dflt = f$edit(a,"trim")
 $!
 $ extensions = "''ans'"
-$ perl_known_extensions = "''dflt'"
+$ known_extensions = "''dflt'"
 $!
 $! %Config-I-VMS, determine build/make utility here (make gmake mmk mms)
 $ echo ""
-$ echo "%Config-I-VMS, Checking your ""make"" utilities..."
+$ echo "Checking your ""make"" utilities..."
 $! If the 'build' that you use is not here add it and it's test
 $! switch to the _END_ of these strings (and increment max_build)
 $! (e.g. builders = builders + "/FOOMAKE" 
@@ -2073,11 +2438,16 @@ $Build_probe:
 $ build = F$ELEMENT(n,"/",builders)
 $ probe  = F$ELEMENT(n,"!",probers)
 $ echo "Testing whether you have ''build' on your system..."
+$!
+$! Noted with GNU Make version 3.60  that the $status and $severity
+$! with the 'probe' Makefile appear to be: $STATUS == "%X1000000C"
+$! $SEVERITY == "4".
+$!
 $ SET NOON
 $ ON CONTROL_Y THEN GOTO Reenable_messages_build
 $ SET MESSAGE/NOFAC/NOSEV/NOIDENT/NOTEXT
 $ 'build' 'probe'
-$ IF ($SEVERITY .EQ. 1)
+$ IF ($SEVERITY .EQ. 1) ! not adequate?
 $ THEN 
 $   echo "OK."
 $   IF (build .EQS. orig_dflt) 
@@ -2101,7 +2471,7 @@ $ IF (ok_builders .NES. "")
 $ THEN
 $   echo "Here is the list of builders you can apparently use:"
 $   echo "(",ok_builders," )"
-$   rp = "Which """"make"""" utility do you wish to use [''dflt']? "
+$   rp = "Which """"make"""" utility do you wish to use? [''dflt'] "
 $   GOSUB myread
 $   ans = F$EDIT(ans,"TRIM, COMPRESS")
 $   ans = F$EXTRACT(0,F$LOCATE(" ",ans),ans) !throw out "-f Makefile." here
@@ -2111,18 +2481,20 @@ $   ELSE build = ans
 $   ENDIF
 $ ELSE
 $   TYPE SYS$INPUT:
+$   DECK
 
 %Config-E-VMS, ERROR:
  Well this looks pretty serious. Perl5 cannot be compiled without a "make"
  utility of some sort and after checking my "builders" list I cannot find
  the symbol or command you use on your system to compile programs.
 
-$   READ SYS$COMMAND/PROMPT="%Config-I-VMS, Which ""MMS"" do you use? " ans
+$   EOD
+$   READ SYS$COMMAND/PROMPT="Which ""MMS"" do you use? " ans
 $   ans = F$EDIT(ans,"TRIM, COMPRESS")
 $   ans = F$EXTRACT(0,F$LOCATE(" ",ans),ans) !throw out "-f Makefile." here
 $   IF (ans .EQS. "") 
 $   THEN build = dflt
-$     echo "I don't know where 'make' is, and my life depends on it."
+$     echo "I do not know where ""make"" is, and my life depends on it."
 $     echo "Go find a make program or fix your DCL$PATH setting!"
 $     echo "ABORTING..."
 $     SET DEFAULT 'vms_default_directory_name' !be kind rewind
@@ -2137,13 +2509,17 @@ $ DELETE/NOLOG Makefile.;
 $ GOTO Beyond_open
 $Open_error:
 $ TYPE SYS$INPUT:
+$ DECK
 
  There seems to be trouble. I just tried to create a file in
+$ EOD
 $ echo4 'F$ENVIRONMENT("DEFAULT")'
 $ TYPE SYS$INPUT:
+$ DECK
  but was unsuccessful. I am stopping now. Please check that directories'
  PROTECTION bits. I will leave you in the directory where you started
  Configure.com
+$ EOD
 $ echo4 "ABORTING..."
 $ GOTO Clean_up
 $ STOP
@@ -2155,7 +2531,17 @@ $ make = F$EDIT(build,"UPCASE")
 $!
 $!: locate the preferred pager for this system
 $!pagers = "most|more|less|type/page"
-$!rp='What pager is used on your system?'
+$ dflt = "type/page"
+$! assume that the presence of a most symbol indicates the presence
+$! of the pager.
+$ IF F$TYPE(most) .EQS. "STRING" THEN dflt = "most"
+$ IF F$TYPE(pager) .EQS. "STRING" THEN dflt = pager
+$ rp="What pager is used on your system? [''dflt'] "
+$ GOSUB myread
+$ IF (ans .EQS. "") 
+$ THEN pager = dflt
+$ ELSE pager = ans
+$ ENDIF
 $!
 $! update [.vms]config.vms here
 $!
@@ -2167,53 +2553,2960 @@ $ THEN
 $   makefile    = ""              !wrt MANIFEST dir
 $   UUmakefile  = "[-]DESCRIP.MMS" !wrt CWD dir
 $   DEFmakefile = "DESCRIP.MMS"    !wrt DEF dir (?)
+$   Makefile_SH = "descrip_mms.template"
 $ ELSE
 $   makefile    = " -f Makefile."  !wrt MANIFEST dir
 $   UUmakefile  = "[-]Makefile."   !wrt CWD dir
 $   DEFmakefile = "Makefile."      !wrt DEF dir (?)
+$   Makefile_SH = "Makefile.in"
 $ ENDIF
 $!
-$ IF macros.NES."" 
-$ THEN 
+$ IF macros .NES. "" 
+$ THEN
 $   tmp = F$LENGTH(macros)
 $   macros = F$EXTRACT(0,(tmp-1),macros) !miss trailing comma
 $   macros = "/macro=(" + macros  + ")"
 $ ENDIF
 $! Build up the extra C flags
 $!
-$ if use_ieee_math
-$ then
+$ IF use_ieee_math
+$ THEN
 $   extra_flags = "''extra_flags'" + "/float=ieee/ieee=denorm_results"
-$ endif
-$ if be_case_sensitive
-$ then
+$ ENDIF
+$ IF be_case_sensitive
+$ THEN
 $   extra_flags = "''extra_flags'" + "/Names=As_Is"
-$ endif
+$ ENDIF
 $ extra_flags = "''extra_flags'" + "''user_c_flags'"
 $!
-$! Invoke the subconfig piece
+$ min_pgflquota = "100000"
+$ pgflquota = F$STRING(F$GETJPI("","PGFLQUOTA"))
+$ IF pgflquota .LES. min_pgflquota
+$ THEN
+$   echo4 "Your PGFLQUOTA of ''pgflquota' appears too small to build ''package'."
+$   READ SYS$COMMAND/PROMPT="Continue? [n] " ans
+$   IF ans
+$   THEN
+$     echo4 "Continuing..."
+$   ELSE
+$     echo4 "ABORTING..."
+$     GOTO Clean_up
+$   ENDIF
+$ ENDIF
 $!
 $ echo ""
-$ echo4 "Checking the C run-time library"
-$ dflt = F$ENVIRONMENT("DEFAULT")
-$ SET DEFAULT [-.vms]
-$ @subconfigure
-$ SET DEFAULT 'dflt
+$ echo4 "Checking the C run-time library."
 $!
-$!  Warn of dangerous symbols or logical names
+$! Former SUBCONFIGURE.COM
 $!
-$Bad_environment: SUBROUTINE
-$   Bad_env = ""
-$   IF p2 .eqs. "SYMBOL"
-$   THEN
-$     IF f$type('p1) .nes. "" THEN  Bad_env := SYMBOL
-$   ELSE
-$     IF f$trnlnm(p1) .nes. "" THEN Bad_env := LOGICAL
-$   ENDIF
-$   IF Bad_env .eqs. "SYMBOL" .or. Bad_env .eqs. "LOGICAL"
-$   THEN
-$     IF f$search("config.msg") .nes. ""
-$     THEN
+$!  - build a config.sh for VMS Perl.
+$!  - use built config.sh to take config_h.SH -> config.h
+$!  - also take vms/descrip_mms.template -> descrip.mms (VMS Makefile)
+$!              vms/Makefile.in -> Makefile. (VMS GNU Makefile?)
+$!              vms/Makefile.SH -> Makefile. (VMS GNU Makefile?)
+$!  - build make_ext.com extension builder procedure.
+$!
+$! Note for folks from other platforms changing things in here:
+$!
+$!   Fancy changes (based on compiler capabilities or VMS version or
+$!   whatever) are tricky, so go ahead and punt on those.
+$!
+$!   Simple changes, though (say, always setting something to 1, or undef,
+$!   or something like that) are straightforward.  Adding a new constant 
+$!   item for the ultimately created config.sh requires at least one 
+$!   (possibly more) line(s) to this file.
+$!
+$!   Add a line in the format:
+$!
+$!     $ WC "foo='undef'"
+$!
+$!   somewhere between the line tagged '##BEGIN WRITE NEW CONSTANTS HERE##'
+$!   and the one tagged '##END WRITE NEW CONSTANTS HERE##' (note the order
+$!   is sorted ASCII and corresponds to the output of config.sh in the 
+$!   Bourne shell version of Configure).
+$!   Be very careful with quoting, as it can be tricky.
+$!   For example if instead of a constant string like 'undef' or 'define' 
+$!   you wanted to add something to VMS's config.sh that looks like:
+$!
+$!     blank_string=''
+$!
+$!   then add a line that looks like this before the 
+$!   '##END WRITE NEW CONSTANTS HERE##' tagged line:
+$!
+$!     $ WC "blank_string='" + "'"
+$!
+$!   (+ is the string concatenator and "''var'" has the effect 
+$!    of "${var}" in perl or sh, but "'const'" is not interpolated).
+$!
+$!   Note that unitialized variables, such as a line like:
+$!
+$!     $ WC "new_var='" + new_var + "'"
+$!
+$!   should be avoided unless new_var has a value assigned prior 
+$!   to that line (think of perl's -w warnings).
+$!
+$!     %DCL-W-UNDSYM, undefined symbol - check validity and spelling
+$!     \NEW_VAR\
+$!
+$!
+$ vms_ver = F$EXTRACT(1,3, osvers)
+$ IF F$LENGTH(Mcc) .EQ. 0 THEN Mcc := "cc"
+$ MCC = f$edit(mcc, "UPCASE")
+$ C_Compiler_Replace := "CC=CC=''Mcc'''ccflags'"
+$ IF Using_Dec_C
+$ THEN
+$   Checkcc := "''Mcc'/prefix=all"
+$ ELSE
+$   IF using_cxx
+$   THEN
+$     Checkcc := cxx
+$   ELSE
+$     Checkcc := "''Mcc'"
+$   ENDIF
+$ ENDIF
+$ ccflags = ccflags + extra_flags
+$ IF be_case_sensitive
+$ THEN
+$   d_vms_be_case_sensitive = "define"
+$ ELSE
+$   d_vms_be_case_sensitive = "undef"
+$ ENDIF
+$! Some constant defaults.
+$ hwname = f$getsyi("HW_NAME")
+$ myname = myhostname
+$ IF myname .EQS. "" THEN myname = F$TRNLNM("SYS$NODE")
+$!
+$ ccdlflags=""
+$ cccdlflags=""
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$   use64bitint = "define"
+$   uselargefiles = "define"
+$   uselongdouble = "define"
+$   usemorebits = "define"
+$ ELSE
+$   use64bitint = "undef"
+$   uselargefiles = "undef"
+$   uselongdouble = "undef"
+$   usemorebits = "undef"
+$ ENDIF
+$ IF use64bitall .OR. use64bitall .EQS. "define"
+$ THEN
+$   use64bitall = "define"
+$ ELSE
+$   use64bitall = "undef"
+$ ENDIF
+$!
+$ usemymalloc=mymalloc
+$!
+$ perl_cc=Mcc
+$!
+$ IF (sharedperl .AND. F$GETSYI("HW_MODEL") .GE. 1024)
+$ THEN
+$   obj_ext=".abj"
+$   so="axe"
+$   dlext="axe"
+$   exe_ext=".axe"
+$   lib_ext=".alb"
+$ ELSE
+$   obj_ext=".obj"
+$   so="exe"
+$   dlext="exe"
+$   exe_ext=".exe"
+$   lib_ext=".olb"
+$ ENDIF
+$ dlobj="dl_vms''obj_ext'"
+$!
+$ cppstdin="''perl_cc'/noobj/preprocess=sys$output sys$input"
+$ cppminus=" "
+$ cpprun="''perl_cc'/noobj/preprocess=sys$output sys$input"
+$ cpplast=" "
+$!
+$ timetype="time_t"
+$ signal_t="void"
+$ stdchar="char"
+$!
+$ IF mymalloc
+$ THEN d_mymalloc="define"
+$ ELSE d_mymalloc="undef"
+$ ENDIF
+$!
+$ usedl="define"
+$ startperl="""$ perl 'f$env(\""procedure\"")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8'  !\n$ exit++ + ++$status != 0 and $exit = $status = undef;"""
+$!
+$ IF ((Use_Threads) .AND. (vms_ver .LES. "6.2"))
+$ THEN
+$   libs="SYS$SHARE:CMA$LIB_SHR.EXE/SHARE SYS$SHARE:CMA$RTL.EXE/SHARE SYS$SHARE:CMA$OPEN_LIB_SHR.exe/SHARE SYS$SHARE:CMA$OPEN_RTL.exe/SHARE"
+$ ELSE
+$   libs=" "
+$ ENDIF
+$ IF Using_Dec_C .OR. using_cxx
+$ THEN
+$   libc="(DECCRTL)"
+$ ELSE
+$   libc=" "
+$ ENDIF
+$!
+$! perllibs should be libs with all non-core libs (such as gdbm) removed.
+$!
+$ perllibs=libs
+$!
+$! Are we 64 bit?
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$   d_PRId64 = "define"
+$   d_PRIEUldbl = "define"
+$   d_PRIFUldbl = "define"
+$   d_PRIGUldbl = "define"
+$   d_PRIeldbl = "define"
+$   d_PRIfldbl = "define"
+$   d_PRIgldbl = "define"
+$   d_PRIu64 = "define"
+$   d_PRIo64 = "define"
+$   d_PRIx64 = "define"
+$   sPRId64 = """Ld"""
+$   sPRIEUldbl = """LE"""
+$   sPRIFUldbl = """LF"""
+$   sPRIGUldbl = """LG"""
+$   sPRIXU64 = """LX"""
+$   sPRIeldbl = """Le"""
+$   sPRIfldbl = """Lf"""
+$   sPRIgldbl = """Lg"""
+$   sPRIi64 = """Li"""
+$   sPRIo64 = """Lo"""
+$   sPRIu64 = """Lu"""
+$   sPRIx64 = """Lx"""
+$   d_quad = "define"
+$   quadtype = "long long"
+$   uquadtype = "unsigned long long"
+$   quadkind  = "QUAD_IS_LONG_LONG"
+$   d_frexpl = "define"
+$   d_isnan = "define"
+$   d_isnanl = "define"
+$   d_modfl = "define"
+$ ELSE
+$   d_PRId64 = "undef"
+$   d_PRIEUldbl = "define"
+$   d_PRIFUldbl = "define"
+$   d_PRIGUldbl = "define"
+$   d_PRIXU64 = "undef"
+$   d_PRIeldbl = "define"
+$   d_PRIfldbl = "undef"
+$   d_PRIgldbl = "undef"
+$   d_PRIu64 = "undef"
+$   d_PRIo64 = "undef"
+$   d_PRIx64 = "undef"
+$   sPRId64 = ""
+$   sPRIEUldbl = """E"""
+$   sPRIFUldbl = """F"""
+$   sPRIGUldbl = """G"""
+$   sPRIXU64 = """lX"""
+$   sPRIeldbl = """e"""
+$   sPRIfldbl = """f"""
+$   sPRIgldbl = """g"""
+$   sPRIi64 = ""
+$   sPRIo64 = ""
+$   sPRIu64 = ""
+$   sPRIx64 = ""
+$   d_quad = "undef"
+$   quadtype = "long"
+$   uquadtype = "unsigned long"
+$   quadkind  = "QUAD_IS_LONG"
+$   d_frexpl = "undef"
+$   d_isnan = "undef"
+$   d_isnanl = "undef"
+$   d_modfl = "undef"
+$ ENDIF
+$ d_SCNfldbl = d_PRIfldbl
+$ sSCNfldbl = sPRIfldbl ! expect consistency
+$!
+$! Now some that we build up
+$!
+$ IF Use_Threads
+$ THEN
+$   IF use_5005_threads
+$   THEN
+$     arch = "''arch'-thread"
+$     archname = "''archname'-thread"
+$     d_old_pthread_create_joinable = "undef"
+$     old_pthread_create_joinable = " "
+$     use5005threads = "define"
+$     useithreads = "undef"
+$   ELSE
+$     arch = "''arch'-ithread"
+$     archname = "''archname'-ithread"
+$     d_old_pthread_create_joinable = "undef"
+$     old_pthread_create_joinable = " "
+$     use5005threads = "undef"
+$     useithreads = "define"
+$   ENDIF
+$ ELSE
+$   d_old_pthread_create_joinable = "undef"
+$   old_pthread_create_joinable = " "
+$   use5005threads = "undef"
+$   useithreads = "undef"
+$ ENDIF
+$!
+$! Some that we need to invoke the compiler for
+$!
+$!
+$! handy construction aliases/symbols
+$!
+$ OS := "open/write CONFIG []try.c"
+$ WS := "write CONFIG"
+$ CS := "close CONFIG"
+$ DS := "delete/nolog/noconfirm []try.*;*"
+$ Needs_Opt := N
+$ good_compile = %X10B90001
+$ IF Using_Gnu_C
+$ THEN
+$   open/write OPTCHAN []try.opt
+$   write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library"
+$   write OPTCHAN "Sys$Share:VAXCRTL/Share"
+$   Close OPTCHAN
+$   Needs_Opt := Y
+$   good_compile = %X10000001
+$ ENDIF
+$ IF using_cxx
+$ THEN
+$   good_compile = %X15F60001
+$ ENDIF
+$ good_link = %X10000001
+$ tmp = "" ! null string default
+$!
+$ GOTO beyond_compile_ok
+$!
+$! Check for type sizes 
+$!
+$type_size_check: 
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(''tmp'));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ RETURN
+$!
+$!: locate header file
+$findhdr:
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <''tmp'>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""define\n"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ RETURN
+$!
+$!: define an alternate in-header-list? function
+$inhdr:
+$!
+$ GOSUB findhdr
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$   echo4 "<''tmp'> found."
+$   tmp = "define"
+$ ELSE
+$   echo4 "<''tmp'> NOT found."
+$   tmp = "undef"
+$ ENDIF
+$ RETURN
+$!
+$!: define an is-in-libc? function
+$inlibc: 
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$   echo4 "''tmp'() found."
+$   tmp = "define"
+$ ELSE
+$   echo4 "''tmp'() NOT found."
+$   tmp = "undef"
+$ ENDIF
+$ RETURN
+$!
+$!: define a shorthand compile call
+$compile:
+$ GOSUB link_ok
+$just_mcr_it:
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$   OPEN/WRITE CONFIG []try.out
+$   DEFINE/USER_MODE SYS$ERROR CONFIG
+$   DEFINE/USER_MODE  SYS$OUTPUT CONFIG
+$   MCR []try.exe
+$   CLOSE CONFIG
+$   OPEN/READ CONFIG []try.out
+$   READ CONFIG tmp
+$   CLOSE CONFIG
+$   DELETE/NOLOG/NOCONFIRM []try.out;
+$   DELETE/NOLOG/NOCONFIRM []try.exe;
+$ ELSE
+$   tmp = "" ! null string default
+$ ENDIF
+$ RETURN
+$!
+$link_ok:
+$ GOSUB compile_ok
+$ DEFINE/USER_MODE SYS$ERROR _NLA0:
+$ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ IF Needs_Opt
+$ THEN
+$   'ld' try.obj,try.opt/opt
+$   link_status = $status
+$ ELSE
+$   'ld' try.obj
+$   link_status = $status
+$ ENDIF
+$ SET ON
+$ IF F$SEARCH("try.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM try.obj;
+$ RETURN
+$!
+$!: define a shorthand compile call for compilations that should be ok.
+$compile_ok:
+$ DEFINE/USER_MODE SYS$ERROR _NLA0:
+$ DEFINE/USER_MODE SYS$OUTPUT _NLA0:
+$ SET NOON
+$ 'Checkcc' try.c
+$ compile_status = $status
+$ SET ON
+$ DELETE/NOLOG/NOCONFIRM try.c;
+$ RETURN
+$!
+$beyond_compile_ok:
+$!
+$! Check for __STDC__
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "#ifdef __STDC__"
+$ WS "printf(""42\n"");"
+$ WS "#else"
+$ WS "printf(""1\n"");"
+$ WS "#endif"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ cpp_stuff=tmp
+$ IF F$INTEGER(tmp) .eq. 42
+$ THEN
+$   echo4 "Your C compiler and pre-processor defines the symbol:"
+$   echo4 "__STDC__"
+$ ENDIF
+$!
+$! Check for double size
+$!
+$ echo4 "Checking to see how big your double precision numbers are..."
+$ tmp="double"
+$ GOSUB type_size_check
+$ doublesize = tmp
+$ echo "Your double is ''doublesize' bytes long."
+$!
+$! Check for long double size
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(long double));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ echo4 "Checking to see if you have long double..."
+$ GOSUB link_ok
+$ IF link_status .NE. good_link
+$ THEN
+$   longdblsize="0"
+$   d_longdbl="undef"
+$   echo "You do not have long double."
+$ ELSE
+$   echo "You have long double."
+$   echo4 "Checking to see how big your long doubles are..."
+$   GOSUB just_mcr_it
+$   longdblsize = tmp
+$   d_longdbl = "define"
+$   echo "Your long doubles are ''longdblsize' bytes long."
+$ ENDIF
+$!
+$!: check for long long
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "printf(""%d\n"", sizeof(long long));"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ echo4 "Checking to see if you have long long..."
+$ GOSUB link_ok
+$ IF link_status .NE. good_link
+$ THEN
+$   longlongsize="0"
+$   d_longlong="undef"
+$   echo "You do not have long long."
+$ ELSE
+$   echo "You have long long."
+$   echo4 "Checking to see how big your long longs are..."
+$   GOSUB just_mcr_it
+$   longlongsize = tmp
+$   d_longlong = "define"
+$   echo "Your long longs are ''longlongsize' bytes long."
+$ ENDIF
+$!
+$! Check the prototype for getgid
+$!
+$ echo "Looking for the type for group ids returned by getgid()."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "gid_t foo;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .NE. good_compile
+$ THEN
+$!   Okay, gid_t failed. Must be unsigned int
+$   gidtype = "unsigned int"
+$   echo4 "assuming ""''gidtype'""."
+$ ELSE
+$   gidtype = "gid_t"
+$   echo4 "gid_t found."
+$ ENDIF
+$!
+$! Check to see if we've got dev_t
+$!
+$ echo "Looking for the type for dev."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "dev_t foo;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .NE. good_compile
+$ THEN
+$!   Okay, dev_t failed. Must be unsigned int
+$   devtype = "unsigned int"
+$   echo4 "assuming ""''devtype'""."
+$ ELSE
+$   devtype = "dev_t"
+$   echo4 "dev_t found."
+$ ENDIF
+$!
+$! Check to see if we've got unistd.h (which we ought to, but you never know)
+$!
+$ i_netdb = "undef"
+$ tmp = "unistd.h"
+$ GOSUB inhdr
+$ i_unistd = tmp
+$!
+$!: see if this is a libutil.h system
+$!
+$ tmp = "libutil.h"
+$ GOSUB inhdr
+$ i_libutil = tmp
+$!
+$! Check to see if we've got shadow.h (probably not, but...)
+$!
+$ tmp = "shadow.h"
+$ GOSUB inhdr
+$ i_shadow = tmp
+$!
+$! Check to see if we've got socks.h (probably not, but...)
+$!
+$ tmp = "socks.h"
+$ GOSUB inhdr
+$ i_socks = tmp
+$!
+$! Check the prototype for select
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "#include <types.h>"
+$   IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
+$   IF Has_Socketshr
+$   THEN
+$     WS "#include <socketshr.h>"
+$   ELSE
+$     WS "#include <time.h>"
+$     WS "#include <socket.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "fd_set *foo;"
+$   WS "int bar;"
+$   WS "foo = NULL;"
+$   WS "bar = select(2, foo, foo, foo, NULL);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   GOSUB compile_ok
+$   IF compile_status .NE. good_compile
+$   THEN
+$!   Okay, select failed.  Must be an int *
+$     selecttype = "int *"
+$     echo4 "select() NOT found."
+$   ELSE
+$     selecttype="fd_set *"
+$     echo4 "select() found."
+$   ENDIF
+$ ELSE
+$   ! No sockets, so stick in an int * : no select, so pick a harmless default
+$   selecttype = "int *"
+$ ENDIF
+$!
+$! Check to see if fd_set exists
+$!
+$ echo "Checking to see how well your C compiler handles fd_set and friends ..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ IF Has_Socketshr
+$ THEN
+$   WS "#include <socketshr.h>"
+$ ENDIF
+$ IF Has_Dec_C_Sockets
+$ THEN
+$   WS "#include <time.h>"
+$   WS "#include <socket.h>"
+$ ENDIF
+$ WS "int main()"
+$ WS "{"
+$ WS "fd_set *foo;"
+$ WS "int bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .ne. good_compile
+$ THEN
+$!  Okay, fd_set failed. Must not exist
+$   d_fd_set = "undef"
+$   echo4 "Hmm, your compiler has some difficulty with fd_set."
+$ ELSE
+$   d_fd_set="define"
+$   echo4 "Well, your system knows about the normal fd_set typedef..."
+$ ENDIF
+$!
+$! Check for inttypes.h
+$!
+$ tmp = "inttypes.h"
+$ GOSUB inhdr
+$ i_inttypes = tmp
+$!
+$! Check to see if off64_t exists
+$!
+$ echo4 "Checking to see if you have off64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "off64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$   d_off64_t="define"
+$   echo "You have off64_t."
+$ ELSE
+$   d_off64_t = "undef"
+$   echo "You do not have off64_t."
+$ ENDIF
+$!
+$! Check to see if fpos64_t exists
+$!
+$ echo4 "Checking to see if you have fpos64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "fpos64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$   d_fpos64_t="define"
+$   echo "You have fpos64_t."
+$ ELSE
+$   d_fpos64_t = "undef"
+$   echo "You do not have fpos64_t."
+$ ENDIF
+$!
+$! Check to see if int64_t exists
+$!
+$ echo4 "Checking to see if you have int64_t..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <types.h>"
+$ WS "#''i_inttypes' IIH"
+$ WS "#ifdef IIH"
+$ WS "#include <inttypes.h>"
+$ WS "#endif"
+$ WS "int main()"
+$ WS "{"
+$ WS "int64_t bar;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile_ok
+$ IF compile_status .EQ. good_compile
+$ THEN
+$   d_int64_t="define"
+$   echo "You have int64_t."
+$ ELSE
+$   d_int64_t = "undef"
+$   echo "You do not have int64_t."
+$ ENDIF
+$!
+$!: see if this is a netdb.h system
+$ IF Has_Dec_C_Sockets
+$ THEN 
+$   tmp = "netdb.h"
+$   GOSUB inhdr
+$   i_netdb = tmp
+$ ENDIF
+$!
+$! Check for h_errno
+$!
+$ echo4 "Checking to see if you have h_errno..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ IF i_unistd .EQS. "define" THEN WS "#include <unistd.h>"
+$ IF i_netdb  .EQS. "define" THEN WS "#include <netdb.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "h_errno = 3;"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$   d_herrno="define"
+$   echo "You have h_errno."
+$ ELSE
+$   d_herrno="undef"
+$   echo "You do not have h_errno."
+$ ENDIF
+$!
+$! Check to see if gethostname exists
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "#include <types.h>"
+$   IF Has_Socketshr
+$   THEN
+$     WS "#include <socketshr.h>"
+$   ELSE
+$     WS "#include <time.h>"
+$     WS "#include <socket.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "char name[100];"
+$   WS "int bar, baz;"
+$   WS "bar = 100;"
+$   WS "baz = gethostname(name, bar);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   GOSUB link_ok
+$   IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$   THEN
+$     d_gethname="define"
+$     echo4 "gethostname() found."
+$   ELSE
+$     d_gethname="undef"
+$   ENDIF
+$ ELSE
+$   ! No sockets, so no gethname
+$   d_gethname = "undef"
+$ ENDIF
+$!
+$! Check for sys/file.h
+$!
+$ tmp = "sys/file.h"
+$ GOSUB inhdr
+$ i_sysfile = tmp
+$!
+$! Check for sys/utsname.h
+$!
+$ tmp = "sys/utsname.h"
+$ GOSUB inhdr
+$ i_sysutsname = tmp
+$!
+$! Check for syslog.h
+$!
+$ tmp = "syslog.h"
+$ GOSUB inhdr
+$ i_syslog = tmp
+$!
+$! Check for poll.h
+$!
+$ tmp = "poll.h"
+$ GOSUB inhdr
+$ i_poll = tmp
+$!
+$! Check for sys/uio.h
+$!
+$ tmp = "sys/uio.h"
+$ GOSUB inhdr
+$ i_sysuio = tmp
+$!
+$! Check for sys/mode.h
+$!
+$ tmp = "sys/mode.h"
+$ GOSUB inhdr
+$ i_sysmode = tmp
+$!
+$! Check for sys/access.h
+$!
+$ tmp = "sys/access.h"
+$ GOSUB inhdr
+$ i_sysaccess = tmp
+$!
+$! Check for sys/security.h
+$!
+$ tmp = "sys/security.h"
+$ GOSUB inhdr
+$ i_syssecrt = tmp
+$!
+$! Check for fcntl.h
+$!
+$ tmp = "fcntl.h"
+$ GOSUB inhdr
+$ i_fcntl = tmp
+$!
+$! Check for fcntl
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <fcntl.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "fcntl(1,2,3);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "fcntl"
+$ GOSUB inlibc
+$ d_fcntl = tmp
+$!
+$! Check for memchr
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char * place;"
+$ WS "place = memchr(""foo"", 47, 3)"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "memchr"
+$ GOSUB inlibc
+$ d_memchr = tmp
+$!
+$! Check for strtoull
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "unsigned __int64 result;"
+$ WS "result = strtoull(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtoull"
+$ GOSUB inlibc
+$ d_strtoull = tmp
+$!
+$! Check for strtouq
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "unsigned __int64 result;"
+$ WS "result = strtouq(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtouq"
+$ GOSUB inlibc
+$ d_strtouq = tmp
+$!
+$! Check for strtoll
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "__int64 result;"
+$ WS "result = strtoll(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtoll"
+$ GOSUB inlibc
+$ d_strtoll = tmp
+$!
+$! Check for strtold
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "long double result;"
+$ WS "result = strtold(""123123"", NULL, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "strtold"
+$ GOSUB inlibc
+$ d_strtold = tmp
+$!
+$! Check for atoll
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS " __int64 result;"
+$ WS "result = atoll(""123123"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "atoll"
+$ GOSUB inlibc
+$ d_atoll = tmp
+$!
+$! Check for atolf
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <string.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "long double"
+$ WS "result = atolf(""123123"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "atolf"
+$ GOSUB inlibc
+$ d_atolf = tmp
+$!
+$! Check for access
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "access(""foo"", F_OK);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "acess"
+$ GOSUB inlibc
+$ d_access = tmp
+$!
+$! Check for bzero
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char foo[10];"
+$ WS "bzero(foo, 10);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "bzero"
+$ GOSUB inlibc
+$ d_bzero = tmp
+$!
+$! Check for bcopy
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <strings.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "char foo[10], bar[10];"
+$ WS "bcopy(""foo"", bar, 3);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "bcopy"
+$ GOSUB inlibc
+$ d_bcopy = tmp
+$!
+$! Check for mkstemp
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkstemp(""foo"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkstemp"
+$ GOSUB inlibc
+$ d_mkstemp = tmp
+$!
+$! Check for mkstemps
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkstemps(""foo"", 1);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkstemps"
+$ GOSUB inlibc
+$ d_mkstemps = tmp
+$!
+$! Check for iconv
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "#include <iconv.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "  iconv_t cd = (iconv_t)0;"
+$ WS "  char *inbuf, *outbuf;"
+$ WS "  size_t inleft, outleft;"
+$ WS "  iconv(cd, &inbuf, &inleft, &outbuf, &outleft);"
+$ WS "  exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .ne. good_compile
+$ THEN
+$   d_iconv="undef"
+$   i_iconv="undef"
+$ ELSE
+$   IF link_status .ne. good_link
+$   THEN
+$     d_iconv="undef"
+$     i_iconv="undef"
+$   ELSE
+$     d_iconv="define"
+$     i_iconv="define"
+$   ENDIF
+$ ENDIF
+$ IF i_iconv .eqs. "define" 
+$ THEN echo4 "<iconv.h> found."
+$ ELSE echo4 "<iconv.h> NOT found."
+$ ENDIF
+$!
+$! Check for mkdtemp
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "mkdtemp(""foo"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "mkdtemp"
+$ GOSUB inlibc
+$ d_mkdtemp = tmp
+$!
+$! Check for setvbuf
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "FILE *foo;"
+$ WS "char Buffer[99];"
+$ WS "foo = fopen(""foo"", ""r"");"
+$ WS "setvbuf(foo, Buffer, 0, 0);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setvbuf"
+$ GOSUB inlibc
+$ d_setvbuf = tmp
+$!
+$! Check for setenv
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "setenv(""FOO"", ""BAR"", 0);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setenv"
+$ GOSUB inlibc
+$ d_setenv = tmp
+$!
+$! Check for setproctitle
+$!
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "setproctitle(""%s"", ""FOO"");"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "setproctitle"
+$ GOSUB inlibc
+$ d_setproctitle = tmp
+$!
+$! Check for <netinet/in.h>
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$   tmp = "netinet/in.h"
+$   GOSUB inhdr
+$   i_niin = tmp
+$ ELSE
+$   i_niin="undef"
+$ ENDIF
+$!
+$! Check for <netinet/tcp.h>
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$   tmp = "netinet/tcp.h"
+$   GOSUB inhdr
+$   i_netinettcp = tmp
+$ ELSE
+$   i_netinettcp="undef"
+$ ENDIF
+$!
+$! Check for endhostent
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "endhostent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "endhostent"
+$   GOSUB inlibc
+$   d_endhent = tmp
+$ ELSE
+$   d_endhent="undef"
+$ ENDIF
+$!
+$! Check for endnetent
+$!
+$ IF Has_Dec_C_Sockets .or. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "endnetent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "endnetent"
+$   GOSUB inlibc
+$   d_endnent = tmp
+$ ELSE
+$   d_endnent="undef"
+$ ENDIF
+$!
+$! Check for endprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "endprotoent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "endprotoent"
+$   GOSUB inlibc
+$   d_endpent = tmp
+$ ELSE
+$   d_endpent="undef"
+$ ENDIF
+$!
+$! Check for endservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "endservent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "endservent"
+$   GOSUB inlibc
+$   d_endsent = tmp
+$ ELSE
+$   d_endsent="undef"
+$ ENDIF
+$!
+$! Check for sethostent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "sethostent(1);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "sethostent"
+$   GOSUB inlibc
+$   d_sethent = tmp
+$ ELSE
+$   d_sethent="undef"
+$ ENDIF
+$!
+$! Check for setnetent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "setnetent(1);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "setnetent"
+$   GOSUB inlibc
+$   d_setnent = tmp
+$ ELSE
+$   d_setnent="undef"
+$ ENDIF
+$!
+$! Check for setprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "setprotoent(1);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "setprotoent"
+$   GOSUB inlibc
+$   d_setpent = tmp
+$ ELSE
+$   d_setpent="undef"
+$ ENDIF
+$!
+$! Check for setservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "setservent(1);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "setservent"
+$   GOSUB inlibc
+$   d_setsent = tmp
+$ ELSE
+$   d_setsent="undef"
+$ ENDIF
+$!
+$! Check for gethostent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "gethostent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "gethostent"
+$   GOSUB inlibc
+$   d_gethent = tmp
+$ ELSE
+$   d_gethent="undef"
+$ ENDIF
+$!
+$! Check for getnetent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "getnetent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "getnetent"
+$   GOSUB inlibc
+$   d_getnent = tmp
+$ ELSE
+$   d_getnent="undef"
+$ ENDIF
+$!
+$! Check for getprotoent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "getprotoent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "getprotoent"
+$   GOSUB inlibc
+$   d_getpent = tmp
+$ ELSE
+$   d_getpent="undef"
+$ ENDIF
+$!
+$! Check for getservent
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "getservent();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "getservent"
+$   GOSUB inlibc
+$   d_getsent = tmp
+$ ELSE
+$   d_getsent="undef"
+$ ENDIF
+$!
+$! Check for socklen_t
+$!
+$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
+$ THEN
+$   echo4 "Checking to see if you have socklen_t..."
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   IF Has_Socketshr
+$   THEN WS "#include <socketshr.h>"
+$   ELSE IF i_netdb .EQS. "define" THEN WS "#include <netdb.h>"
+$   ENDIF
+$   WS "int main()"
+$   WS "{"
+$   WS "socklen_t x = 16;"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   GOSUB link_ok
+$   IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$   THEN
+$     d_socklen_t="define"
+$     echo "You have socklen_t."
+$   ELSE
+$     d_socklen_t="undef"
+$     echo "You do not have socklen_t."
+$   ENDIF
+$ ELSE
+$   d_socklen_t="undef"
+$ ENDIF
+$!
+$! Check for pthread_yield
+$!
+$ IF use_threads
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <pthread.h>"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
+$   WS "{"
+$   WS "pthread_yield();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "pthread_yield"
+$   GOSUB inlibc
+$   d_pthread_yield = tmp
+$ ELSE
+$   d_pthread_yield="undef"
+$ ENDIF
+$!
+$! Check for sched_yield
+$!
+$ IF use_threads
+$ THEN
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <pthread.h>"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
+$   WS "{"
+$   WS "sched_yield();"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   tmp = "sched_yield"
+$   GOSUB inlibc
+$   d_sched_yield = tmp
+$   IF d_sched_yield .EQS. "define"
+$   THEN sched_yield = "sched_yield"
+$   ELSE sched_yield = " "
+$   ENDIF
+$ ELSE
+$   d_sched_yield="undef"
+$   sched_yield = " "
+$ ENDIF
+$!
+$! Check for generic pointer size
+$!
+$ echo4 "Checking to see how big your pointers are..." 
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "int foo;"
+$ WS "foo = sizeof(char *);"
+$ WS "printf(""%d\n"", foo);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ tmp = "char *"
+$ GOSUB type_size_check
+$ ptrsize = tmp
+$ echo "Your pointers are ''ptrsize' bytes long."
+$!
+$! Check for size_t size
+$!
+$ tmp = "size_t"
+$ zzz = tmp
+$ echo4 "Checking the size of ''zzz'..."
+$ GOSUB type_size_check
+$ sizesize = tmp
+$ echo "Your ''zzz' size is ''sizesize' bytes."
+$!
+$! Check rand48 and its ilk
+$!
+$ echo4 "Looking for a random number function..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main()"
+$ WS "{"
+$ WS "srand48(12L);"
+$ WS "exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB link_ok
+$ IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$ THEN
+$   drand01 = "drand48()"
+$   randseedtype = "long int"
+$   seedfunc = "srand48"
+$   echo4 "Good, found drand48()."
+$   d_drand48proto = "define"
+$ ELSE
+$   d_drand48proto = "undef"
+$   drand01="random()"
+$   randseedtype = "unsigned"
+$   seedfunc = "srandom"
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "int main()"
+$   WS "{"
+$   WS "srandom(12);"
+$   WS "exit(0);"
+$   WS "}"
+$   CS
+$   GOSUB link_ok
+$   IF compile_status .EQ. good_compile .AND. link_status .EQ. good_link
+$   THEN
+$     echo4 "OK, found random()."
+$   ELSE
+$     drand01="(((float)rand())/((float)RAND_MAX))"
+$     randseedtype = "unsigned"
+$     seedfunc = "srand"
+$     echo4 "Yick, looks like I have to use rand()."
+$   ENDIF
+$ ENDIF
+$! Done with compiler checks. Clean up.
+$ IF F$SEARCH("try.c")  .NES."" THEN DELETE/NOLOG/NOCONFIRM try.c;*
+$ IF F$SEARCH("try.obj").NES."" THEN DELETE/NOLOG/NOCONFIRM try.obj;*
+$ IF F$SEARCH("try.exe").NES."" THEN DELETE/NOLOG/NOCONFIRM try.exe;*
+$ IF F$SEARCH("try.opt").NES."" THEN DELETE/NOLOG/NOCONFIRM try.opt;*
+$ IF F$SEARCH("try.out").NES."" THEN DELETE/NOLOG/NOCONFIRM try.out;*
+$ IF using_cxx
+$ THEN
+$   CALL Cxx_demangler_cleanup
+$ ENDIF
+$!
+$! Some that are compiler or VMS version sensitive
+$!
+$! Gnu C stuff
+$ IF Using_Gnu_C
+$ THEN
+$   d_attribut="define"
+$   vms_cc_type="gcc"
+$ ELSE
+$   vms_cc_type="cc"
+$   d_attribut="undef"
+$ ENDIF
+$!
+$! Dec C >= 5.2 and VMS ver >= 7.0
+$ IF (Using_Dec_C).AND.(F$INTEGER(Dec_C_Version).GE.50200000).AND.(vms_ver .GES. "7.0")
+$ THEN
+$   d_bcmp="define"
+$   d_gettimeod="define"
+$   d_uname="define"
+$   d_sigaction="define"
+$   d_truncate="define"
+$   d_wait4="define"
+$   d_index="define"
+$   pidtype="pid_t"
+$   sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2 SPARE18 SPARE19 CHLD CONT STOP TSTP TTIN TTOU DEBUG SPARE27 SPARE28 SPARE29 SPARE30 SPARE31 SPARE32 RTMIN RTMAX"",0"
+$   psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
+$   psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",""SPARE18"",""SPARE19"",""CHLD"",""CONT"",""STOP"",""TSTP"","
+$   psnwc3="""TTIN"",""TTOU"",""DEBUG"",""SPARE27"",""SPARE28"",""SPARE29"",""SPARE30"",""SPARE31"",""SPARE32"",""RTMIN"",""RTMAX"",0"
+$   sig_name_init = psnwc1 + psnwc2 + psnwc3
+$   sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 64"",0"
+$   sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,64,0"
+$!   perl_sig_num_with_commas=sig_num_init
+$   uidtype="uid_t"
+$   d_pathconf="define"
+$   d_fpathconf="define"
+$   d_sysconf="define"
+$   d_sigsetjmp="define"
+$ ELSE
+$   pidtype="unsigned int"
+$   d_gettimeod="undef"
+$   d_bcmp="undef"
+$   d_uname="undef"
+$   d_sigaction="undef"
+$   d_truncate="undef"
+$   d_wait4="undef"
+$   d_index="undef"
+$   sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2"",0"
+$   psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
+$   psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",0"
+$   sig_name_init = psnwc1 + psnwc2
+$   sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17"",0"
+$   sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,0"
+$!   perl_sig_num_with_commas=sig_num_init
+$   uidtype="unsigned int"
+$   d_pathconf="undef"
+$   d_fpathconf="undef"
+$   d_sysconf="undef"
+$   d_sigsetjmp="undef"
+$ ENDIF
+$!
+$! Dec C alone
+$ IF Using_Dec_C
+$ THEN
+$   d_mbstowcs="define"
+$   d_mbtowc="define"
+$   d_stdiobase="define"
+$   d_stdio_cnt_lval="define"
+$   d_stdio_ptr_lval="define"
+$   d_stdstdio="define"
+$   d_wcstombs="define"
+$   d_mblen="define"
+$   d_mktime="define"
+$   d_strcoll="define"
+$   d_strxfrm="define"
+$   d_wctomb="define"
+$   i_locale="define"
+$   d_locconv="define"
+$   d_setlocale="define"
+$   vms_cc_type="decc"
+$ ELSE
+$   d_mbstowcs="undef"
+$   d_mbtowc="undef"
+$   d_stdiobase="undef"
+$   d_stdio_cnt_lval="undef"
+$   d_stdio_ptr_lval="undef"
+$   d_stdstdio="undef"
+$   d_wcstombs="undef"
+$   d_mblen="undef"
+$   d_mktime="undef"
+$   d_strcoll="undef"
+$   d_strxfrm="undef"
+$   d_wctomb="undef"
+$   i_locale="undef"
+$   d_locconv="undef"
+$   d_setlocale="undef"
+$ ENDIF
+$!
+$! Sockets?
+$ if Has_Socketshr .OR. Has_Dec_C_Sockets
+$ THEN
+$   d_vms_do_sockets="define"
+$   d_htonl="define"
+$   d_socket="define"
+$   d_select="define"
+$   netdb_hlen_type="int"
+$   netdb_host_type="char *"
+$   netdb_name_type="char *"
+$   netdb_net_type="long"
+$   d_gethbyaddr="define"
+$   d_gethbyname="define"
+$   d_getnbyaddr="define"
+$   d_getnbyname="define"
+$   d_getpbynumber="define"
+$   d_getpbyname="define"
+$   d_getsbyport="define"
+$   d_getsbyname="define"
+$   d_gethostprotos="define"
+$   d_getnetprotos="define"
+$   d_getprotoprotos="define"
+$   d_getservprotos="define"
+$   IF Using_Dec_C .OR. using_cxx
+$   THEN
+$     socksizetype="unsigned int"
+$   ELSE
+$     socksizetype="int *"
+$   ENDIF
+$ ELSE
+$   d_vms_do_sockets="undef"
+$   d_htonl="undef"
+$   d_socket="undef"
+$   d_select="undef"
+$   netdb_hlen_type="int"
+$   netdb_host_type="char *"
+$   netdb_name_type="char *"
+$   netdb_net_type="long"
+$   d_gethbyaddr="undef"
+$   d_gethbyname="undef"
+$   d_getnbyaddr="undef"
+$   d_getnbyname="undef"
+$   d_getpbynumber="undef"
+$   d_getpbyname="undef"
+$   d_getsbyport="undef"
+$   d_getsbyname="undef"
+$   d_gethostprotos="undef"
+$   d_getnetprotos="undef"
+$   d_getprotoprotos="undef"
+$   d_getservprotos="undef"
+$   socksizetype="undef"
+$ ENDIF
+$! Threads
+$ IF use_threads
+$ THEN
+$   usethreads="define"
+$   d_pthreads_created_joinable="define"
+$   if (vms_ver .GES. "7.0")
+$   THEN
+$     d_oldpthreads="undef"
+$   ELSE
+$     d_oldpthreads="define"
+$   ENDIF
+$ ELSE
+$   d_oldpthreads="undef"
+$   usethreads="undef"
+$   d_pthreads_created_joinable="undef"
+$ ENDIF
+$! 
+$! new (5.005_62++) typedefs for primitives
+$!
+$ echo "Choosing the C types to be used for Perl's internal types..."
+$ ivtype="long"
+$ uvtype="unsigned long"
+$ i8type="char"
+$ u8type="unsigned char"
+$ i16type="short"
+$ u16type="unsigned short"
+$ i32type="int"
+$ u32type="unsigned int"
+$ i64type="long long"
+$ u64type="unsigned long long"
+$ nvtype="double"
+$!
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$   ivtype = "''i64type'"
+$   uvtype = "''u64type'"
+$   nvtype="long double"
+$ ELSE
+$   i64size="undef"
+$   u64size="undef"
+$ ENDIF
+$!
+$ tmp = "''ivtype'"
+$ GOSUB type_size_check
+$ ivsize = tmp
+$ IF use64bitint .OR. use64bitint .EQS. "define" THEN i64size = tmp
+$ IF ivtype .eqs. "long"
+$ THEN longsize = tmp
+$ ELSE
+$   tmp = "long"
+$   GOSUB type_size_check
+$   longsize = tmp
+$ ENDIF
+$!
+$ tmp = "''uvtype'"
+$ GOSUB type_size_check
+$ uvsize = tmp
+$ IF use64bitint .OR. use64bitint .EQS. "define" THEN u64size = tmp
+$!
+$ tmp = "''i8type'"
+$ GOSUB type_size_check
+$ i8size = tmp
+$!
+$ tmp = "''u8type'"
+$ GOSUB type_size_check
+$ u8size = tmp
+$!
+$ tmp = "''i16type'"
+$ GOSUB type_size_check
+$ i16size = tmp
+$ IF i16type .eqs. "short"
+$ THEN shortsize = tmp
+$ ELSE
+$   tmp = "short"
+$   gosub type_size_check
+$   shortsize = tmp
+$ ENDIF
+$!
+$ tmp = "''u16type'"
+$ GOSUB type_size_check
+$ u16size = tmp
+$!
+$ tmp = "''i32type'"
+$ GOSUB type_size_check
+$ i32size = tmp
+$ IF i32type .eqs. "int"
+$ THEN intsize = tmp
+$ ELSE
+$   tmp = "int"
+$   gosub type_size_check
+$   intsize = tmp
+$ ENDIF
+$!
+$ tmp = "''u32type'"
+$ gosub type_size_check
+$ u32size = tmp
+$!
+$ tmp = "''nvtype'"
+$ GOSUB type_size_check
+$ nvsize = tmp
+$!
+$ echo "(IV will be ""''ivtype'"", ''ivsize' bytes)"
+$ echo "(UV will be ""''uvtype'"", ''uvsize' bytes)"
+$ echo "(NV will be ""''nvtype'"", ''nvsize' bytes)"
+$!
+$ echo4 "Checking whether your NVs can preserve your UVs..."
+$ OS
+$ WS "#if defined(__DECC) || defined(__DECCXX)"
+$ WS "#include <stdlib.h>"
+$ WS "#endif"
+$ WS "#include <stdio.h>"
+$ WS "int main() {"
+$ WS "    ''uvtype' k = (''uvtype')~0, l;"
+$ WS "    ''nvtype' d;"
+$ WS "    l = k;"
+$ WS "    d = (''nvtype')l;"
+$ WS "    l = (''uvtype')d;"
+$ WS "    if (l == k)"
+$ WS "       printf(""preserve\n"");"
+$ WS "    exit(0);"
+$ WS "}"
+$ CS
+$ GOSUB compile
+$ IF tmp .EQS. "preserve"
+$ THEN 
+$   d_nv_preserves_uv = "define"
+$   echo "Yes, they can." 
+$   d_nv_preserves_uv_bits = F$STRING(F$INTEGER(uvsize) * 8)
+$ ELSE
+$   d_nv_preserves_uv = "undef"
+$   echo "No, they can't."
+$   echo4 "Checking how many bits of your UVs your NVs can preserve..."
+$   OS
+$   WS "#if defined(__DECC) || defined(__DECCXX)"
+$   WS "#include <stdlib.h>"
+$   WS "#endif"
+$   WS "#include <stdio.h>"
+$   WS "int main() {"
+$   WS "    ''uvtype' u = 0;"
+$   WS "    int     n = 8 * ''uvsize';"
+$   WS "    int     i;"
+$   WS "    for (i = 0; i < n; i++) {"
+$   WS "      u = u << 1 | (''uvtype')1;"
+$   WS "      if ((''uvtype')(''nvtype')u != u)"
+$   WS "        break;"
+$   WS "    }"
+$   WS "    printf(""%d\n"", i);"
+$   WS "    exit(0);"
+$   WS "}"
+$   GOSUB compile
+$   d_nv_preserves_uv_bits = tmp
+$ ENDIF
+$ DELETE/SYMBOL tmp
+$!
+$ ivdformat="""ld"""
+$ uvuformat="""lu"""
+$ uvoformat="""lo"""
+$ uvxformat="""lx"""
+$! uselongdouble?
+$ nveformat="""e"""
+$ nvfformat="""f"""
+$ nvgformat="""g"""
+$! 
+$! Finally the composite ones. All config
+$!
+$ myuname="''osname' ''myname' ''osvers' ''F$EDIT(hwname, "TRIM")'"
+$!
+$ IF Using_Dec_C .AND. (.NOT. using_cxx)
+$ THEN
+$   ccflags="/Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
+$ ENDIF
+$ i_dirent = "undef"
+$ IF using_cxx
+$ THEN
+$   i_dirent = "define"
+$   ccflags="/Include=[]/Standard=ANSI/Prefix=All/Obj=''obj_ext'/NoList''ccflags'"
+$ ENDIF
+$ IF use_vmsdebug_perl
+$ THEN
+$   optimize="/Debug/NoOpt"
+$   dbgprefix = "DBG"
+$ ELSE
+$   optimize= ""
+$   dbgprefix = ""
+$ ENDIF
+$!
+$! Okay, we've got everything configured. Now go write out a config.sh.
+$ basename_config_sh = F$PARSE(config_sh,,,"NAME",)+F$PARSE(config_sh,,,"TYPE",)
+$ echo4 "Creating ''basename_config_sh'..."
+$ open/write CONFIG 'config_sh'
+$ WC := write CONFIG
+$!
+$! ##BEGIN WRITE NEW CONSTANTS HERE##
+$!
+$ WC "#!/bin/sh"
+$ WC "#"
+$ WC "# This file was produced by Configure.COM on a ''osname' system."
+$ WC "#"
+$ WC "# Package name      : ''package'"
+$ WC "# Source directory  : ''src'"
+$ WC "# Configuration time: " + cf_time
+$ WC "# Configuration by  : " + cf_by
+$ WC "# Target system     : " + myuname
+$ WC ""
+$ WC "CONFIG='true'"
+$ WC "Makefile_SH='" + Makefile_SH + "'"
+$ WC "Mcc='" + Mcc + "'"
+$! WC "PERL_SUBVERSION='" + subversion + "'" ! VMS specific to descrip_mms.template
+$ WC "PERL_VERSION='" + patchlevel + "'" ! VMS specific to descrip_mms.template
+$ WC "alignbytes='" + alignbytes + "'"
+$ WC "aphostname='" + "'"
+$ WC "ar='" + "'"
+$ WC "archlib='" + archlib + "'"
+$ WC "archlibexp='" + archlibexp + "'"
+$ WC "archname='" + archname + "'"
+$ WC "baserev='" + baserev + "'"
+$ WC "bin='" + bin + "'"
+$ WC "binexp='" + binexp + "'"
+$ WC "builddir='" + builddir + "'"
+$ WC "byteorder='1234'"
+$ WC "castflags='0'"
+$ WC "cc='" + perl_cc + "'"
+$ WC "cccdlflags='" + cccdlflags + "'"
+$ WC "ccdlflags='" + ccdlflags + "'"
+$ WC "ccflags='" + ccflags + "'"
+$ WC "ccversion='" + ccversion + "'"
+$ WC "cf_by='" + cf_by + "'"
+$ WC "cf_email='" + cf_email + "'"
+$ WC "cf_time='" + cf_time + "'"
+$ WC "config_args='" + config_args + "'"
+$ WC "config_sh='" + config_sh + "'"
+$ WC "cpp_stuff='" + cpp_stuff + "'"
+$ WC "cpplast='" + cpplast + "'"
+$ WC "cppminus='" + cppminus + "'"
+$ WC "cpprun='" + cpprun + "'"
+$ WC "cppstdin='" + cppstdin + "'"
+$ WC "crosscompile='undef'"
+$ WC "d_Gconvert='my_gconvert(x,n,t,b)'"
+$ WC "d_PRId64='" + d_PRId64 + "'"
+$ WC "d_PRIEldbl='" + d_PRIEUldbl + "'"
+$ WC "d_PRIFldbl='" + d_PRIFUldbl + "'"
+$ WC "d_PRIGldbl='" + d_PRIGUldbl + "'"
+$ WC "d_PRIX64='" + d_PRIXU64 + "'"
+$ WC "d_PRIeldbl='" + d_PRIeldbl + "'"
+$ WC "d_PRIfldbl='" + d_PRIfldbl + "'"
+$ WC "d_PRIgldbl='" + d_PRIgldbl + "'"
+$ WC "d_PRIo64='" + d_PRIo64 + "'"
+$ WC "d_PRIu64='" + d_PRIu64 + "'"
+$ WC "d_PRIx64='" + d_PRIx64 + "'"
+$ WC "d_SCNfldbl='" + d_SCNfldbl + "'"
+$ WC "d_access='" + d_access + "'"
+$ WC "d_accessx='undef'"
+$ WC "d_alarm='define'"
+$ WC "d_archlib='define'"
+$ WC "d_atolf='" + d_atolf + "'"
+$ WC "d_atoll='" + d_atoll + "'"
+$ WC "d_attribut='" + d_attribut + "'"
+$ WC "d_bcmp='" + d_bcmp + "'"
+$ WC "d_bcopy='" + d_bcopy + "'"
+$ WC "d_bincompat3='undef'"
+$ WC "d_bincompat5005='undef'"
+$ WC "d_bsdgetpgrp='undef'"
+$! WC "d_bsdpgrp='undef'"
+$ WC "d_bsdsetpgrp='undef'"
+$ WC "d_bzero='" + d_bzero + "'"
+$ WC "d_casti32='define'"
+$ WC "d_castneg='define'"
+$ WC "d_charvspr='undef'"
+$ WC "d_chown='define'"
+$ WC "d_chroot='undef'"
+$ WC "d_chsize='undef'"
+$ WC "d_cmsghdr_s='undef'"
+$ WC "d_const='define'"
+$ WC "d_crypt='define'"
+$ WC "d_csh='undef'"
+$ WC "d_cuserid='define'"
+$ WC "d_dbl_dig='define'"
+$ WC "d_difftime='define'"
+$ WC "d_dirnamlen='define'"
+$ WC "d_dlerror='undef'"
+$ WC "d_dlsymun='undef'"
+$ WC "d_dosuid='undef'"
+$ WC "d_drand48proto='" + d_drand48proto + "'"
+$ WC "d_dup2='define'"
+$ WC "d_eaccess='undef'"
+$ WC "d_endgrent='define'"
+$ WC "d_endhent='" + d_endhent + "'"
+$ WC "d_endnent='" + d_endnent + "'"
+$ WC "d_endpent='" + d_endpent + "'"
+$ WC "d_endpwent='define'"
+$ WC "d_endsent='" + d_endsent + "'"
+$ WC "d_eofnblk='undef'"
+$ WC "d_eunice='undef'"
+$ WC "d_fchmod='undef'"
+$ WC "d_fchown='undef'"
+$ WC "d_fcntl='" + d_fcntl + "'"
+$ WC "d_fd_set='" + d_fd_set + "'"
+$ WC "d_fgetpos='define'"
+$ WC "d_flexfnam='define'"
+$ WC "d_flock='undef'"
+$ WC "d_fork='undef'"
+$ WC "d_fpathconf='" + d_fpathconf + "'"
+$ WC "d_fpos64_t='" + d_fpos64_t + "'"
+$ WC "d_frexpl='" + d_frexpl + "'"
+$ WC "d_fs_data_s='undef'"
+$ WC "d_fseeko='undef'"
+$ WC "d_fsetpos='define'"
+$ WC "d_fstatfs='undef'"
+$ WC "d_fstatvfs='undef'"
+$ WC "d_ftello='undef'"
+$ WC "d_getcwd='undef'"
+$ WC "d_getespwnam='undef'"
+$ WC "d_getfsstat='undef'"
+$ WC "d_getgrent='define'"
+$ WC "d_getgrps='undef'"
+$ WC "d_gethbyaddr='" + d_gethbyaddr + "'"
+$ WC "d_gethbyname='" + d_gethbyname + "'"
+$ WC "d_gethent='" + d_gethent + "'"
+$ WC "d_gethname='" + d_gethname + "'"
+$ WC "d_gethostprotos='" + d_gethostprotos + "'"
+$ WC "d_getlogin='define'"
+$ WC "d_getmnt='undef'"
+$ WC "d_getmntent='undef'"
+$ WC "d_getnbyaddr='" + d_getnbyaddr + "'"
+$ WC "d_getnbyname='" + d_getnbyname + "'"
+$ WC "d_getnent='" + d_getnent + "'"
+$ WC "d_getnetprotos='" + d_getnetprotos + "'"
+$ WC "d_getpbyname='" + d_getpbyname + "'"
+$ WC "d_getpbynumber='" + d_getpbynumber + "'"
+$ WC "d_getpent='" + d_getpent + "'"
+$ WC "d_getpgid='undef'"
+$ WC "d_getpgrp2='undef'"
+$ WC "d_getpgrp='undef'"
+$ WC "d_getppid='undef'"
+$ WC "d_getprior='undef'"
+$ WC "d_getprotoprotos='" + d_getprotoprotos + "'"
+$ WC "d_getprpwnam='undef'"
+$ WC "d_getpwent='define'"
+$ WC "d_getsbyname='" + d_getsbyname + "'"
+$ WC "d_getsbyport='" + d_getsbyport + "'"
+$ WC "d_getsent='" + d_getsent + "'"
+$ WC "d_getservprotos='" + d_getservprotos + "'"
+$ WC "d_getspnam='undef'"
+$ WC "d_gettimeod='" + d_gettimeod + "'"
+$ WC "d_gnulibc='undef'"
+$ WC "d_grpasswd='undef'"
+$ WC "d_hasmntopt='undef'"
+$ WC "d_htonl='" + d_htonl + "'"
+$ WC "d_iconv='" + d_iconv +"'"
+$ WC "d_index='" + d_index + "'"
+$ WC "d_inetaton='undef'"
+$ WC "d_int64_t='" + d_int64_t + "'"
+$ WC "d_isascii='define'"
+$ WC "d_isnan='" + d_isnan + "'"
+$ WC "d_isnanl='" + d_isnanl + "'"
+$ WC "d_killpg='undef'"
+$ WC "d_lchown='undef'"
+$ WC "d_ldbl_dig='define'"
+$ WC "d_link='undef'"
+$ WC "d_llseek='undef'"
+$ WC "d_locconv='" + d_locconv + "'"
+$ WC "d_lockf='undef'"
+$ WC "d_longdbl='" + d_longdbl + "'"
+$ WC "d_longlong='" + d_longlong + "'"
+$ WC "d_lseekproto='define'"
+$ WC "d_lstat='undef'"
+$ WC "d_madvise='undef'"
+$ WC "d_mblen='" + d_mblen + "'"
+$ WC "d_mbstowcs='" + d_mbstowcs + "'"
+$ WC "d_mbtowc='" + d_mbtowc + "'"
+$ WC "d_memchr='" + d_memchr + "'"
+$ WC "d_memcmp='define'"
+$ WC "d_memcpy='define'"
+$ WC "d_memmove='define'"
+$ WC "d_memset='define'"
+$ WC "d_mkdir='define'"
+$ WC "d_mkdtemp='" + d_mkdtemp + "'"
+$ WC "d_mkfifo='undef'"
+$ WC "d_mknod='undef'"
+$ WC "d_mkstemp='" + d_mkstemp + "'"
+$ WC "d_mkstemps='" + d_mkstemps + "'"
+$ WC "d_mktime='" + d_mktime + "'"
+$ WC "d_mmap='undef'"
+$ WC "d_modfl='" + d_modfl + "'"
+$ WC "d_mprotect='undef'"
+$ WC "d_msg='undef'"
+$ WC "d_msg_ctrunc='undef'"
+$ WC "d_msg_dontroute='undef'"
+$ WC "d_msg_oob='undef'"
+$ WC "d_msg_peek='undef'"
+$ WC "d_msg_proxy='undef'"
+$ WC "d_msghdr_s='undef'"
+$ WC "d_msync='undef'"
+$ WC "d_munmap='undef'"
+$ WC "d_mymalloc='" + d_mymalloc + "'"
+$ WC "d_nice='define'"
+$ WC "d_nv_preserves_uv='" + d_nv_preserves_uv + "'"
+$ WC "d_nv_preserves_uv_bits='" + d_nv_preserves_uv_bits + "'"
+$ WC "d_off64_t='" + d_off64_t + "'"
+$ WC "d_old_pthread_create_joinable='" + d_old_pthread_create_joinable + "'"
+$ WC "d_oldarchlib='define'"
+$ WC "d_oldpthreads='" + d_oldpthreads + "'"
+$ WC "d_open3='define'"
+$ WC "d_pathconf='" + d_pathconf + "'"
+$ WC "d_pause='define'"
+$ WC "d_perl_otherlibdirs='undef'"
+$ WC "d_phostname='undef'"
+$ WC "d_pipe='define'"
+$ WC "d_poll='undef'"
+$ WC "d_pthread_yield='" + d_pthread_yield + "'"
+$ WC "d_pthreads_created_joinable='" + d_pthreads_created_joinable + "'"
+$ WC "d_pwage='undef'"
+$ WC "d_pwchange='undef'"
+$ WC "d_pwclass='undef'"
+$ WC "d_pwcomment='define'"
+$ WC "d_pwexpire='undef'"
+$ WC "d_pwgecos='define'"
+$ WC "d_pwpasswd='define'"
+$ WC "d_pwquota='undef'"
+$ WC "d_qgcvt='undef'"
+$ WC "d_quad='" + d_quad + "'"
+$ WC "d_readdir='define'"
+$ WC "d_readlink='undef'"
+$ WC "d_readv='undef'"
+$ WC "d_recvmsg='undef'"
+$ WC "d_rename='define'"
+$ WC "d_rewinddir='define'"
+$ WC "d_rmdir='define'"
+$ WC "d_safebcpy='undef'"
+$ WC "d_safemcpy='define'"
+$ WC "d_sanemcmp='define'"
+$ WC "d_sched_yield='" + d_sched_yield + "'"
+$ WC "d_scm_rights='undef'"
+$ WC "d_seekdir='define'"
+$ WC "d_select='" + d_select + "'"
+$ WC "d_sem='undef'"
+$ WC "d_semctl_semid_ds='undef'"
+$ WC "d_semctl_semun='undef'"
+$ WC "d_sendmsg='undef'"
+$ WC "d_setegid='undef'"
+$ WC "d_setenv='" + d_setenv + "'"
+$ WC "d_seteuid='undef'"
+$ WC "d_setgrent='undef'"
+$ WC "d_setgrps='undef'"
+$ WC "d_sethent='" + d_sethent + "'"
+$ WC "d_setlinebuf='undef'"
+$ WC "d_setlocale='" + d_setlocale + "'"
+$ WC "d_setnent='" + d_setnent + "'"
+$ WC "d_setpent='" + d_setpent + "'"
+$ WC "d_setpgid='undef'"
+$ WC "d_setpgrp2='undef'"
+$ WC "d_setpgrp='undef'"
+$ WC "d_setprior='undef'"
+$ WC "d_setproctitle='" + d_setproctitle + "'"
+$ WC "d_setpwent='define'"
+$ WC "d_setregid='undef'"
+$ WC "d_setresgid='undef'"
+$ WC "d_setresuid='undef'"
+$ WC "d_setreuid='undef'"
+$ WC "d_setrgid='undef'"
+$ WC "d_setruid='undef'"
+$ WC "d_setsent='" + d_setsent + "'"
+$ WC "d_setsid='undef'"
+$ WC "d_setvbuf='" + d_setvbuf + "'"
+$ WC "d_sfio='undef'"
+$ WC "d_shm='undef'"
+$ WC "d_shmatprototype='undef'"
+$ WC "d_sigaction='" + d_sigaction + "'"
+$ WC "d_sigsetjmp='" + d_sigsetjmp + "'"
+$ WC "d_socket='" + d_socket + "'"
+$ WC "d_socklen_t='" + d_socklen_t + "'"
+$ WC "d_sockpair='undef'"
+$ WC "d_socks5_init='undef'"
+$ WC "d_sqrtl='define'"
+$ WC "d_statblks='undef'"
+$ WC "d_statfs_f_flags='undef'"
+$ WC "d_statfs_s='undef'"
+$ WC "d_statfsflags='undef'"
+$ WC "d_stdio_cnt_lval='" + d_stdio_cnt_lval + "'"
+$ WC "d_stdio_ptr_lval='" + d_stdio_ptr_lval + "'"
+$ WC "d_stdio_stream_array='undef'"
+$ WC "d_stdiobase='" + d_stdiobase + "'"
+$ WC "d_stdstdio='" + d_stdstdio + "'"
+$ WC "d_strchr='define'"
+$ WC "d_strcoll='" + d_strcoll + "'"
+$ WC "d_strctcpy='define'"
+$ WC "d_strerrm='strerror((e),vaxc$errno)'"
+$ WC "d_strerror='define'"
+$ WC "d_strtod='define'"
+$ WC "d_strtol='define'"
+$ WC "d_strtold='" + d_strtold + "'"
+$ WC "d_strtoll='" + d_strtoll + "'"
+$ WC "d_strtoul='define'"
+$ WC "d_strtoull='" + d_strtoull + "'"
+$ WC "d_strtouq='" + d_strtouq + "'"
+$ WC "d_strxfrm='" + d_strxfrm  + "'"
+$ WC "d_suidsafe='undef'"
+$ WC "d_symlink='undef'"
+$ WC "d_syscall='undef'"
+$ WC "d_sysconf='" + d_sysconf + "'"
+$ WC "d_syserrlst='undef'"
+$ WC "d_system='define'"
+$ WC "d_tcgetpgrp='undef'"
+$ WC "d_tcsetpgrp='undef'"
+$ WC "d_telldir='define'"
+$ WC "d_telldirproto='define'"
+$ WC "d_times='define'"
+$ WC "d_truncate='" + d_truncate + "'"
+$ WC "d_tzname='undef'"
+$ WC "d_umask='define'"
+$ WC "d_uname='" + d_uname + "'"
+$ WC "d_union_semun='undef'"
+$ WC "d_unlink_all_versions='undef'"
+$ WC "d_ustat='undef'"
+$ WC "d_vendorarch='undef'"
+$ WC "d_vendorlib='undef'"
+$ WC "d_vfork='define'"
+$ WC "d_vms_case_sensitive_symbols='" + d_vms_be_case_sensitive + "'" ! VMS
+$ WC "d_vms_do_sockets='" + d_vms_do_sockets + "'" ! VMS
+$ WC "d_void_closedir='define'"
+$ WC "d_volatile='define'"
+$ WC "d_vprintf='define'"
+$ WC "d_wait4='" + d_wait4 + "'"
+$ WC "d_waitpid='define'"
+$ WC "d_wcstombs='" + d_wcstombs + "'"
+$ WC "d_wctomb='" + d_wctomb + "'"
+$ WC "d_writev='undef'"
+$ WC "db_hashtype=' '"
+$ WC "db_prefixtype=' '"
+$ WC "dbgprefix='" + dbgprefix + "'"
+$ WC "defvoidused='15'"
+$ WC "devtype='" + devtype + "'"
+$ WC "direntrytype='struct dirent'"
+$ WC "dlext='" + dlext + "'"
+$ WC "dlobj='" + dlobj + "'"
+$ WC "dlsrc='dl_vms.c'"
+$ WC "doublesize='" + doublesize + "'"
+$ WC "drand01='" + drand01 + "'"
+$ WC "dynamic_ext='" + extensions + "'"
+$ WC "eagain=' '"
+$ WC "ebcdic='undef'"
+$ WC "eunicefix=':'"
+$ WC "exe_ext='" + exe_ext + "'"
+$ WC "extensions='" + extensions + "'"
+$ WC "fflushNULL='define'"
+$ WC "fflushall='undef'"
+$ WC "fpostype='fpos_t'"
+$ WC "freetype='void'"
+$ WC "full_ar='" + "'"
+$ WC "full_csh='" + " '"
+$ WC "full_sed='_NLA0:'"
+$ WC "gccversion='" + gccversion + "'"
+$ WC "gidformat='lu'"
+$ WC "gidsign='1'"
+$ WC "gidsize='4'"
+$ WC "gidtype='" + gidtype + "'"
+$ WC "groupstype='Gid_t'"
+$ WC "hint='none'"
+$ WC "hintfile='" + "'"
+$ WC "i16size='" + i16size + "'"
+$ WC "i16type='" + i16type + "'"
+$ WC "i32size='" + i32size + "'"
+$ WC "i32type='" + i32type + "'"
+$ WC "i64size='" + i64size + "'"
+$ WC "i64type='" + i64type + "'"
+$ WC "i8size='" + i8size + "'"
+$ WC "i8type='" + i8type + "'"
+$ WC "i_arpainet='undef'"
+$ WC "i_dbm='undef'"
+$ WC "i_dirent='" + i_dirent + "'"
+$ WC "i_dlfcn='undef'"
+$ WC "i_fcntl='" + i_fcntl + "'"
+$ WC "i_float='define'"
+$ WC "i_grp='undef'"
+$ WC "i_iconv='" + i_iconv +"'"
+$ WC "i_ieeefp='undef'"
+$ WC "i_inttypes='" + i_inttypes + "'"
+$ WC "i_libutil='" + i_libutil + "'"
+$ WC "i_limits='define'"
+$ WC "i_locale='" + i_locale + "'"
+$ WC "i_machcthr='undef'"
+$ WC "i_machcthreads='undef'"
+$ WC "i_math='define'"
+$ WC "i_memory='undef'"
+$ WC "i_mntent='undef'"
+$ WC "i_ndbm='undef'"
+$ WC "i_netdb='" + i_netdb + "'"
+$ WC "i_neterrno='define'"
+$ WC "i_netinettcp='" + i_netinettcp + "'"
+$ WC "i_niin='" + i_niin + "'"
+$ WC "i_poll='" + i_poll + "'"
+$ WC "i_prot='undef'"
+$ WC "i_pthread='define'"
+$ WC "i_pwd='undef'"
+$ WC "i_rpcsvcdbm='undef'"
+$ WC "i_sfio='undef'"
+$ WC "i_sgtty='undef'"
+$ WC "i_shadow='" + i_shadow + "'"
+$ WC "i_socks='" + i_socks + "'"
+$ WC "i_stdarg='define'"
+$ WC "i_stddef='define'"
+$ WC "i_stdlib='define'"
+$ WC "i_string='define'"
+$ WC "i_sunmath='undef'"
+$ WC "i_sysaccess='" + i_sysaccess + "'"
+$ WC "i_sysdir='undef'"
+$ WC "i_sysfile='" + i_sysfile + "'"
+$ WC "i_sysioctl='undef'"
+$ WC "i_syslog='" + i_syslog + "'"
+$ WC "i_sysmman='undef'"
+$ WC "i_sysmode='" + i_sysmode + "'"
+$ WC "i_sysmount='undef'"
+$ WC "i_sysndir='undef'"
+$ WC "i_sysparam='undef'"
+$ WC "i_sysresrc='undef'"
+$ WC "i_syssecrt='" + i_syssecrt + "'"
+$ WC "i_sysselct='undef'"
+$ WC "i_sysstat='define'"
+$ WC "i_sysstatfs='undef'"
+$ WC "i_sysstatvfs='undef'"
+$ WC "i_systime='undef'"
+$ WC "i_systimek='undef'"
+$ WC "i_systimes='undef'"
+$ WC "i_systypes='define'"
+$ WC "i_sysuio='" + i_sysuio + "'"
+$ WC "i_sysun='undef'"
+$ WC "i_sysutsname='" + i_sysutsname + "'"
+$ WC "i_sysvfs='undef'"
+$ WC "i_syswait='undef'"
+$ WC "i_termio='undef'"
+$ WC "i_termios='undef'"
+$ WC "i_time='define'"
+$ WC "i_unistd='" + i_unistd + "'"
+$ WC "i_ustat='undef'"
+$ WC "i_utime='undef'"
+$ WC "i_values='undef'"
+$ WC "i_varargs='undef'"
+$ WC "i_vfork='undef'"
+$ WC "inc_version_list='0'"
+$ WC "inc_version_list_init='0'"
+$ WC "installarchlib='" + installarchlib + "'"
+$ WC "installbin='" + installbin + "'"
+$ WC "installman1dir='" + installman1dir + "'"
+$ WC "installman3dir='" + installman3dir + "'"
+$ WC "installprivlib='" + installprivlib + "'"
+$ WC "installscript='" + installscript + "'"
+$ WC "installsitearch='" + installsitearch + "'"
+$ WC "installsitelib='" + installsitelib + "'"
+$ WC "installusrbinperl='undef'"
+$ WC "intsize='" + intsize + "'"
+$ WC "ivdformat='" + ivdformat + "'"
+$ WC "ivsize='" + ivsize + "'"
+$ WC "ivtype='" + ivtype + "'"
+$ WC "known_extensions='" + known_extensions + "'"
+$ WC "ld='" + ld + "'"
+$ WC "lddlflags='/Share'"
+$ WC "ldflags='/NoTrace/NoMap'"
+$ WC "lib_ext='" + lib_ext + "'"
+$ WC "libc='" + libc + "'"
+$ WC "libpth='/sys$share /sys$library'"
+$ WC "libs='" + libs + "'"
+$ WC "longdblsize='" + longdblsize + "'"
+$ WC "longlongsize='" + longlongsize + "'"
+$ WC "longsize='" + longsize + "'"
+$ WC "lseeksize='4'"
+$ WC "lseektype='int'"
+$ WC "mab='" + "'"
+$ WC "make='" + make + "'"
+$ WC "malloctype='void *'"
+$ WC "man1ext='rno'"
+$ WC "man3ext='rno'"
+$ WC "mmaptype=' " + "'"
+$ WC "modetype='unsigned int'"
+$ WC "multiarch='undef'"
+$ WC "mydomain='" + mydomain + "'"
+$ WC "myhostname='" + myhostname + "'"
+$ WC "myuname='" + myuname + "'"
+$ WC "netdb_hlen_type='" + netdb_hlen_type + "'"
+$ WC "netdb_host_type='" + netdb_host_type + "'"
+$ WC "netdb_name_type='" + netdb_name_type + "'"
+$ WC "netdb_net_type='" + netdb_net_type + "'"
+$ WC "nveformat='" + nveformat + "'"
+$ WC "nvfformat='" + nvfformat + "'"
+$ WC "nvgformat='" + nvgformat + "'"
+$ WC "nvsize='" + nvsize + "'"
+$ WC "nvtype='" + nvtype + "'"
+$ WC "o_nonblock=' '"
+$ WC "obj_ext='" + obj_ext + "'"
+$ WC "old_pthread_create_joinable='" + old_pthread_create_joinable + "'"
+$ WC "oldarchlib='" + oldarchlib + "'"
+$ WC "oldarchlibexp='" + oldarchlibexp + "'"
+$ WC "optimize='" + optimize + "'"
+$ WC "osname='" + osname + "'"
+$ WC "osvers='" + osvers + "'"
+$ WC "otherlibdirs='" + "'"
+$ WC "package='" + package + "'"
+$ WC "pager='" + pager + "'"
+$ WC "patchlevel='" + patchlevel + "'"
+$ WC "path_sep='|'"
+$ WC "perl_root='" + perl_root + "'" ! VMS specific $trnlnm()
+$ WC "perladmin='" + perladmin + "'"
+$ WC "perllibs='" + perllibs + "'"
+$ WC "pgflquota='" + pgflquota + "'"
+$ WC "pidtype='" + pidtype + "'"
+$ WC "pm_apiversion='" + version + "'"
+$! WC "prefix='" + vms_prefix + "'"
+$ WC "prefix='" + prefix + "'"
+$ WC "privlib='" + privlib + "'"
+$ WC "privlibexp='" + privlibexp + "'"
+$ WC "prototype='define'"
+$ WC "ptrsize='" + ptrsize + "'"
+$ WC "quadkind='" + quadkind + "'"
+$ WC "quadtype='" + quadtype + "'" 
+$ WC "randbits='31'"
+$ WC "randseedtype='" + randseedtype + "'"
+$ WC "ranlib='" + "'"
+$ WC "rd_nodata=' '"
+$ WC "revision='" + revision + "'"
+$ WC "sPRId64='" + sPRId64 + "'"
+$ WC "sPRIEldbl='" + sPRIEUldbl + "'"
+$ WC "sPRIFldbl='" + sPRIFUldbl + "'"
+$ WC "sPRIGldbl='" + sPRIGUldbl + "'"
+$ WC "sPRIX64='" + sPRIXU64 + "'"
+$ WC "sPRIeldbl='" + sPRIeldbl + "'"
+$ WC "sPRIfldbl='" + sPRIfldbl + "'"
+$ WC "sPRIgldbl='" + sPRIgldbl + "'"
+$! WC "sPRIi64='" + sPRIi64 + "'"
+$ WC "sPRIo64='" + sPRIo64 + "'"
+$ WC "sPRIu64='" + sPRIu64 + "'"
+$ WC "sPRIx64='" + sPRIx64 + "'"
+$ WC "sSCNfldbl='" + sSCNfldbl + "'"
+$ WC "sched_yield='" + sched_yield + "'"
+$ WC "seedfunc='" + seedfunc + "'"
+$ WC "selectminbits='32'"
+$ WC "selecttype='" + selecttype + "'"
+$ WC "sh='MCR'"
+$ WC "shmattype='" + "'"
+$ WC "shortsize='" + shortsize + "'"
+$ WC "shrplib='define'"
+$ WC "sig_name='" + sig_name + "'"
+$ tmp = "sig_name_init='" + sig_name_init + "'"
+$ WC/symbol tmp
+$ DELETE/SYMBOL tmp
+$ WC "sig_num='" + sig_num + "'"
+$ WC "sig_num_init='" + sig_num_init + "'"
+$ WC "signal_t='" + signal_t + "'"
+$ WC "sitearch='" + sitearch + "'"
+$ WC "sitearchexp='" + sitearchexp + "'"
+$ WC "sitelib='" + sitelib + "'"
+$ WC "sitelib_stem='" + sitelib_stem + "'"
+$ WC "sitelibexp='" + sitelibexp + "'"
+$ WC "sizesize='" + sizesize + "'"
+$ WC "sizetype='size_t'"
+$ WC "so='" + so + "'"
+$ WC "socksizetype='" + socksizetype + "'"
+$ WC "spitshell='write sys$output '"
+$ WC "src='" + src + "'"
+$ WC "ssizetype='int'"
+$ WC "startperl=" + startperl ! This one's special--no enclosing single quotes
+$ WC "static_ext='" + "'"
+$ WC "stdchar='" + stdchar + "'"
+$ WC "stdio_base='((*fp)->_base)'"
+$ WC "stdio_bufsiz='((*fp)->_cnt + (*fp)->_ptr - (*fp)->_base)'"
+$ WC "stdio_cnt='((*fp)->_cnt)'"
+$ WC "stdio_ptr='((*fp)->_ptr)'"
+$ WC "stdio_stream_array=' " + "'"
+$ WC "subversion='" + subversion + "'"
+$ WC "timetype='" + timetype + "'"
+$ WC "u16size='" + u16size + "'"
+$ WC "u16type='" + u16type + "'"
+$ WC "u32size='" + u32size + "'"
+$ WC "u32type='" + u32type + "'"
+$ WC "u64size='" + u64size + "'"
+$ WC "u64type='" + u64type + "'"
+$ WC "u8size='" + u8size + "'"
+$ WC "u8type='" + u8type + "'"
+$ WC "uidformat='lu'"
+$ WC "uidsign='1'"
+$ WC "uidsize='4'"
+$ WC "uidtype='" + uidtype + "'"
+$ WC "uquadtype='" + uquadtype + "'" 
+$ WC "use5005threads='" + use5005threads + "'"
+$ WC "use64bitall='" + use64bitall + "'"
+$ WC "use64bitint='" + use64bitint + "'"
+$ WC "usedl='" + usedl + "'"
+$ WC "useithreads='" + useithreads + "'"
+$ WC "uselargefiles='" + uselargefiles + "'"
+$ WC "uselongdouble='" + uselongdouble + "'"
+$ WC "usemorebits='" + usemorebits + "'"
+$ WC "usemultiplicity='" + usemultiplicity + "'"
+$ WC "usemymalloc='" + usemymalloc + "'"
+$ WC "useperlio='undef'"
+$ WC "useposix='false'"
+$ WC "usesocks='undef'"
+$ WC "usethreads='" + usethreads + "'"
+$ WC "usevfork='true'"
+$ WC "uvoformat='" + uvoformat + "'"
+$ WC "uvsize='" + uvsize + "'"
+$ WC "uvtype='" + uvtype + "'"
+$ WC "uvuformat='" + uvuformat + "'"
+$ WC "uvxformat='" + uvxformat + "'"
+$ WC "vendorarchexp='" + "'"
+$ WC "vendorlib_stem='" + "'"
+$ WC "vendorlibexp='" + "'"
+$ WC "version='" + version + "'"
+$ WC "vms_cc_type='" + vms_cc_type + "'" ! VMS specific
+$ WC "vms_prefix='" + vms_prefix + "'" ! VMS specific
+$ WC "vms_ver='" + vms_ver + "'" ! VMS specific
+$ WC "voidflags='15'"
+$ WC "xs_apiversion='" + version + "'"
+$ WC "CONFIGDOTSH='true'"
+$!
+$! ##END WRITE NEW CONSTANTS HERE##
+$!
+$ CLOSE CONFIG
+$!
+$! Okay, we've gotten here. Build munchconfig.exe
+$ COPY/NOLOG [-.vms]munchconfig.c []
+$ COPY/NOLOG [-.vms]'Makefile_SH' []
+$ 'Perl_CC' munchconfig.c
+$ IF Needs_Opt
+$ THEN
+$   OPEN/WRITE CONFIG []munchconfig.opt
+$   IF Using_Gnu_C
+$   THEN
+$     WRITE CONFIG "Gnu_CC:[000000]gcclib.olb/library"
+$   ENDIF
+$   WRITE CONFIG "Sys$Share:VAXCRTL/Share"
+$   CLOSE CONFIG
+$   'ld' munchconfig.obj,munchconfig.opt/opt
+$   DELETE/NOLOG/NOCONFIRM munchconfig.opt;
+$ ELSE
+$   'ld' munchconfig.obj
+$ ENDIF
+$ IF F$SEARCH("munchconfig.obj") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.obj;
+$ IF F$SEARCH("munchconfig.c") .NES. "" THEN DELETE/NOLOG/NOCONFIRM munchconfig.c;
+$ IF using_cxx
+$ THEN
+$   CALL Cxx_demangler_cleanup
+$ ENDIF
+$!
+$ IF alldone .EQS. ""
+$ THEN
+$   cat4 SYS$INPUT:
+$   DECK
+
+If you'd like to make any changes to the config.sh file before I begin
+to configure things, answer yes to the following question.
+
+$   EOD
+$   dflt="n"
+$   rp="Do you wish to edit ''basename_config_sh'? [''dflt'] "
+$   GOSUB myread
+$   IF ans .EQS. "" then ans = dflt
+$   IF ans
+$   THEN
+$     echo4 ""
+$     echo4 "Be sure to type LOGOUT after you have edited the file,"
+$     echo4 "then this procedure will resume."
+$     echo4 ""
+$     default = F$ENVIRONMENT("DEFAULT")
+$     DIRECTORY 'config_sh'
+$     SET DEFAULT [-]
+$     SPAWN/WAIT
+$     SET DEFAULT 'default'
+$   ENDIF
+$ ENDIF
+$!
+$ echo ""
+$ echo4 "Adding ''osname' specific preprocessor commands."
+$ !
+$ ! we need an fdl file
+$ CREATE [-]CONFIG.FDL
+$ DECK
+RECORD
+  FORMAT STREAM_LF
+$ EOD
+$ CREATE /FDL=[-]CONFIG.FDL [-]CONFIG.LOCAL
+$ ! First spit out the header info with the local defines (to get
+$ ! around the 255 character command line limit)
+$ OPEN/APPEND CONFIG [-]config.local
+$ IF use_debugging_perl THEN WC "#define DEBUGGING"
+$ IF use_two_pot_malloc THEN WC "#define TWO_POT_OPTIMIZE"
+$ IF mymalloc THEN WC "#define EMBEDMYMALLOC"
+$ IF use_pack_malloc THEN WC "#define PACK_MALLOC"
+$ IF use_debugmalloc THEN WC "#define DEBUGGING_MSTATS"
+$ IF Using_Gnu_C THEN WC "#define GNUC_ATTRIBUTE_CHECK"
+$ IF (Has_Dec_C_Sockets)
+$ THEN
+$    WC "#define VMS_DO_SOCKETS"
+$    WC "#define DECCRTL_SOCKETS"
+$ ELSE
+$    IF Has_Socketshr THEN WC "#define VMS_DO_SOCKETS"
+$ ENDIF
+$! This is VMS-specific for now
+$ WC "#''d_setenv' HAS_SETENV"
+$ IF d_secintgenv THEN WC "#define SECURE_INTERNAL_GETENV"
+$ IF d_alwdeftype THEN WC "#define ALWAYS_DEFTYPES"
+$ IF use64bitint .OR. use64bitint .EQS. "define"
+$ THEN
+$   WC "#define USE_64_BIT_INT"
+$   WC "#define USE_LONG_DOUBLE"
+$ ENDIF
+$ IF use64bitall .OR. use64bitall .EQS. "define" THEN -
+    WC "#define USE_64_BIT_ALL"
+$ IF be_case_sensitive THEN WC "#define VMS_WE_ARE_CASE_SENSITIVE"
+$ IF d_herrno .EQS. "undef" THEN WC "#define NEED_AN_H_ERRNO"
+$ WC "#define HAS_ENVGETENV"
+$ WC "#define PERL_EXTERNAL_GLOB"
+$ CLOSE CONFIG
+$!
+$ echo4 "Doing variable substitutions on .SH files..."
+$ echo4 "Extracting config.h (with variable substitutions)"
+$!
+$! Now build the normal config.h
+$ DEFINE/USER_MODE sys$output [-]config.main
+$ mcr []munchconfig 'config_sh' [-]config_h.sh
+$ ! Concatenate them together
+$ copy [-]config.local,[-]config.main [-]config.h
+$! Clean up
+$ DELETE/NOLOG [-]CONFIG.MAIN;*
+$ DELETE/NOLOG [-]CONFIG.LOCAL;*
+$ DELETE/NOLOG [-]CONFIG.FDL;*
+$!
+$ IF Using_Dec_C
+$ THEN
+$   DECC_REPLACE = "DECC=decc=1"
+$ ELSE
+$   DECC_REPLACE = "DECC="
+$ ENDIF
+$ IF using_cxx
+$ THEN
+$   DECCXX_REPLACE = "DECCXX=DECCXX=1"
+$ ELSE
+$   DECCXX_REPLACE = "DECCXX="
+$ ENDIF
+$ IF Using_Gnu_C
+$ THEN
+$   GNUC_REPLACE = "GNUC=gnuc=1"
+$ ELSE
+$   GNUC_REPLACE = "GNUC=" 
+$ ENDIF
+$ IF Has_Dec_C_Sockets
+$ THEN
+$   SOCKET_REPLACE = "SOCKET=DECC_SOCKETS=1"
+$ ELSE
+$   IF Has_Socketshr
+$   THEN
+$     SOCKET_REPLACE = "SOCKET=SOCKETSHR_SOCKETS=1"
+$   ELSE
+$     SOCKET_REPLACE = "SOCKET="
+$   ENDIF
+$ ENDIF
+$ IF Use_Threads
+$ THEN
+$   IF (vms_ver .LES. "6.2")
+$   THEN
+$     THREAD_REPLACE = "THREAD=OLDTHREADED=1"
+$   ELSE
+$     THREAD_REPLACE = "THREAD=THREADED=1"
+$   ENDIF
+$ ELSE
+$   THREAD_REPLACE = "THREAD="
+$ ENDIF
+$ IF mymalloc
+$ THEN
+$   MALLOC_REPLACE = "MALLOC=MALLOC=1"
+$ ELSE
+$   MALLOC_REPLACE = "MALLOC="
+$ ENDIF
+$ echo4 "Extracting ''defmakefile' (with variable substitutions)"
+$ DEFINE/USER_MODE sys$output 'UUmakefile'
+$ mcr []munchconfig 'config_sh' 'Makefile_SH' "''DECC_REPLACE'" -
+ "''DECCXX_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" "''SOCKET_REPLACE'" -
+ "''THREAD_REPLACE'" "''C_Compiler_Replace'" "''MALLOC_REPLACE'" -
+ "''Thread_Live_Dangerously'" "PV=''version'" "FLAGS=FLAGS=''extra_flags'"
+$! Clean up after ourselves
+$ DELETE/NOLOG/NOCONFIRM []munchconfig.exe;
+$ echo4 "Extracting make_ext.com (without variable substitutions)"
+$ Create Sys$Disk:[-]make_ext.com
+$ Deck/Dollar="$EndOfTpl$"
+$!++ make_ext.com
+$!   NOTE: This file is extracted as part of the VMS configuration process.
+$!   Any changes made to it directly will be lost.  If you need to make any
+$!   changes, please edit the template in Configure.Com instead.
+$    def = F$Environment("Default")
+$    exts1 = F$Edit(p1,"Compress")
+$    p2 = F$Edit(p2,"Upcase,Compress,Trim")
+$    If F$Locate("MCR ",p2).eq.0 Then p2 = F$Extract(3,255,p2)
+$    miniperl = "$" + F$Search(F$Parse(p2,".Exe"))
+$    makeutil = p3
+$    if f$type('p3') .nes. "" then makeutil = 'p3'
+$    targ = F$Edit(p4,"Lowercase")
+$    i = 0
+$ next_ext:
+$    ext = F$Element(i," ",p1)
+$    If ext .eqs. " " Then Goto done
+$    Define/User_mode Perl_Env_Tables CLISYM_LOCAL
+$    miniperl
+$    deck
+     ($extdir = $ENV{'ext'}) =~ s/::/./g;
+     $extdir =~ s#/#.#g;
+     if ($extdir =~ /^vms/i) { $extdir =~ s/vms/.vms.ext/i; }
+     else                    { $extdir = ".ext.$extdir";   }
+     ($ENV{'extdir'} = "[$extdir]");
+     ($ENV{'up'} = ('-') x ($extdir =~ tr/././));
+$    eod
+$    Set Default &extdir
+$    redesc = 0
+$    If F$Locate("clean",targ) .eqs. F$Length(targ)
+$    Then
+$      Write Sys$Output ""
+$      Write Sys$Output "      Making ''ext' (dynamic)"
+$      On Error Then Goto done
+$      If F$Search("Descrip.MMS") .eqs. ""
+$      Then
+$        redesc = 1
+$      Else
+$        If F$CvTime(F$File("Descrip.MMS","rdt")) .lts. -
+            F$CvTime(F$File("Makefile.PL","rdt")) Then redesc = 1
+$      EndIf
+$    Else
+$      Write Sys$Output "''targ'ing ''ext' . . ."
+$      On Error Then Continue
+$    EndIf
+$    If redesc Then -
+       miniperl "-I[''up'.lib]" Makefile.PL "INST_LIB=[''up'.lib]" "INST_ARCHLIB=[''up'.lib]"
+$    makeutil 'targ'
+$    i = i + 1
+$    Set Def &def
+$    Goto next_ext
+$ done:
+$    sts = $Status
+$    Set Def &def
+$    Exit sts
+$!-- make_ext.com
+$EndOfTpl$
+$!
+$!
+$!  Warn of dangerous symbols or logical names
+$!
+$Bad_environment: SUBROUTINE
+$   Bad_env = ""
+$   IF p2 .eqs. "SYMBOL"
+$   THEN
+$     IF f$type('p1') .nes. "" THEN  Bad_env := SYMBOL
+$   ELSE
+$     IF f$trnlnm(p1) .nes. "" THEN Bad_env := LOGICAL
+$   ENDIF
+$   IF Bad_env .eqs. "SYMBOL" .or. Bad_env .eqs. "LOGICAL"
+$   THEN
+$     IF f$search("config.msg") .nes. ""
+$     THEN
 $       OPEN/APPEND CONFIG config.msg
 $     ELSE
 $       OPEN/WRITE CONFIG config.msg
@@ -2226,7 +5519,7 @@ $       WRITE CONFIG " delete before building ''package' via:"
 $       WRITE CONFIG "     $ DELETE/SYMBOL/GLOBAL ''p1'"
 $       IF f$locate("""",&p1) .ge. f$length(&p1)
 $       THEN
-$       WRITE CONFIG " after building, testing, and installing ''package'
+$       WRITE CONFIG " after building, testing, and installing ''package'"
 $       WRITE CONFIG " restore the symbol with:"
 $       WRITE CONFIG "     $ ''p1' == """ + &p1 + """"
 $       ENDIF
@@ -2243,7 +5536,7 @@ $   ENDIF
 $ EXIT
 $ ENDSUBROUTINE ! Bad_environment
 $ echo ""
-$ echo4 "%Config-I-VMS, Checking for dangerous pre-existing global symbols and logical names."
+$ echo4 "Checking for dangerous pre-existing global symbols and logical names."
 $ CALL Bad_environment "TMP"
 $ CALL Bad_environment "LIB"
 $ CALL Bad_environment "T"
@@ -2258,28 +5551,28 @@ $ IF (.NOT.perl_symbol)
 $ THEN
 $   file_2_find = "[-]''packageup'.cld"
 $   echo ""
-$   echo4 "%Config-I-VMS, The perl.cld file is now being written..."
+$   echo4 "The perl.cld file is now being written..."
 $   OPEN/WRITE CONFIG 'file_2_find'
 $   ext = ".exe"
-$   IF ((sharedperl) .AND. (f$getsyi("ARCH_NAME") .NES. "VAX")) THEN ext := .AXE
+$   IF ((sharedperl) .AND. (F$GETSYI("HW_MODEL") .GE. 1024)) THEN ext := .AXE
 $   IF (use_vmsdebug_perl)
 $   THEN
 $     WRITE CONFIG "define verb dbgperl"
-$     WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]dbgperl''ext'")
+$     WRITE CONFIG F$FAO("!_!AS","image ''vms_prefix':[000000]dbgperl''ext'")
 $     WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
 $     WRITE CONFIG ""
 $     WRITE CONFIG "define verb perl"
-$     WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]ndbgPerl''ext'")
+$     WRITE CONFIG F$FAO("!_!AS","image ''vms_prefix':[000000]ndbgPerl''ext'")
 $     WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
 $   ELSE
 $     WRITE CONFIG "define verb perl"
-$     WRITE CONFIG F$FAO("!_!AS","image ''packageup'_root:[000000]perl''ext'")
+$     WRITE CONFIG F$FAO("!_!AS","image ''vms_prefix':[000000]perl''ext'")
 $     WRITE CONFIG F$FAO("!_!AS","cliflags (foreign)")
 $   ENDIF
 $   CLOSE CONFIG
 $ ENDIF ! (.NOT.perl_symbol)
 $ echo ""
-$ echo4 "%Config-I-VMS, The perl_setup.com file is now being written..."
+$ echo4 "The perl_setup.com file is now being written..."
 $ file_2_find = "[-]perl_setup.com"
 $ OPEN/WRITE CONFIG 'file_2_find'
 $ WRITE CONFIG "$!"
@@ -2294,38 +5587,38 @@ $ WRITE CONFIG "$!"
 $ prefix = prefix - "000000."
 $ IF F$LOCATE(".]",prefix) .EQ. F$LENGTH(prefix) THEN -
     prefix = prefix - "]" + ".]" 
-$ WRITE CONFIG "$ define/translation=concealed Perl_Root ''prefix'"
+$ WRITE CONFIG "$ define/translation=concealed ''vms_prefix' ''prefix'"
 $ WRITE CONFIG "$ ext = "".exe"""
-$ IF sharedperl .EQS. "Y"
+$ IF sharedperl
 $ THEN
-$   write config "$ if f$getsyi(""ARCH_NAME"") .nes. ""VAX"" then ext = "".AXE"""
+$   write config "$ if f$getsyi(""HW_MODEL"") .ge. 1024 then ext = "".AXE"""
 $ ENDIF
 $ IF (perl_symbol)
 $ THEN
 $   IF (use_vmsdebug_perl)
 $   THEN
-$     WRITE CONFIG "$ dbgperl :== $Perl_Root:[000000]dbgPerl'ext'"
-$     WRITE CONFIG "$ perl    :== $Perl_Root:[000000]ndbgPerl'ext'"
-$     WRITE CONFIG "$ define dbgPerlShr Perl_Root:[000000]dbgPerlShr'ext'"
+$     WRITE CONFIG "$ dbgperl :== $''vms_prefix':[000000]dbgPerl'ext'"
+$     WRITE CONFIG "$ perl    :== $''vms_prefix':[000000]ndbgPerl'ext'"
+$     WRITE CONFIG "$ define dbgPerlShr ''vms_prefix':[000000]dbgPerlShr'ext'"
 $   ELSE
-$     WRITE CONFIG "$ perl :== $Perl_Root:[000000]Perl'ext'"
-$     WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$     WRITE CONFIG "$ perl :== $''vms_prefix':[000000]Perl'ext'"
+$     WRITE CONFIG "$ define PerlShr ''vms_prefix':[000000]PerlShr'ext'"
 $   ENDIF
 $ ELSE ! .NOT.perl_symbol
 $   IF (use_vmsdebug_perl)
 $   THEN
-$     WRITE CONFIG "$ define dbgPerlShr Perl_Root:[000000]dbgPerlShr'ext'"
+$     WRITE CONFIG "$ define dbgPerlShr ''vms_prefix':[000000]dbgPerlShr'ext'"
 $   ELSE
-$     WRITE CONFIG "$ define PerlShr Perl_Root:[000000]PerlShr'ext'"
+$     WRITE CONFIG "$ define PerlShr ''vms_prefix':[000000]PerlShr'ext'"
 $   ENDIF
 $   IF perl_verb .EQS. "PROCESS"
 $   THEN
-$     WRITE CONFIG "$ set command ''packagup'_ROOT:[000000]''packageup'.CLD"
+$     WRITE CONFIG "$ set command ''vms_prefix':[000000]''packageup'.CLD"
 $   ENDIF
 $ ENDIF !  perl_symbol
-$ WRITE CONFIG "$ define/nolog pod2text Perl_Root:[lib.pod]pod2text.com"
-$ WRITE CONFIG "$ define/nolog pod2html Perl_Root:[lib.pod]pod2html.com"
-$ WRITE CONFIG "$ define/nolog pod2man  Perl_Root:[lib.pod]pod2man.com"
+$ WRITE CONFIG "$ define/nolog pod2text ''vms_prefix':[lib.pod]pod2text.com"
+$ WRITE CONFIG "$ define/nolog pod2html ''vms_prefix':[lib.pod]pod2html.com"
+$ WRITE CONFIG "$ define/nolog pod2man  ''vms_prefix':[lib.pod]pod2man.com"
 $!
 $ IF (tzneedset)
 $ THEN
@@ -2338,59 +5631,59 @@ $ WRITE CONFIG "$! Symbols for commonly used scripts:"
 $ WRITE CONFIG "$!"
 $ IF (perl_symbol)
 $ THEN
-$   WRITE CONFIG "$ Perldoc  == ""'"+"'Perl' Perl_Root:[lib.pod]Perldoc.com -t"""
+$   WRITE CONFIG "$ Perldoc  == ""'"+"'Perl' ''vms_prefix':[lib.pod]Perldoc.com -t"""
 $   WRITE CONFIG "$ pod2text == ""'"+"'Perl' pod2text"""
 $   WRITE CONFIG "$ pod2html == ""'"+"'Perl' pod2html"""
-$   WRITE CONFIG "$ pod2latex == ""'"+"'Perl' Perl_Root:[lib.pod]pod2latex.com"""
+$   WRITE CONFIG "$ pod2latex == ""'"+"'Perl' ''vms_prefix':[lib.pod]pod2latex.com"""
 $   WRITE CONFIG "$!pod2man  == ""'"+"'Perl' pod2man"""
-$   WRITE CONFIG "$!Perlbug  == ""'"+"'Perl' Perl_Root:[lib]Perlbug.com"""
-$   WRITE CONFIG "$ c2ph     == ""'"+"'Perl' Perl_Root:[utils]c2ph.com"""
+$   WRITE CONFIG "$!Perlbug  == ""'"+"'Perl' ''vms_prefix':[lib]Perlbug.com"""
+$   WRITE CONFIG "$ c2ph     == ""'"+"'Perl' ''vms_prefix':[utils]c2ph.com"""
 $   IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
 $   THEN
-$     WRITE CONFIG "$ dprofpp     == ""'"+"'Perl' Perl_Root:[utils]dprofpp.com"""
+$     WRITE CONFIG "$ dprofpp     == ""'"+"'Perl' ''vms_prefix':[utils]dprofpp.com"""
 $   ENDIF 
-$   WRITE CONFIG "$ h2ph     == ""'"+"'Perl' Perl_Root:[utils]h2ph.com"""
-$   WRITE CONFIG "$ h2xs     == ""'"+"'Perl' Perl_Root:[utils]h2xs.com"""
-$   WRITE CONFIG "$!perlcc   == ""'"+"'Perl' Perl_Root:[utils]perlcc.com"""
-$   WRITE CONFIG "$ splain   == ""'"+"'Perl' Perl_Root:[utils]splain.com"""
+$   WRITE CONFIG "$ h2ph     == ""'"+"'Perl' ''vms_prefix':[utils]h2ph.com"""
+$   WRITE CONFIG "$ h2xs     == ""'"+"'Perl' ''vms_prefix':[utils]h2xs.com"""
+$   WRITE CONFIG "$!perlcc   == ""'"+"'Perl' ''vms_prefix':[utils]perlcc.com"""
+$   WRITE CONFIG "$ splain   == ""'"+"'Perl' ''vms_prefix':[utils]splain.com"""
 $ ELSE
-$   WRITE CONFIG "$ Perldoc  == ""Perl Perl_Root:[lib.pod]Perldoc.com -t"""
+$   WRITE CONFIG "$ Perldoc  == ""Perl ''vms_prefix':[lib.pod]Perldoc.com -t"""
 $   WRITE CONFIG "$ pod2text == ""Perl pod2text"""
 $   WRITE CONFIG "$ pod2html == ""Perl pod2html"""
-$   WRITE CONFIG "$ pod2latex == ""Perl Perl_Root:[lib.pod]pod2latex.com"""
+$   WRITE CONFIG "$ pod2latex == ""Perl ''vms_prefix':[lib.pod]pod2latex.com"""
 $   WRITE CONFIG "$!pod2man  == ""Perl pod2man"""
-$   WRITE CONFIG "$!Perlbug  == ""Perl Perl_Root:[lib]Perlbug.com"""
-$   WRITE CONFIG "$ c2ph     == ""Perl Perl_Root:[utils]c2ph.com"""
+$   WRITE CONFIG "$!Perlbug  == ""Perl ''vms_prefix':[lib]Perlbug.com"""
+$   WRITE CONFIG "$ c2ph     == ""Perl ''vms_prefix':[utils]c2ph.com"""
 $   IF F$LOCATE("Devel::DProf",extensions) .LT. F$LENGTH(extensions)
 $   THEN
-$     WRITE CONFIG "$ dprofpp     == ""Perl Perl_Root:[utils]dprofpp.com"""
+$     WRITE CONFIG "$ dprofpp     == ""Perl ''vms_prefix':[utils]dprofpp.com"""
 $   ENDIF 
-$   WRITE CONFIG "$ h2ph     == ""Perl Perl_Root:[utils]h2ph.com"""
-$   WRITE CONFIG "$ h2xs     == ""Perl Perl_Root:[utils]h2xs.com"""
-$   WRITE CONFIG "$!perlcc   == ""Perl Perl_Root:[utils]perlcc.com"""
-$   WRITE CONFIG "$ splain   == ""Perl Perl_Root:[utils]splain.com"""
+$   WRITE CONFIG "$ h2ph     == ""Perl ''vms_prefix':[utils]h2ph.com"""
+$   WRITE CONFIG "$ h2xs     == ""Perl ''vms_prefix':[utils]h2xs.com"""
+$   WRITE CONFIG "$!perlcc   == ""Perl ''vms_prefix':[utils]perlcc.com"""
+$   WRITE CONFIG "$ splain   == ""Perl ''vms_prefix':[utils]splain.com"""
 $ ENDIF
 $ CLOSE CONFIG
 $!
 $ echo  ""
-$ echo  "%Config-I-VMS, The file can be found at:"
-$ echo4 "-Config-I-VMS, ''F$SEARCH(file_2_find)'"
-$ echo  "-Config-I-VMS, Add that file (or an @ call to it) to your [SY]LOGIN.COM"
-$ echo  "-Config-I-VMS, when you are satisfied with a successful compilation,"
-$ echo  "-Config-I-VMS, testing, and installation of your perl."
+$ echo  "The file can be found at:"
+$ echo4 "    ''F$SEARCH(file_2_find)'"
+$ echo  "Add that file (or an @ call to it) to your [SY]LOGIN.COM"
+$ echo  "when you are satisfied with a successful compilation,"
+$ echo  "testing, and installation of your perl."
 $ echo  ""
 $ IF ((.NOT.perl_symbol) .AND. (perl_verb .EQS. "DCLTABLES"))
 $ THEN
 $   file_2_find = "[-]''packageup'_install.com"
-$   OPEN/WRITE CONFIG 'file_2_find
+$   OPEN/WRITE CONFIG 'file_2_find'
 $   WRITE CONFIG "$ set command perl /table=sys$common:[syslib]dcltables.exe -"
 $   WRITE CONFIG "    /output=sys$common:[syslib]dcltables.exe"
 $   WRITE CONFIG "$ install replace sys$common:[syslib]dcltables.exe"
 $   CLOSE CONFIG
 $   echo4 ""
-$   echo4 "%Config-I-VMS, In order to install the ''packageup' verb into DCLTABLES run:"
-$   echo4 "-Config-I-VMS, @ ''F$SEARCH(file_2_find)'"
-$   echo4 "-Config-I-VMS, after a successful build, test, and install.  Do so with CMKRNL privilege."
+$   echo4 "In order to install the ''packageup' verb into DCLTABLES run:"
+$   echo4 "    @ ''F$SEARCH(file_2_find)'"
+$   echo4 "after a successful build, test, and install.  Do so with CMKRNL privilege."
 $   echo4 ""
 $ ENDIF
 $!
index 2ef8331..f98eb76 100755 (executable)
@@ -86,7 +86,7 @@ EOM
                exit 1
                ;;
        *)
-               opts="$opts $1"
+               opts="$opts '$1'"
                shift
                ;;
        esac
@@ -126,7 +126,7 @@ case "$verbose" in
 *) copt="$copt -d";;
 esac
 
-set X sh Configure $copt $create $opts
+eval "set X sh Configure $copt $create $opts"
 shift
 echo "$@"
 exec "$@"
diff --git a/cop.h b/cop.h
index 4584a96..6e8bd91 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -35,10 +35,10 @@ struct cop {
 #  define CopFILEAV(c)         (CopFILE(c) \
                                 ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
 #  define CopSTASHPV(c)                ((c)->cop_stashpv)
-#  define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = savepv(pv))
+#  define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
 #  define CopSTASH(c)          (CopSTASHPV(c) \
                                 ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
-#  define CopSTASH_set(c,hv)   CopSTASHPV_set(c, HvNAME(hv))
+#  define CopSTASH_set(c,hv)   CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
 #  define CopSTASH_eq(c,hv)    ((hv)                                   \
                                 && (CopSTASHPV(c) == HvNAME(hv)        \
                                     || (CopSTASHPV(c) && HvNAME(hv)    \
@@ -393,7 +393,7 @@ Used to indicate scalar context.  See C<GIMME_V>, C<GIMME>, and
 L<perlcall>.
 
 =for apidoc AmU||G_ARRAY
-Used to indicate array context.  See C<GIMME_V>, C<GIMME> and
+Used to indicate list context.  See C<GIMME_V>, C<GIMME> and
 L<perlcall>.
 
 =for apidoc AmU||G_VOID
@@ -433,6 +433,7 @@ L<perlcall>.
 #define EVAL_INEVAL    1       /* some enclosing scope is an eval */
 #define EVAL_WARNONLY  2       /* used by yywarn() when calling yyerror() */
 #define EVAL_KEEPERR   4       /* set by Perl_call_sv if G_KEEPERR */
+#define EVAL_INREQUIRE 8       /* The code is being required. */
 
 /* Support for switching (stack and block) contexts.
  * This ensures magic doesn't invalidate local stack and cx pointers.
index 120e8ee..0a5a408 100644 (file)
@@ -125,7 +125,7 @@ $(LIBPERL)$(LIB_EXT): $& perl$(OBJ_EXT) $(cwobj) ld2
 # The Module used here must not depend on Config or any extensions.
 
 miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL)s$(LIB_EXT) opmini$(OBJ_EXT)
-       $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL)s $(libs)
+       $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL)s $(libs)
        $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
 
 !NO!SUBS!
@@ -147,7 +147,7 @@ $(LIBPERL)$(LIB_EXT): $& perl$(OBJ_EXT) $(cwobj)
 # The Module used here must not depend on Config or any extensions.
 
 miniperl: $& miniperlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) opmini$(OBJ_EXT)
-       $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
+       $(LDLIBPTH) $(CC) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT) $(LLIBPERL) $(libs)
        $(LDLIBPTH) ./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
 
 !NO!SUBS!
@@ -165,16 +165,16 @@ esac
 $spitshell >>Makefile <<'!NO!SUBS!'
 
 perl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(LDLIBPTH) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) -Wl,-Bstatic $(LLIBPERL) -Wl,-Bdynamic `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) -Wl,-Bstatic $(LLIBPERL) -Wl,-Bdynamic `cat ext.libs` $(libs)
 
 pureperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(LDLIBPTH) purify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) purify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o pureperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 purecovperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) purecov $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o purecovperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL)$(LIB_EXT) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(LDLIBPTH) quantify $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o quantperl perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LLIBPERL) `cat ext.libs` $(libs)
 
 !NO!SUBS!
 
index 5c25236..b48774f 100644 (file)
@@ -34,7 +34,8 @@ repair()
      -e 's=file/=='\
      -e 's=File/=='\
      -e 's=glob=='\
-     -e 's=Glob=='
+     -e 's=Glob=='\
+     -e 's/storable/Storable/'
 }
 static_ext=$(repair "$static_ext")
 extensions=$(repair "$extensions")
index c928851..80a627e 100644 (file)
@@ -433,3 +433,22 @@ Perl_DJGPP_init (int *argcp,char ***argvp)
         strcpy (perlprefix,"..");
 }
 
+int
+djgpp_fflush (FILE *fp)
+{
+    int res;
+
+    if ((res = fflush(fp)) == 0 && fp) {
+       Stat_t s;
+       if (Fstat(fileno(fp), &s) == 0 && !S_ISSOCK(s.st_mode))
+           res = fsync(fileno(fp));
+    }
+/*
+ * If the flush succeeded but set end-of-file, we need to clear
+ * the error because our caller may check ferror().  BTW, this
+ * probably means we just flushed an empty file.
+ */
+    if (res == 0 && fp && ferror(fp) == EOF) clearerr(fp);
+
+    return res;
+}
diff --git a/doio.c b/doio.c
index 7d52d6f..eba2f8c 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -87,7 +87,7 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
     register IO *io = GvIOn(gv);
     PerlIO *saveifp = Nullfp;
     PerlIO *saveofp = Nullfp;
-    char savetype = ' ';
+    char savetype = IoTYPE_CLOSED;
     int writing = 0;
     PerlIO *fp;
     int fd;
@@ -108,7 +108,7 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
 
     if (IoIFP(io)) {
        fd = PerlIO_fileno(IoIFP(io));
-       if (IoTYPE(io) == '-')
+       if (IoTYPE(io) == IoTYPE_STD)
            result = 0;
        else if (fd <= PL_maxsysfd) {
            saveifp = IoIFP(io);
@@ -116,7 +116,7 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
            savetype = IoTYPE(io);
            result = 0;
        }
-       else if (IoTYPE(io) == '|')
+       else if (IoTYPE(io) == IoTYPE_PIPE)
            result = PerlProc_pclose(IoIFP(io));
        else if (IoIFP(io) != IoOFP(io)) {
            if (IoOFP(io)) {
@@ -146,14 +146,14 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
 
        switch (result = rawmode & O_ACCMODE) {
        case O_RDONLY:
-            IoTYPE(io) = '<';
+            IoTYPE(io) = IoTYPE_RDONLY;
             break;
        case O_WRONLY:
-            IoTYPE(io) = '>';
+            IoTYPE(io) = IoTYPE_WRONLY;
             break;
        case O_RDWR:
        default:
-            IoTYPE(io) = '+';
+            IoTYPE(io) = IoTYPE_RDWR;
             break;
        }
 
@@ -216,14 +216,14 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
        }
        mode[0] = mode[1] = mode[2] = mode[3] = '\0';
        IoTYPE(io) = *type;
-       if (*type == '+' && tlen > 1 && type[tlen-1] != '|') { /* scary */
+       if (*type == IoTYPE_RDWR && tlen > 1 && type[tlen-1] != IoTYPE_PIPE) { /* scary */
            mode[1] = *type++;
            --tlen;
            writing = 1;
        }
 
-       if (*type == '|') {
-           if (num_svs && (tlen != 2 || type[1] != '-')) {
+       if (*type == IoTYPE_PIPE) {
+           if (num_svs && (tlen != 2 || type[1] != IoTYPE_STD)) {
              unknown_desr:
                Perl_croak(aTHX_ "Unknown open() mode '%.*s'", (int)olen, oname);
            }
@@ -261,11 +261,12 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
            }
            writing = 1;
        }
-       else if (*type == '>') {
+       else if (*type == IoTYPE_WRONLY) {
            TAINT_PROPER("open");
            type++;
-           if (*type == '>') {
-               mode[0] = IoTYPE(io) = 'a';
+           if (*type == IoTYPE_WRONLY) {
+               /* Two IoTYPE_WRONLYs in a row make for an IoTYPE_APPEND. */
+               mode[0] = IoTYPE(io) = IoTYPE_APPEND;
                type++;
                tlen--;
            }
@@ -313,15 +314,30 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
                             * be optimized away on most platforms;
                             * only Solaris and Linux seem to flush
                             * on that. --jhi */
-                           PerlIO_seek(fp, 0, SEEK_CUR);
+#ifdef USE_SFIO
+                           /* sfio fails to clear error on next
+                              sfwrite, contrary to documentation.
+                              -- Nick Clark */
+                           if (PerlIO_seek(fp, 0, SEEK_CUR) == -1)
+                               PerlIO_clearerr(fp);
+#endif
                            /* On the other hand, do all platforms
                             * take gracefully to flushing a read-only
                             * filehandle?  Perhaps we should do
                             * fsetpos(src)+fgetpos(dst)?  --nik */
                            PerlIO_flush(fp);
                            fd = PerlIO_fileno(fp);
-                           if (IoTYPE(thatio) == 's')
-                               IoTYPE(io) = 's';
+                           /* When dup()ing STDIN, STDOUT or STDERR
+                            * explicitly set appropriate access mode */
+                           if (IoIFP(thatio) == PerlIO_stdout()
+                               || IoIFP(thatio) == PerlIO_stderr())
+                               IoTYPE(io) = IoTYPE_WRONLY;
+                           else if (IoIFP(thatio) == PerlIO_stdin())
+                                IoTYPE(io) = IoTYPE_RDONLY;
+                           /* When dup()ing a socket, say result is
+                            * one as well */
+                           else if (IoTYPE(thatio) == IoTYPE_SOCKET)
+                               IoTYPE(io) = IoTYPE_SOCKET;
                        }
                        else
                            fd = -1;
@@ -339,16 +355,16 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
            else {
                /*SUPPRESS 530*/
                for (; isSPACE(*type); type++) ;
-               if (strEQ(type,"-")) {
+               if (*type == IoTYPE_STD && !type[1]) {
                    fp = PerlIO_stdout();
-                   IoTYPE(io) = '-';
+                   IoTYPE(io) = IoTYPE_STD;
                }
                else  {
                    fp = PerlIO_open((num_svs ? name : type), mode);
                }
            }
        }
-       else if (*type == '<') {
+       else if (*type == IoTYPE_RDONLY) {
            if (num_svs && tlen != 1)
                goto unknown_desr;
            /*SUPPRESS 530*/
@@ -363,16 +379,16 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
                name = type;
                goto duplicity;
            }
-           if (strEQ(type,"-")) {
+           if (*type == IoTYPE_STD && !type[1]) {
                fp = PerlIO_stdin();
-               IoTYPE(io) = '-';
+               IoTYPE(io) = IoTYPE_STD;
            }
            else
                fp = PerlIO_open((num_svs ? name : type), mode);
        }
-       else if (tlen > 1 && type[tlen-1] == '|') {
+       else if (tlen > 1 && type[tlen-1] == IoTYPE_PIPE) {
            if (num_svs) {
-               if (tlen != 2 || type[0] != '-')
+               if (tlen != 2 || type[0] != IoTYPE_STD)
                    goto unknown_desr;
            }
            else {
@@ -403,18 +419,18 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
                    mode = "r";
                fp = PerlProc_popen(name,mode);
            }
-           IoTYPE(io) = '|';
+           IoTYPE(io) = IoTYPE_PIPE;
        }
        else {
            if (num_svs)
                goto unknown_desr;
            name = type;
-           IoTYPE(io) = '<';
+           IoTYPE(io) = IoTYPE_RDONLY;
            /*SUPPRESS 530*/
            for (; isSPACE(*name); name++) ;
            if (strEQ(name,"-")) {
                fp = PerlIO_stdin();
-               IoTYPE(io) = '-';
+               IoTYPE(io) = IoTYPE_STD;
            }
            else {
                char *mode;
@@ -430,19 +446,19 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
     }
     if (!fp) {
        dTHR;
-       if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == '<' && strchr(name, '\n'))
+       if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == IoTYPE_RDONLY && strchr(name, '\n'))
            Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "open");
        goto say_false;
     }
     if (IoTYPE(io) &&
-      IoTYPE(io) != '|' && IoTYPE(io) != '-') {
+      IoTYPE(io) != IoTYPE_PIPE && IoTYPE(io) != IoTYPE_STD) {
        dTHR;
        if (PerlLIO_fstat(PerlIO_fileno(fp),&PL_statbuf) < 0) {
            (void)PerlIO_close(fp);
            goto say_false;
        }
        if (S_ISSOCK(PL_statbuf.st_mode))
-           IoTYPE(io) = 's';   /* in case a socket was passed in to us */
+           IoTYPE(io) = IoTYPE_SOCKET; /* in case a socket was passed in to us */
 #ifdef HAS_SOCKET
        else if (
 #ifdef S_IFMT
@@ -450,13 +466,15 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
 #else
            !PL_statbuf.st_mode
 #endif
-       ) {
+           && IoTYPE(io) != IoTYPE_WRONLY  /* Dups of STD* filehandles already have */
+           && IoTYPE(io) != IoTYPE_RDONLY  /* type so they aren't marked as sockets */
+       ) {                                 /* on OS's that return 0 on fstat()ed pipe */
            char tmpbuf[256];
            Sock_size_t buflen = sizeof tmpbuf;
            if (PerlSock_getsockname(PerlIO_fileno(fp), (struct sockaddr *)tmpbuf,
                            &buflen) >= 0
                  || errno != ENOTSOCK)
-               IoTYPE(io) = 's'; /* some OS's return 0 on fstat()ed socket */
+               IoTYPE(io) = IoTYPE_SOCKET; /* some OS's return 0 on fstat()ed socket */
                                /* but some return 0 for streams too, sigh */
        }
 #endif
@@ -504,8 +522,8 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
     IoFLAGS(io) &= ~IOf_NOLINE;
     if (writing) {
        dTHR;
-       if (IoTYPE(io) == 's'
-           || (IoTYPE(io) == '>' && S_ISCHR(PL_statbuf.st_mode)) )
+       if (IoTYPE(io) == IoTYPE_SOCKET
+           || (IoTYPE(io) == IoTYPE_WRONLY && S_ISCHR(PL_statbuf.st_mode)) )
        {
            char *mode;
            if (out_raw)
@@ -773,8 +791,8 @@ Perl_do_pipe(pTHX_ SV *sv, GV *rgv, GV *wgv)
     IoIFP(rstio) = PerlIO_fdopen(fd[0], "r");
     IoOFP(wstio) = PerlIO_fdopen(fd[1], "w");
     IoIFP(wstio) = IoOFP(wstio);
-    IoTYPE(rstio) = '<';
-    IoTYPE(wstio) = '>';
+    IoTYPE(rstio) = IoTYPE_RDONLY;
+    IoTYPE(wstio) = IoTYPE_WRONLY;
     if (!IoIFP(rstio) || !IoOFP(wstio)) {
        if (IoIFP(rstio)) PerlIO_close(IoIFP(rstio));
        else PerlLIO_close(fd[0]);
@@ -810,9 +828,8 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit)
     if (!io) {         /* never opened */
        if (not_implicit) {
            dTHR;
-           if (ckWARN(WARN_UNOPENED))
-               Perl_warner(aTHX_ WARN_UNOPENED, 
-                      "Close on unopened file %s",GvENAME(gv));
+           if (ckWARN(WARN_UNOPENED)) /* no check for closed here */
+               report_evil_fh(gv, io, PL_op->op_type);
            SETERRNO(EBADF,SS$_IVCHAN);
        }
        return FALSE;
@@ -823,7 +840,7 @@ Perl_do_close(pTHX_ GV *gv, bool not_implicit)
        IoPAGE(io) = 0;
        IoLINES_LEFT(io) = IoPAGE_LEN(io);
     }
-    IoTYPE(io) = ' ';
+    IoTYPE(io) = IoTYPE_CLOSED;
     return retval;
 }
 
@@ -834,7 +851,7 @@ Perl_io_close(pTHX_ IO *io, bool not_implicit)
     int status;
 
     if (IoIFP(io)) {
-       if (IoTYPE(io) == '|') {
+       if (IoTYPE(io) == IoTYPE_PIPE) {
            status = PerlProc_pclose(IoIFP(io));
            if (not_implicit) {
                STATUS_NATIVE_SET(status);
@@ -844,7 +861,7 @@ Perl_io_close(pTHX_ IO *io, bool not_implicit)
                retval = (status != -1);
            }
        }
-       else if (IoTYPE(io) == '-')
+       else if (IoTYPE(io) == IoTYPE_STD)
            retval = TRUE;
        else {
            if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {          /* a socket */
@@ -875,13 +892,22 @@ Perl_do_eof(pTHX_ GV *gv)
     if (!io)
        return TRUE;
     else if (ckWARN(WARN_IO)
-            && (IoTYPE(io) == '>' || IoIFP(io) == PerlIO_stdout()
+            && (IoTYPE(io) == IoTYPE_WRONLY || IoIFP(io) == PerlIO_stdout()
                 || IoIFP(io) == PerlIO_stderr()))
     {
-       SV* sv = sv_newmortal();
-       gv_efullname4(sv, gv, Nullch, FALSE);
-       Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
-                   SvPV_nolen(sv));
+       /* integrate to report_evil_fh()? */
+        char *name = NULL; 
+       if (isGV(gv)) {
+           SV* sv = sv_newmortal();
+           gv_efullname4(sv, gv, Nullch, FALSE);
+           name = SvPV_nolen(sv);
+       }
+       if (name && *name)
+           Perl_warner(aTHX_ WARN_IO,
+                       "Filehandle %s opened only for output", name);
+       else
+           Perl_warner(aTHX_ WARN_IO,
+                       "Filehandle opened only for output");
     }
 
     while (IoIFP(io)) {
@@ -925,8 +951,8 @@ Perl_do_tell(pTHX_ GV *gv)
     }
     {
        dTHR;
-       if (ckWARN(WARN_UNOPENED))
-           Perl_warner(aTHX_ WARN_UNOPENED, "tell() on unopened file");
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
     }
     SETERRNO(EBADF,RMS$_IFI);
     return (Off_t)-1;
@@ -947,8 +973,8 @@ Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence)
     }
     {
        dTHR;
-       if (ckWARN(WARN_UNOPENED))
-           Perl_warner(aTHX_ WARN_UNOPENED, "seek() on unopened file");
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
     }
     SETERRNO(EBADF,RMS$_IFI);
     return FALSE;
@@ -964,8 +990,8 @@ Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence)
        return PerlLIO_lseek(PerlIO_fileno(fp), pos, whence);
     {
        dTHR;
-       if (ckWARN(WARN_UNOPENED))
-           Perl_warner(aTHX_ WARN_UNOPENED, "sysseek() on unopened file");
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
     }
     SETERRNO(EBADF,RMS$_IFI);
     return (Off_t)-1;
@@ -1160,6 +1186,11 @@ Perl_do_print(pTHX_ register SV *sv, PerlIO *fp)
        }
        /* FALL THROUGH */
     default:
+#if 0
+       /* XXX Fix this when the I/O disciplines arrive. XXX */
+       if (DO_UTF8(sv))
+           sv_utf8_downgrade(sv, FALSE);
+#endif
        tmps = SvPV(sv, len);
        break;
     }
@@ -1169,7 +1200,7 @@ Perl_do_print(pTHX_ register SV *sv, PerlIO *fp)
      * but only until the system hard limit/the filesystem limit,
      * at which we would get EPERM.  Note that when using buffered
      * io the write failure can be delayed until the flush/close. --jhi */
-    if (len && (PerlIO_write(fp,tmps,len) == 0 || PerlIO_error(fp)))
+    if (len && (PerlIO_write(fp,tmps,len) == 0))
        return FALSE;
     return !PerlIO_error(fp);
 }
@@ -1179,25 +1210,24 @@ Perl_my_stat(pTHX)
 {
     djSP;
     IO *io;
-    GV* tmpgv;
+    GV* gv;
 
     if (PL_op->op_flags & OPf_REF) {
        EXTEND(SP,1);
-       tmpgv = cGVOP_gv;
+       gv = cGVOP_gv;
       do_fstat:
-       io = GvIO(tmpgv);
+       io = GvIO(gv);
        if (io && IoIFP(io)) {
-           PL_statgv = tmpgv;
+           PL_statgv = gv;
            sv_setpv(PL_statname,"");
            PL_laststype = OP_STAT;
            return (PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache));
        }
        else {
-           if (tmpgv == PL_defgv)
+           if (gv == PL_defgv)
                return PL_laststatval;
-           if (ckWARN(WARN_UNOPENED))
-               Perl_warner(aTHX_ WARN_UNOPENED, "Stat on unopened file %s",
-                 GvENAME(tmpgv));
+           if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+               report_evil_fh(gv, io, PL_op->op_type);
            PL_statgv = Nullgv;
            sv_setpv(PL_statname,"");
            return (PL_laststatval = -1);
@@ -1209,11 +1239,11 @@ Perl_my_stat(pTHX)
        STRLEN n_a;
        PUTBACK;
        if (SvTYPE(sv) == SVt_PVGV) {
-           tmpgv = (GV*)sv;
+           gv = (GV*)sv;
            goto do_fstat;
        }
        else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
-           tmpgv = (GV*)SvRV(sv);
+           gv = (GV*)SvRV(sv);
            goto do_fstat;
        }
 
diff --git a/doop.c b/doop.c
index ba8a7e5..b75ffaa 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -77,12 +77,12 @@ S_do_trans_simple(pTHX_ SV *sv)
 
         ulen = 1;
         /* Need to check this, otherwise 128..255 won't match */
-       c = utf8_to_uv(s, &ulen);
+       c = utf8_to_uv_chk(s, &ulen, 0);
         if (c < 0x100 && (ch = tbl[(short)c]) >= 0) {
             matches++;
-            if (ch < 0x80) 
+            if (ch < 0x80)
                 *d++ = ch;
-            else         
+            else
                 d = uv_to_utf8(d,ch);
             s += ulen;
         }
@@ -93,8 +93,8 @@ S_do_trans_simple(pTHX_ SV *sv)
     }
     *d = '\0';
     sv_setpvn(sv, (const char*)dstart, d - dstart);
+    Safefree(dstart);
     SvUTF8_on(sv);
-    SvLEN_set(sv, 2*len+1);
     SvSETMAGIC(sv);
     return matches;
 }
@@ -125,7 +125,7 @@ S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
             I32 ulen;
             ulen = 1;
             if (hasutf)
-                c = utf8_to_uv(s,&ulen);
+                c = utf8_to_uv_chk(s,&ulen, 0);
             else
                 c = *s;
             if (c < 0x100 && tbl[c] >= 0)
@@ -222,7 +222,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
     UV extra = none + 1;
     UV final;
     UV uv;
-    I32 isutf; 
+    I32 isutf;
     I32 howmany;
 
     isutf = SvUTF8(sv);
@@ -258,7 +258,7 @@ S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
            i = UTF8SKIP(s);
            s += i;
            matches++;
-            if (i > 1 && !isutf++) 
+            if (i > 1 && !isutf++)
                 HALF_UTF8_UPGRADE(dstart,d);
            d = uv_to_utf8(d, final);
        }
@@ -337,7 +337,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
     if (squash) {
        UV puv = 0xfeedface;
        while (s < send) {
-            if (SvUTF8(sv)) 
+            if (SvUTF8(sv))
                uv = swash_fetch(rv, s);
            else {
                U8 tmpbuf[2];
@@ -354,7 +354,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            if (uv < none) {
                matches++;
                if (uv != puv) {
-                    if ((uv & 0x80) && !isutf++) 
+                    if ((uv & 0x80) && !isutf++)
                         HALF_UTF8_UPGRADE(dst,d);
                    d = uv_to_utf8(d, uv);
                    puv = uv;
@@ -364,7 +364,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            }
            else if (uv == none) {      /* "none" is unmapped character */
                I32 ulen;
-               *d++ = (U8)utf8_to_uv(s, &ulen);
+               *d++ = (U8)utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                puv = 0xfeedface;
                continue;
@@ -384,7 +384,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
     }
     else {
        while (s < send) {
-            if (SvUTF8(sv)) 
+            if (SvUTF8(sv))
                uv = swash_fetch(rv, s);
            else {
                U8 tmpbuf[2];
@@ -405,7 +405,7 @@ S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
            }
            else if (uv == none) {      /* "none" is unmapped character */
                I32 ulen;
-               *d++ = (U8)utf8_to_uv(s, &ulen);
+               *d++ = (U8)utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                continue;
            }
@@ -435,7 +435,7 @@ Perl_do_trans(pTHX_ SV *sv)
 {
     dTHR;
     STRLEN len;
-    I32 hasutf = (PL_op->op_private & 
+    I32 hasutf = (PL_op->op_private &
                     (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
 
     if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
@@ -487,7 +487,7 @@ Perl_do_join(pTHX_ register SV *sv, SV *del, register SV **mark, register SV **s
     (void)SvUPGRADE(sv, SVt_PV);
     if (SvLEN(sv) < len + items) {     /* current length is way too short */
        while (items-- > 0) {
-           if (*mark && !SvGMAGICAL(*mark) && SvOK(*mark)) {
+           if (*mark && !SvGAMAGIC(*mark) && SvOK(*mark)) {
                SvPV(*mark, tmplen);
                len += tmplen;
            }
@@ -537,7 +537,7 @@ Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
        SvTAINTED_on(sv);
 }
 
-/* XXX SvUTF8 support missing! */
+/* currently converts input to bytes if possible, but doesn't sweat failure */
 UV
 Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
 {
@@ -547,8 +547,13 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
 
     if (offset < 0)
        return retnum;
-    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */ 
+    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
        Perl_croak(aTHX_ "Illegal number of bits in vec");
+
+    if (SvUTF8(sv)) {
+       (void) Perl_sv_utf8_downgrade(aTHX_ sv, TRUE);
+    }
+
     offset *= size;    /* turn into bit offset */
     len = (offset + size + 7) / 8;     /* required number of bytes */
     if (len > srclen) {
@@ -620,7 +625,7 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
                        ((UV) s[offset + 4] << 24) +
                        ((UV) s[offset + 5] << 16);
                else
-                   retnum = 
+                   retnum =
                        ((UV) s[offset    ] << 56) +
                        ((UV) s[offset + 1] << 48) +
                        ((UV) s[offset + 2] << 40) +
@@ -670,7 +675,10 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
     return retnum;
 }
 
-/* XXX SvUTF8 support missing! */
+/* currently converts input to bytes if possible but doesn't sweat failures,
+ * although it does ensure that the string it clobbers is not marked as
+ * utf8-valid any more
+ */
 void
 Perl_do_vecset(pTHX_ SV *sv)
 {
@@ -686,13 +694,23 @@ Perl_do_vecset(pTHX_ SV *sv)
     if (!targ)
        return;
     s = (unsigned char*)SvPV_force(targ, targlen);
+    if (SvUTF8(targ)) {
+       /* This is handled by the SvPOK_only below...
+       if (!Perl_sv_utf8_downgrade(aTHX_ targ, TRUE))
+           SvUTF8_off(targ);
+        */
+       (void) Perl_sv_utf8_downgrade(aTHX_ targ, TRUE);
+    }
+
     (void)SvPOK_only(targ);
     lval = SvUV(sv);
     offset = LvTARGOFF(sv);
+    if (offset < 0)
+       Perl_croak(aTHX_ "Assigning to negative offset in vec");
     size = LvTARGLEN(sv);
-    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */ 
+    if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
        Perl_croak(aTHX_ "Illegal number of bits in vec");
-    
+
     offset *= size;                    /* turn into bit offset */
     len = (offset + size + 7) / 8;     /* required number of bytes */
     if (len > targlen) {
@@ -700,7 +718,7 @@ Perl_do_vecset(pTHX_ SV *sv)
        (void)memzero((char *)(s + targlen), len - targlen + 1);
        SvCUR_set(targ, len);
     }
-    
+
     if (size < 8) {
        mask = (1 << size) - 1;
        size = offset & 7;
@@ -749,7 +767,7 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
     STRLEN len;
     char *s;
     dTHR;
-    
+
     if (SvTYPE(sv) == SVt_PVAV) {
        register I32 i;
         I32 max;
@@ -883,7 +901,7 @@ Perl_do_chomp(pTHX_ register SV *sv)
   nope:
     SvSETMAGIC(sv);
     return count;
-} 
+}
 
 void
 Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
@@ -951,10 +969,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
        switch (optype) {
        case OP_BIT_AND:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc & ruc;
@@ -966,10 +984,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
            break;
        case OP_BIT_XOR:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc ^ ruc;
@@ -978,10 +996,10 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
            goto mop_up_utf;
        case OP_BIT_OR:
            while (lulen && rulen) {
-               luc = utf8_to_uv((U8*)lc, &ulen);
+               luc = utf8_to_uv_chk((U8*)lc, &ulen, 0);
                lc += ulen;
                lulen -= ulen;
-               ruc = utf8_to_uv((U8*)rc, &ulen);
+               ruc = utf8_to_uv_chk((U8*)rc, &ulen, 0);
                rc += ulen;
                rulen -= ulen;
                duc = luc | ruc;
@@ -1089,8 +1107,8 @@ Perl_do_kv(pTHX)
     I32 dokeys =   (PL_op->op_type == OP_KEYS);
     I32 dovalues = (PL_op->op_type == OP_VALUES);
     I32 realhv = (SvTYPE(hv) == SVt_PVHV);
-    
-    if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV) 
+
+    if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV)
        dokeys = dovalues = TRUE;
 
     if (!hv) {
index 08b48fa..5f12b9d 100644 (file)
--- a/dosish.h
+++ b/dosish.h
 #define fwrite1 fwrite
 
 #define Fstat(fd,bufptr)   fstat((fd),(bufptr))
-#define Fflush(fp)         fflush(fp)
+#ifdef DJGPP
+#   define Fflush(fp)      djgpp_fflush(fp)
+#else
+#   define Fflush(fp)      fflush(fp)
+#endif
 #define Mkdir(path,mode)   mkdir((path),(mode))
 
 #ifndef WIN32
diff --git a/dump.c b/dump.c
index 86c56ce..ad0a21f 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -279,9 +279,9 @@ Perl_sv_peek(pTHX_ SV *sv)
        }
     }
     else if (SvNOKp(sv)) {
-       RESTORE_NUMERIC_STANDARD();
+       STORE_NUMERIC_LOCAL_SET_STANDARD();
        Perl_sv_catpvf(aTHX_ t, "(%g)",SvNVX(sv));
-       RESTORE_NUMERIC_LOCAL();
+       RESTORE_NUMERIC_LOCAL();
     }
     else if (SvIOKp(sv)) {
        if (SvIsUV(sv))
@@ -769,7 +769,7 @@ void
 Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
 {
     dTHR;
-    SV *d = sv_newmortal();
+    SV *d;
     char *s;
     U32 flags;
     U32 type;
@@ -783,7 +783,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     flags = SvFLAGS(sv);
     type = SvTYPE(sv);
 
-    Perl_sv_setpvf(aTHX_ d,
+    d = Perl_newSVpvf(aTHX_
                   "(0x%"UVxf") at 0x%"UVxf"\n%*s  REFCNT = %"IVdf"\n%*s  FLAGS = (",
                   PTR2UV(SvANY(sv)), PTR2UV(sv),
                   (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
@@ -833,6 +833,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        if (GvINTRO(sv))        sv_catpv(d, "INTRO,");
        if (GvMULTI(sv))        sv_catpv(d, "MULTI,");
        if (GvASSUMECV(sv))     sv_catpv(d, "ASSUMECV,");
+       if (GvIN_PAD(sv))       sv_catpv(d, "IN_PAD,");
        if (GvIMPORTED(sv)) {
            sv_catpv(d, "IMPORT");
            if (GvIMPORTED(sv) == GVf_IMPORTED)
@@ -867,6 +868,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     switch (type) {
     case SVt_NULL:
        PerlIO_printf(file, "NULL%s\n", s);
+       SvREFCNT_dec(d);
        return;
     case SVt_IV:
        PerlIO_printf(file, "IV%s\n", s);
@@ -915,6 +917,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        break;
     default:
        PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
+       SvREFCNT_dec(d);
        return;
     }
     if (type >= SVt_PVIV || type == SVt_IV) {
@@ -927,7 +930,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        PerlIO_putc(file, '\n');
     }
     if (type >= SVt_PVNV || type == SVt_NV) {
-       RESTORE_NUMERIC_STANDARD();
+       STORE_NUMERIC_LOCAL_SET_STANDARD();
        /* %Vg doesn't work? --jhi */
 #ifdef USE_LONG_DOUBLE
        Perl_dump_indent(aTHX_ level, file, "  NV = %.*" PERL_PRIgldbl "\n", LDBL_DIG, SvNVX(sv));
@@ -940,10 +943,13 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "  RV = 0x%"UVxf"\n", PTR2UV(SvRV(sv)));
        if (nest < maxnest)
            do_sv_dump(level+1, file, SvRV(sv), nest+1, maxnest, dumpops, pvlim);
+       SvREFCNT_dec(d);
        return;
     }
-    if (type < SVt_PV)
+    if (type < SVt_PV) {
+       SvREFCNT_dec(d);
        return;
+    }
     if (type <= SVt_PVLV) {
        if (SvPVX(sv)) {
            Perl_dump_indent(aTHX_ level, file,"  PV = 0x%"UVxf" ", PTR2UV(SvPVX(sv)));
@@ -1042,7 +1048,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
            theoret = HvKEYS(sv);
            theoret += theoret * theoret/pow2;
            PerlIO_putc(file, '\n');
-           Perl_dump_indent(aTHX_ level, file, "  hash quality = %.1f%%", theoret/sum*100);
+           Perl_dump_indent(aTHX_ level, file, "  hash quality = %.1"NVff"%%", theoret/sum*100);
        }
        PerlIO_putc(file, '\n');
        Perl_dump_indent(aTHX_ level, file, "  KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
@@ -1178,6 +1184,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        Perl_dump_indent(aTHX_ level, file, "  FLAGS = 0x%"UVxf"\n", (UV)IoFLAGS(sv));
        break;
     }
+    SvREFCNT_dec(d);
 }
 
 void
diff --git a/eg/ADB b/eg/ADB
deleted file mode 100644 (file)
index e8130e1..0000000
--- a/eg/ADB
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: ADB,v $$Revision: 4.1 $$Date: 92/08/07 17:20:06 $
-
-# This script is only useful when used in your crash directory.
-
-$num = shift;
-exec 'adb', '-k', "vmunix.$num", "vmcore.$num";
diff --git a/eg/README b/eg/README
deleted file mode 100644 (file)
index 15eb655..0000000
--- a/eg/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Although supplied with the perl package, the perl scripts in this eg
-directory and its subdirectories are placed in the public domain, and
-you may do anything with them that you wish.
-
-This stuff is supplied on an as-is basis--little attempt has been made to make
-any of it portable.  It's mostly here to give you an idea of what perl code
-looks like, and what tricks and idioms are used.
-
-System administrators responsible for many computers will enjoy the items
-down in the g directory very much.  The scan directory contains the beginnings
-of a system to check on and report various kinds of anomalies.
-
-If you machine doesn't support #!, the first thing you'll want to do is
-replace the #! with a couple of lines that look like this:
-
-       eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
-               if $running_under_some_shell;
-
-being sure to include any flags that were on the #! line.  A supplied script
-called "nih" will translate perl scripts in place for you:
-
-       nih g/g??
diff --git a/eg/changes b/eg/changes
deleted file mode 100644 (file)
index 901e1ed..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: changes,v $$Revision: 4.1 $$Date: 92/08/07 17:20:08 $
-
-($dir, $days) = @ARGV;
-$dir = '/' if $dir eq '';
-$days = '14' if $days eq '';
-
-# Masscomps do things differently from Suns
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-open(Find, "find $dir -mtime -$days -print |") ||
-       die "changes: can't run find";
-#else
-open(Find, "find $dir \\( -fstype nfs -prune \\) -o -mtime -$days -ls |") ||
-       die "changes: can't run find";
-#endif
-
-while (<Find>) {
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-    $x = `/bin/ls -ild $_`;
-    $_ = $x;
-    ($inode,$perm,$links,$owner,$group,$size,$month,$day,$time,$name)
-      = split(' ');
-#else
-    ($inode,$blocks,$perm,$links,$owner,$group,$size,$month,$day,$time,$name)
-      = split(' ');
-#endif
-
-    printf("%10s%3s %-8s %-8s%9s %3s %2s %s\n",
-           $perm,$links,$owner,$group,$size,$month,$day,$name);
-}
-
diff --git a/eg/client b/eg/client
deleted file mode 100755 (executable)
index 5900c90..0000000
--- a/eg/client
+++ /dev/null
@@ -1,34 +0,0 @@
-#!./perl
-
-$pat = 'S n C4 x8';
-$inet = 2;
-$echo = 7;
-$smtp = 25;
-$nntp = 119;
-$test = 2345;
-
-$SIG{'INT'} = 'dokill';
-
-$this = pack($pat,$inet,0,   128,149,13,43);
-$that = pack($pat,$inet,$test,127,0,0,1);
-
-if (socket(S,2,1,6)) { print "socket ok\n"; } else { die $!; }
-if (bind(S,$this)) { print "bind ok\n"; } else { die $!; }
-if (connect(S,$that)) { print "connect ok\n"; } else { die $!; }
-
-select(S); $| = 1; select(stdout);
-
-if ($child = fork) {
-    while (<STDIN>) {
-       print S;
-    }
-    sleep 3;
-    do dokill();
-}
-else {
-    while (<S>) {
-       print;
-    }
-}
-
-sub dokill { kill 9,$child if $child; }
diff --git a/eg/down b/eg/down
deleted file mode 100755 (executable)
index bbb0d06..0000000
--- a/eg/down
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/perl
-
-$| = 1;
-if ($#ARGV >= 0) {
-    $cmd = join(' ',@ARGV);
-}
-else {
-    print "Command: ";
-    $cmd = <stdin>;
-    chop($cmd);
-    while ($cmd =~ s/\\$//) {
-       print "+ ";
-       $cmd .= <stdin>;
-       chop($cmd);
-    }
-}
-$cwd = `pwd`; chop($cwd);
-
-open(FIND,'find . -type d -print|') || die "Can't run find";
-
-while (<FIND>) {
-    chop;
-    unless (chdir $_) {
-       print stderr "Can't cd to $_\n";
-       next;
-    }
-    print "\t--> ",$_,"\n";
-    system $cmd;
-    chdir $cwd;
-}
diff --git a/eg/dus b/eg/dus
deleted file mode 100644 (file)
index 3025e2b..0000000
--- a/eg/dus
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: dus,v $$Revision: 4.1 $$Date: 92/08/07 17:20:11 $
-
-# This script does a du -s on any directories in the current directory that
-# are not mount points for another filesystem.
-
-($mydev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-   $blksize,$blocks) = stat('.');
-
-open(ls,'ls -F1|');
-
-while (<ls>) {
-    chop;
-    next unless s|/$||;
-    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-       $blksize,$blocks) = stat($_);
-    next unless $dev == $mydev;
-    push(@ary,$_);
-}
-
-exec 'du', '-s', @ary;
diff --git a/eg/findcp b/eg/findcp
deleted file mode 100644 (file)
index 5dba040..0000000
--- a/eg/findcp
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: findcp,v $$Revision: 4.1 $$Date: 92/08/07 17:20:12 $
-
-# This is a wrapper around the find command that pretends find has a switch
-# of the form -cp host:destination.  It presumes your find implements -ls.
-# It uses tar to do the actual copy.  If your tar knows about the I switch
-# you may prefer to use findtar, since this one has to do the tar in batches.
-
-sub copy {
-    `tar cf - $list | rsh $desthost cd $destdir '&&' tar xBpf -`;
-}
-
-$sourcedir = $ARGV[0];
-if ($sourcedir =~ /^\//) {
-    $ARGV[0] = '.';
-    unless (chdir($sourcedir)) { die "Can't find directory $sourcedir: $!"; }
-}
-
-$args = join(' ',@ARGV);
-if ($args =~ s/-cp *([^ ]+)/-ls/) {
-    $dest = $1;
-    if ($dest =~ /(.*):(.*)/) {
-       $desthost = $1;
-       $destdir = $2;
-    }
-    else {
-       die "Malformed destination--should be host:directory";
-    }
-}
-else {
-    die("No destination specified");
-}
-
-open(find,"find $args |") || die "Can't run find for you: $!";
-
-while (<find>) {
-    @x = split(' ');
-    if ($x[2] =~ /^d/) { next;}
-    chop($filename = $x[10]);
-    if (length($list) > 5000) {
-       do copy();
-       $list = '';
-    }
-    else {
-       $list .= ' ';
-    }
-    $list .= $filename;
-}
-
-if ($list) {
-    do copy();
-}
diff --git a/eg/findtar b/eg/findtar
deleted file mode 100644 (file)
index 6462f66..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: findtar,v $$Revision: 4.1 $$Date: 92/08/07 17:20:13 $
-
-# findtar takes find-style arguments and spits out a tarfile on stdout.
-# It won't work unless your find supports -ls and your tar the I flag.
-
-$args = join(' ',@ARGV);
-open(find,"/usr/bin/find $args -ls |") || die "Can't run find for you.";
-
-open(tar,"| /bin/tar cIf - -") || die "Can't run tar for you: $!";
-
-while (<find>) {
-    @x = split(' ');
-    if ($x[2] =~ /^d/) { print tar '-d ';}
-    print tar $x[10],"\n";
-}
diff --git a/eg/g/gcp b/eg/g/gcp
deleted file mode 100644 (file)
index d18b6f6..0000000
--- a/eg/g/gcp
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: gcp,v $$Revision: 4.1 $$Date: 92/08/07 17:20:15 $
-
-# Here is a script to do global rcps.  See man page.
-
-$#ARGV >= 1 || die "Not enough arguments.\n";
-
-if ($ARGV[0] eq '-r') {
-    $rcp = 'rcp -r';
-    shift;
-} else {
-    $rcp = 'rcp';
-}
-$args = $rcp;
-$dest = $ARGV[$#ARGV];
-
-$SIG{'QUIT'} = 'CLEANUP';
-$SIG{'INT'} = 'CONT';
-
-while ($arg = shift) {
-    if ($arg =~ /^([-a-zA-Z0-9_+]+):/) {
-       if ($systype && $systype ne $1) {
-           die "Can't mix system type specifers ($systype vs $1).\n";
-       }
-       $#ARGV < 0 || $arg !~ /:$/ || die "No source file specified.\n";
-       $systype = $1;
-       $args .= " $arg";
-    } else {
-       if ($#ARGV >= 0) {
-           if ($arg =~ /^[\/~]/) {
-               $arg =~ /^(.*)\// && ($dir = $1);
-           } else {
-               if (!$pwd) {
-                   chop($pwd = `pwd`);
-               }
-               $dir = $pwd;
-           }
-       }
-       if ($olddir && $dir ne $olddir && $dest =~ /:$/) {
-           $args .= " $dest$olddir; $rcp";
-       }
-       $olddir = $dir;
-       $args .= " $arg";
-    }
-}
-
-die "No system type specified.\n" unless $systype;
-
-$args =~ s/:$/:$olddir/;
-
-chop($thishost = `hostname`);
-
-$one_of_these = ":$systype:";
-if ($systype =~ s/\+/[+]/g) {
-    $one_of_these =~ s/\+/:/g;
-}
-$one_of_these =~ s/-/:-/g;
-
-@ARGV = ();
-push(@ARGV,'.grem') if -f '.grem';
-push(@ARGV,'.ghosts') if -f '.ghosts';
-push(@ARGV,'/etc/ghosts');
-
-$remainder = '';
-
-line: while (<>) {
-    s/[ \t]*\n//;
-    if (!$_ || /^#/) {
-       next line;
-    }
-    if (/^([a-zA-Z_0-9]+)=(.+)/) {
-       $name = $1; $repl = $2;
-       $repl =~ s/\+/:/g;
-       $repl =~ s/-/:-/g;
-       $one_of_these =~ s/:$name:/:$repl:/;
-       $repl =~ s/:/:-/g;
-       $one_of_these =~ s/:-$name:/:-$repl:/g;
-       next line;
-    }
-    @gh = split(' ');
-    $host = $gh[0];
-  next line if $host eq $thishost;     # should handle aliases too
-    $wanted = 0;
-    foreach $class (@gh) {
-       $wanted++ if index($one_of_these,":$class:") >= 0;
-       $wanted = -9999 if index($one_of_these,":-$class:") >= 0;
-    }
-    if ($wanted > 0) {
-       ($cmd = $args) =~ s/[ \t]$systype:/ $host:/g;
-       print "$cmd\n";
-       $result = `$cmd 2>&1`;
-       $remainder .= "$host+" if
-           $result =~ /Connection timed out|Permission denied/;
-       print $result;
-    }
-}
-
-if ($remainder) {
-    chop($remainder);
-    open(grem,">.grem") || (printf stderr "Can't create .grem: $!\n");
-    print grem 'rem=', $remainder, "\n";
-    close(grem);
-    print 'rem=', $remainder, "\n";
-}
-
-sub CLEANUP {
-    exit;
-}
-
-sub CONT {
-    print "Continuing...\n";   # Just ignore the signal that kills rcp
-    $remainder .= "$host+";
-}
diff --git a/eg/g/gcp.man b/eg/g/gcp.man
deleted file mode 100644 (file)
index 1198554..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-.\" $RCSfile: gcp.man,v $$Revision: 4.1 $$Date: 92/08/07 17:20:17 $
-.TH GCP 1C "13 May 1988"
-.SH NAME
-gcp \- global file copy
-.SH SYNOPSIS
-.B gcp
-file1 file2
-.br
-.B gcp
-[
-.B \-r
-] file ... directory
-.SH DESCRIPTION
-.I gcp
-works just like rcp(1C) except that you may specify a set of hosts to copy files
-from or to.
-The host sets are defined in the file /etc/ghosts.
-(An individual host name can be used as a set containing one member.)
-You can give a command like
-
-       gcp /etc/motd sun:
-
-to copy your /etc/motd file to /etc/motd on all the Suns.
-If, on the other hand, you say
-
-       gcp /a/foo /b/bar sun:/tmp
-
-then your files will be copied to /tmp on all the Suns.
-The general rule is that if you don't specify the destination directory,
-files go to the same directory they are in currently.
-.P
-You may specify the union of two or more sets by using + as follows:
-
-       gcp /a/foo /b/bar 750+mc:
-
-which will copy /a/foo to /a/foo on all 750's and Masscomps, and then copy
-/b/bar to /b/bar on all 750's and Masscomps.
-.P
-Commonly used sets should be defined in /etc/ghosts.
-For example, you could add a line that says
-
-       pep=manny+moe+jack
-
-Another way to do that would be to add the word "pep" after each of the host
-entries:
-
-       manny   sun3 pep
-.br
-       moe             sun3 pep
-.br
-       jack            sun3 pep
-
-Hosts and sets of host can also be excluded:
-
-       foo=sun-sun2
-
-Any host so excluded will never be included, even if a subsequent set on the
-line includes it:
-
-       foo=abc+def
-.br
-       bar=xyz-abc+foo
-
-comes out to xyz+def.
-
-You can define private host sets by creating .ghosts in your current directory
-with entries just like /etc/ghosts.
-Also, if there is a file .grem, it defines "rem" to be the remaining hosts
-from the last gsh or gcp that didn't succeed everywhere.
-.PP
-Interrupting with a SIGINT will cause the rcp to the current host to be skipped
-and execution resumed with the next host.
-To stop completely, send a SIGQUIT.
-.SH SEE ALSO
-rcp(1C)
-.SH BUGS
-All the bugs of rcp, since it calls rcp.
diff --git a/eg/g/ged b/eg/g/ged
deleted file mode 100644 (file)
index 07ac88f..0000000
--- a/eg/g/ged
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: ged,v $$Revision: 4.1 $$Date: 92/08/07 17:20:18 $
-
-# Does inplace edits on a set of files on a set of machines.
-#
-# Typical invokation:
-#
-#      ged vax+sun /etc/passwd
-#      s/Freddy/Freddie/;
-#      ^D
-#
-
-$class = shift;
-$files = join(' ',@ARGV);
-
-die "Usage: ged class files <perlcmds\n" unless $files;
-
-exec "gsh", $class, "-d", "perl -pi.bak - $files";
-
-die "Couldn't execute gsh for some reason, stopped";
diff --git a/eg/g/ghosts b/eg/g/ghosts
deleted file mode 100644 (file)
index 96ec771..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# This first section gives alternate sets defined in terms of the sets given
-# by the second section.  The order is important--all references must be
-# forward references.
-
-Nnd=sun-nd
-all=sun+mc+vax
-baseline=sun+mc
-sun=sun2+sun3
-vax=750+8600
-pep=manny+moe+jack
-
-# This second section defines the basic sets.  Each host should have a line
-# that specifies which sets it is a member of.  Extra sets should be separated
-# by white space.  (The first section isn't strictly necessary, since all sets
-# could be defined in the second section, but then it wouldn't be so readable.)
-
-basvax 8600    src
-cdb0   sun3            sys
-cdb1   sun3            sys
-cdb2   sun3            sys
-chief  sun3    src
-tis0   sun3
-manny  sun3            sys
-moe    sun3            sys
-jack   sun3            sys
-disney sun3            sys
-huey   sun3            nd
-dewey  sun3            nd
-louie  sun3            nd
-bizet  sun2    src     sys
-gif0   mc      src
-mc0    mc
-dtv0   mc
diff --git a/eg/g/gsh b/eg/g/gsh
deleted file mode 100644 (file)
index 4bc5d87..0000000
--- a/eg/g/gsh
+++ /dev/null
@@ -1,117 +0,0 @@
-#! /usr/bin/perl
-
-# $RCSfile: gsh,v $$Revision: 4.1 $$Date: 92/08/07 17:20:20 $
-
-# Do rsh globally--see man page
-
-$SIG{'QUIT'} = 'quit';                 # install signal handler for SIGQUIT
-
-sub getswitches {
-    while ($ARGV[0] =~ /^-/) {         # parse switches
-       $ARGV[0] =~ /^-h/ && ($showhost++,$silent++,shift(@ARGV),next);
-       $ARGV[0] =~ /^-s/ && ($silent++,shift(@ARGV),next);
-       $ARGV[0] =~ /^-d/ && ($dodist++,shift(@ARGV),next);
-       $ARGV[0] =~ /^-n/ && ($n=' -n',shift(@ARGV),next);
-       $ARGV[0] =~ /^-l/ && ($l=' -l ' . $ARGV[1],shift(@ARGV),shift(@ARGV),
-                               next);
-       last;
-    }
-}
-
-do getswitches();                      # get any switches before class
-$systype = shift;                      # get name representing set of hosts
-do getswitches();                      # same switches allowed after class
-
-if ($dodist) {                         # distribute input over all rshes?
-    `cat >/tmp/gsh$$`;                 #  get input into a handy place
-    $dist = " </tmp/gsh$$";            #  each rsh takes input from there
-}
-
-$cmd = join(' ',@ARGV);                        # remaining args constitute the command
-$cmd =~ s/'/'"'"'/g;                   # quote any embedded single quotes
-
-$one_of_these = ":$systype:";          # prepare to expand "macros"
-$one_of_these =~ s/\+/:/g;             # we hope to end up with list of
-$one_of_these =~ s/-/:-/g;             #  colon separated attributes
-
-@ARGV = ();
-push(@ARGV,'.grem') if -f '.grem';
-push(@ARGV,'.ghosts') if -f '.ghosts';
-push(@ARGV,'/etc/ghosts');
-
-$remainder = '';
-
-line: while (<>) {             # for each line of ghosts
-
-    s/[ \t]*\n//;                      # trim trailing whitespace
-    if (!$_ || /^#/) {                 # skip blank line or comment
-       next line;
-    }
-
-    if (/^(\w+)=(.+)/) {               # a macro line?
-       $name = $1; $repl = $2;
-       $repl =~ s/\+/:/g;
-       $repl =~ s/-/:-/g;
-       $one_of_these =~ s/:$name:/:$repl:/;    # do expansion in "wanted" list
-       $repl =~ s/:/:-/g;
-       $one_of_these =~ s/:-$name:/:-$repl:/;
-       next line;
-    }
-
-    # we have a normal line
-
-    @attr = split(' ');                        # a list of attributes to match against
-                                       #   which we put into an array
-    $host = $attr[0];                  # the first attribute is the host name
-    if ($showhost) {
-       $showhost = "$host:\t";
-    }
-
-    $wanted = 0;
-    foreach $attr (@attr) {            # iterate over attribute array
-       $wanted++ if index($one_of_these,":$attr:") >= 0;
-       $wanted = -9999 if index($one_of_these,":-$attr:") >= 0;
-    }
-    if ($wanted > 0) {
-       print "rsh $host$l$n '$cmd'\n" unless $silent;
-       $SIG{'INT'} = 'DEFAULT';
-       if (open(PIPE,"rsh $host$l$n '$cmd'$dist 2>&1|")) {     # start an rsh
-           $SIG{'INT'} = 'cont';
-           for ($iter=0; <PIPE>; $iter++) {
-               unless ($iter) {
-                   $remainder .= "$host+"
-                       if /Connection timed out|Permission denied/;
-               }
-               print $showhost,$_;
-           }
-           close(PIPE);
-       } else {
-           print "(Can't execute rsh: $!)\n";
-           $SIG{'INT'} = 'cont';
-       }
-    }
-}
-
-unlink "/tmp/gsh$$" if $dodist;
-
-if ($remainder) {
-    chop($remainder);
-    open(grem,">.grem") || (printf stderr "Can't make a .grem file: $!\n");
-    print grem 'rem=', $remainder, "\n";
-    close(grem);
-    print 'rem=', $remainder, "\n";
-}
-
-# here are a couple of subroutines that serve as signal handlers
-
-sub cont {
-    print "\rContinuing...\n";
-    $remainder .= "$host+";
-}
-
-sub quit {
-    $| = 1;
-    print "\r";
-    $SIG{'INT'} = '';
-    kill 2, $$;
-}
diff --git a/eg/g/gsh.man b/eg/g/gsh.man
deleted file mode 100644 (file)
index 2958707..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-.\" $RCSfile: gsh.man,v $$Revision: 4.1 $$Date: 92/08/07 17:20:22 $
-.TH GSH 8 "13 May 1988"
-.SH NAME
-gsh \- global shell
-.SH SYNOPSIS
-.B gsh
-[options]
-.I host
-[options] 
-.I command
-.SH DESCRIPTION
-.I gsh
-works just like rsh(1C) except that you may specify a set of hosts to execute
-the command on.
-The host sets are defined in the file /etc/ghosts.
-(An individual host name can be used as a set containing one member.)
-You can give a command like
-
-       gsh sun /etc/mungmotd
-
-to run /etc/mungmotd on all your Suns.
-.P
-You may specify the union of two or more sets by using + as follows:
-
-       gsh 750+mc /etc/mungmotd
-
-which will run mungmotd on all 750's and Masscomps.
-.P
-Commonly used sets should be defined in /etc/ghosts.
-For example, you could add a line that says
-
-       pep=manny+moe+jack
-
-Another way to do that would be to add the word "pep" after each of the host
-entries:
-
-       manny   sun3 pep
-.br
-       moe             sun3 pep
-.br
-       jack            sun3 pep
-
-Hosts and sets of host can also be excluded:
-
-       foo=sun-sun2
-
-Any host so excluded will never be included, even if a subsequent set on the
-line includes it:
-
-       foo=abc+def
-       bar=xyz-abc+foo
-
-comes out to xyz+def.
-
-You can define private host sets by creating .ghosts in your current directory
-with entries just like /etc/ghosts.
-Also, if there is a file .grem, it defines "rem" to be the remaining hosts
-from the last gsh or gcp that didn't succeed everywhere.
-
-Options include all those defined by rsh, as well as
-
-.IP "\-d" 8
-Causes gsh to collect input till end of file, and then distribute that input
-to each invokation of rsh.
-.IP "\-h" 8
-Rather than print out the command followed by the output, merely prepends the
-host name to each line of output.
-.IP "\-s" 8
-Do work silently.
-.PP
-Interrupting with a SIGINT will cause the rsh to the current host to be skipped
-and execution resumed with the next host.
-To stop completely, send a SIGQUIT.
-.SH SEE ALSO
-rsh(1C)
-.SH BUGS
-All the bugs of rsh, since it calls rsh.
-
-Also, will not properly return data from the remote execution that contains
-null characters.
diff --git a/eg/muck b/eg/muck
deleted file mode 100644 (file)
index 873539b..0000000
--- a/eg/muck
+++ /dev/null
@@ -1,141 +0,0 @@
-#!../perl
-
-$M = '-M';
-$M = '-m' if -d '/usr/uts' && -f '/etc/master';
-
-do 'getopt.pl';
-do Getopt('f');
-
-if ($opt_f) {
-    $makefile = $opt_f;
-}
-elsif (-f 'makefile') {
-    $makefile = 'makefile';
-}
-elsif (-f 'Makefile') {
-    $makefile = 'Makefile';
-}
-else {
-    die "No makefile\n";
-}
-
-$MF = 'mf00';
-
-while(($key,$val) = each(ENV)) {
-    $mac{$key} = $val;
-}
-
-do scan($makefile);
-
-$co = $action{'.c.o'};
-$co = ' ' unless $co;
-
-$missing = "Missing dependencies:\n";
-foreach $key (sort keys(o)) {
-    if ($oc{$key}) {
-       $src = $oc{$key};
-       $action = $action{$key};
-    }
-    else {
-       $action = '';
-    }
-    if (!$action) {
-       if ($co && ($c = $key) =~ s/\.o$/.c/ && -f $c) {
-           $src = $c;
-           $action = $co;
-       }
-       else {
-           print "No source found for $key $c\n";
-           next;
-       }
-    }
-    $I = '';
-    $D = '';
-    $I .= $1 while $action =~ s/(-I\S+\s*)//;
-    $D .= $1 . ' ' while $action =~ s/(-D\w+)//;
-    if ($opt_v) {
-       $cmd = "Checking $key: cc $M $D $I $src";
-       $cmd =~ s/\s\s+/ /g;
-       print stderr $cmd,"\n";
-    }
-    open(CPP,"cc $M $D $I $src|") || die "Can't run C preprocessor: $!";
-    while (<CPP>) {
-       ($name,$dep) = split;
-       $dep =~ s|^\./||;
-       (print $missing,"$key: $dep\n"),($missing='')
-           unless ($dep{"$key: $dep"} += 2) > 2;
-    }
-}
-
-$extra = "\nExtraneous dependencies:\n";
-foreach $key (sort keys(dep)) {
-    if ($key =~ /\.o: .*\.h$/ && $dep{$key} == 1) {
-       print $extra,$key,"\n";
-       $extra = '';
-    }
-}
-
-sub scan {
-    local($makefile) = @_;
-    local($MF) = $MF;
-    print stderr "Analyzing $makefile.\n" if $opt_v;
-    $MF++;
-    open($MF,$makefile) || die "Can't open $makefile: $!";
-    while (<$MF>) {
-       chop;
-       chop($_ = $_ . <$MF>) while s/\\$//;
-       next if /^#/;
-       next if /^$/;
-       s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg;
-       s/\$\((\w+)\)/$mac{$1}/eg;
-       $mac{$1} = $2, next if /^(\w+)\s*=\s*(.*)/;
-       if (/^include\s+(.*)/) {
-           do scan($1);
-           print stderr "Continuing $makefile.\n" if $opt_v;
-           next;
-       }
-       if (/^([^:]+):\s*(.*)/) {
-           $left = $1;
-           $right = $2;
-           if ($right =~ /^([^;]*);(.*)/) {
-               $right = $1;
-               $action = $2;
-           }
-           else {
-               $action = '';
-           }
-           while (<$MF>) {
-               last unless /^\t/;
-               chop;
-               chop($_ = $_ . <$MF>) while s/\\$//;
-               next if /^#/;
-               last if /^$/;
-               s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg;
-               s/\$\((\w+)\)/$mac{$1}/eg;
-               $action .= $_;
-           }
-           foreach $targ (split(' ',$left)) {
-               $targ =~ s|^\./||;
-               foreach $src (split(' ',$right)) {
-                   $src =~ s|^\./||;
-                   $deplist{$targ} .= ' ' . $src;
-                   $dep{"$targ: $src"} = 1;
-                   $o{$src} = 1 if $src =~ /\.o$/;
-                   $oc{$targ} = $src if $targ =~ /\.o$/ && $src =~ /\.[yc]$/;
-               }
-               $action{$targ} .= $action;
-           }
-           redo if $_;
-       }
-    }
-    close($MF);
-}
-
-sub subst {
-    local($foo,$from,$to) = @_;
-    $foo = $mac{$foo};
-    $from =~ s/\./[.]/;
-    y/a/a/;
-    $foo =~ s/\b$from\b/$to/g;
-    $foo;
-}
diff --git a/eg/muck.man b/eg/muck.man
deleted file mode 100644 (file)
index 02ae428..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-.\" $RCSfile: muck.man,v $$Revision: 4.1 $$Date: 92/08/07 17:20:23 $
-.TH MUCK 1 "10 Jan 1989"
-.SH NAME
-muck \- make usage checker
-.SH SYNOPSIS
-.B muck
-[options]
-.SH DESCRIPTION
-.I muck
-looks at your current makefile and complains if you've left out any dependencies
-between .o and .h files.
-It also complains about extraneous dependencies.
-.PP
-You can use the -f FILENAME option to specify an alternate name for your
-makefile.
-The -v option is a little more verbose about what muck is mucking around
-with at the moment.
-.SH SEE ALSO
-make(1)
-.SH BUGS
-Only knows about .h, .c and .o files.
diff --git a/eg/myrup b/eg/myrup
deleted file mode 100644 (file)
index 2cbdf75..0000000
--- a/eg/myrup
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: myrup,v $$Revision: 4.1 $$Date: 92/08/07 17:20:26 $
-
-# This was a customization of ruptime requested by someone here who wanted
-# to be able to find the least loaded machine easily.  It uses the
-# /etc/ghosts file that's defined for gsh and gcp to prune down the
-# number of entries to those hosts we have administrative control over.
-
-print "node    load (u)\n------- --------\n";
-
-open(ghosts,'/etc/ghosts') || die "Can't open /etc/ghosts: $!";
-line: while (<ghosts>) {
-    next line if /^#/;
-    next line if /^$/;
-    next line if /=/;
-    ($host) = split;
-    $wanted{$host} = 1;
-}
-
-open(ruptime,'ruptime|') || die "Can't run ruptime: $!";
-open(sort,'|sort +1n');
-
-while (<ruptime>) {
-    ($host,$upness,$foo,$users,$foo,$foo,$load) = split(/[\s,]+/);
-    if ($wanted{$host} && $upness eq 'up') {
-       printf sort "%s\t%s (%d)\n", $host, $load, $users;
-    }
-}
diff --git a/eg/nih b/eg/nih
deleted file mode 100644 (file)
index 4475c49..0000000
--- a/eg/nih
+++ /dev/null
@@ -1,11 +0,0 @@
-eval 'exec /usr/bin/perl -Spi.bak $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
-# $RCSfile: nih,v $$Revision: 4.1 $$Date: 92/08/07 17:20:27 $
-
-# This script makes #! scripts directly executable on machines that don't
-# support #!.  It edits in place any scripts mentioned on the command line.
-
-s[^#!(.*)]
- [#!$1\neval 'exec $1 -S \$0 \${1+"\$@"}'\n\tif \$running_under_some_shell;]
-       if $. == 1;
diff --git a/eg/relink b/eg/relink
deleted file mode 100644 (file)
index 2c5793f..0000000
--- a/eg/relink
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/perl
-'di';
-'ig00';
-#
-# $RCSfile: relink,v $$Revision: 4.1 $$Date: 92/08/07 17:20:29 $
-#
-# $Log:        relink,v $
-
-($op = shift) || die "Usage: relink perlexpr [filenames]\n";
-if (!@ARGV) {
-    @ARGV = <STDIN>;
-    chop(@ARGV);
-}
-for (@ARGV) {
-    next unless -l;            # symbolic link?
-    $name = $_;
-    $_ = readlink($_);
-    $was = $_;
-    eval $op;
-    die $@ if $@;
-    if ($was ne $_) {
-       unlink($name);
-       symlink($_, $name);
-    }
-}
-##############################################################################
-
-       # These next few lines are legal in both Perl and nroff.
-
-.00;                   # finish .ig
-'di                    \" finish diversion--previous line must be blank
-.nr nl 0-1             \" fake up transition to first page again
-.nr % 0                        \" start at page 1
-';<<'.ex'; #__END__ ############# From here on it's a standard manual page ############
-.TH RELINK 1 "July 30, 1990"
-.AT 3
-.SH LINK
-relink \- relinks multiple symbolic links
-.SH SYNOPSIS
-.B relink perlexpr [symlinknames]
-.SH DESCRIPTION
-.I Relink
-relinks the symbolic links given according to the rule specified as the
-first argument.
-The argument is a Perl expression which is expected to modify the $_
-string in Perl for at least some of the names specified.
-For each symbolic link named on the command line, the Perl expression
-will be executed on the contents of the symbolic link with that name.
-If a given symbolic link's contents is not modified by the expression,
-it will not be changed.
-If a name given on the command line is not a symbolic link, it will be ignored.
-If no names are given on the command line, names will be read
-via standard input.
-.PP
-For example, to relink all symbolic links in the current directory
-pointing to somewhere in X11R3 so that they point to X11R4, you might say
-.nf
-
-       relink 's/X11R3/X11R4/' *
-
-.fi
-To change all occurences of links in the system from /usr/spool to /var/spool,
-you'd say
-.nf
-
-       find / -type l -print | relink 's#/usr/spool#/var/spool#'
-
-.fi
-.SH ENVIRONMENT
-No environment variables are used.
-.SH FILES
-.SH AUTHOR
-Larry Wall
-.SH "SEE ALSO"
-ln(1)
-.br
-perl(1)
-.SH DIAGNOSTICS
-If you give an invalid Perl expression you'll get a syntax error.
-.SH BUGS
-.ex
diff --git a/eg/rename b/eg/rename
deleted file mode 100755 (executable)
index 10e97f7..0000000
--- a/eg/rename
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/perl
-'di';
-'ig00';
-#
-# $RCSfile: rename,v $$Revision: 4.1 $$Date: 92/08/07 17:20:30 $
-#
-# $Log:        rename,v $
-
-($op = shift) || die "Usage: rename perlexpr [filenames]\n";
-if (!@ARGV) {
-    @ARGV = <STDIN>;
-    chop(@ARGV);
-}
-for (@ARGV) {
-    $was = $_;
-    eval $op;
-    die $@ if $@;
-    rename($was,$_) unless $was eq $_;
-}
-##############################################################################
-
-       # These next few lines are legal in both Perl and nroff.
-
-.00;                   # finish .ig
-'di                    \" finish diversion--previous line must be blank
-.nr nl 0-1             \" fake up transition to first page again
-.nr % 0                        \" start at page 1
-';<<'.ex'; #__END__ ############# From here on it's a standard manual page ############
-.TH RENAME 1 "July 30, 1990"
-.AT 3
-.SH NAME
-rename \- renames multiple files
-.SH SYNOPSIS
-.B rename perlexpr [files]
-.SH DESCRIPTION
-.I Rename
-renames the filenames supplied according to the rule specified as the
-first argument.
-The argument is a Perl expression which is expected to modify the $_
-string in Perl for at least some of the filenames specified.
-If a given filename is not modified by the expression, it will not be
-renamed.
-If no filenames are given on the command line, filenames will be read
-via standard input.
-.PP
-For example, to rename all files matching *.bak to strip the extension,
-you might say
-.nf
-
-       rename 's/\e.bak$//' *.bak
-
-.fi
-To translate uppercase names to lower, you'd use
-.nf
-
-       rename 'y/A-Z/a-z/' *
-
-.fi
-.SH ENVIRONMENT
-No environment variables are used.
-.SH FILES
-.SH AUTHOR
-Larry Wall
-.SH "SEE ALSO"
-mv(1)
-.br
-perl(1)
-.SH DIAGNOSTICS
-If you give an invalid Perl expression you'll get a syntax error.
-.SH BUGS
-.I Rename
-does not check for the existence of target filenames, so use with care.
-.ex
diff --git a/eg/rmfrom b/eg/rmfrom
deleted file mode 100644 (file)
index 7178e77..0000000
--- a/eg/rmfrom
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/perl -n
-
-# $RCSfile: rmfrom,v $$Revision: 4.1 $$Date: 92/08/07 17:20:31 $
-
-# A handy (but dangerous) script to put after a find ... -print.
-
-chop; unlink;
diff --git a/eg/scan/scan_df b/eg/scan/scan_df
deleted file mode 100644 (file)
index c221cdc..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_df,v $$Revision: 4.1 $$Date: 92/08/07 17:20:33 $
-
-# This report points out filesystems that are in danger of overflowing.
-
-(chdir '/usr/adm/private/memories') || die "Can't cd to memories: $!\n";
-`df >newdf`;
-open(Df, 'olddf');
-
-while (<Df>) {
-    ($fs,$kbytes,$used,$avail,$capacity,$mounted_on) = split;
-    next if $fs =~ /:/;
-    next if $fs eq '';
-    $oldused{$fs} = $used;
-}
-
-open(Df, 'newdf') || die "scan_df: can't open newdf";
-
-while (<Df>) {
-    ($fs,$kbytes,$used,$avail,$capacity,$mounted_on) = split;
-    next if $fs =~ /:/;
-    next if $fs eq '';
-    $oldused = $oldused{$fs};
-    next if ($oldused == $used && $capacity < 99);     # inactive filesystem
-    if ($capacity >= 90) {
-#if defined(mc300) || defined(mc500) || defined(mc700)
-       $_ = substr($_,0,13) . '        ' . substr($_,13,1000);
-       $kbytes /= 2;           # translate blocks to K
-       $used /= 2;
-       $oldused /= 2;
-       $avail /= 2;
-#endif
-       $diff = int($used - $oldused);
-       if ($avail < $diff * 2) {       # mark specially if in danger
-           $mounted_on .= ' *';
-       }
-       next if $diff < 50 && $mounted_on eq '/';
-       $fs =~ s|/dev/||;
-       if ($diff >= 0) {
-           $diff = '(+' . $diff . ')';
-       }
-       else {
-           $diff = '(' . $diff . ')';
-       }
-       printf "%-8s%8d%8d %-8s%8d%7s    %s\n",
-           $fs,$kbytes,$used,$diff,$avail,$capacity,$mounted_on;
-    }
-}
-
-rename('newdf','olddf');
diff --git a/eg/scan/scan_last b/eg/scan/scan_last
deleted file mode 100644 (file)
index 4d15ca0..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_last,v $$Revision: 4.1 $$Date: 92/08/07 17:20:35 $
-
-# This reports who was logged on at weird hours
-
-($dy, $mo, $lastdt) = split(/ +/,`date`);
-
-open(Last, 'exec last 2>&1 |') || die "scan_last: can't run last";
-
-while (<Last>) {
-#if defined(mc300) || defined(mc500) || defined(mc700)
-    $_ = substr($_,0,19) . substr($_,23,100);
-#endif
-    next if /^$/;
-    (print),next if m|^/|;
-    $login  = substr($_,0,8);
-    $tty    = substr($_,10,7);
-    $from   = substr($_,19,15);
-    $day    = substr($_,36,3);
-    $mo     = substr($_,40,3);
-    $dt     = substr($_,44,2);
-    $hr     = substr($_,47,2);
-    $min    = substr($_,50,2);
-    $dash   = substr($_,53,1);
-    $tohr   = substr($_,55,2);
-    $tomin  = substr($_,58,2);
-    $durhr  = substr($_,63,2);
-    $durmin = substr($_,66,2);
-    
-    next unless $hr;
-    next if $login eq 'reboot  ';
-    next if $login eq 'shutdown';
-
-    if ($dt != $lastdt) {
-       if ($lastdt < $dt) {
-           $seen += $dt - $lastdt;
-       }
-       else {
-           $seen++;
-       }
-       $lastdt = $dt;
-    }
-
-    $inat = $hr + $min / 60;
-    if ($tohr =~ /^[a-z]/) {
-       $outat = 12;            # something innocuous
-    } else {
-       $outat = $tohr + $tomin / 60;
-    }
-
-  last if $seen + ($inat < 8) > 1;
-
-    if ($inat < 5 || $inat > 21 || $outat < 6 || $outat > 23) {
-       print;
-    }
-}
diff --git a/eg/scan/scan_messages b/eg/scan/scan_messages
deleted file mode 100644 (file)
index 6cf0997..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_messages,v $$Revision: 4.1 $$Date: 92/08/07 17:20:37 $
-
-# This prints out extraordinary console messages.  You'll need to customize.
-
-chdir('/usr/adm/private/memories') || die "Can't cd to memories: $!\n";
-
-$maxpos = `cat oldmsgs 2>&1`;
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-open(Msgs, '/dev/null') || die "scan_messages: can't open messages";
-#else
-open(Msgs, '/usr/adm/messages') || die "scan_messages: can't open messages";
-#endif
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-   $blksize,$blocks) = stat(Msgs);
-
-if ($size < $maxpos) {         # Did somebody truncate messages file?
-    $maxpos = 0;
-}
-
-seek(Msgs,$maxpos,0);          # Start where we left off last time.
-
-while (<Msgs>) {
-    s/\[(\d+)\]/#/ && s/$1/#/g;
-#ifdef vax
-    $_ =~ s/[A-Z][a-z][a-z] +\w+ +[0-9:]+ +\w+ +//;
-    next if /root@.*:/;
-    next if /^vmunix: 4.3 BSD UNIX/;
-    next if /^vmunix: Copyright/;
-    next if /^vmunix: avail mem =/;
-    next if /^vmunix: SBIA0 at /;
-    next if /^vmunix: disk ra81 is/;
-    next if /^vmunix: dmf. at uba/;
-    next if /^vmunix: dmf.:.*asynch/;
-    next if /^vmunix: ex. at uba/;
-    next if /^vmunix: ex.: HW/;
-    next if /^vmunix: il. at uba/;
-    next if /^vmunix: il.: hardware/;
-    next if /^vmunix: ra. at uba/;
-    next if /^vmunix: ra.: media/;
-    next if /^vmunix: real mem/;
-    next if /^vmunix: syncing disks/;
-    next if /^vmunix: tms/;
-    next if /^vmunix: tmscp. at uba/;
-    next if /^vmunix: uba. at /;
-    next if /^vmunix: uda. at /;
-    next if /^vmunix: uda.: unit . ONLIN/;
-    next if /^vmunix: .*buffers containing/;
-    next if /^syslogd: .*newslog/;
-#endif
-    next if /unknown service/;
-    next if /^\.\.\.$/;
-    if (/^[A-Z][a-z][a-z] [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]/) {
-       $pfx = '';
-       next;
-    }
-    next if /^[ \t]*$/;
-    next if /^[ 0-9]*done$/;
-    if (/^A/) {
-       next if /^Accounting [sr]/;
-    }
-    elsif (/^C/) {
-       next if /^Called from/;
-       next if /^Copyright/;
-    }
-    elsif (/^E/) {
-       next if /^End traceback/;
-       next if /^Ethernet address =/;
-    }
-    elsif (/^K/) {
-       next if /^KERNEL MODE/;
-    }
-    elsif (/^R/) {
-       next if /^Rebooting Unix/;
-    }
-    elsif (/^S/) {
-       next if /^Sun UNIX 4\.2 Release/;
-    }
-    elsif (/^W/) {
-       next if /^WARNING: clock gained/;
-    }
-    elsif (/^a/) {
-       next if /^arg /;
-       next if /^avail mem =/;
-    }
-    elsif (/^b/) {
-       next if /^bwtwo[0-9] at /;
-    }
-    elsif (/^c/) {
-       next if /^cgone[0-9] at /;
-       next if /^cdp[0-9] at /;
-       next if /^csr /;
-    }
-    elsif (/^d/) {
-       next if /^dcpa: init/;
-       next if /^done$/;
-       next if /^dts/;
-       next if /^dump i\/o error/;
-       next if /^dumping to dev/;
-       next if /^dump succeeded/;
-       $pfx = '*' if /^dev = /;
-    }
-    elsif (/^e/) {
-       next if /^end \*\*/;
-       next if /^error in copy/;
-    }
-    elsif (/^f/) {
-       next if /^found /;
-    }
-    elsif (/^i/) {
-       next if /^ib[0-9] at /;
-       next if /^ie[0-9] at /;
-    }
-    elsif (/^l/) {
-       next if /^le[0-9] at /;
-    }
-    elsif (/^m/) {
-       next if /^mem = /;
-       next if /^mt[0-9] at /;
-       next if /^mti[0-9] at /;
-       $pfx = '*' if /^mode = /;
-    }
-    elsif (/^n/) {
-       next if /^not found /;
-    }
-    elsif (/^p/) {
-       next if /^page map /;
-       next if /^pi[0-9] at /;
-       $pfx = '*' if /^panic/;
-    }
-    elsif (/^q/) {
-       next if /^qqq /;
-    }
-    elsif (/^r/) {
-       next if /^read  /;
-       next if /^revarp: Requesting/;
-       next if /^root [od]/;
-    }
-    elsif (/^s/) {
-       next if /^sc[0-9] at /;
-       next if /^sd[0-9] at /;
-       next if /^sd[0-9]: </;
-       next if /^si[0-9] at /;
-       next if /^si_getstatus/;
-       next if /^sk[0-9] at /;
-       next if /^skioctl/;
-       next if /^skopen/;
-       next if /^skprobe/;
-       next if /^skread/;
-       next if /^skwrite/;
-       next if /^sky[0-9] at /;
-       next if /^st[0-9] at /;
-       next if /^st0:.*load/;
-       next if /^stat1 = /;
-       next if /^syncing disks/;
-       next if /^syslogd: going down on signal 15/;
-    }
-    elsif (/^t/) {
-       next if /^timeout [0-9]/;
-       next if /^tm[0-9] at /;
-       next if /^tod[0-9] at /;
-       next if /^tv [0-9]/;
-       $pfx = '*' if /^trap address/;
-    }
-    elsif (/^u/) {
-       next if /^unit nsk/;
-       next if /^use one of/;
-       $pfx = '' if /^using/;
-       next if /^using [0-9]+ buffers/;
-    }
-    elsif (/^x/) {
-       next if /^xy[0-9] at /;
-       next if /^write [0-9]/;
-       next if /^xy[0-9]: </;
-       next if /^xyc[0-9] at /;
-    }
-    elsif (/^y/) {
-       next if /^yyy [0-9]/;
-    }
-    elsif (/^z/) {
-       next if /^zs[0-9] at /;
-    }
-    $pfx = '*' if /^[a-z]+:$/;
-    s/pid [0-9]+: //;
-    if (/last message repeated ([0-9]+) time/) {
-       $seen{$last} += $1;
-       next;
-    }
-    s/^/$pfx/ if $pfx;
-    unless ($seen{$_}++) {
-       push(@seen,$_);
-    }
-    $last = $_;
-}
-$max = tell(Msgs);
-
-open(tmp,'|sort >oldmsgs.tmp') || die "Can't create tmp file: $!\n";
-while ($_ = pop(@seen)) {
-    print tmp $_;
-}
-close(tmp);
-open(tmp,'oldmsgs.tmp') || die "Can't reopen tmp file: $!\n";
-while (<tmp>) {
-    if (/^nd:/) {
-       next if $seen{$_} < 20;
-    }
-    if (/NFS/) {
-       next if $seen{$_} < 20;
-    }
-    if (/no carrier/) {
-       next if $seen{$_} < 20;
-    }
-    if (/silo overflow/) {
-       next if $seen{$_} < 20;
-    }
-    print $seen{$_},":\t",$_;
-}
-
-print `rm -f oldmsgs.tmp 2>&1; echo $max > oldmsgs 2>&1`;
diff --git a/eg/scan/scan_passwd b/eg/scan/scan_passwd
deleted file mode 100644 (file)
index 50f6fc8..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: scan_passwd,v $$Revision: 4.1 $$Date: 92/08/07 17:20:38 $
-
-# This scans passwd file for security holes.
-
-open(Pass,'/etc/passwd') || die "Can't open passwd file: $!\n";
-# $dotriv = (`date` =~ /^Mon/);
-$dotriv = 1;
-
-while (<Pass>) {
-    ($login,$pass,$uid,$gid,$gcos,$home,$shell) = split(/:/);
-    if ($shell eq '') {
-       print "Short: $_";
-    }
-    next if /^[+]/;
-    if ($pass eq '') {
-       if (index(":sync:lpq:+:", ":$login:") < 0) {
-           print "No pass: $login\t$gcos\n";
-       }
-    }
-    elsif ($dotriv && crypt($login,substr($pass,0,2)) eq $pass) {
-       print "Trivial: $login\t$gcos\n";
-    }
-    if ($uid == 0) {
-       if ($login !~ /^.?root$/ && $pass ne '*') {
-           print "Extra root: $_";
-       }
-    }
-}
diff --git a/eg/scan/scan_ps b/eg/scan/scan_ps
deleted file mode 100644 (file)
index 18b5cb2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_ps,v $$Revision: 4.1 $$Date: 92/08/07 17:20:40 $
-
-# This looks for looping processes.
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-open(Ps, '/bin/ps -el|') || die "scan_ps: can't run ps";
-
-while (<Ps>) {
-    next if /rwhod/;
-    print if index(' T', substr($_,62,1)) < 0;
-}
-#else
-open(Ps, '/bin/ps auxww|') || die "scan_ps: can't run ps";
-
-while (<Ps>) {
-    next if /dataserver/;
-    next if /nfsd/;
-    next if /update/;
-    next if /ypserv/;
-    next if /rwhod/;
-    next if /routed/;
-    next if /pagedaemon/;
-#ifdef vax
-    ($user,$pid,$cpu,$mem,$sz,$rss,$tt,$stat,$start,$time) = split;
-#else
-    ($user,$pid,$cpu,$mem,$sz,$rss,$tt,$stat,$time) = split;
-#endif
-    print if length($time) > 4;
-}
-#endif
diff --git a/eg/scan/scan_sudo b/eg/scan/scan_sudo
deleted file mode 100644 (file)
index 5b143e9..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_sudo,v $$Revision: 4.1 $$Date: 92/08/07 17:20:42 $
-
-# Analyze the sudo log.
-
-chdir('/usr/adm/private/memories') || die "Can't cd to memories: $!\n";
-
-if (open(Oldsudo,'oldsudo')) {
-    $maxpos = <Oldsudo>;
-    close Oldsudo;
-}
-else {
-    $maxpos = 0;
-    `echo 0 >oldsudo`;
-}
-
-unless (open(Sudo, '/usr/adm/sudo.log')) {
-    print "Somebody removed sudo.log!!!\n" if $maxpos;
-    exit 0;
-}
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-   $blksize,$blocks) = stat(Sudo);
-
-if ($size < $maxpos) {
-    $maxpos = 0;
-    print "Somebody reset sudo.log!!!\n";
-}
-
-seek(Sudo,$maxpos,0);
-
-while (<Sudo>) {
-    s/^.* :[ \t]+//;
-    s/ipcrm.*/ipcrm/;
-    s/kill.*/kill/;
-    unless ($seen{$_}++) {
-       push(@seen,$_);
-    }
-    $last = $_;
-}
-$max = tell(Sudo);
-
-open(tmp,'|sort >oldsudo.tmp') || die "Can't create tmp file: $!\n";
-while ($_ = pop(@seen)) {
-    print tmp $_;
-}
-close(tmp);
-open(tmp,'oldsudo.tmp') || die "Can't reopen tmp file: $!\n";
-while (<tmp>) {
-    print $seen{$_},":\t",$_;
-}
-
-print `(rm -f oldsudo.tmp; echo $max > oldsudo) 2>&1`;
diff --git a/eg/scan/scan_suid b/eg/scan/scan_suid
deleted file mode 100644 (file)
index c10aa58..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/perl -P
-
-# $RCSfile: scan_suid,v $$Revision: 4.1 $$Date: 92/08/07 17:20:43 $
-
-# Look for new setuid root files.
-
-chdir '/usr/adm/private/memories' || die "Can't cd to memories: $!\n";
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-   $blksize,$blocks) = stat('oldsuid');
-if ($nlink) {
-    $lasttime = $mtime;
-    $tmp = $ctime - $atime;
-    if ($tmp <= 0 || $tmp >= 10) {
-       print "WARNING: somebody has read oldsuid!\n";
-    }
-    $tmp = $ctime - $mtime;
-    if ($tmp <= 0 || $tmp >= 10) {
-       print "WARNING: somebody has modified oldsuid!!!\n";
-    }
-} else {
-    $lasttime = time - 60 * 60 * 24;   # one day ago
-}
-$thistime = time;
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-open(Find, 'find / -perm -04000 -print |') ||
-       die "scan_find: can't run find";
-#else
-open(Find, 'find / \( -fstype nfs -prune \) -o -perm -04000 -ls |') ||
-       die "scan_find: can't run find";
-#endif
-
-open(suid, '>newsuid.tmp');
-
-while (<Find>) {
-
-#if defined(mc300) || defined(mc500) || defined(mc700)
-    $x = `/bin/ls -il $_`;
-    $_ = $x;
-    s/^ *//;
-    ($inode,$perm,$links,$owner,$group,$size,$month,$day,$time,$name)
-      = split;
-#else
-    s/^ *//;
-    ($inode,$blocks,$perm,$links,$owner,$group,$size,$month,$day,$time,$name)
-      = split;
-#endif
-
-    if ($perm =~ /[sS]/ && $owner eq 'root') {
-       ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-          $blksize,$blocks) = stat($name);
-       $foo = sprintf("%10s%3s %-8s %-8s%9s %3s %2s %s %s\n",
-               $perm,$links,$owner,$group,$size,$month,$day,$name,$inode);
-       print suid $foo;
-       if ($ctime > $lasttime) {
-           if ($ctime > $thistime) {
-               print "Future file: $foo";
-           }
-           else {
-               $ct .= $foo;
-           }
-       }
-    }
-}
-close(suid);
-
-print `sort +7 -8 newsuid.tmp >newsuid 2>&1`;
-$foo = `/bin/diff oldsuid newsuid 2>&1`;
-print "Differences in suid info:\n",$foo if $foo;
-print `mv oldsuid oldoldsuid 2>&1; mv newsuid oldsuid 2>&1`;
-print `touch oldsuid 2>&1;sleep 2 2>&1;chmod o+w oldsuid 2>&1`;
-print `rm -f newsuid.tmp 2>&1`;
-
-@ct = split(/\n/,$ct);
-$ct = '';
-$* = 1;
-while ($#ct >= 0) {
-    $tmp = shift(@ct);
-    unless ($foo =~ "^>.*$tmp\n") { $ct .= "$tmp\n"; }
-}
-
-print "Inode changed since last time:\n",$ct if $ct;
-
diff --git a/eg/scan/scanner b/eg/scan/scanner
deleted file mode 100644 (file)
index e73cdc8..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: scanner,v $$Revision: 4.1 $$Date: 92/08/07 17:20:44 $
-
-# This runs all the scan_* routines on all the machines in /etc/ghosts.
-# We run this every morning at about 6 am:
-
-#      !/bin/sh
-#      cd /usr/adm/private
-#      decrypt scanner | perl >scan.out 2>&1
-#      mail admin <scan.out
-
-# Note that the scan_* files should be encrypted with the key "-inquire", and
-# scanner should be encrypted somehow so that people can't find that key.
-# I leave it up to you to figure out how to unencrypt it before executing.
-
-$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin:/usr/ucb:.';
-
-$| = 1;                # command buffering on stdout
-
-print "Subject: bizarre happenings\n\n";
-
-(chdir '/usr/adm/private') || die "Can't cd to /usr/adm/private: $!\n";
-
-if ($#ARGV >= 0) {
-    @scanlist = @ARGV;
-} else {
-    @scanlist = split(/[ \t\n]+/,`echo scan_*`);
-}
-
-scan: while ($scan = shift(@scanlist)) {
-    print "\n********** $scan **********\n";
-    $showhost++;
-
-    $systype = 'all';
-
-    open(ghosts, '/etc/ghosts') || die 'No /etc/ghosts file';
-
-    $one_of_these = ":$systype:";
-    if ($systype =~ s/\+/[+]/g) {
-       $one_of_these =~ s/\+/:/g;
-    }
-
-    line: while (<ghosts>) {
-       s/[ \t]*\n//;
-       if (!$_ || /^#/) {
-           next line;
-       }
-       if (/^([a-zA-Z_0-9]+)=(.+)/) {
-           $name = $1; $repl = $2;
-           $repl =~ s/\+/:/g;
-           $one_of_these =~ s/:$name:/:$repl:/;
-           next line;
-       }
-       @gh = split;
-       $host = $gh[0];
-       if ($showhost) { $showhost = "$host:\t"; }
-       class: while ($class = pop(gh)) {
-           if (index($one_of_these,":$class:") >=0) {
-               $iter = 0;
-               `exec crypt -inquire <$scan >.x 2>/dev/null`;
-               unless (open(scan,'.x')) {
-                   print "Can't run $scan: $!\n";
-                   next scan;
-               }
-               $cmd = <scan>;
-               unless ($cmd =~ s/#!(.*)\n/$1/) {
-                   $cmd = '/usr/bin/perl';
-               }
-               close(scan);
-               if (open(PIPE,"exec rsh $host '$cmd' <.x|")) {
-                   sleep(5);
-                   unlink '.x';
-                   while (<PIPE>) {
-                       last if $iter++ > 1000;         # must be looping
-                       next if /^[0-9.]+u [0-9.]+s/;
-                       print $showhost,$_;
-                   }
-                   close(PIPE);
-               } else {
-                   print "(Can't execute rsh: $!)\n";
-               }
-               last class;
-           }
-       }
-    }
-}
diff --git a/eg/server b/eg/server
deleted file mode 100755 (executable)
index 49a140a..0000000
--- a/eg/server
+++ /dev/null
@@ -1,27 +0,0 @@
-#!./perl
-
-$pat = 'S n C4 x8';
-$inet = 2;
-$echo = 7;
-$smtp = 25;
-$nntp = 119;
-
-$this = pack($pat,$inet,2345, 0,0,0,0);
-select(NS); $| = 1; select(stdout);
-
-if (socket(S,2,1,6)) { print "socket ok\n"; } else { die $!; }
-if (bind(S,$this)) { print "bind ok\n"; } else { die $!; }
-if (listen(S,5)) { print "listen ok\n"; } else { die $!; }
-for (;;) {
-    print "Listening again\n";
-    if ($addr = accept(NS,S)) { print "accept ok\n"; } else { die $!; }
-
-    @ary = unpack($pat,$addr);
-    $, = ' ';
-    print @ary; print "\n";
-
-    while (<NS>) {
-       print;
-       print NS;
-    }
-}
diff --git a/eg/shmkill b/eg/shmkill
deleted file mode 100644 (file)
index b91ee6f..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: shmkill,v $$Revision: 4.1 $$Date: 92/08/07 17:20:45 $
-
-# A script to call from crontab periodically when people are leaving shared
-# memory sitting around unattached.
-
-open(ipcs,'ipcs -m -o|') || die "Can't run ipcs: $!";
-
-while (<ipcs>) {
-    $tmp = index($_,'NATTCH');
-    $pos = $tmp if $tmp >= 0;
-    if (/^m/) {
-       ($m,$id,$key,$mode,$owner,$group,$attach) = split;
-       if ($attach != substr($_,$pos,6)) {
-           die "Different ipcs format--can't parse!\n";
-       }
-       if ($attach == 0) {
-           push(@goners,'-m',$id);
-       }
-    }
-}
-
-exec 'ipcrm', @goners if $#goners >= 0;
diff --git a/eg/sysvipc/README b/eg/sysvipc/README
deleted file mode 100644 (file)
index 54094f1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-FYEnjoyment, here are the test scripts I used while implementing SysV
-IPC in Perl.  Each of them must be run with the parameter "s" for
-"send" or "r" for "receive"; in each case, the receiver is the server
-and the sender is the client.
-
--- 
-Chip Salzenberg at ComDev/TCT     <chip@tct.uucp>, <uunet!ateng!tct!chip>
-
-
diff --git a/eg/sysvipc/ipcmsg b/eg/sysvipc/ipcmsg
deleted file mode 100644 (file)
index 646d8b6..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/perl
-eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
-require 'sys/ipc.ph';
-require 'sys/msg.ph';
-
-$| = 1;
-
-$mode = shift;
-die "usage: ipcmsg {r|s}\n" unless $mode =~ /^[rs]$/;
-$send = ($mode eq "s");
-
-$id = msgget(0x1234, ($send ? 0 : &IPC_CREAT) | 0644);
-die "Can't get message queue: $!\n" unless defined($id);
-print "message queue id: $id\n";
-
-if ($send) {
-       while (<STDIN>) {
-               chop;
-               unless (msgsnd($id, pack("LA*", $., $_), 0)) {
-                       die "Can't send message: $!\n";
-               }
-       }
-}
-else {
-       $SIG{'INT'} = $SIG{'QUIT'} = "leave";
-       for (;;) {
-               unless (msgrcv($id, $_, 512, 0, 0)) {
-                       die "Can't receive message: $!\n";
-               }
-               ($type, $message) = unpack("La*", $_);
-               printf "[%d] %s\n", $type, $message;
-       }
-}
-
-&leave;
-
-sub leave {
-       if (!$send) {
-               $x = msgctl($id, &IPC_RMID, 0);
-               if (!defined($x) || $x < 0) {
-                       die "Can't remove message queue: $!\n";
-               }
-       }
-       exit;
-}
diff --git a/eg/sysvipc/ipcsem b/eg/sysvipc/ipcsem
deleted file mode 100644 (file)
index e0dc551..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/perl
-eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
-require 'sys/ipc.ph';
-require 'sys/msg.ph';
-
-$| = 1;
-
-$mode = shift;
-die "usage: ipcmsg {r|s}\n" unless $mode =~ /^[rs]$/;
-$signal = ($mode eq "s");
-
-$id = semget(0x1234, 1, ($signal ? 0 : &IPC_CREAT) | 0644);
-die "Can't get semaphore: $!\n" unless defined($id);
-print "semaphore id: $id\n";
-
-if ($signal) {
-       while (<STDIN>) {
-               print "Signalling\n";
-               unless (semop($id, pack("sss", 0, 1, 0))) {
-                       die "Can't signal semaphore: $!\n";
-               }
-       }
-}
-else {
-       $SIG{'INT'} = $SIG{'QUIT'} = "leave";
-       for (;;) {
-               unless (semop($id, pack("sss", 0, -1, 0))) {
-                       die "Can't wait for semaphore: $!\n";
-               }
-               print "Unblocked\n";
-       }
-}
-
-&leave;
-
-sub leave {
-       if (!$signal) {
-               $x = semctl($id, 0, &IPC_RMID, 0);
-               if (!defined($x) || $x < 0) {
-                       die "Can't remove semaphore: $!\n";
-               }
-       }
-       exit;
-}
diff --git a/eg/sysvipc/ipcshm b/eg/sysvipc/ipcshm
deleted file mode 100644 (file)
index ecc1ba4..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/perl
-eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
-require 'sys/ipc.ph';
-require 'sys/shm.ph';
-
-$| = 1;
-
-$mode = shift;
-die "usage: ipcshm {r|s}\n" unless $mode =~ /^[rs]$/;
-$send = ($mode eq "s");
-
-$SIZE = 32;
-$id = shmget(0x1234, $SIZE, ($send ? 0 : &IPC_CREAT) | 0644);
-die "Can't get shared memory: $!\n" unless defined($id);
-print "shared memory id: $id\n";
-
-if ($send) {
-       while (<STDIN>) {
-               chop;
-               unless (shmwrite($id, pack("La*", length($_), $_), 0, $SIZE)) {
-                       die "Can't write to shared memory: $!\n";
-               }
-       }
-}
-else {
-       $SIG{'INT'} = $SIG{'QUIT'} = "leave";
-       for (;;) {
-               $_ = <STDIN>;
-               unless (shmread($id, $_, 0, $SIZE)) {
-                       die "Can't read shared memory: $!\n";
-               }
-               $len = unpack("L", $_);
-               $message = substr($_, length(pack("L",0)), $len);
-               printf "[%d] %s\n", $len, $message;
-       }
-}
-
-&leave;
-
-sub leave {
-       if (!$send) {
-               $x = shmctl($id, &IPC_RMID, 0);
-               if (!defined($x) || $x < 0) {
-                       die "Can't remove shared memory: $!\n";
-               }
-       }
-       exit;
-}
diff --git a/eg/travesty b/eg/travesty
deleted file mode 100644 (file)
index 7e6f983..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/perl
-
-while (<>) {
-    next if /^\./;
-    next if /^From / .. /^$/;
-    next if /^Path: / .. /^$/;
-    s/^\W+//;
-    push(@ary,split(' '));
-    while ($#ary > 1) {
-       $a = $p;
-       $p = $n;
-       $w = shift(@ary);
-       $n = $num{$w};
-       if ($n eq '') {
-           push(@word,$w);
-           $n = pack('S',$#word);
-           $num{$w} = $n;
-       }
-       $lookup{$a . $p} .= $n;
-    }
-}
-
-for (;;) {
-    $n = $lookup{$a . $p};
-    ($foo,$n) = each(lookup) if $n eq '';
-    $n = substr($n,int(rand(length($n))) & 0177776,2);
-    $a = $p;
-    $p = $n;
-    ($w) = unpack('S',$n);
-    $w = $word[$w];
-    $col += length($w) + 1;
-    if ($col >= 65) {
-       $col = 0;
-       print "\n";
-    }
-    else {
-       print ' ';
-    }
-    print $w;
-    if ($w =~ /\.$/) {
-       if (rand() < .1) {
-           print "\n";
-           $col = 80;
-       }
-    }
-}
diff --git a/eg/unuc b/eg/unuc
deleted file mode 100755 (executable)
index ae5c652..0000000
--- a/eg/unuc
+++ /dev/null
@@ -1,186 +0,0 @@
-#!/usr/bin/perl
-
-print STDERR "Loading proper nouns...\n";
-open(DICT,"/usr/dict/words") || die "Can't find /usr/dict/words: $!\n";
-while (<DICT>) {
-    if (/^[A-Z]/) {
-       chop;
-       ($lower = $_) =~ y/A-Z/a-z/;
-       $proper{$lower} = $_;
-    }
-}
-close DICT;
-print STDERR "Loading exceptions...\n";
-
-$prog = <<'EOT';
-while (<>) {
-    next if /[a-z]/;
-    y/A-Z/a-z/;
-    s/(\w+)/$proper{$1} ? $proper{$1} : $1/eg;
-    s/^(\s*)([a-z])/$1 . (($tmp = $2) =~ y:a-z:A-Z:,$tmp)/e;
-    s/([-.?!]["']?(\n\s*|  \s*)["']?)([a-z])/$1 . (($tmp = $3) =~ y:a-z:A-Z:,$tmp)/eg;
-    s/\b([b-df-hj-np-tv-xz]+)\b/(($tmp = $1) =~ y:a-z:A-Z:,$tmp)/eg;
-    s/([a-z])'([SDT])\b/$1 . "'" . (($tmp = $2) =~ y:A-Z:a-z:,$tmp)/eg;
-EOT
-while (<DATA>) {
-    chop;
-    next if /^$/;
-    next if /^#/;
-    if (! /;$/) {
-       $foo = $_;
-       $foo =~ y/A-Z/a-z/;
-       print STDERR "Dup $_\n" if $proper{$foo};
-       $foo =~ s/([^\w ])/\\$1/g;
-       $foo =~ s/ /(\\s+)/g;
-       $foo = "\\b" . $foo if $foo =~ /^\w/;   # XXX till patch 9
-       $foo .= "\\b" if $foo =~ /\w$/;
-       $i = 0;
-       ($bar = $_) =~ s/ /'$' . ++$i/eg;
-       $_ = "s/$foo/$bar/gi;";
-    }
-    $prog .= '    ' . $_ . "\n";
-}
-$prog .= "}\ncontinue {\n    print;\n}\n";
-
-$/ = '';
-#print $prog;
-eval $prog; die $@ if $@;
-__END__
-A.M.
-Air Force
-Air Force Base
-Air Force Station
-American
-Apr.
-Ariane
-Aug.
-August
-Bureau of Labor Statistics
-CIT
-Caltech
-Cape Canaveral
-Challenger
-China
-Corporation
-Crippen
-Daily News in Brief
-Daniel Quayle
-Dec.
-Discovery
-Edwards
-Endeavour
-Feb.
-Ford Aerospace
-Fri.
-General Dynamics
-George Bush
-Headline News
-HOTOL
-I
-II
-III
-IV
-IX
-Institute of Technology
-JPL
-Jan.
-Jul.
-Jun.
-Kennedy Space Center
-LDEF
-Long Duration Exposure Facility
-Long March
-Mar.
-March
-Martin
-Martin Marietta
-Mercury
-Mon.
-in May
-s/\bmay (\d)/May $1/g;
-s/\boffice of (\w)/'Office of ' . (($tmp = $1) =~ y:a-z:A-Z:,$tmp)/eg;
-National Science Foundation
-NASA Select
-New Mexico
-Nov.
-OMB
-Oct.
-Office of Management and Budget
-President
-President Bush
-Richard Truly
-Rocketdyne
-Russian
-Russians
-Sat.
-Sep.
-Soviet
-Soviet Union
-Soviets
-Space Shuttle
-Sun.
-Thu.
-Tue.
-U.S.
-Union of Soviet Socialist Republics
-United States
-VI
-VII
-VIII
-Vice President
-Vice President Quayle
-Wed.
-White Sands
-Kaman Aerospace
-Aerospace Daily
-Aviation Week
-Space Technology
-Washington Post
-Los Angeles Times
-New York Times
-Aerospace Industries Association
-president of
-Johnson Space Center
-Space Services
-Inc.
-Co.
-Hughes Aircraft
-Company
-Orbital Sciences
-Swedish Space
-Arnauld
-Nicogosian
-Magellan
-Galileo
-Mir
-Jet Propulsion Laboratory
-University
-Department of Defense
-Orbital Science
-OMS
-United Press International
-United Press
-UPI
-Associated Press
-AP
-Cable News Network
-Cape York
-Zenit
-SYNCOM
-Eastern
-Western
-Test Range
-Jcsat
-Japanese Satellite Communications
-Defence Ministry
-Defense Ministry
-Skynet
-Fixed Service Structure
-Launch Processing System
-Asiasat
-Launch Control Center
-Earth
-CNES
-Glavkosmos
-Pacific
-Atlantic
diff --git a/eg/uudecode b/eg/uudecode
deleted file mode 100644 (file)
index 3b3cb60..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/perl
-while (<>) {
-    next unless ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
-    open(OUT,"> $file") || die "Can't create $file: $!\n";
-    while (<>) {
-           last if /^end/;
-           next if /[a-z]/;
-           next unless int((((ord() - 32) & 077) + 2) / 3) ==
-                   int(length() / 4);
-           print OUT unpack("u", $_);
-    }
-    chmod oct($mode), $file;
-    eof() && die "Missing end: $file may be truncated.\n";
-}
-
diff --git a/eg/van/empty b/eg/van/empty
deleted file mode 100644 (file)
index d699319..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: empty,v $$Revision: 4.1 $$Date: 92/08/07 17:20:50 $
-
-# This script empties a trashcan.
-
-$recursive = shift if $ARGV[0] eq '-r';
-
-@ARGV = '.' if $#ARGV < 0;
-
-chop($pwd = `pwd`);
-
-dir: foreach $dir (@ARGV) {
-    unless (chdir $dir) {
-       print stderr "Can't find directory $dir: $!\n";
-       next dir;
-    }
-    if ($recursive) {
-       do cmd('find . -name .deleted -exec /bin/rm -rf {} ;');
-    }
-    else {
-       if (-d '.deleted') {
-           do cmd('rm -rf .deleted');
-       }
-       else {
-           if ($dir eq '.' && $pwd =~ m|/\.deleted$|) {
-               chdir '..';
-               do cmd('rm -rf .deleted');
-           }
-           else {
-               print stderr "No trashcan found in directory $dir\n";
-           }
-       }
-    }
-}
-continue {
-    chdir $pwd;
-}
-
-# force direct execution with no shell
-
-sub cmd {
-    system split(' ',join(' ',@_));
-}
-
diff --git a/eg/van/unvanish b/eg/van/unvanish
deleted file mode 100644 (file)
index acb1603..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: unvanish,v $$Revision: 4.1 $$Date: 92/08/07 17:20:52 $
-
-sub it {
-    if ($olddir ne '.') {
-       chop($pwd = `pwd`) if $pwd eq '';
-       (chdir $olddir) || die "Directory $olddir is not accesible";
-    }
-    unless ($olddir eq '.deleted') {
-       if (-d '.deleted') {
-           chdir '.deleted' || die "Directory .deleted is not accesible";
-       }
-       else {
-           chop($pwd = `pwd`) if $pwd eq '';
-           die "Directory .deleted does not exist" unless $pwd =~ /\.deleted$/;
-       }
-    }
-    print `mv $startfiles$filelist..$force`;
-    if ($olddir ne '.') {
-       (chdir $pwd) || die "Can't get back to original directory $pwd: $!\n";
-    }
-}
-
-if ($#ARGV < 0) {
-    open(lastcmd,'.deleted/.lastcmd') || 
-       open(lastcmd,'.lastcmd') || 
-           die "No previous vanish in this dir";
-    $ARGV = <lastcmd>;
-    close(lastcmd);
-    @ARGV = split(/[\n ]+/,$ARGV);
-}
-
-while ($ARGV[0] =~ /^-/) {
-    $_ = shift;
-    /^-f/ && ($force = ' >/dev/null 2>&1');
-    /^-i/ && ($interactive = 1);
-    if (/^-+$/) {
-       $startfiles = '- ';
-       last;
-    }
-}
-
-while ($file = shift) {
-    if ($file =~ s|^(.*)/||) {
-       $dir = $1;
-    }
-    else {
-       $dir = '.';
-    }
-
-    if ($dir ne $olddir) {
-       do it() if $olddir;
-       $olddir = $dir;
-    }
-
-    if ($interactive) {
-       print "unvanish: restore $dir/$file? ";
-       next unless <stdin> =~ /^y/i;
-    }
-
-    $filelist .= $file; $filelist .= ' ';
-
-}
-
-do it() if $olddir;
diff --git a/eg/van/vanexp b/eg/van/vanexp
deleted file mode 100644 (file)
index 415b73b..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: vanexp,v $$Revision: 4.1 $$Date: 92/08/07 17:20:53 $
-
-# This is for running from a find at night to expire old .deleteds
-
-$can = $ARGV[0];
-
-exit 1 unless $can =~ /.deleted$/;
-
-($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-   $blksize,$blocks) = stat($can);
-
-exit 0 unless $size;
-
-if (time - $mtime > 2 * 24 * 60 * 60) {
-    `/bin/rm -rf $can`;
-}
-else {
-    `find $can -ctime +2 -exec rm -f {} \;`;
-}
diff --git a/eg/van/vanish b/eg/van/vanish
deleted file mode 100644 (file)
index 09b9679..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/perl
-
-# $RCSfile: vanish,v $$Revision: 4.1 $$Date: 92/08/07 17:20:54 $
-
-sub it {
-    if ($olddir ne '.') {
-       chop($pwd = `pwd`) if $pwd eq '';
-       (chdir $olddir) || die "Directory $olddir is not accesible";
-    }
-    if (!-d .deleted) {
-       print `mkdir .deleted; chmod 775 .deleted`;
-       die "You can't remove files from $olddir" if $?;
-    }
-    $filelist =~ s/ $//;
-    $filelist =~ s/#/\\#/g;
-    if ($filelist !~ /^[ \t]*$/) {
-       open(lastcmd,'>.deleted/.lastcmd');
-       print lastcmd $filelist,"\n";
-       close(lastcmd);
-       print `/bin/mv $startfiles$filelist .deleted$force`;
-    }
-    if ($olddir ne '.') {
-       (chdir $pwd) || die "Can't get back to original directory $pwd: $!\n";
-    }
-}
-
-while ($ARGV[0] =~ /^-/) {
-    $_ = shift;
-    /^-f/ && ($force = ' >/dev/null 2>&1');
-    /^-i/ && ($interactive = 1);
-    if (/^-+$/) {
-       $startfiles = '- ';
-       last;
-    }
-}
-
-chop($pwd = `pwd`);
-
-while ($file = shift) {
-    if ($file =~ s|^(.*)/||) {
-       $dir = $1;
-    }
-    else {
-       $dir = '.';
-    }
-
-    if ($interactive) {
-       print "vanish: remove $dir/$file? ";
-       next unless <stdin> =~ /^y/i;
-    }
-
-    if ($file eq '.deleted') {
-       print stderr "To delete .deleted (the trashcan) use the 'empty' command.\n";
-       next;
-    }
-
-    if ($dir ne $olddir) {
-       do it() if $olddir;
-       $olddir = $dir;
-    }
-
-    $filelist .= $file; $filelist .= ' ';
-}
-
-do it() if $olddir;
diff --git a/eg/who b/eg/who
deleted file mode 100644 (file)
index ac15246..0000000
--- a/eg/who
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/perl
-# This assumes your /etc/utmp file looks like ours
-open(UTMP,'/etc/utmp');
-@mo = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
-while (read(UTMP,$utmp,36)) {
-    ($line,$name,$host,$time) = unpack('A8A8A16l',$utmp);
-    if ($name) {
-       $host = "($host)" if ord($host);
-       ($sec,$min,$hour,$mday,$mon) = localtime($time);
-       printf "%-9s%-8s%s %2d %02d:%02d   %s\n",
-         $name,$line,$mo[$mon],$mday,$hour,$min,$host;
-    }
-}   
diff --git a/eg/wrapsuid b/eg/wrapsuid
deleted file mode 100755 (executable)
index 3b1fc6e..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/perl
-'di';
-'ig00';
-#
-# $Header: wrapsuid,v 1.1 90/08/11 13:51:29 lwall Locked $
-#
-# $Log:        wrapsuid,v $
-# Revision 1.1  90/08/11  13:51:29  lwall
-# Initial revision
-# 
-
-$xdev = '-xdev' unless -d '/dev/iop';
-
-if ($#ARGV >= 0) {
-    @list = @ARGV;
-    foreach $name (@ARGV) {
-       die "You must use absolute pathnames.\n" unless $name =~ m|^/|;
-    }
-}
-else {
-    open(DF,"/etc/mount|") || die "Can't run /etc/mount";
-
-    while (<DF>) {
-       chop;
-       $_ .= <DF> if length($_) < 50;
-       @ary = split;
-       push(@list,$ary[2]) if ($ary[0] =~ m|^/dev|);
-    }
-}
-$fslist = join(' ',@list);
-
-die "Can't find local filesystems" unless $fslist;
-
-open(FIND,
-  "find $fslist $xdev -type f \\( -perm -04000 -o -perm -02000 \\) -print|");
-
-while (<FIND>) {
-    chop;
-    next unless -T;
-    print "Fixing ", $_, "\n";
-    ($dir,$file) = m|(.*)/(.*)|;
-    chdir $dir || die "Can't chdir to $dir";
-    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
-       $blksize,$blocks) = stat($file);
-       die "Can't stat $_" unless $ino;
-    chmod $mode & 01777, $file;                # wipe out set[ug]id bits
-    rename($file,".$file");
-    open(C,">.tmp$$.c") || die "Can't write C program for $_";
-    $real = "$dir/.$file";
-    print C '
-main(argc,argv)
-int argc;
-char **argv;
-{
-    execv("' . $real . '",argv);
-}
-';
-    close C;
-    system '/bin/cc', ".tmp$$.c", '-o', $file;
-    die "Can't compile new $_" if $?;
-    chmod $mode, $file;
-    chown $uid, $gid, $file;
-    unlink ".tmp$$.c";
-    chdir '/';
-}
-##############################################################################
-
-       # These next few lines are legal in both Perl and nroff.
-
-.00;                   # finish .ig
-'di                    \" finish diversion--previous line must be blank
-.nr nl 0-1             \" fake up transition to first page again
-.nr % 0                        \" start at page 1
-'; __END__ ############# From here on it's a standard manual page ############
-.TH SUIDSCRIPT 1 "July 30, 1990"
-.AT 3
-.SH NAME
-wrapsuid \- puts a compiled C wrapper around a setuid or setgid script
-.SH SYNOPSIS
-.B wrapsuid [dirlist]
-.SH DESCRIPTION
-.I Wrapsuid
-creates a small C program to execute a script with setuid or setgid privileges
-without having to set the setuid or setgid bit on the script, which is
-a security problem on many machines.
-Specify the list of directories or files that you wish to process.
-The names must be absolute pathnames.
-With no arguments it will attempt to process all the local directories
-for this machine.
-The scripts to be processed must have the setuid or setgid bit set.
-The wrapsuid program will delete the bits and set them on the wrapper.
-.PP
-Non-superusers may only process their own files.
-.SH ENVIRONMENT
-No environment variables are used.
-.SH FILES
-None.
-.SH AUTHOR
-Larry Wall
-.SH "SEE ALSO"
-.SH DIAGNOSTICS
-.SH BUGS
-.ex
index c6fa46c..383d164 100644 (file)
@@ -7364,7 +7364,7 @@ $~        The name of the current report format.
 ?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.
+@_     Parameter array for subroutines.  Also used by split unless in list context.
 \\  Creates reference to what follows, like \$var, or quotes non-\w in strings.
 \\0    Octal char, e.g. \\033.
 \\E    Case modification terminator.  See \\Q, \\L, and \\U.
diff --git a/embed.h b/embed.h
index f0bae6f..50a9d9e 100644 (file)
--- a/embed.h
+++ b/embed.h
@@ -1,4 +1,4 @@
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
 #define magic_nextpack         Perl_magic_nextpack
 #define magic_regdata_cnt      Perl_magic_regdata_cnt
 #define magic_regdatum_get     Perl_magic_regdatum_get
+#define magic_regdatum_set     Perl_magic_regdatum_set
 #define magic_set              Perl_magic_set
 #define magic_setamagic                Perl_magic_setamagic
 #define magic_setarylen                Perl_magic_setarylen
 #define newSVnv                        Perl_newSVnv
 #define newSVpv                        Perl_newSVpv
 #define newSVpvn               Perl_newSVpvn
+#define newSVpvn_share         Perl_newSVpvn_share
 #define newSVpvf               Perl_newSVpvf
 #define vnewSVpvf              Perl_vnewSVpvf
 #define newSVrv                        Perl_newSVrv
 #define utf8_to_bytes          Perl_utf8_to_bytes
 #define bytes_to_utf8          Perl_bytes_to_utf8
 #define utf8_to_uv             Perl_utf8_to_uv
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #define uv_to_utf8             Perl_uv_to_utf8
 #define vivify_defelem         Perl_vivify_defelem
 #define vivify_ref             Perl_vivify_ref
 #define wait4pid               Perl_wait4pid
-#define report_closed_fh       Perl_report_closed_fh
+#define report_evil_fh         Perl_report_evil_fh
 #define report_uninit          Perl_report_uninit
 #define warn                   Perl_warn
 #define vwarn                  Perl_vwarn
 #define ck_spair               Perl_ck_spair
 #define ck_split               Perl_ck_split
 #define ck_subr                        Perl_ck_subr
+#define ck_substr              Perl_ck_substr
 #define ck_svconst             Perl_ck_svconst
 #define ck_trunc               Perl_ck_trunc
 #define pp_aassign             Perl_pp_aassign
 #define magic_nextpack(a,b,c)  Perl_magic_nextpack(aTHX_ a,b,c)
 #define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b)
 #define magic_regdatum_get(a,b)        Perl_magic_regdatum_get(aTHX_ a,b)
+#define magic_regdatum_set(a,b)        Perl_magic_regdatum_set(aTHX_ a,b)
 #define magic_set(a,b)         Perl_magic_set(aTHX_ a,b)
 #define magic_setamagic(a,b)   Perl_magic_setamagic(aTHX_ a,b)
 #define magic_setarylen(a,b)   Perl_magic_setarylen(aTHX_ a,b)
 #define newSVnv(a)             Perl_newSVnv(aTHX_ a)
 #define newSVpv(a,b)           Perl_newSVpv(aTHX_ a,b)
 #define newSVpvn(a,b)          Perl_newSVpvn(aTHX_ a,b)
+#define newSVpvn_share(a,b,c)  Perl_newSVpvn_share(aTHX_ a,b,c)
 #define vnewSVpvf(a,b)         Perl_vnewSVpvf(aTHX_ a,b)
 #define newSVrv(a,b)           Perl_newSVrv(aTHX_ a,b)
 #define newSVsv(a)             Perl_newSVsv(aTHX_ a)
 #define utf8_to_bytes(a,b)     Perl_utf8_to_bytes(aTHX_ a,b)
 #define bytes_to_utf8(a,b)     Perl_bytes_to_utf8(aTHX_ a,b)
 #define utf8_to_uv(a,b)                Perl_utf8_to_uv(aTHX_ a,b)
+#define utf8_to_uv_chk(a,b,c)  Perl_utf8_to_uv_chk(aTHX_ a,b,c)
 #define uv_to_utf8(a,b)                Perl_uv_to_utf8(aTHX_ a,b)
 #define vivify_defelem(a)      Perl_vivify_defelem(aTHX_ a)
 #define vivify_ref(a,b)                Perl_vivify_ref(aTHX_ a,b)
 #define wait4pid(a,b,c)                Perl_wait4pid(aTHX_ a,b,c)
-#define report_closed_fh(a,b,c,d)      Perl_report_closed_fh(aTHX_ a,b,c,d)
+#define report_evil_fh(a,b,c)  Perl_report_evil_fh(aTHX_ a,b,c)
 #define report_uninit()                Perl_report_uninit(aTHX)
 #define vwarn(a,b)             Perl_vwarn(aTHX_ a,b)
 #define vwarner(a,b,c)         Perl_vwarner(aTHX_ a,b,c)
 #define ck_spair(a)            Perl_ck_spair(aTHX_ a)
 #define ck_split(a)            Perl_ck_split(aTHX_ a)
 #define ck_subr(a)             Perl_ck_subr(aTHX_ a)
+#define ck_substr(a)           Perl_ck_substr(aTHX_ a)
 #define ck_svconst(a)          Perl_ck_svconst(aTHX_ a)
 #define ck_trunc(a)            Perl_ck_trunc(aTHX_ a)
 #define pp_aassign()           Perl_pp_aassign(aTHX)
 #define magic_regdata_cnt      Perl_magic_regdata_cnt
 #define Perl_magic_regdatum_get        CPerlObj::Perl_magic_regdatum_get
 #define magic_regdatum_get     Perl_magic_regdatum_get
+#define Perl_magic_regdatum_set        CPerlObj::Perl_magic_regdatum_set
+#define magic_regdatum_set     Perl_magic_regdatum_set
 #define Perl_magic_set         CPerlObj::Perl_magic_set
 #define magic_set              Perl_magic_set
 #define Perl_magic_setamagic   CPerlObj::Perl_magic_setamagic
 #define newSVpv                        Perl_newSVpv
 #define Perl_newSVpvn          CPerlObj::Perl_newSVpvn
 #define newSVpvn               Perl_newSVpvn
+#define Perl_newSVpvn_share    CPerlObj::Perl_newSVpvn_share
+#define newSVpvn_share         Perl_newSVpvn_share
 #define Perl_newSVpvf          CPerlObj::Perl_newSVpvf
 #define newSVpvf               Perl_newSVpvf
 #define Perl_vnewSVpvf         CPerlObj::Perl_vnewSVpvf
 #define bytes_to_utf8          Perl_bytes_to_utf8
 #define Perl_utf8_to_uv                CPerlObj::Perl_utf8_to_uv
 #define utf8_to_uv             Perl_utf8_to_uv
+#define Perl_utf8_to_uv_chk    CPerlObj::Perl_utf8_to_uv_chk
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #define Perl_uv_to_utf8                CPerlObj::Perl_uv_to_utf8
 #define uv_to_utf8             Perl_uv_to_utf8
 #define Perl_vivify_defelem    CPerlObj::Perl_vivify_defelem
 #define vivify_ref             Perl_vivify_ref
 #define Perl_wait4pid          CPerlObj::Perl_wait4pid
 #define wait4pid               Perl_wait4pid
-#define Perl_report_closed_fh  CPerlObj::Perl_report_closed_fh
-#define report_closed_fh       Perl_report_closed_fh
+#define Perl_report_evil_fh    CPerlObj::Perl_report_evil_fh
+#define report_evil_fh         Perl_report_evil_fh
 #define Perl_report_uninit     CPerlObj::Perl_report_uninit
 #define report_uninit          Perl_report_uninit
 #define Perl_warn              CPerlObj::Perl_warn
 #define ck_split               Perl_ck_split
 #define Perl_ck_subr           CPerlObj::Perl_ck_subr
 #define ck_subr                        Perl_ck_subr
+#define Perl_ck_substr         CPerlObj::Perl_ck_substr
+#define ck_substr              Perl_ck_substr
 #define Perl_ck_svconst                CPerlObj::Perl_ck_svconst
 #define ck_svconst             Perl_ck_svconst
 #define Perl_ck_trunc          CPerlObj::Perl_ck_trunc
index e851a7a..9e05b1b 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -135,12 +135,12 @@ sub write_protos {
        }
        $ret .= ")";
        $ret .= " __attribute__((noreturn))" if $flags =~ /r/;
-       if( $flags =~ /f/ ) { 
+       if( $flags =~ /f/ ) {
            my $prefix = $flags =~ /n/ ? '' : 'pTHX_';
-           my $args = scalar @args; 
+           my $args = scalar @args;
            $ret .= "\n#ifdef CHECK_FORMAT\n";
            $ret .= sprintf " __attribute__((format(printf,%s%d,%s%d)))",
-                                   $prefix, $args - 1, $prefix, $args; 
+                                   $prefix, $args - 1, $prefix, $args;
            $ret .= "\n#endif\n";
        }
        $ret .= ";\n";
@@ -185,11 +185,11 @@ EOT
 #       hints
 #       copline
 my @extvars = qw(sv_undef sv_yes sv_no na dowarn
-                 curcop compiling 
+                 curcop compiling
                  tainting tainted stack_base stack_sp sv_arenaroot
                 no_modify
                  curstash DBsub DBsingle debstash
-                 rsfp 
+                 rsfp
                  stdingv
                 defgv
                 errgv
@@ -280,7 +280,7 @@ unlink 'embed.h';
 open(EM, '> embed.h') or die "Can't create embed.h: $!\n";
 
 print EM <<'END';
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -542,7 +542,7 @@ open(EM, '> embedvar.h')
     or die "Can't create embedvar.h: $!\n";
 
 print EM <<'END';
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -708,7 +708,7 @@ open(OBX, '> objXSUB.h')
     or die "Can't create objXSUB.h: $!\n";
 
 print OBX <<'EOT';
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -766,7 +766,7 @@ open(CAPI, '> perlapi.c') or die "Can't create perlapi.c: $!\n";
 open(CAPIH, '> perlapi.h') or die "Can't create perlapi.h: $!\n";
 
 print CAPIH <<'EOT';
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -873,7 +873,7 @@ EOT
 close CAPIH;
 
 print CAPI <<'EOT';
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -1132,7 +1132,7 @@ sub docout ($$$) { # output the docs for one function
 
     $docs .= "NOTE: this function is experimental and may change or be
 removed without notice.\n\n" if $flags =~ /x/;
-    $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n" 
+    $docs .= "NOTE: the perl_ form of this function is deprecated.\n\n"
        if $flags =~ /p/;
 
     print $fh "=item $name\n$docs";
@@ -1159,7 +1159,7 @@ for $file (glob('*.c'), glob('*.h')) {
 }
 
 unlink "pod/perlapi.pod";
-open (DOC, ">pod/perlapi.pod") or 
+open (DOC, ">pod/perlapi.pod") or
        die "Can't create pod/perlapi.pod: $!\n";
 
 walk_table {   # load documented functions into approriate hash
@@ -1184,7 +1184,7 @@ walk_table {      # load documented functions into approriate hash
 } \*DOC;
 
 for (sort keys %docfuncs) {
-    # Have you used a full for apidoc or just a func name?  
+    # Have you used a full for apidoc or just a func name?
     # Have you used Ap instead of Am in the for apidoc?
     warn "Unable to place $_!\n";
 }
@@ -1196,9 +1196,9 @@ perlapi - autogenerated documentation for the perl public API
 
 =head1 DESCRIPTION
 
-This file contains the documentation of the perl public API generated by 
-embed.pl, specifically a listing of functions, macros, flags, and variables 
-that may be used by extension writers.  The interfaces of any functions that 
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers.  The interfaces of any functions that
 are not listed here are subject to change without notice.  For this reason,
 blindly using functions listed in proto.h is to be avoided when writing
 extensions.
@@ -1244,19 +1244,19 @@ _EOE_
 
 close(DOC);
 
-open(GUTS, ">pod/perlintern.pod") or 
+open(GUTS, ">pod/perlintern.pod") or
                die "Unable to create pod/perlintern.pod: $!\n";
 print GUTS <<'END';
 =head1 NAME
 
-perlintern - autogenerated documentation of purely B<internal> 
+perlintern - autogenerated documentation of purely B<internal>
                 Perl functions
 
 =head1 DESCRIPTION
 
-This file is the autogenerated documentation of functions in the 
+This file is the autogenerated documentation of functions in the
 Perl interpreter that are documented using Perl's internal documentation
-format but are not marked as part of the Perl API. In other words, 
+format but are not marked as part of the Perl API. In other words,
 B<they are not for use in extensions>!
 
 =over 8
@@ -1272,8 +1272,8 @@ print GUTS <<'END';
 
 =head1 AUTHORS
 
-The autodocumentation system was originally added to the Perl core by 
-Benjamin Stuhl. Documentation is by whoever was kind enough to 
+The autodocumentation system was originally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
 document their functions.
 
 =head1 SEE ALSO
@@ -1428,7 +1428,7 @@ Afnrp     |void   |croak_nocontext|const char* pat|...
 Afnp   |OP*    |die_nocontext  |const char* pat|...
 Afnp   |void   |deb_nocontext  |const char* pat|...
 Afnp   |char*  |form_nocontext |const char* pat|...
-Afnp   |void   |load_module_nocontext|U32 flags|SV* name|SV* ver|...
+Anp    |void   |load_module_nocontext|U32 flags|SV* name|SV* ver|...
 Afnp   |SV*    |mess_nocontext |const char* pat|...
 Afnp   |void   |warn_nocontext |const char* pat|...
 Afnp   |void   |warner_nocontext|U32 err|const char* pat|...
@@ -1651,7 +1651,7 @@ p |void   |lex_start      |SV* line
 p      |OP*    |linklist       |OP* o
 p      |OP*    |list           |OP* o
 p      |OP*    |listkids       |OP* o
-Afp    |void   |load_module|U32 flags|SV* name|SV* ver|...
+Ap     |void   |load_module|U32 flags|SV* name|SV* ver|...
 Ap     |void   |vload_module|U32 flags|SV* name|SV* ver|va_list* args
 p      |OP*    |localize       |OP* arg|I32 lexical
 Apd    |I32    |looks_like_number|SV* sv
@@ -1680,6 +1680,7 @@ p |int    |magic_mutexfree|SV* sv|MAGIC* mg
 p      |int    |magic_nextpack |SV* sv|MAGIC* mg|SV* key
 p      |U32    |magic_regdata_cnt|SV* sv|MAGIC* mg
 p      |int    |magic_regdatum_get|SV* sv|MAGIC* mg
+p      |int    |magic_regdatum_set|SV* sv|MAGIC* mg
 p      |int    |magic_set      |SV* sv|MAGIC* mg
 p      |int    |magic_setamagic|SV* sv|MAGIC* mg
 p      |int    |magic_setarylen|SV* sv|MAGIC* mg
@@ -1800,6 +1801,7 @@ Apd       |SV*    |newSVuv        |UV u
 Apd    |SV*    |newSVnv        |NV n
 Apd    |SV*    |newSVpv        |const char* s|STRLEN len
 Apd    |SV*    |newSVpvn       |const char* s|STRLEN len
+Apd    |SV*    |newSVpvn_share |const char* s|STRLEN len|U32 hash
 Afpd   |SV*    |newSVpvf       |const char* pat|...
 Ap     |SV*    |vnewSVpvf      |const char* pat|va_list* args
 Apd    |SV*    |newSVrv        |SV* rv|const char* classname
@@ -2070,14 +2072,15 @@ Ap      |U8*    |utf16_to_utf8  |U8* p|U8 *d|I32 bytelen|I32 *newlen
 Ap     |U8*    |utf16_to_utf8_reversed|U8* p|U8 *d|I32 bytelen|I32 *newlen
 Ap     |I32    |utf8_distance  |U8 *a|U8 *b
 Ap     |U8*    |utf8_hop       |U8 *s|I32 off
-ApM    |U8*    |utf8_to_bytes  |U8 *s|STRLEN len
+ApM    |U8*    |utf8_to_bytes  |U8 *s|STRLEN *len
 ApM    |U8*    |bytes_to_utf8  |U8 *s|STRLEN *len
 Ap     |UV     |utf8_to_uv     |U8 *s|I32* retlen
+Ap     |UV     |utf8_to_uv_chk |U8 *s|I32* retlen|bool checking
 Ap     |U8*    |uv_to_utf8     |U8 *d|UV uv
 p      |void   |vivify_defelem |SV* sv
 p      |void   |vivify_ref     |SV* sv|U32 to_what
 p      |I32    |wait4pid       |Pid_t pid|int* statusp|int flags
-p      |void   |report_closed_fh|GV *gv|IO *io|const char *func|const char *obj
+p      |void   |report_evil_fh |GV *gv|IO *io|I32 op
 p      |void   |report_uninit
 Afpd   |void   |warn           |const char* pat|...
 Ap     |void   |vwarn          |const char* pat|va_list* args
index 10339b2..729389c 100644 (file)
@@ -1,4 +1,4 @@
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
 #define PL_argvoutgv           (PERL_GET_INTERP->Iargvoutgv)
 #define PL_basetime            (PERL_GET_INTERP->Ibasetime)
 #define PL_beginav             (PERL_GET_INTERP->Ibeginav)
+#define PL_beginav_save                (PERL_GET_INTERP->Ibeginav_save)
 #define PL_bitcount            (PERL_GET_INTERP->Ibitcount)
 #define PL_bufend              (PERL_GET_INTERP->Ibufend)
 #define PL_bufptr              (PERL_GET_INTERP->Ibufptr)
 #define PL_argvoutgv           (vTHX->Iargvoutgv)
 #define PL_basetime            (vTHX->Ibasetime)
 #define PL_beginav             (vTHX->Ibeginav)
+#define PL_beginav_save                (vTHX->Ibeginav_save)
 #define PL_bitcount            (vTHX->Ibitcount)
 #define PL_bufend              (vTHX->Ibufend)
 #define PL_bufptr              (vTHX->Ibufptr)
 #define PL_argvoutgv           (aTHXo->interp.Iargvoutgv)
 #define PL_basetime            (aTHXo->interp.Ibasetime)
 #define PL_beginav             (aTHXo->interp.Ibeginav)
+#define PL_beginav_save                (aTHXo->interp.Ibeginav_save)
 #define PL_bitcount            (aTHXo->interp.Ibitcount)
 #define PL_bufend              (aTHXo->interp.Ibufend)
 #define PL_bufptr              (aTHXo->interp.Ibufptr)
 #define PL_Iargvoutgv          PL_argvoutgv
 #define PL_Ibasetime           PL_basetime
 #define PL_Ibeginav            PL_beginav
+#define PL_Ibeginav_save       PL_beginav_save
 #define PL_Ibitcount           PL_bitcount
 #define PL_Ibufend             PL_bufend
 #define PL_Ibufptr             PL_bufptr
index 5b37e3a..ee65ee3 100644 (file)
@@ -17,7 +17,6 @@ Header=''
 Id='$Id'
 Locker=''
 Log='$Log'
-Mcc=''
 RCSfile='$RCSfile'
 Revision='$Revision'
 Source=''
@@ -33,8 +32,8 @@ apirevision=''
 apisubversion=''
 apiversion=''
 ar='arm-pe-ar'
-archlib='/perl/lib/5.6.1/epoc'
-archlibexp='/perl/lib/5.6.1/epoc'
+archlib='?:/perl/lib/5.7.0/epoc'
+archlibexp='?:/perl/lib/5.7.0/epoc'
 archname64=''
 archname='epoc'
 archobjs='epoc.o epocish.o epoc_stubs.o'
@@ -80,10 +79,10 @@ crosscompile='define'
 cryptlib=''
 csh='csh'
 d_Gconvert='epoc_gcvt((x),(n),(b))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
 d_PRId64='undef'
 d_PRIeldbl='undef'
 d_PRIfldbl='define'
@@ -295,6 +294,7 @@ d_setpent='undef'
 d_setpgid='undef'
 d_setpgrp2='undef'
 d_setpgrp='undef'
+d_setproctitle='undef'
 d_setprior='undef'
 d_setpwent='undef'
 d_setregid='undef'
@@ -317,6 +317,7 @@ d_sigaction='undef'
 d_sigsetjmp='undef'
 d_socket='define'
 d_sockpair='undef'
+d_socks5_init='undef'
 d_statblks='define'
 d_statfs='undef'
 d_statfsflags='define'
@@ -385,7 +386,7 @@ emacs=''
 eunicefix=':'
 exe_ext=''
 expr='expr'
-extensions='Data/Dumper File/Glob IO Socket Fcntl'
+extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
 fflushNULL='undef'
 fflushall='define'
 find=''
@@ -407,7 +408,6 @@ h_fcntl=''
 h_sysfile=''
 hint=''
 hostcat=''
-huge=''
 i_arpainet='define'
 i_bsdioctl='undef'
 i_db='undef'
@@ -422,6 +422,7 @@ i_grp='undef'
 i_iconv='undef'
 i_ieeefp='undef'
 i_inttypes='undef'
+i_libutil='undef'
 i_limits='define'
 i_locale='undef'
 i_machcthr='undef'
@@ -483,23 +484,22 @@ i_vfork='undef'
 ignore_versioned_solibs=''
 incpath=''
 inews=''
-installarchlib='/home/olaf/E/lib'
-installbin='/home/olaf/E/bin'
-installman1dir=''
-installman3dir=''
-installprefix='/home/olaf/'
+installarchlib='/home/of/PERL/perl/lib/5.6.0/epoc'
+installbin='/home/of/PERL/System/Programs/'
+installman1dir='/home/of/PERL/man1'
+installman3dir='/home/of/PERL/man3'
+installprefix=''
 installprefixexp=''
-installprivlib=''
-installscript=''
-installsitearch='/home/olaf/E/site/'
-installsitelib='/home/olaf/E/site/lib'
+installprivlib='/home/of/PERL/perl/lib/5.6.0/'
+installscript='/home/of/PERL/bin/'
+installsitearch='/home/of/PERL/site/lib/site_perl/5.6.0/epoc'
+installsitelib='/home/of/PERL/perl/lib/site_perl/5.6.0'
 installstyle=''
 installusrbinperl='undef'
 installvendorlib=''
 intsize='4'
-known_extensions='Data/Dumper File/Glob IO Socket Fcntl'
+known_extensions='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname Errno'
 ksh=''
-large=''
 ld='echo'
 lddlflags=''
 ldflags=''
@@ -533,18 +533,30 @@ make_set_make='#'
 mallocobj=''
 mallocsrc=''
 malloctype='void *'
+man1='man1'
 man1dir=''
 man1direxp=''
 man1ext=''
+man2='man2'
+man2ext='2'
+man3='man3'
 man3dir=''
 man3direxp=''
 man3ext=''
-medium=''
+man4='man4'
+man4ext='4'
+man5='man5'
+man5ext='5'
+man6='man6'
+man6ext='6'
+man7='man7'
+man7ext='7'
+man8='man8'
+man8ext='8'
 mips=''
 mips_type=''
 mkdir='mkdir'
 mmaptype=''
-models='none'
 modetype='mode_t'
 more='more'
 multiarch='define'
@@ -561,7 +573,7 @@ netdb_net_type='int'
 nm='arm-pe-nm'
 nm_opt=''
 nm_so_opt=''
-nonxs_ext=''
+nonxs_ext='Errno'
 nroff='nroff'
 o_nonblock='O_NONBLOCK'
 obj_ext=''
@@ -575,7 +587,7 @@ package=''
 pager=''
 passcat=''
 patchlevel=''
-path_sep=''
+path_sep=':'
 perl=''
 perladmin=''
 perlpath=''
@@ -587,8 +599,8 @@ pmake=''
 pr=''
 prefix=''
 prefixexp=''
-privlib='/perl/lib/5.6.1'
-privlibexp='/perl/lib/5.6.1'
+privlib='?:/perl/lib/5.7.0'
+privlibexp='?:/perl/lib/5.7.0'
 prototype='define'
 ptrsize='4'
 randbits='31'
@@ -599,10 +611,10 @@ rd_nodata='-1'
 rm='rm'
 rmail=''
 runnm='false'
-sPRIEldbl=''
-sPRIFldbl=''
-sPRIGldbl=''
-sPRIX64=''
+sPRIEUldbl=''
+sPRIFUldbl=''
+sPRIGUldbl=''
+sPRIXU64=''
 sPRId64=''
 sPRIeldbl=''
 sPRIfldbl='"f"'
@@ -632,18 +644,17 @@ sig_name_init='"ZERO", 0'
 sig_num='0'
 sig_num_init='0, 0'
 signal_t='void'
-sitearch='/perl/lib/site_perl/5.6.1/epoc'
-sitearchexp='/perl/lib/site_perl/5.6.1/epoc'
-sitelib='/perl/lib/site_perl/5.6.1/'
-sitelib_stem='/perl/lib/site_perl'
-sitelibexp='/perl/lib/site_perl/5.6.1/'
+sitearch='?:/perl/lib/site_perl/5.7.0/epoc'
+sitearchexp='?:/perl/lib/site_perl/5.7.0/epoc'
+sitelib='?:/perl/lib/site_perl/5.7.0/'
+sitelib_stem='?:/perl/lib/site_perl'
+sitelibexp='?:/perl/lib/site_perl/5.7.0/'
 siteprefix=''
 siteprefixexp=''
 sizesize='4'
 sizetype='size_t'
 sleep=''
 smail=''
-small=''
 so=''
 socksizetype='size_t'
 sockethdr=''
@@ -651,12 +662,11 @@ socketlib=''
 sort='sort'
 spackage=''
 spitshell='cat'
-split=''
 src='.'
 ssizetype='long'
 startperl=''
 startsh='#!/bin/sh'
-static_ext='Data/Dumper File/Glob IO Socket Fcntl'
+static_ext='Data/Dumper File/Glob IO Socket Fcntl Sys/Hostname'
 stdchar='char'
 stdio_base=''
 stdio_bufsiz=''
@@ -708,7 +718,8 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.6.1'
+version='5.7.0'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth=''
@@ -838,7 +849,7 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.6.0'
+version='5.7.0'
 vi=''
 voidflags='15'
 xlibpth=''
@@ -949,4 +960,16 @@ xs_apiversion='5.005'
 d_getcwd='define'
 i_sysmode='undef'
 d_vendorarch='undef'
-
+d_frexpl='undef'
+d_getespwnam='undef'
+d_getprpwnam='undef'
+d_isnan='define'
+d_isnanl='undef'
+d_modfl='undef'
+d_setproctitle='undef'
+d_socks5_init='undef'
+i_libutil='undef'
+i_prot='undef'
+d_SCNfldbl='undef'
+d_perl_otherlibdirs='undef'
+nvsize='16'
index 77dafb1..65a881f 100644 (file)
@@ -3,9 +3,9 @@
 use File::Find;
 use Cwd;
 
-$VERSION="5.6";
+$VERSION="5.7";
 $PATCH="0";
-$EPOC_VERSION=20;
+$EPOC_VERSION=24;
 $CROSSCOMPILEPATH=cwd;
 $CROSSREPLACEPATH="H:\\perl";
 
@@ -32,7 +32,7 @@ open OUT,">perl.pkg";
 
 print OUT "#{\"perl$VERSION\"},(0x100051d8),$PATCH,$EPOC_VERSION,0\n";
 
-print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\perl.exe\"\n";
+print OUT "\"$CROSSREPLACEPATH\\perlmain.exe\"-\"!:\\system\\programs\\perl.exe\"\n";
 
 find(\&filefound, cwd.'/lib');
 print OUT "@\"G:\\lib\\stdlib.sis\",(0x0100002c3)\n"
index 498036d..a2691f3 100644 (file)
@@ -58,6 +58,7 @@ Perl_epoc_init(int *argcp, char ***argvp) {
 
 }
 
+
 #ifdef __MARM__
 /* Symbian forgot to include __fixunsdfi into the MARM euser.lib */
 /* This is from libgcc2.c , gcc-2.7.2.3                          */
@@ -86,6 +87,8 @@ __fixunsdfsi (a)
   return (SItype) a;
 }
 
+#endif
+
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
@@ -143,5 +146,64 @@ do_spawn (pTHX_ SV *really,SV **mark,SV **sp)
     return rc;
 }
 
-#endif
+static
+XS(epoc_getcwd)   /* more or less stolen from win32.c */
+{
+    dXSARGS;
+    /* Make the host for current directory */
+    char *buffer; 
+    int buflen = 256;
+
+    char *ptr;
+    buffer = (char *) malloc( buflen);
+    if (buffer == NULL) {
+      XSRETURN_UNDEF;
+    }
+    while ((NULL == ( ptr = getcwd( buffer, buflen))) && (errno == ERANGE)) {
+      buflen *= 2;
+      if (NULL == realloc( buffer, buflen)) {
+        XSRETURN_UNDEF;
+      }
+      
+    }
+
+    /* 
+     * If ptr != Nullch 
+     *   then it worked, set PV valid, 
+     *   else return 'undef' 
+     */
+
+    if (ptr) {
+       SV *sv = sv_newmortal();
+       char *tptr;
+
+       for (tptr = ptr; *tptr != '\0'; tptr++) {
+         if (*tptr == '\\') {
+           *tptr = '/';
+         }
+       }
+       sv_setpv(sv, ptr);
+       free( buffer);
+
+       EXTEND(SP,1);
+       SvPOK_on(sv);
+       ST(0) = sv;
+       XSRETURN(1);
+    }
+    free( buffer);
+    XSRETURN_UNDEF;
+}
+  
+
+void
+Perl_init_os_extras(void)
+{ 
+  dTHXo;
+  char *file = __FILE__;
+  newXS("EPOC::getcwd", epoc_getcwd, file);
+}
+
+void
+Perl_my_setenv(pTHX_ char *nam,char *val) {
+  setenv( nam, val, 1);
+}
index b11da40..c1c6bcf 100644 (file)
@@ -8,8 +8,6 @@
 
 #include <string.h>
 
-char *environ = 0;
-
 int getgid() {return 0;}
 int getegid() {return 0;}
 int geteuid() {return 0;}
@@ -31,7 +29,7 @@ signal() { }
 int execv() { return -1;}
 int execvp() { return -1;}
 
-void Perl_do_exec() {} 
+void Perl_do_exec() {}
 
 /*------------------------------------------------------------------*/
 /* Two dummy functions implement getproto*                          */
index 75a64fc..551d1f5 100644 (file)
 double epoc_atof( const char *ptr);
 #define atof(a) epoc_atof(a)
 
+#define init_os_extras Perl_init_os_extras
 
+#define NO_ENVIRON_ARRAY
index 9da8a35..ab3bd65 100644 (file)
@@ -15,11 +15,11 @@ system("arm-pe-dlltool --as=arm-pe-as --output-exp $basname.exp " .
        "--base-file $basname.bas $epoc/lib/eexe.o @objs " .
        "$epoc/lib/ecrt0.o $epoc/lib/estlib.lib  $epoc/lib/euser.lib");
 
-system("arm-pe-ld -s -e _E32Startup -o $basname.exe $basname.exp " .
+system("arm-pe-ld -s -e _E32Startup $basname.exp " .
        "-o $baspe.exe $epoc/lib/eexe.o @objs " .
        "$epoc/lib/ecrt0.o $epoc/lib/estlib.lib $epoc/lib/euser.lib");
 
-system( "wine \"$epoc/bin/petran.exe $baspe.exe $basname.exe " .
+system( "wine $epoc/bin/petran.exe \"$baspe.exe $basname.exe " .
         "-nocall -heap 0x00000400 0x00400000 -stack 0x0000c000 " .
-        "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000 \" ");
+        "-uid1 0x1000007a -uid2 0x100051d8 -uid3 0x00000000\" ");
 
index 4512d91..50364fa 100644 (file)
@@ -9,11 +9,12 @@ package B;
 use XSLoader ();
 require Exporter;
 @ISA = qw(Exporter);
-@EXPORT_OK = qw(minus_c ppname
+@EXPORT_OK = qw(minus_c ppname save_BEGINs
                class peekop cast_I32 cstring cchar hash threadsv_names
                main_root main_start main_cv svref_2object opnumber amagic_generation
                walkoptree walkoptree_slow walkoptree_exec walksymtable
-               parents comppadlist sv_undef compile_stats timing_info init_av);
+               parents comppadlist sv_undef compile_stats timing_info
+               begin_av init_av end_av);
 sub OPf_KIDS ();
 use strict;
 @B::SV::ISA = 'B::OBJECT';
index 9e29855..f1f0e65 100644 (file)
@@ -81,7 +81,7 @@ static char *opclassnames[] = {
 
 static int walkoptree_debug = 0;       /* Flag for walkoptree debug hook */
 
-static SV *specialsv_list[4];
+static SV *specialsv_list[6];
 
 static opclass
 cc_opclass(pTHX_ OP *o)
@@ -386,11 +386,15 @@ BOOT:
     specialsv_list[1] = &PL_sv_undef;
     specialsv_list[2] = &PL_sv_yes;
     specialsv_list[3] = &PL_sv_no;
+    specialsv_list[4] = pWARN_ALL;
+    specialsv_list[5] = pWARN_NONE;
 #include "defsubs.h"
 }
 
 #define B_main_cv()    PL_main_cv
 #define B_init_av()    PL_initav
+#define B_begin_av()   PL_beginav_save
+#define B_end_av()     PL_endav
 #define B_main_root()  PL_main_root
 #define B_main_start() PL_main_start
 #define B_amagic_generation()  PL_amagic_generation
@@ -402,6 +406,12 @@ BOOT:
 B::AV
 B_init_av()
 
+B::AV
+B_begin_av()
+
+B::AV
+B_end_av()
+
 B::CV
 B_main_cv()
 
@@ -515,6 +525,11 @@ minus_c()
     CODE:
        PL_minus_c = TRUE;
 
+void
+save_BEGINs()
+    CODE:
+       PL_minus_c |= 0x10;
+
 SV *
 cstring(sv)
        SV *    sv
@@ -693,8 +708,8 @@ PMOP_precomp(o)
        if (rx)
            sv_setpvn(ST(0), rx->precomp, rx->prelen);
 
-#define SVOP_sv(o)     cSVOPo->op_sv
-#define SVOP_gv(o)     ((GV*)cSVOPo->op_sv)
+#define SVOP_sv(o)     cSVOPo->op_sv
+#define SVOP_gv(o)     ((GV*)cSVOPo->op_sv)
 
 MODULE = B     PACKAGE = B::SVOP               PREFIX = SVOP_
 
@@ -1210,7 +1225,7 @@ CvXSUBANY(cv)
 
 MODULE = B    PACKAGE = B::CV
 
-U8
+U16
 CvFLAGS(cv)
       B::CV   cv
 
index bc0eda9..b412927 100644 (file)
@@ -15,7 +15,7 @@ use Exporter;
 our(%insn_data, @insn_name, @optype, @specialsv_name);
 
 @optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP);
-@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no);
+@specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no pWARN_ALL pWARN_NONE);
 
 # XXX insn_data is initialised this way because with a large
 # %insn_data = (foo => [...], bar => [...], ...) initialiser
@@ -27,117 +27,121 @@ $insn_data{ldsv} = [1, \&PUT_svindex, "GET_svindex"];
 $insn_data{ldop} = [2, \&PUT_opindex, "GET_opindex"];
 $insn_data{stsv} = [3, \&PUT_U32, "GET_U32"];
 $insn_data{stop} = [4, \&PUT_U32, "GET_U32"];
-$insn_data{ldspecsv} = [5, \&PUT_U8, "GET_U8"];
-$insn_data{newsv} = [6, \&PUT_U8, "GET_U8"];
-$insn_data{newop} = [7, \&PUT_U8, "GET_U8"];
-$insn_data{newopn} = [8, \&PUT_U8, "GET_U8"];
-$insn_data{newpv} = [9, \&PUT_PV, "GET_PV"];
-$insn_data{pv_cur} = [11, \&PUT_U32, "GET_U32"];
-$insn_data{pv_free} = [12, \&PUT_none, "GET_none"];
-$insn_data{sv_upgrade} = [13, \&PUT_U8, "GET_U8"];
-$insn_data{sv_refcnt} = [14, \&PUT_U32, "GET_U32"];
-$insn_data{sv_refcnt_add} = [15, \&PUT_I32, "GET_I32"];
-$insn_data{sv_flags} = [16, \&PUT_U32, "GET_U32"];
-$insn_data{xrv} = [17, \&PUT_svindex, "GET_svindex"];
-$insn_data{xpv} = [18, \&PUT_none, "GET_none"];
-$insn_data{xiv32} = [19, \&PUT_I32, "GET_I32"];
-$insn_data{xiv64} = [20, \&PUT_IV64, "GET_IV64"];
-$insn_data{xnv} = [21, \&PUT_NV, "GET_NV"];
-$insn_data{xlv_targoff} = [22, \&PUT_U32, "GET_U32"];
-$insn_data{xlv_targlen} = [23, \&PUT_U32, "GET_U32"];
-$insn_data{xlv_targ} = [24, \&PUT_svindex, "GET_svindex"];
-$insn_data{xlv_type} = [25, \&PUT_U8, "GET_U8"];
-$insn_data{xbm_useful} = [26, \&PUT_I32, "GET_I32"];
-$insn_data{xbm_previous} = [27, \&PUT_U16, "GET_U16"];
-$insn_data{xbm_rare} = [28, \&PUT_U8, "GET_U8"];
-$insn_data{xfm_lines} = [29, \&PUT_I32, "GET_I32"];
-$insn_data{xio_lines} = [30, \&PUT_I32, "GET_I32"];
-$insn_data{xio_page} = [31, \&PUT_I32, "GET_I32"];
-$insn_data{xio_page_len} = [32, \&PUT_I32, "GET_I32"];
-$insn_data{xio_lines_left} = [33, \&PUT_I32, "GET_I32"];
-$insn_data{xio_top_name} = [34, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_top_gv} = [36, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_fmt_name} = [37, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_fmt_gv} = [38, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_bottom_name} = [39, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xio_bottom_gv} = [40, \&PUT_svindex, "GET_svindex"];
-$insn_data{xio_subprocess} = [41, \&PUT_U16, "GET_U16"];
-$insn_data{xio_type} = [42, \&PUT_U8, "GET_U8"];
-$insn_data{xio_flags} = [43, \&PUT_U8, "GET_U8"];
-$insn_data{xcv_stash} = [44, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_start} = [45, \&PUT_opindex, "GET_opindex"];
-$insn_data{xcv_root} = [46, \&PUT_opindex, "GET_opindex"];
-$insn_data{xcv_gv} = [47, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_file} = [48, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xcv_depth} = [49, \&PUT_I32, "GET_I32"];
-$insn_data{xcv_padlist} = [50, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_outside} = [51, \&PUT_svindex, "GET_svindex"];
-$insn_data{xcv_flags} = [52, \&PUT_U16, "GET_U16"];
-$insn_data{av_extend} = [53, \&PUT_I32, "GET_I32"];
-$insn_data{av_push} = [54, \&PUT_svindex, "GET_svindex"];
-$insn_data{xav_fill} = [55, \&PUT_I32, "GET_I32"];
-$insn_data{xav_max} = [56, \&PUT_I32, "GET_I32"];
-$insn_data{xav_flags} = [57, \&PUT_U8, "GET_U8"];
-$insn_data{xhv_riter} = [58, \&PUT_I32, "GET_I32"];
-$insn_data{xhv_name} = [59, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{hv_store} = [60, \&PUT_svindex, "GET_svindex"];
-$insn_data{sv_magic} = [61, \&PUT_U8, "GET_U8"];
-$insn_data{mg_obj} = [62, \&PUT_svindex, "GET_svindex"];
-$insn_data{mg_private} = [63, \&PUT_U16, "GET_U16"];
-$insn_data{mg_flags} = [64, \&PUT_U8, "GET_U8"];
-$insn_data{mg_pv} = [65, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{xmg_stash} = [66, \&PUT_svindex, "GET_svindex"];
-$insn_data{gv_fetchpv} = [67, \&PUT_strconst, "GET_strconst"];
-$insn_data{gv_stashpv} = [68, \&PUT_strconst, "GET_strconst"];
-$insn_data{gp_sv} = [69, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_refcnt} = [70, \&PUT_U32, "GET_U32"];
-$insn_data{gp_refcnt_add} = [71, \&PUT_I32, "GET_I32"];
-$insn_data{gp_av} = [72, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_hv} = [73, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_cv} = [74, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_file} = [75, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{gp_io} = [76, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_form} = [77, \&PUT_svindex, "GET_svindex"];
-$insn_data{gp_cvgen} = [78, \&PUT_U32, "GET_U32"];
-$insn_data{gp_line} = [79, \&PUT_U16, "GET_U16"];
-$insn_data{gp_share} = [80, \&PUT_svindex, "GET_svindex"];
-$insn_data{xgv_flags} = [81, \&PUT_U8, "GET_U8"];
-$insn_data{op_next} = [82, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_sibling} = [83, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_ppaddr} = [84, \&PUT_strconst, "GET_strconst"];
-$insn_data{op_targ} = [85, \&PUT_U32, "GET_U32"];
-$insn_data{op_type} = [86, \&PUT_U16, "GET_U16"];
-$insn_data{op_seq} = [87, \&PUT_U16, "GET_U16"];
-$insn_data{op_flags} = [88, \&PUT_U8, "GET_U8"];
-$insn_data{op_private} = [89, \&PUT_U8, "GET_U8"];
-$insn_data{op_first} = [90, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_last} = [91, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_other} = [92, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_children} = [93, \&PUT_U32, "GET_U32"];
-$insn_data{op_pmreplroot} = [94, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_pmreplrootgv} = [95, \&PUT_svindex, "GET_svindex"];
-$insn_data{op_pmreplstart} = [96, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_pmnext} = [97, \&PUT_opindex, "GET_opindex"];
-$insn_data{pregcomp} = [98, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{op_pmflags} = [99, \&PUT_U16, "GET_U16"];
-$insn_data{op_pmpermflags} = [100, \&PUT_U16, "GET_U16"];
-$insn_data{op_sv} = [101, \&PUT_svindex, "GET_svindex"];
-$insn_data{op_padix} = [102, \&PUT_U32, "GET_U32"];
-$insn_data{op_pv} = [103, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{op_pv_tr} = [104, \&PUT_op_tr_array, "GET_op_tr_array"];
-$insn_data{op_redoop} = [105, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_nextop} = [106, \&PUT_opindex, "GET_opindex"];
-$insn_data{op_lastop} = [107, \&PUT_opindex, "GET_opindex"];
-$insn_data{cop_label} = [108, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{cop_stashpv} = [109, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{cop_file} = [110, \&PUT_pvcontents, "GET_pvcontents"];
-$insn_data{cop_seq} = [111, \&PUT_U32, "GET_U32"];
-$insn_data{cop_arybase} = [112, \&PUT_I32, "GET_I32"];
-$insn_data{cop_line} = [113, \&PUT_U16, "GET_U16"];
-$insn_data{cop_warnings} = [114, \&PUT_svindex, "GET_svindex"];
-$insn_data{main_start} = [115, \&PUT_opindex, "GET_opindex"];
-$insn_data{main_root} = [116, \&PUT_opindex, "GET_opindex"];
-$insn_data{curpad} = [117, \&PUT_svindex, "GET_svindex"];
+$insn_data{stpv} = [5, \&PUT_U32, "GET_U32"];
+$insn_data{ldspecsv} = [6, \&PUT_U8, "GET_U8"];
+$insn_data{newsv} = [7, \&PUT_U8, "GET_U8"];
+$insn_data{newop} = [8, \&PUT_U8, "GET_U8"];
+$insn_data{newopn} = [9, \&PUT_U8, "GET_U8"];
+$insn_data{newpv} = [11, \&PUT_PV, "GET_PV"];
+$insn_data{pv_cur} = [12, \&PUT_U32, "GET_U32"];
+$insn_data{pv_free} = [13, \&PUT_none, "GET_none"];
+$insn_data{sv_upgrade} = [14, \&PUT_U8, "GET_U8"];
+$insn_data{sv_refcnt} = [15, \&PUT_U32, "GET_U32"];
+$insn_data{sv_refcnt_add} = [16, \&PUT_I32, "GET_I32"];
+$insn_data{sv_flags} = [17, \&PUT_U32, "GET_U32"];
+$insn_data{xrv} = [18, \&PUT_svindex, "GET_svindex"];
+$insn_data{xpv} = [19, \&PUT_none, "GET_none"];
+$insn_data{xiv32} = [20, \&PUT_I32, "GET_I32"];
+$insn_data{xiv64} = [21, \&PUT_IV64, "GET_IV64"];
+$insn_data{xnv} = [22, \&PUT_NV, "GET_NV"];
+$insn_data{xlv_targoff} = [23, \&PUT_U32, "GET_U32"];
+$insn_data{xlv_targlen} = [24, \&PUT_U32, "GET_U32"];
+$insn_data{xlv_targ} = [25, \&PUT_svindex, "GET_svindex"];
+$insn_data{xlv_type} = [26, \&PUT_U8, "GET_U8"];
+$insn_data{xbm_useful} = [27, \&PUT_I32, "GET_I32"];
+$insn_data{xbm_previous} = [28, \&PUT_U16, "GET_U16"];
+$insn_data{xbm_rare} = [29, \&PUT_U8, "GET_U8"];
+$insn_data{xfm_lines} = [30, \&PUT_I32, "GET_I32"];
+$insn_data{xio_lines} = [31, \&PUT_I32, "GET_I32"];
+$insn_data{xio_page} = [32, \&PUT_I32, "GET_I32"];
+$insn_data{xio_page_len} = [33, \&PUT_I32, "GET_I32"];
+$insn_data{xio_lines_left} = [34, \&PUT_I32, "GET_I32"];
+$insn_data{xio_top_name} = [36, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_top_gv} = [37, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_fmt_name} = [38, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_fmt_gv} = [39, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_bottom_name} = [40, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xio_bottom_gv} = [41, \&PUT_svindex, "GET_svindex"];
+$insn_data{xio_subprocess} = [42, \&PUT_U16, "GET_U16"];
+$insn_data{xio_type} = [43, \&PUT_U8, "GET_U8"];
+$insn_data{xio_flags} = [44, \&PUT_U8, "GET_U8"];
+$insn_data{xcv_stash} = [45, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_start} = [46, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_root} = [47, \&PUT_opindex, "GET_opindex"];
+$insn_data{xcv_gv} = [48, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_file} = [49, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{xcv_depth} = [50, \&PUT_I32, "GET_I32"];
+$insn_data{xcv_padlist} = [51, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_outside} = [52, \&PUT_svindex, "GET_svindex"];
+$insn_data{xcv_flags} = [53, \&PUT_U16, "GET_U16"];
+$insn_data{av_extend} = [54, \&PUT_I32, "GET_I32"];
+$insn_data{av_push} = [55, \&PUT_svindex, "GET_svindex"];
+$insn_data{xav_fill} = [56, \&PUT_I32, "GET_I32"];
+$insn_data{xav_max} = [57, \&PUT_I32, "GET_I32"];
+$insn_data{xav_flags} = [58, \&PUT_U8, "GET_U8"];
+$insn_data{xhv_riter} = [59, \&PUT_I32, "GET_I32"];
+$insn_data{xhv_name} = [60, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{hv_store} = [61, \&PUT_svindex, "GET_svindex"];
+$insn_data{sv_magic} = [62, \&PUT_U8, "GET_U8"];
+$insn_data{mg_obj} = [63, \&PUT_svindex, "GET_svindex"];
+$insn_data{mg_private} = [64, \&PUT_U16, "GET_U16"];
+$insn_data{mg_flags} = [65, \&PUT_U8, "GET_U8"];
+$insn_data{mg_pv} = [66, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{xmg_stash} = [67, \&PUT_svindex, "GET_svindex"];
+$insn_data{gv_fetchpv} = [68, \&PUT_strconst, "GET_strconst"];
+$insn_data{gv_stashpv} = [69, \&PUT_strconst, "GET_strconst"];
+$insn_data{gp_sv} = [70, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_refcnt} = [71, \&PUT_U32, "GET_U32"];
+$insn_data{gp_refcnt_add} = [72, \&PUT_I32, "GET_I32"];
+$insn_data{gp_av} = [73, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_hv} = [74, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cv} = [75, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_file} = [76, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{gp_io} = [77, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_form} = [78, \&PUT_svindex, "GET_svindex"];
+$insn_data{gp_cvgen} = [79, \&PUT_U32, "GET_U32"];
+$insn_data{gp_line} = [80, \&PUT_U16, "GET_U16"];
+$insn_data{gp_share} = [81, \&PUT_svindex, "GET_svindex"];
+$insn_data{xgv_flags} = [82, \&PUT_U8, "GET_U8"];
+$insn_data{op_next} = [83, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_sibling} = [84, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_ppaddr} = [85, \&PUT_strconst, "GET_strconst"];
+$insn_data{op_targ} = [86, \&PUT_U32, "GET_U32"];
+$insn_data{op_type} = [87, \&PUT_U16, "GET_U16"];
+$insn_data{op_seq} = [88, \&PUT_U16, "GET_U16"];
+$insn_data{op_flags} = [89, \&PUT_U8, "GET_U8"];
+$insn_data{op_private} = [90, \&PUT_U8, "GET_U8"];
+$insn_data{op_first} = [91, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_last} = [92, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_other} = [93, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_children} = [94, \&PUT_U32, "GET_U32"];
+$insn_data{op_pmreplroot} = [95, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmreplrootgv} = [96, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_pmreplstart} = [97, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_pmnext} = [98, \&PUT_opindex, "GET_opindex"];
+$insn_data{pregcomp} = [99, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pmflags} = [100, \&PUT_U16, "GET_U16"];
+$insn_data{op_pmpermflags} = [101, \&PUT_U16, "GET_U16"];
+$insn_data{op_sv} = [102, \&PUT_svindex, "GET_svindex"];
+$insn_data{op_padix} = [103, \&PUT_U32, "GET_U32"];
+$insn_data{op_pv} = [104, \&PUT_pvcontents, "GET_pvcontents"];
+$insn_data{op_pv_tr} = [105, \&PUT_op_tr_array, "GET_op_tr_array"];
+$insn_data{op_redoop} = [106, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_nextop} = [107, \&PUT_opindex, "GET_opindex"];
+$insn_data{op_lastop} = [108, \&PUT_opindex, "GET_opindex"];
+$insn_data{cop_label} = [109, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_stashpv} = [110, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_file} = [111, \&PUT_pvindex, "GET_pvindex"];
+$insn_data{cop_seq} = [112, \&PUT_U32, "GET_U32"];
+$insn_data{cop_arybase} = [113, \&PUT_I32, "GET_I32"];
+$insn_data{cop_line} = [114, \&PUT_U16, "GET_U16"];
+$insn_data{cop_warnings} = [115, \&PUT_svindex, "GET_svindex"];
+$insn_data{main_start} = [116, \&PUT_opindex, "GET_opindex"];
+$insn_data{main_root} = [117, \&PUT_opindex, "GET_opindex"];
+$insn_data{curpad} = [118, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_begin} = [119, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_init} = [120, \&PUT_svindex, "GET_svindex"];
+$insn_data{push_end} = [121, \&PUT_svindex, "GET_svindex"];
 
 my ($insn_name, $insn_data);
 while (($insn_name, $insn_data) = each %insn_data) {
index 6c51a9a..5e798ce 100644 (file)
@@ -4,14 +4,17 @@
 #
 #      You may distribute under the terms of either the GNU General Public
 #      License or the Artistic License, as specified in the README file.
+
 package B::Assembler;
 use Exporter;
 use B qw(ppname);
 use B::Asmdata qw(%insn_data @insn_name);
+use Config qw(%Config);
+require ByteLoader;            # we just need its $VERSIOM
 
 @ISA = qw(Exporter);
-@EXPORT_OK = qw(assemble_fh assemble_insn strip_comments
-               parse_statement uncstring);
+@EXPORT_OK = qw(assemble_fh newasm endasm assemble);
+$VERSION = 0.02;
 
 use strict;
 my %opnumber;
@@ -20,7 +23,7 @@ for ($i = 0; defined($opname = ppname($i)); $i++) {
     $opnumber{$opname} = $i;
 }
 
-my ($linenum, $errors);
+my($linenum, $errors, $out); # global state, set up by newasm
 
 sub error {
     my $str = shift;
@@ -49,13 +52,15 @@ sub B::Asmdata::PUT_U8 {
     return $c;
 }
 
-sub B::Asmdata::PUT_U16 { pack("n", $_[0]) }
-sub B::Asmdata::PUT_U32 { pack("N", $_[0]) }
-sub B::Asmdata::PUT_I32 { pack("N", $_[0]) }
-sub B::Asmdata::PUT_NV  { sprintf("%lf\0", $_[0]) }
-sub B::Asmdata::PUT_objindex { pack("N", $_[0]) } # could allow names here
+sub B::Asmdata::PUT_U16 { pack("S", $_[0]) }
+sub B::Asmdata::PUT_U32 { pack("L", $_[0]) }
+sub B::Asmdata::PUT_I32 { pack("L", $_[0]) }
+sub B::Asmdata::PUT_NV  { sprintf("%s\0", $_[0]) } # "%lf" looses precision and pack('d',...)
+                                                  # may not even be portable between compilers
+sub B::Asmdata::PUT_objindex { pack("L", $_[0]) } # could allow names here
 sub B::Asmdata::PUT_svindex { &B::Asmdata::PUT_objindex }
 sub B::Asmdata::PUT_opindex { &B::Asmdata::PUT_objindex }
+sub B::Asmdata::PUT_pvindex { &B::Asmdata::PUT_objindex }
 
 sub B::Asmdata::PUT_strconst {
     my $arg = shift;
@@ -79,7 +84,7 @@ sub B::Asmdata::PUT_PV {
     my $arg = shift;
     $arg = uncstring($arg);
     error "bad string argument: $arg" unless defined($arg);
-    return pack("N", length($arg)) . $arg;
+    return pack("L", length($arg)) . $arg;
 }
 sub B::Asmdata::PUT_comment_t {
     my $arg = shift;
@@ -90,7 +95,7 @@ sub B::Asmdata::PUT_comment_t {
     }
     return $arg . "\n";
 }
-sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) }
+sub B::Asmdata::PUT_double { sprintf("%s\0", $_[0]) } # see PUT_NV above
 sub B::Asmdata::PUT_none {
     my $arg = shift;
     error "extraneous argument: $arg" if defined $arg;
@@ -103,12 +108,12 @@ sub B::Asmdata::PUT_op_tr_array {
        error "wrong number of arguments to op_tr_array";
        @ary = (0) x 256;
     }
-    return pack("n256", @ary);
+    return pack("S256", @ary);
 }
 # XXX Check this works
 sub B::Asmdata::PUT_IV64 {
     my $arg = shift;
-    return pack("NN", $arg >> 32, $arg & 0xffffffff);
+    return pack("LL", $arg >> 32, $arg & 0xffffffff);
 }
 
 my %unesc = (n => "\n", r => "\r", t => "\t", a => "\a",
@@ -138,6 +143,24 @@ sub strip_comments {
     return $stmt;
 }
 
+# create the ByteCode header: magic, archname, ByteLoader $VERSION, ivsize,
+#      ptrsize, byteorder
+# nvtype is irrelevant (floats are stored as strings)
+# byteorder is strconst not U32 because of varying size issues
+
+sub gen_header {
+    my $header = "";
+
+    $header .= B::Asmdata::PUT_U32(0x43424c50);        # 'PLBC'
+    $header .= B::Asmdata::PUT_strconst('"' . $Config{archname}. '"');
+    $header .= B::Asmdata::PUT_strconst(qq["$ByteLoader::VERSION"]);
+    $header .= B::Asmdata::PUT_U32($Config{ivsize});
+    $header .= B::Asmdata::PUT_U32($Config{ptrsize});
+    $header .= B::Asmdata::PUT_strconst(sprintf(qq["0x%s"], $Config{byteorder}));
+
+    $header;
+}
+
 sub parse_statement {
     my $stmt = shift;
     my ($insn, $arg) = $stmt =~ m{
@@ -183,27 +206,52 @@ sub assemble_insn {
 
 sub assemble_fh {
     my ($fh, $out) = @_;
-    my ($line, $insn, $arg);
-    $linenum = 0;
-    $errors = 0;
+    my $line;
+    my $asm = newasm($out);
     while ($line = <$fh>) {
-       $linenum++;
-       chomp $line;
-       if ($debug) {
-           my $quotedline = $line;
-           $quotedline =~ s/\\/\\\\/g;
-           $quotedline =~ s/"/\\"/g;
-           &$out(assemble_insn("comment", qq("$quotedline")));
-       }
-       $line = strip_comments($line) or next;
-       ($insn, $arg) = parse_statement($line);
-       &$out(assemble_insn($insn, $arg));
-       if ($debug) {
-           &$out(assemble_insn("nop", undef));
-       }
+       assemble($line);
     }
+    endasm();
+}
+
+sub newasm {
+    my($outsub) = @_;
+
+    die "Invalid printing routine for B::Assembler\n" unless ref $outsub eq 'CODE';
+    die <<EOD if ref $out;
+Can't have multiple byteassembly sessions at once!
+       (perhaps you forgot an endasm()?)
+EOD
+
+    $linenum = $errors = 0;
+    $out = $outsub;
+
+    $out->(gen_header());
+}
+
+sub endasm {
     if ($errors) {
-       die "Assembly failed with $errors error(s)\n";
+       die "There were $errors assembly errors\n";
+    }
+    $linenum = $errors = $out = 0;
+}
+
+sub assemble {
+    my($line) = @_;
+    my ($insn, $arg);
+    $linenum++;
+    chomp $line;
+    if ($debug) {
+       my $quotedline = $line;
+       $quotedline =~ s/\\/\\\\/g;
+       $quotedline =~ s/"/\\"/g;
+       $out->(assemble_insn("comment", qq("$quotedline")));
+    }
+    $line = strip_comments($line) or next;
+    ($insn, $arg) = parse_statement($line);
+    $out->(assemble_insn($insn, $arg));
+    if ($debug) {
+       $out->(assemble_insn("nop", undef));
     }
 }
 
@@ -217,14 +265,21 @@ B::Assembler - Assemble Perl bytecode
 
 =head1 SYNOPSIS
 
-       use Assembler;
+       use B::Assembler qw(newasm endasm assemble);
+       newasm(\&printsub);     # sets up for assembly
+       assemble($buf);         # assembles one line
+       endasm();               # closes down
+
+       use B::Assembler qw(assemble_fh);
+       assemble_fh($fh, \&printsub);   # assemble everything in $fh
 
 =head1 DESCRIPTION
 
 See F<ext/B/B/Assembler.pm>.
 
-=head1 AUTHOR
+=head1 AUTHORS
 
 Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Per-statement interface by Benjamin Stuhl, C<sho_pi@hotmail.com>
 
 =cut
index 941a818..bea023a 100644 (file)
@@ -6,16 +6,18 @@
 #      License or the Artistic License, as specified in the README file.
 #
 package B::Bytecode;
+
 use strict;
 use Carp;
-use IO::File;
-
-use B qw(minus_c main_cv main_root main_start comppadlist
+use B qw(main_cv main_root main_start comppadlist
         class peekop walkoptree svref_2object cstring walksymtable
-        SVf_POK SVp_POK SVf_IOK SVp_IOK
+        init_av begin_av end_av
+        SVf_POK SVp_POK SVf_IOK SVp_IOK SVf_NOK SVp_NOK
+        SVf_READONLY GVf_IMPORTED_AV GVf_IMPORTED_CV GVf_IMPORTED_HV
+        GVf_IMPORTED_SV SVTYPEMASK
        );
 use B::Asmdata qw(@optype @specialsv_name);
-use B::Assembler qw(assemble_fh);
+use B::Assembler qw(newasm endasm assemble);
 
 my %optype_enum;
 my $i;
@@ -31,41 +33,76 @@ sub POK () { SVf_POK|SVp_POK }
 # XXX Shouldn't be hardwired
 sub IOK () { SVf_IOK|SVp_IOK }
 
-my ($verbose, $module_only, $no_assemble, $debug_bc, $debug_cv);
-my $assembler_pid;
+# Following is SVf_NOK|SVp_NOK
+# XXX Shouldn't be hardwired
+sub NOK () { SVf_NOK|SVp_NOK }
+
+# nonexistant flags (see B::GV::bytecode for usage)
+sub GVf_IMPORTED_IO () { 0; }
+sub GVf_IMPORTED_FORM () { 0; }
+
+my ($verbose, $no_assemble, $debug_bc, $debug_cv);
+my @packages;  # list of packages to compile
+
+sub asm (@) {  # print replacement that knows about assembling
+    if ($no_assemble) {
+       print @_;
+    } else {
+       my $buf = join '', @_;
+       assemble($_) for (split /\n/, $buf);
+    }
+}
+
+sub asmf (@) { # printf replacement that knows about assembling
+    if ($no_assemble) {
+       printf shift(), @_;
+    } else {
+       my $format = shift;
+       my $buf = sprintf $format, @_;
+       assemble($_) for (split /\n/, $buf);
+    }
+}
 
 # Optimisation options. On the command line, use hyphens instead of
 # underscores for compatibility with gcc-style options. We use
 # underscores here because they are OK in (strict) barewords.
-my ($strip_syntree, $compress_nullops, $omit_seq, $bypass_nullops);
-my %optimise = (strip_syntax_tree      => \$strip_syntree,
-               compress_nullops        => \$compress_nullops,
+my ($compress_nullops, $omit_seq, $bypass_nullops);
+my %optimise = (compress_nullops       => \$compress_nullops,
                omit_sequence_numbers   => \$omit_seq,
                bypass_nullops          => \$bypass_nullops);
 
+my $strip_syntree;     # this is left here in case stripping the
+                       # syntree ever becomes safe again
+                       #       -- BKS, June 2000
+
 my $nextix = 0;
 my %symtable;  # maps object addresses to object indices.
                # Filled in at allocation (newsv/newop) time.
+
 my %saved;     # maps object addresses (for SVish classes) to "saved yet?"
                # flag. Set at FOO::bytecode time usually by SV::bytecode.
                # Manipulated via saved(), mark_saved(), unmark_saved().
 
+my %strtable;  # maps shared strings to object indices
+               # Filled in at allocation (pvix) time
+
 my $svix = -1; # we keep track of when the sv register contains an element
                # of the object table to avoid unnecessary repeated
                # consecutive ldsv instructions.
+
 my $opix = -1; # Ditto for the op register.
 
 sub ldsv {
     my $ix = shift;
     if ($ix != $svix) {
-       print "ldsv $ix\n";
+       asm "ldsv $ix\n";
        $svix = $ix;
     }
 }
 
 sub stsv {
     my $ix = shift;
-    print "stsv $ix\n";
+    asm "stsv $ix\n";
     $svix = $ix;
 }
 
@@ -76,14 +113,14 @@ sub set_svix {
 sub ldop {
     my $ix = shift;
     if ($ix != $opix) {
-       print "ldop $ix\n";
+       asm "ldop $ix\n";
        $opix = $ix;
     }
 }
 
 sub stop {
     my $ix = shift;
-    print "stop $ix\n";
+    asm "stop $ix\n";
     $opix = $ix;
 }
 
@@ -100,12 +137,29 @@ sub pvstring {
     }
 }
 
+sub nv {
+    # print full precision
+    my $str = sprintf "%.40f", $_[0];
+    $str =~ s/0+$//;           # remove trailing zeros
+    $str =~ s/\.$/.0/;
+    return $str;
+}
+
 sub saved { $saved{${$_[0]}} }
 sub mark_saved { $saved{${$_[0]}} = 1 }
 sub unmark_saved { $saved{${$_[0]}} = 0 }
 
 sub debug { $debug_bc = shift }
 
+sub pvix {     # save a shared PV (mainly for COPs)
+    return $strtable{$_[0]} if defined($strtable{$_[0]});
+    asmf "newpv %s\n", pvstring($_[0]);
+    my $ix = $nextix++;
+    $strtable{$_[0]} = $ix;
+    asmf "stpv %d\n", $ix;
+    return $ix;
+}
+
 sub B::OBJECT::nyi {
     my $obj = shift;
     warn sprintf("bytecode save method for %s (0x%x) not yet implemented\n",
@@ -129,7 +183,7 @@ sub B::OBJECT::objix {
 
 sub B::SV::newix {
     my ($sv, $ix) = @_;
-    printf "newsv %d\t# %s\n", $sv->FLAGS & 0xf, class($sv);
+    asmf "newsv %d\t# %s\n", $sv->FLAGS & SVTYPEMASK, class($sv);
     stsv($ix);    
 }
 
@@ -137,7 +191,7 @@ sub B::GV::newix {
     my ($gv, $ix) = @_;
     my $gvname = $gv->NAME;
     my $name = cstring($gv->STASH->NAME . "::" . $gvname);
-    print "gv_fetchpv $name\n";
+    asm "gv_fetchpv $name\n";
     stsv($ix);
 }
 
@@ -146,7 +200,7 @@ sub B::HV::newix {
     my $name = $hv->NAME;
     if ($name) {
        # It's a stash
-       printf "gv_stashpv %s\n", cstring($name);
+       asmf "gv_stashpv %s\n", cstring($name);
        stsv($ix);
     } else {
        # It's an ordinary HV. Fall back to ordinary newix method
@@ -158,7 +212,7 @@ sub B::SPECIAL::newix {
     my ($sv, $ix) = @_;
     # Special case. $$sv is not the address of the SV but an
     # index into svspecialsv_list.
-    printf "ldspecsv $$sv\t# %s\n", $specialsv_name[$$sv];
+    asmf "ldspecsv $$sv\t# %s\n", $specialsv_name[$$sv];
     stsv($ix);
 }
 
@@ -166,8 +220,8 @@ sub B::OP::newix {
     my ($op, $ix) = @_;
     my $class = class($op);
     my $typenum = $optype_enum{$class};
-    croak "OP::newix: can't understand class $class" unless defined($typenum);
-    print "newop $typenum\t# $class\n";
+    croak("OP::newix: can't understand class $class") unless defined($typenum);
+    asm "newop $typenum\t# $class\n";
     stop($ix);
 }
 
@@ -180,7 +234,7 @@ sub B::OP::bytecode {
     my $op = shift;
     my $next = $op->next;
     my $nextix;
-    my $sibix = $op->sibling->objix;
+    my $sibix = $op->sibling->objix unless $strip_syntree;
     my $ix = $op->objix;
     my $type = $op->type;
 
@@ -189,24 +243,24 @@ sub B::OP::bytecode {
     }
     $nextix = $next->objix;
 
-    printf "# %s\n", peekop($op) if $debug_bc;
+    asmf "# %s\n", peekop($op) if $debug_bc;
     ldop($ix);
-    print "op_next $nextix\n";
-    print "op_sibling $sibix\n" unless $strip_syntree;
-    printf "op_type %s\t# %d\n", "pp_" . $op->name, $type;
-    printf("op_seq %d\n", $op->seq) unless $omit_seq;
+    asm "op_next $nextix\n";
+    asm "op_sibling $sibix\n" unless $strip_syntree;
+    asmf "op_type %s\t# %d\n", "pp_" . $op->name, $type;
+    asmf("op_seq %d\n", $op->seq) unless $omit_seq;
     if ($type || !$compress_nullops) {
-       printf "op_targ %d\nop_flags 0x%x\nop_private 0x%x\n",
+       asmf "op_targ %d\nop_flags 0x%x\nop_private 0x%x\n",
            $op->targ, $op->flags, $op->private;
     }
 }
 
 sub B::UNOP::bytecode {
     my $op = shift;
-    my $firstix = $op->first->objix;
+    my $firstix = $op->first->objix unless $strip_syntree;
     $op->B::OP::bytecode;
     if (($op->type || !$compress_nullops) && !$strip_syntree) {
-       print "op_first $firstix\n";
+       asm "op_first $firstix\n";
     }
 }
 
@@ -214,7 +268,7 @@ sub B::LOGOP::bytecode {
     my $op = shift;
     my $otherix = $op->other->objix;
     $op->B::UNOP::bytecode;
-    print "op_other $otherix\n";
+    asm "op_other $otherix\n";
 }
 
 sub B::SVOP::bytecode {
@@ -222,7 +276,7 @@ sub B::SVOP::bytecode {
     my $sv = $op->sv;
     my $svix = $sv->objix;
     $op->B::OP::bytecode;
-    print "op_sv $svix\n";
+    asm "op_sv $svix\n";
     $sv->bytecode;
 }
 
@@ -230,7 +284,7 @@ sub B::PADOP::bytecode {
     my $op = shift;
     my $padix = $op->padix;
     $op->B::OP::bytecode;
-    print "op_padix $padix\n";
+    asm "op_padix $padix\n";
 }
 
 sub B::PVOP::bytecode {
@@ -243,27 +297,27 @@ sub B::PVOP::bytecode {
     #
     if ($op->name eq "trans") {
        my @shorts = unpack("s256", $pv); # assembler handles endianness
-       print "op_pv_tr ", join(",", @shorts), "\n";
+       asm "op_pv_tr ", join(",", @shorts), "\n";
     } else {
-       printf "newpv %s\nop_pv\n", pvstring($pv);
+       asmf "newpv %s\nop_pv\n", pvstring($pv);
     }
 }
 
 sub B::BINOP::bytecode {
     my $op = shift;
-    my $lastix = $op->last->objix;
+    my $lastix = $op->last->objix unless $strip_syntree;
     $op->B::UNOP::bytecode;
     if (($op->type || !$compress_nullops) && !$strip_syntree) {
-       print "op_last $lastix\n";
+       asm "op_last $lastix\n";
     }
 }
 
 sub B::LISTOP::bytecode {
     my $op = shift;
-    my $children = $op->children;
+    my $children = $op->children unless $strip_syntree;
     $op->B::BINOP::bytecode;
     if (($op->type || !$compress_nullops) && !$strip_syntree) {
-       print "op_children $children\n";
+       asm "op_children $children\n";
     }
 }
 
@@ -273,28 +327,29 @@ sub B::LOOP::bytecode {
     my $nextopix = $op->nextop->objix;
     my $lastopix = $op->lastop->objix;
     $op->B::LISTOP::bytecode;
-    print "op_redoop $redoopix\nop_nextop $nextopix\nop_lastop $lastopix\n";
+    asm "op_redoop $redoopix\nop_nextop $nextopix\nop_lastop $lastopix\n";
 }
 
 sub B::COP::bytecode {
     my $op = shift;
-    my $stashpv = $op->stashpv;
     my $file = $op->file;
     my $line = $op->line;
+    if ($debug_bc) { # do this early to aid debugging
+       asmf "# line %s:%d\n", $file, $line;
+    }
+    my $stashpv = $op->stashpv;
     my $warnings = $op->warnings;
     my $warningsix = $warnings->objix;
-    if ($debug_bc) {
-       printf "# line %s:%d\n", $file, $line;
-    }
+    my $labelix = pvix($op->label);
+    my $stashix = pvix($stashpv);
+    my $fileix = pvix($file);
+    $warnings->bytecode;
     $op->B::OP::bytecode;
-    printf <<"EOT", pvstring($op->label), pvstring($stashpv), $op->cop_seq, pvstring($file), $op->arybase;
-newpv %s
-cop_label
-newpv %s
-cop_stashpv
+    asmf <<"EOT", $labelix, $stashix, $op->cop_seq, $fileix, $op->arybase;
+cop_label %d
+cop_stashpv %d
 cop_seq %d
-newpv %s
-cop_file
+cop_file %d
 cop_arybase %d
 cop_line $line
 cop_warnings $warningsix
@@ -322,13 +377,13 @@ sub B::PMOP::bytecode {
     }
     $op->B::LISTOP::bytecode;
     if ($opname eq "pushre") {
-       printf "op_pmreplrootgv $replrootix\n";
+       asmf "op_pmreplrootgv $replrootix\n";
     } else {
-       print "op_pmreplroot $replrootix\nop_pmreplstart $replstartix\n";
+       asm "op_pmreplroot $replrootix\nop_pmreplstart $replstartix\n";
     }
     my $re = pvstring($op->precomp);
     # op_pmnext omitted since a perl bug means it's sometime corrupt
-    printf <<"EOT", $op->pmflags, $op->pmpermflags;
+    asmf <<"EOT", $op->pmflags, $op->pmpermflags;
 op_pmflags 0x%x
 op_pmpermflags 0x%x
 newpv $re
@@ -343,7 +398,7 @@ sub B::SV::bytecode {
     my $refcnt = $sv->REFCNT;
     my $flags = sprintf("0x%x", $sv->FLAGS);
     ldsv($ix);
-    print "sv_refcnt $refcnt\nsv_flags $flags\n";
+    asm "sv_refcnt $refcnt\nsv_flags $flags\n";
     mark_saved($sv);
 }
 
@@ -351,7 +406,7 @@ sub B::PV::bytecode {
     my $sv = shift;
     return if saved($sv);
     $sv->B::SV::bytecode;
-    printf("newpv %s\nxpv\n", pvstring($sv->PV)) if $sv->FLAGS & POK;
+    asmf("newpv %s\nxpv\n", pvstring($sv->PV)) if $sv->FLAGS & POK;
 }
 
 sub B::IV::bytecode {
@@ -359,14 +414,14 @@ sub B::IV::bytecode {
     return if saved($sv);
     my $iv = $sv->IVX;
     $sv->B::SV::bytecode;
-    printf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
+    asmf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32" if $sv->FLAGS & IOK; # could be PVNV
 }
 
 sub B::NV::bytecode {
     my $sv = shift;
     return if saved($sv);
     $sv->B::SV::bytecode;
-    printf "xnv %s\n", $sv->NVX;
+    asmf "xnv %s\n", nv($sv->NVX);
 }
 
 sub B::RV::bytecode {
@@ -376,7 +431,7 @@ sub B::RV::bytecode {
     my $rvix = $rv->objix;
     $rv->bytecode;
     $sv->B::SV::bytecode;
-    print "xrv $rvix\n";
+    asm "xrv $rvix\n";
 }
 
 sub B::PVIV::bytecode {
@@ -384,7 +439,7 @@ sub B::PVIV::bytecode {
     return if saved($sv);
     my $iv = $sv->IVX;
     $sv->B::PV::bytecode;
-    printf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
+    asmf "%s $iv\n", $sv->needs64bits ? "xiv64" : "xiv32";
 }
 
 sub B::PVNV::bytecode {
@@ -404,12 +459,12 @@ sub B::PVNV::bytecode {
     } else {
        my $pv = $sv->PV;
        $sv->B::IV::bytecode;
-       printf "xnv %s\n", $sv->NVX;
+       asmf "xnv %s\n", nv($sv->NVX);
        if ($flag == 1) {
            $pv .= "\0" . $sv->TABLE;
-           printf "newpv %s\npv_cur %d\nxpv\n", pvstring($pv),length($pv)-257;
+           asmf "newpv %s\npv_cur %d\nxpv\n", pvstring($pv),length($pv)-257;
        } else {
-           printf("newpv %s\nxpv\n", pvstring($pv)) if $sv->FLAGS & POK;
+           asmf("newpv %s\nxpv\n", pvstring($pv)) if $sv->FLAGS & POK;
        }
     }
 }
@@ -431,9 +486,9 @@ sub B::PVMG::bytecode {
     #
     @mgobjix = map($_->OBJ->objix, @mgchain);
     $sv->B::PVNV::bytecode($flag);
-    print "xmg_stash $stashix\n";
+    asm "xmg_stash $stashix\n";
     foreach $mg (@mgchain) {
-       printf "sv_magic %s\nmg_obj %d\nnewpv %s\nmg_pv\n",
+       asmf "sv_magic %s\nmg_obj %d\nnewpv %s\nmg_pv\n",
            cstring($mg->TYPE), shift(@mgobjix), pvstring($mg->PTR);
     }
 }
@@ -442,7 +497,7 @@ sub B::PVLV::bytecode {
     my $sv = shift;
     return if saved($sv);
     $sv->B::PVMG::bytecode;
-    printf <<'EOT', $sv->TARGOFF, $sv->TARGLEN, cstring($sv->TYPE);
+    asmf <<'EOT', $sv->TARGOFF, $sv->TARGLEN, cstring($sv->TYPE);
 xlv_targoff %d
 xlv_targlen %d
 xlv_type %s
@@ -454,46 +509,63 @@ sub B::BM::bytecode {
     return if saved($sv);
     # See PVNV::bytecode for an explanation of what the argument does
     $sv->B::PVMG::bytecode(1);
-    printf "xbm_useful %d\nxbm_previous %d\nxbm_rare %d\n",
+    asmf "xbm_useful %d\nxbm_previous %d\nxbm_rare %d\n",
        $sv->USEFUL, $sv->PREVIOUS, $sv->RARE;
 }
 
+sub empty_gv { # is a GV empty except for imported stuff?
+    my $gv = shift;
+
+    return 0 if ($gv->SV->FLAGS & SVTYPEMASK); # sv not SVt_NULL
+    my @subfield_names = qw(AV HV CV FORM IO);
+    @subfield_names = grep {;
+                               no strict 'refs';
+                               !($gv->GvFLAGS & ${\"GVf_IMPORTED_$_"}->()) && ${$gv->$_()};
+                       } @subfield_names;
+    return scalar @subfield_names;
+}
+
 sub B::GV::bytecode {
     my $gv = shift;
     return if saved($gv);
+    return unless grep { $_ eq $gv->STASH->NAME; } @packages;
+    return if $gv->NAME =~ m/^\(/;     # ignore overloads - they'll be rebuilt
     my $ix = $gv->objix;
     mark_saved($gv);
     ldsv($ix);
-    printf <<"EOT", $gv->FLAGS, $gv->GvFLAGS;
+    asmf <<"EOT", $gv->FLAGS, $gv->GvFLAGS;
 sv_flags 0x%x
 xgv_flags 0x%x
 EOT
     my $refcnt = $gv->REFCNT;
-    printf("sv_refcnt_add %d\n", $refcnt - 1) if $refcnt > 1;
+    asmf("sv_refcnt_add %d\n", $refcnt - 1) if $refcnt > 1;
     return if $gv->is_empty;
-    printf <<"EOT", $gv->LINE, pvstring($gv->FILE);
+    asmf <<"EOT", $gv->LINE, pvix($gv->FILE);
 gp_line %d
-newpv %s
-gp_file
+gp_file %d
 EOT
     my $gvname = $gv->NAME;
     my $name = cstring($gv->STASH->NAME . "::" . $gvname);
     my $egv = $gv->EGV;
     my $egvix = $egv->objix;
     my $gvrefcnt = $gv->GvREFCNT;
-    printf("gp_refcnt_add %d\n", $gvrefcnt - 1) if $gvrefcnt > 1;
+    asmf("gp_refcnt_add %d\n", $gvrefcnt - 1) if $gvrefcnt > 1;
     if ($gvrefcnt > 1 &&  $ix != $egvix) {
-       print "gp_share $egvix\n";
+       asm "gp_share $egvix\n";
     } else {
        if ($gvname !~ /^([^A-Za-z]|STDIN|STDOUT|STDERR|ARGV|SIG|ENV)$/) {
            my $i;
            my @subfield_names = qw(SV AV HV CV FORM IO);
+           @subfield_names = grep {;
+                                       no strict 'refs';
+                                       !($gv->GvFLAGS & ${\"GVf_IMPORTED_$_"}->());
+                               } @subfield_names;
            my @subfields = map($gv->$_(), @subfield_names);
            my @ixes = map($_->objix, @subfields);
            # Reset sv register for $gv
            ldsv($ix);
            for ($i = 0; $i < @ixes; $i++) {
-               printf "gp_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
+               asmf "gp_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
            }
            # Now save all the subfields
            my $sv;
@@ -523,10 +595,10 @@ sub B::HV::bytecode {
        }
        ldsv($ix);
        for ($i = 0; $i < @contents; $i += 2) {
-           printf("newpv %s\nhv_store %d\n",
+           asmf("newpv %s\nhv_store %d\n",
                   pvstring($contents[$i]), $ixes[$i / 2]);
        }
-       printf "sv_refcnt %d\nsv_flags 0x%x\n", $hv->REFCNT, $hv->FLAGS;
+       asmf "sv_refcnt %d\nsv_flags 0x%x\n", $hv->REFCNT, $hv->FLAGS;
     }
 }
 
@@ -551,22 +623,26 @@ sub B::AV::bytecode {
     # create an AV with NEWSV and SvUPGRADE rather than doing newAV
     # which is what sets AvMAX and AvFILL.
     ldsv($ix);
-    printf "xav_flags 0x%x\nxav_max -1\nxav_fill -1\n", $av->AvFLAGS;
+    asmf "sv_flags 0x%x\n", $av->FLAGS & ~SVf_READONLY; # SvREADONLY_off($av) in case PADCONST
+    asmf "xav_flags 0x%x\nxav_max -1\nxav_fill -1\n", $av->AvFLAGS;
     if ($fill > -1) {
        my $elix;
        foreach $elix (@ixes) {
-           print "av_push $elix\n";
+           asm "av_push $elix\n";
        }
     } else {
        if ($max > -1) {
-           print "av_extend $max\n";
+           asm "av_extend $max\n";
        }
     }
+    asmf "sv_flags 0x%x\n", $av->FLAGS; # restore flags from above
 }
 
 sub B::CV::bytecode {
     my $cv = shift;
     return if saved($cv);
+    return if ${$cv->GV} && ($cv->GV->GvFLAGS & GVf_IMPORTED_CV);
+    my $fileix = pvix($cv->FILE);
     my $ix = $cv->objix;
     $cv->B::PVMG::bytecode;
     my $i;
@@ -581,10 +657,10 @@ sub B::CV::bytecode {
     # Reset sv register for $cv (since above ->objix calls stomped on it)
     ldsv($ix);
     for ($i = 0; $i < @ixes; $i++) {
-       printf "xcv_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
+       asmf "xcv_%s %d\n", lc($subfield_names[$i]), $ixes[$i];
     }
-    printf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->CvFLAGS;
-    printf "newpv %s\nxcv_file\n", pvstring($cv->FILE);
+    asmf "xcv_depth %d\nxcv_flags 0x%x\n", $cv->DEPTH, $cv->CvFLAGS;
+    asmf "xcv_file %d\n", $fileix;
     # Now save all the subfields (except for CvROOT which was handled
     # above) and CvSTART (now the initial element of @subfields).
     shift @subfields; # bye-bye CvSTART
@@ -607,17 +683,17 @@ sub B::IO::bytecode {
 
     $io->B::PVMG::bytecode;
     ldsv($ix);
-    print "xio_top_gv $top_gvix\n";
-    print "xio_fmt_gv $fmt_gvix\n";
-    print "xio_bottom_gv $bottom_gvix\n";
+    asm "xio_top_gv $top_gvix\n";
+    asm "xio_fmt_gv $fmt_gvix\n";
+    asm "xio_bottom_gv $bottom_gvix\n";
     my $field;
     foreach $field (qw(TOP_NAME FMT_NAME BOTTOM_NAME)) {
-       printf "newpv %s\nxio_%s\n", pvstring($io->$field()), lc($field);
+       asmf "newpv %s\nxio_%s\n", pvstring($io->$field()), lc($field);
     }
     foreach $field (qw(LINES PAGE PAGE_LEN LINES_LEFT SUBPROCESS)) {
-       printf "xio_%s %d\n", lc($field), $io->$field();
+       asmf "xio_%s %d\n", lc($field), $io->$field();
     }
-    printf "xio_type %s\nxio_flags 0x%x\n", cstring($io->IoTYPE), $io->IoFLAGS;
+    asmf "xio_type %s\nxio_flags 0x%x\n", cstring($io->IoTYPE), $io->IoFLAGS;
     $top_gv->bytecode;
     $fmt_gv->bytecode;
     $bottom_gv->bytecode;
@@ -628,8 +704,7 @@ sub B::SPECIAL::bytecode {
 }
 
 sub bytecompile_object {
-    my $sv;
-    foreach $sv (@_) {
+    for my $sv (@_) {
        svref_2object($sv)->bytecode;
     }
 }
@@ -637,7 +712,7 @@ sub bytecompile_object {
 sub B::GV::bytecodecv {
     my $gv = shift;
     my $cv = $gv->CV;
-    if ($$cv && !saved($cv)) {
+    if ($$cv && !saved($cv) && !($gv->FLAGS & GVf_IMPORTED_CV)) {
        if ($debug_cv) {
            warn sprintf("saving extra CV &%s::%s (0x%x) from GV 0x%x\n",
                         $gv->STASH->NAME, $gv->NAME, $$cv, $$gv);
@@ -646,43 +721,66 @@ sub B::GV::bytecodecv {
     }
 }
 
-sub bytecompile_main {
-    my $curpad = (comppadlist->ARRAY)[1];
-    my $curpadix = $curpad->objix;
-    $curpad->bytecode;
-    walkoptree(main_root, "bytecode");
-    warn "done main program, now walking symbol table\n" if $debug_bc;
-    my ($pack, %exclude);
-    foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS strict vars
-                     FileHandle Exporter Carp UNIVERSAL IO Fcntl Symbol warnings
-                     attributes File::Spec SelectSaver blib Cwd))
-    {
-       $exclude{$pack."::"} = 1;
+sub save_call_queues {
+    if (begin_av()->isa("B::AV")) {    # this is just to save 'use Foo;' calls
+       for my $cv (begin_av()->ARRAY) {
+           next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+           my $op = $cv->START;
+OPLOOP:
+           while ($$op) {
+               if ($op->name eq 'require') { # save any BEGIN that does a require
+                   $cv->bytecode;
+                   asmf "push_begin %d\n", $cv->objix;
+                   last OPLOOP;
+               }
+               $op = $op->next;
+           }
+       }
     }
-    no strict qw(vars refs);
-    walksymtable(\%{"main::"}, "bytecodecv", sub {
-       warn "considering $_[0]\n" if $debug_bc;
-       return !defined($exclude{$_[0]});
-    });
-    if (!$module_only) {
-       printf "main_root %d\n", main_root->objix;
-       printf "main_start %d\n", main_start->objix;
-       printf "curpad $curpadix\n";
-       # XXX Do min_intro_pending and max_intro_pending matter?
+    if (init_av()->isa("B::AV")) {
+       for my $cv (init_av()->ARRAY) {
+           next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+           $cv->bytecode;
+           asmf "push_init %d\n", $cv->objix;
+       }
+    }
+    if (end_av()->isa("B::AV")) {
+       for my $cv (end_av()->ARRAY) {
+           next unless grep { $_ eq $cv->STASH->NAME; } @packages;
+           $cv->bytecode;
+           asmf "push_end %d\n", $cv->objix;
+       }
     }
 }
 
-sub prepare_assemble {
-    my $newfh = IO::File->new_tmpfile;
-    select($newfh);
-    binmode $newfh;
-    return $newfh;
+sub symwalk {
+    no strict 'refs';
+    my $ok = 1 if grep { (my $name = $_[0]) =~ s/::$//; $_ eq $name;} @packages;
+    if (grep { /^$_[0]/; } @packages) {
+       walksymtable(\%{"$_[0]"}, "bytecodecv", \&symwalk, $_[0]);
+    }
+    warn "considering $_[0] ... " . ($ok ? "accepted\n" : "rejected\n")
+       if $debug_bc;
+    $ok;
 }
 
-sub do_assemble {
-    my $fh = shift;
-    seek($fh, 0, 0); # rewind the temporary file
-    assemble_fh($fh, sub { print OUT @_ });
+sub bytecompile_main {
+    my $curpad = (comppadlist->ARRAY)[1];
+    my $curpadix = $curpad->objix;
+    $curpad->bytecode;
+    save_call_queues();
+    walkoptree(main_root, "bytecode") unless ref(main_root) eq "B::NULL";
+    warn "done main program, now walking symbol table\n" if $debug_bc;
+    if (@packages) {
+       no strict qw(refs);
+       walksymtable(\%{"main::"}, "bytecodecv", \&symwalk);
+    } else {
+       die "No packages requested for compilation!\n";
+    }
+    asmf "main_root %d\n", main_root->objix;
+    asmf "main_start %d\n", main_start->objix;
+    asmf "curpad $curpadix\n";
+    # XXX Do min_intro_pending and max_intro_pending matter?
 }
 
 sub compile {
@@ -690,7 +788,7 @@ sub compile {
     my ($option, $opt, $arg);
     open(OUT, ">&STDOUT");
     binmode OUT;
-    select(OUT);
+    select OUT;
   OPTION:
     while ($option = shift @options) {
        if ($option =~ /^-(.)(.*)/) {
@@ -727,8 +825,6 @@ sub compile {
            }
        } elsif ($opt eq "v") {
            $verbose = 1;
-       } elsif ($opt eq "m") {
-           $module_only = 1;
        } elsif ($opt eq "S") {
            $no_assemble = 1;
        } elsif ($opt eq "f") {
@@ -747,9 +843,6 @@ sub compile {
            foreach $ref (values %optimise) {
                $$ref = 0;
            }
-           if ($arg >= 6) {
-               $strip_syntree = 1;
-           }
            if ($arg >= 2) {
                $bypass_nullops = 1;
            }
@@ -757,28 +850,30 @@ sub compile {
                $compress_nullops = 1;
                $omit_seq = 1;
            }
+       } elsif ($opt eq "u") {
+           $arg ||= shift @options;
+           push @packages, $arg;
+       } else {
+           warn qq(ignoring unknown option "$opt$arg"\n);
        }
     }
+    if (! @packages) {
+       warn "No package specified for compilation, assuming main::\n";
+       @packages = qw(main);
+    }
     if (@options) {
-       return sub {
-           my $objname;
-           my $newfh; 
-           $newfh = prepare_assemble() unless $no_assemble;
-           foreach $objname (@options) {
-               eval "bytecompile_object(\\$objname)";
-           }
-           do_assemble($newfh) unless $no_assemble;
-       }
+       die "Extraneous options left on B::Bytecode commandline: @options\n";
     } else {
-       return sub {
-           my $newfh; 
-           $newfh = prepare_assemble() unless $no_assemble;
+       return sub { 
+           newasm(\&apr) unless $no_assemble;
            bytecompile_main();
-           do_assemble($newfh) unless $no_assemble;
-       }
+           endasm() unless $no_assemble;
+       };
     }
 }
 
+sub apr { print @_; }
+
 1;
 
 __END__
@@ -848,18 +943,11 @@ which is only used by perl's internal compiler.
 If op->op_next ever points to a NULLOP, replaces the op_next field
 with the first non-NULLOP in the path of execution.
 
-=item B<-fstrip-syntax-tree>
-
-Leaves out code to fill in the pointers which link the internal syntax
-tree together. They're not needed at run-time but leaving them out
-will make it impossible to recompile or disassemble the resulting
-program.  It will also stop C<goto label> statements from working.
-
 =item B<-On>
 
 Optimisation level (n = 0, 1, 2, ...). B<-O> means B<-O1>.
 B<-O1> sets B<-fcompress-nullops> B<-fomit-sequence numbers>.
-B<-O6> adds B<-fstrip-syntax-tree>.
+B<-O2> adds B<-fbypass-nullops>.
 
 =item B<-D>
 
@@ -887,33 +975,33 @@ Prints each CV taken from the final symbol tree walk.
 Output (bytecode) assembler source rather than piping it
 through the assembler and outputting bytecode.
 
-=item B<-m>
-
-Compile as a module rather than a standalone program. Currently this
-just means that the bytecodes for initialising C<main_start>,
-C<main_root> and C<curpad> are omitted.
-
+=item B<-upackage>
+  
+Stores package in the output.
+  
 =back
 
 =head1 EXAMPLES
 
-    perl -MO=Bytecode,-O6,-o,foo.plc foo.pl
+    perl -MO=Bytecode,-O6,-ofoo.plc,-umain foo.pl
 
-    perl -MO=Bytecode,-S foo.pl > foo.S
+    perl -MO=Bytecode,-S,-umain foo.pl > foo.S
     assemble foo.S > foo.plc
 
 Note that C<assemble> lives in the C<B> subdirectory of your perl
 library directory. The utility called perlcc may also be used to 
 help make use of this compiler.
 
-    perl -MO=Bytecode,-m,-oFoo.pmc Foo.pm
+    perl -MO=Bytecode,-uFoo,-oFoo.pmc Foo.pm
 
 =head1 BUGS
 
-Plenty. Current status: experimental.
+Output is still huge and there are still occasional crashes during
+either compilation or ByteLoading. Current status: experimental.
 
-=head1 AUTHOR
+=head1 AUTHORS
 
 Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
+Benjamin Stuhl, C<sho_pi@hotmail.com>
 
 =cut
index ae7a973..1327591 100644 (file)
@@ -53,7 +53,6 @@ sub B::PMOP::debug {
     printf "\top_pmnext\t0x%x\n", ${$op->pmnext};
     printf "\top_pmregexp->precomp\t%s\n", cstring($op->precomp);
     printf "\top_pmflags\t0x%x\n", $op->pmflags;
-    $op->pmshort->debug;
     $op->pmreplroot->debug;
 }
 
@@ -244,7 +243,7 @@ sub B::SPECIAL::debug {
 sub compile {
     my $order = shift;
     B::clearsym();
-    if ($order eq "exec") {
+    if ($order && $order eq "exec") {
         return sub { walkoptree_exec(main_start, "debug") }
     } else {
         return sub { walkoptree(main_root, "debug") }
index b6e1097..5c5c5eb 100644 (file)
@@ -14,6 +14,7 @@ use B qw(class main_root main_start main_cv svref_2object opnumber
         OPpLVAL_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
         OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
         SVf_IOK SVf_NOK SVf_ROK SVf_POK
+         CVf_METHOD CVf_LOCKED CVf_LVALUE
         PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
         PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
 $VERSION = 0.591;
@@ -432,6 +433,13 @@ sub deparse_sub {
     if ($cv->FLAGS & SVf_POK) {
        $proto = "(". $cv->PV . ") ";
     }
+    if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)) {
+        $proto .= ": ";
+        $proto .= "lvalue " if $cv->CvFLAGS & CVf_LVALUE;
+        $proto .= "locked " if $cv->CvFLAGS & CVf_LOCKED;
+        $proto .= "method " if $cv->CvFLAGS & CVf_METHOD;
+    }
+
     local($self->{'curcv'}) = $cv;
     local($self->{'curstash'}) = $self->{'curstash'};
     if (not null $cv->ROOT) {
@@ -839,7 +847,7 @@ sub pp_i_preinc { pfixop(@_, "++", 23) }
 sub pp_i_predec { pfixop(@_, "--", 23) }
 sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) }
 sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) }
-sub pp_complement { maybe_targmy(@_. \&pfixop, "~", 21) }
+sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) }
 
 sub pp_negate { maybe_targmy(@_, \&real_negate) }
 sub real_negate {
@@ -2487,7 +2495,7 @@ sub pchr { # ASCII
 
 sub collapse {
     my(@chars) = @_;
-    my($c, $str, $tr);
+    my($str, $c, $tr) = ("");
     for ($c = 0; $c < @chars; $c++) {
        $tr = $chars[$c];
        $str .= pchr($tr);
@@ -2540,7 +2548,7 @@ sub tr_decode_byte {
        }
        @from = @newfrom;
     }
-    unless ($flags & OPpTRANS_DELETE) {
+    unless ($flags & OPpTRANS_DELETE || !@to) {
        pop @to while $#to and $to[$#to] == $to[$#to -1];
     }
     my($from, $to);
index cb9696b..dcf6a1d 100644 (file)
@@ -1,5 +1,6 @@
 use ExtUtils::MakeMaker;
 use Config;
+use File::Spec;
 
 my $e = $Config{'exe_ext'};
 my $o = $Config{'obj_ext'};
@@ -29,8 +30,19 @@ sub post_constants {
     "\nLIBS = $Config::Config{libs}\n"
 }    
 
-sub postamble {
-'
-B$(OBJ_EXT) : defsubs.h 
-'
+sub upupfile {
+    File::Spec->catfile(File::Spec->updir,
+                       File::Spec->updir, $_[0]);
+}
+
+sub MY::postamble {
+    my $op_h   = upupfile('op.h');
+    my $cop_h  = upupfile('cop.h');
+    my $noecho = shift->{NOECHO};
+"
+B\$(OBJ_EXT) : defsubs.h              
+
+defsubs.h :: $op_h $cop_h                     
+       $noecho \$(NOOP)
+" 
 }
index 352f8d4..2ef91ed 100644 (file)
@@ -1,5 +1,5 @@
 package O;
-use B qw(minus_c);
+use B qw(minus_c save_BEGINs);
 use Carp;    
 
 sub import {
@@ -11,6 +11,7 @@ sub import {
     my $compilesub = &{"B::${backend}::compile"}(@options);
     if (ref($compilesub) eq "CODE") {
        minus_c;
+       save_BEGINs;
        eval 'CHECK { &$compilesub() }';
     } else {
        die $compilesub;
index 80ef936..800bb2c 100644 (file)
@@ -6,10 +6,16 @@ my ($out) = __FILE__ =~ /(^.*)\.PL/i;
 $out =~ s/_h$/.h/;
 open(OUT,">$out") || die "Cannot open $file:$!";
 print "Extracting $out...\n";
-foreach my $const (qw(AVf_REAL 
+foreach my $const (qw(
+                     AVf_REAL 
                      HEf_SVKEY
+                     SVf_READONLY SVTYPEMASK
+                     GVf_IMPORTED_AV GVf_IMPORTED_HV
+                     GVf_IMPORTED_SV GVf_IMPORTED_CV
+                     CVf_METHOD CVf_LOCKED CVf_LVALUE
                       SVf_IOK SVf_IVisUV SVf_NOK SVf_POK 
-                     SVf_ROK SVp_IOK SVp_POK ))
+                     SVf_ROK SVp_IOK SVp_POK SVp_NOK
+                     ))
  {
   doconst($const);
  }
index e0cb8ff..e08333d 100644 (file)
@@ -9,13 +9,13 @@ PP(pp_range)
 }
 
 pp_range is a LOGOP.
-In array context, it just returns op_next.
+In list context, it just returns op_next.
 In scalar context it checks the truth of targ and returns
 op_other if true, op_next if false.
 
 flip is an UNOP.
 It "looks after" its child which is always a pp_range LOGOP.
-In array context, it just returns the child's op_other.
+In list context, it just returns the child's op_other.
 In scalar context, there are three possible outcomes:
   (1) set child's targ to 1, our targ to 1 and return op_next.
   (2) set child's targ to 1, our targ to 0, sp-- and return child's op_other.
index 286d746..9c8c84d 100644 (file)
@@ -2,7 +2,7 @@ package ByteLoader;
 
 use XSLoader ();
 
-$VERSION = 0.03;
+$VERSION = 0.04;
 
 XSLoader::load 'ByteLoader', $VERSION;
 
@@ -17,10 +17,10 @@ ByteLoader - load byte compiled perl code
 
 =head1 SYNOPSIS
 
-  use ByteLoader 0.03;
+  use ByteLoader 0.04;
   <byte code>
 
-  use ByteLoader 0.03;
+  use ByteLoader 0.04;
   <byte code>
 
 =head1 DESCRIPTION
index 7c3746b..d3b4351 100644 (file)
@@ -4,31 +4,74 @@
 #include "XSUB.h"
 #include "byterun.h"
 
-static int
-xgetc(PerlIO *io)
-{
-    dTHX;
-    return PerlIO_getc(io);
-}
+/* Something arbitary for a buffer size */
+#define BYTELOADER_BUFFER 8096
 
-static int
-xfread(char *buf, size_t size, size_t n, PerlIO *io)
+int
+bl_getc(struct byteloader_fdata *data)
 {
     dTHX;
-    int i = PerlIO_read(io, buf, n * size);
-    if (i > 0)
-       i /= size;
-    return i;
+    if (SvCUR(data->datasv) <= data->next_out) {
+      int result;
+      /* Run out of buffered data, so attempt to read some more */
+      *(SvPV_nolen (data->datasv)) = '\0';
+      SvCUR_set (data->datasv, 0);
+      data->next_out = 0;
+      result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
+
+      /* Filter returned error, or we got EOF and no data, then return EOF.
+        Not sure if filter is allowed to return EOF and add data simultaneously
+        Think not, but will bullet proof against it. */
+      if (result < 0 || SvCUR(data->datasv) == 0)
+       return EOF;
+      /* Else there must be at least one byte present, which is good enough */
+    }
+
+    return *((char *) SvPV_nolen (data->datasv) + data->next_out++);
 }
 
-static void
-freadpv(U32 len, void *data, XPV *pv)
+int
+bl_read(struct byteloader_fdata *data, char *buf, size_t size, size_t n)
 {
     dTHX;
-    New(666, pv->xpv_pv, len, char);
-    PerlIO_read((PerlIO*)data, (void*)pv->xpv_pv, len);
-    pv->xpv_len = len;
-    pv->xpv_cur = len - 1;
+    char *start;
+    STRLEN len;
+    size_t wanted = size * n;
+
+    start = SvPV (data->datasv, len);
+    if (len < (data->next_out + wanted)) {
+      int result;
+
+      /* Shuffle data to start of buffer */
+      len -= data->next_out;
+      if (len) {
+       memmove (start, start + data->next_out, len + 1);
+       SvCUR_set (data->datasv, len);
+      } else {
+       *start = '\0';  /* Avoid call to memmove. */
+       SvCUR_set (data->datasv, 0);
+      }
+      data->next_out = 0;
+
+      /* Attempt to read more data. */
+      do {
+       result = FILTER_READ (data->idx + 1, data->datasv, BYTELOADER_BUFFER);
+       
+       start = SvPV (data->datasv, len);
+      } while (result > 0 && len < wanted);
+      /* Loop while not (EOF || error) and short reads */
+
+      /* If not enough data read, truncate copy */
+      if (wanted > len)
+       wanted = len;
+    }
+
+    if (wanted > 0) {
+      memcpy (buf, start + data->next_out, wanted);
+       data->next_out += wanted;
+      wanted /= size;
+    }
+    return (int) wanted;
 }
 
 static I32
@@ -37,14 +80,20 @@ byteloader_filter(pTHXo_ int idx, SV *buf_sv, int maxlen)
     dTHR;
     OP *saveroot = PL_main_root;
     OP *savestart = PL_main_start;
-    struct bytestream bs;
+    struct byteloader_state bstate;
+    struct byteloader_fdata data;
+
+    data.next_out = 0;
+    data.datasv = FILTER_DATA(idx);
+    data.idx = idx;
 
-    bs.data = PL_rsfp;
-    bs.pfgetc = (int(*) (void*))xgetc;
-    bs.pfread = (int(*) (char*,size_t,size_t,void*))xfread;
-    bs.pfreadpv = freadpv;
+    bstate.bs_fdata = &data;
+    bstate.bs_obj_list = Null(void**);
+    bstate.bs_obj_list_fill = -1;
+    bstate.bs_sv = Nullsv;
+    bstate.bs_iv_overflows = 0;
 
-    byterun(aTHXo_ bs);
+    byterun(aTHXo_ &bstate);
 
     if (PL_in_eval) {
         OP *o;
@@ -70,8 +119,12 @@ PROTOTYPES: ENABLE
 
 void
 import(...)
+  PREINIT:
+    SV *sv = newSVpvn ("", 0);
   PPCODE:
-    filter_add(byteloader_filter, NULL);
+    if (!sv)
+      croak ("Could not allocate ByteLoader buffers");
+    filter_add(byteloader_filter, sv);
 
 void
 unimport(...)
index 1621fed..c6acd28 100644 (file)
@@ -5,29 +5,33 @@ typedef char *op_tr_array;
 typedef int comment_t;
 typedef SV *svindex;
 typedef OP *opindex;
+typedef char *pvindex;
 typedef IV IV64;
 
 #define BGET_FREAD(argp, len, nelem)   \
-        bs.pfread((char*)(argp),(len),(nelem),bs.data)
-#define BGET_FGETC() bs.pfgetc(bs.data)
+        bl_read(bstate->bs_fdata,(char*)(argp),(len),(nelem))
+#define BGET_FGETC() bl_getc(bstate->bs_fdata)
 
 #define BGET_U32(arg)  \
-       BGET_FREAD(&arg, sizeof(U32), 1); arg = PerlSock_ntohl((U32)arg)
+       BGET_FREAD(&arg, sizeof(U32), 1)
 #define BGET_I32(arg)  \
-       BGET_FREAD(&arg, sizeof(I32), 1); arg = (I32)PerlSock_ntohl((U32)arg)
+       BGET_FREAD(&arg, sizeof(I32), 1)
 #define BGET_U16(arg)  \
-       BGET_FREAD(&arg, sizeof(U16), 1); arg = PerlSock_ntohs((U16)arg)
+       BGET_FREAD(&arg, sizeof(U16), 1)
 #define BGET_U8(arg)   arg = BGET_FGETC()
 
-#define BGET_PV(arg)   STMT_START {    \
-       BGET_U32(arg);                  \
-       if (arg)                        \
-           bs.pfreadpv(arg, bs.data, &bytecode_pv);    \
-       else {                          \
-           bytecode_pv.xpv_pv = 0;             \
-           bytecode_pv.xpv_len = 0;            \
-           bytecode_pv.xpv_cur = 0;            \
-       }                               \
+#define BGET_PV(arg)   STMT_START {                                    \
+       BGET_U32(arg);                                                  \
+       if (arg) {                                                      \
+           New(666, bstate->bs_pv.xpv_pv, arg, char);                  \
+           bl_read(bstate->bs_fdata, (void*)bstate->bs_pv.xpv_pv, arg, 1);     \
+           bstate->bs_pv.xpv_len = arg;                                \
+           bstate->bs_pv.xpv_cur = arg - 1;                            \
+       } else {                                                        \
+           bstate->bs_pv.xpv_pv = 0;                                   \
+           bstate->bs_pv.xpv_len = 0;                                  \
+           bstate->bs_pv.xpv_cur = 0;                                  \
+       }                                                               \
     } STMT_END
 
 #ifdef BYTELOADER_LOG_COMMENTS
@@ -63,22 +67,20 @@ typedef IV IV64;
            arg = (I32)lo;                              \
        }                                               \
        else {                                          \
-           bytecode_iv_overflows++;                            \
+           bstate->bs_iv_overflows++;                  \
            arg = 0;                                    \
        }                                               \
     } STMT_END
 
-#define BGET_op_tr_array(arg) do {     \
-       unsigned short *ary;            \
-       int i;                          \
-       New(666, ary, 256, unsigned short); \
-       BGET_FREAD(ary, 256, 2);        \
-       for (i = 0; i < 256; i++)       \
-           ary[i] = PerlSock_ntohs(ary[i]);    \
-       arg = (char *) ary;             \
+#define BGET_op_tr_array(arg) do {                     \
+       unsigned short *ary;                            \
+       int i;                                          \
+       New(666, ary, 256, unsigned short);             \
+       BGET_FREAD(ary, sizeof(unsigned short), 256);   \
+       arg = (char *) ary;                             \
     } while (0)
 
-#define BGET_pvcontents(arg)   arg = bytecode_pv.xpv_pv
+#define BGET_pvcontents(arg)   arg = bstate->bs_pv.xpv_pv
 #define BGET_strconst(arg) STMT_START {        \
        for (arg = PL_tokenbuf; (*arg = BGET_FGETC()); arg++) /* nothing */; \
        arg = PL_tokenbuf;                      \
@@ -91,14 +93,21 @@ typedef IV IV64;
     } STMT_END
 
 #define BGET_objindex(arg, type) STMT_START {  \
-       U32 ix;                                 \
        BGET_U32(ix);                           \
-       arg = (type)bytecode_obj_list[ix];              \
+       arg = (type)bstate->bs_obj_list[ix];    \
     } STMT_END
 #define BGET_svindex(arg) BGET_objindex(arg, svindex)
 #define BGET_opindex(arg) BGET_objindex(arg, opindex)
+#define BGET_pvindex(arg) STMT_START {                 \
+       BGET_objindex(arg, pvindex);                    \
+       arg = arg ? savepv(arg) : arg;                  \
+    } STMT_END
 
 #define BSET_ldspecsv(sv, arg) sv = specialsv_list[arg]
+#define BSET_stpv(pv, arg) STMT_START {                \
+       BSET_OBJ_STORE(pv, arg);                \
+       SAVEFREEPV(pv);                         \
+    } STMT_END
                                    
 #define BSET_sv_refcnt_add(svrefcnt, arg)      svrefcnt += arg
 #define BSET_gp_refcnt_add(gprefcnt, arg)      gprefcnt += arg
@@ -110,23 +119,29 @@ typedef IV IV64;
 #define BSET_gv_fetchpv(sv, arg)       sv = (SV*)gv_fetchpv(arg, TRUE, SVt_PV)
 #define BSET_gv_stashpv(sv, arg)       sv = (SV*)gv_stashpv(arg, TRUE)
 #define BSET_sv_magic(sv, arg)         sv_magic(sv, Nullsv, arg, 0, 0)
-#define BSET_mg_pv(mg, arg)    mg->mg_ptr = arg; mg->mg_len = bytecode_pv.xpv_cur
+#define BSET_mg_pv(mg, arg)    mg->mg_ptr = arg; mg->mg_len = bstate->bs_pv.xpv_cur
 #define BSET_sv_upgrade(sv, arg)       (void)SvUPGRADE(sv, arg)
 #define BSET_xpv(sv)   do {    \
-       SvPV_set(sv, bytecode_pv.xpv_pv);       \
-       SvCUR_set(sv, bytecode_pv.xpv_cur);     \
-       SvLEN_set(sv, bytecode_pv.xpv_len);     \
+       SvPV_set(sv, bstate->bs_pv.xpv_pv);     \
+       SvCUR_set(sv, bstate->bs_pv.xpv_cur);   \
+       SvLEN_set(sv, bstate->bs_pv.xpv_len);   \
     } while (0)
 #define BSET_av_extend(sv, arg)        av_extend((AV*)sv, arg)
 
 #define BSET_av_push(sv, arg)  av_push((AV*)sv, arg)
 #define BSET_hv_store(sv, arg) \
-       hv_store((HV*)sv, bytecode_pv.xpv_pv, bytecode_pv.xpv_cur, arg, 0)
+       hv_store((HV*)sv, bstate->bs_pv.xpv_pv, bstate->bs_pv.xpv_cur, arg, 0)
 #define BSET_pv_free(pv)       Safefree(pv.xpv_pv)
 #define BSET_pregcomp(o, arg) \
        ((PMOP*)o)->op_pmregexp = arg ? \
-               CALLREGCOMP(aTHX_ arg, arg + bytecode_pv.xpv_cur, ((PMOP*)o)) : 0
-#define BSET_newsv(sv, arg)    sv = NEWSV(666,0); SvUPGRADE(sv, arg)
+               CALLREGCOMP(aTHX_ arg, arg + bstate->bs_pv.xpv_cur, ((PMOP*)o)) : 0
+#define BSET_newsv(sv, arg)                            \
+       STMT_START {                                    \
+           sv = (arg == SVt_PVAV ? (SV*)newAV() :      \
+                 arg == SVt_PVHV ? (SV*)newHV() :      \
+                 NEWSV(666,0));                        \
+           SvUPGRADE(sv, arg);                         \
+       } STMT_END
 #define BSET_newop(o, arg)     ((o = (OP*)safemalloc(optype_size[arg])), \
                                 memzero((char*)o,optype_size[arg]))
 #define BSET_newopn(o, arg) STMT_START {       \
@@ -135,7 +150,10 @@ typedef IV IV64;
        oldop->op_next = o;                     \
     } STMT_END
 
-#define BSET_ret(foo) return
+#define BSET_ret(foo) STMT_START {                     \
+       Safefree(bstate->bs_obj_list);                  \
+       return;                                         \
+    } STMT_END
 
 /*
  * Kludge special-case workaround for OP_MAPSTART
@@ -152,10 +170,88 @@ typedef IV IV64;
        PL_comppad = (AV *)arg;                 \
        pad = AvARRAY(arg);                     \
     } STMT_END
+/* this works now that Sarathy's changed the CopFILE_set macro to do the SvREFCNT_inc()
+       -- BKS 6-2-2000 */
 #define BSET_cop_file(cop, arg)                CopFILE_set(cop,arg)
 #define BSET_cop_line(cop, arg)                CopLINE_set(cop,arg)
 #define BSET_cop_stashpv(cop, arg)     CopSTASHPV_set(cop,arg)
 
-#define BSET_OBJ_STORE(obj, ix)                \
-       (I32)ix > bytecode_obj_list_fill ?      \
-       bset_obj_store(aTHXo_ obj, (I32)ix) : (bytecode_obj_list[ix] = obj)
+/* this is simply stolen from the code in newATTRSUB() */
+#define BSET_push_begin(ary,cv)                                \
+       STMT_START {                                    \
+           I32 oldscope = PL_scopestack_ix;            \
+           ENTER;                                      \
+           SAVECOPFILE(&PL_compiling);                 \
+           SAVECOPLINE(&PL_compiling);                 \
+           save_svref(&PL_rs);                         \
+           sv_setsv(PL_rs, PL_nrs);                    \
+           if (!PL_beginav)                            \
+               PL_beginav = newAV();                   \
+           av_push(PL_beginav, cv);                    \
+           call_list(oldscope, PL_beginav);            \
+           PL_curcop = &PL_compiling;                  \
+           PL_compiling.op_private = PL_hints;         \
+           LEAVE;                                      \
+       } STMT_END
+#define BSET_push_init(ary,cv)                                                         \
+       STMT_START {                                                                    \
+           av_unshift((PL_initav ? PL_initav : (PL_initav = newAV(), PL_initav)), 1);  \
+           av_store(PL_initav, 0, cv);                                                 \
+       } STMT_END
+#define BSET_push_end(ary,cv)                                                                  \
+       STMT_START {                                                                    \
+           av_unshift((PL_endav ? PL_endav : (PL_endav = newAV(), PL_endav)), 1);      \
+           av_store(PL_endav, 0, cv);                                                  \
+       } STMT_END
+#define BSET_OBJ_STORE(obj, ix)                        \
+       (I32)ix > bstate->bs_obj_list_fill ?    \
+       bset_obj_store(aTHXo_ bstate, obj, (I32)ix) : (bstate->bs_obj_list[ix] = obj)
+
+/* NOTE: the bytecode header only sanity-checks the bytecode. If a script cares about
+ * what version of Perl it's being called under, it should do a 'require 5.6.0' or
+ * equivalent. However, since the header includes checks requiring an exact match in
+ * ByteLoader versions (we can't guarantee forward compatibility), you don't 
+ * need to specify one:
+ *     use ByteLoader;
+ * is all you need.
+ *     -- BKS, June 2000
+*/
+
+#define HEADER_FAIL(f) \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f)
+#define HEADER_FAIL1(f, arg1)  \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1)
+#define HEADER_FAIL2(f, arg1, arg2)    \
+       Perl_croak(aTHX_ "Invalid bytecode for this architecture: " f, arg1, arg2)
+
+#define BYTECODE_HEADER_CHECK                                  \
+       STMT_START {                                            \
+           U32 sz = 0;                                         \
+           strconst str;                                       \
+                                                               \
+           BGET_U32(sz); /* Magic: 'PLBC' */                   \
+           if (sz != 0x43424c50) {                             \
+               HEADER_FAIL1("bad magic (want 0x43424c50, got %#x)", (int)sz);          \
+           }                                                   \
+           BGET_strconst(str); /* archname */                  \
+           if (strNE(str, ARCHNAME)) {                         \
+               HEADER_FAIL2("wrong architecture (want %s, you have %s)",str,ARCHNAME); \
+           }                                                   \
+           BGET_strconst(str); /* ByteLoader version */        \
+           if (strNE(str, VERSION)) {                          \
+               HEADER_FAIL2("mismatched ByteLoader versions (want %s, you have %s)",   \
+                       str, VERSION);                          \
+           }                                                   \
+           BGET_U32(sz); /* ivsize */                          \
+           if (sz != IVSIZE) {                                 \
+               HEADER_FAIL("different IVSIZE");                \
+           }                                                   \
+           BGET_U32(sz); /* ptrsize */                         \
+           if (sz != PTRSIZE) {                                \
+               HEADER_FAIL("different PTRSIZE");               \
+           }                                                   \
+           BGET_strconst(str); /* byteorder */                 \
+           if (strNE(str, STRINGIFY(BYTEORDER))) {             \
+               HEADER_FAIL("different byteorder");     \
+           }                                                   \
+       } STMT_END
index a1044ab..19f1f6b 100644 (file)
@@ -26,7 +26,7 @@
 #include "bytecode.h"
 
 
-static int optype_size[] = {
+static const int optype_size[] = {
     sizeof(OP),
     sizeof(UNOP),
     sizeof(BINOP),
@@ -40,38 +40,35 @@ static int optype_size[] = {
     sizeof(COP)
 };
 
-static SV *specialsv_list[4];
-
-static int bytecode_iv_overflows = 0;
-static SV *bytecode_sv;
-static XPV bytecode_pv;
-static void **bytecode_obj_list;
-static I32 bytecode_obj_list_fill = -1;
-
 void *
-bset_obj_store(pTHXo_ void *obj, I32 ix)
+bset_obj_store(pTHXo_ struct byteloader_state *bstate, void *obj, I32 ix)
 {
-    if (ix > bytecode_obj_list_fill) {
-       if (bytecode_obj_list_fill == -1)
-           New(666, bytecode_obj_list, ix + 1, void*);
-       else
-           Renew(bytecode_obj_list, ix + 1, void*);
-       bytecode_obj_list_fill = ix;
+    if (ix > bstate->bs_obj_list_fill) {
+       Renew(bstate->bs_obj_list, ix + 32, void*);
+       bstate->bs_obj_list_fill = ix + 31;
     }
-    bytecode_obj_list[ix] = obj;
+    bstate->bs_obj_list[ix] = obj;
     return obj;
 }
 
 void
-byterun(pTHXo_ struct bytestream bs)
+byterun(pTHXo_ register struct byteloader_state *bstate)
 {
     dTHR;
-    int insn;
+    register int insn;
+    U32 ix;
+    SV *specialsv_list[6];
+
+    BYTECODE_HEADER_CHECK;     /* croak if incorrect platform */
+    New(666, bstate->bs_obj_list, 32, void*); /* set op objlist */
+    bstate->bs_obj_list_fill = 31;
 
     specialsv_list[0] = Nullsv;
     specialsv_list[1] = &PL_sv_undef;
     specialsv_list[2] = &PL_sv_yes;
     specialsv_list[3] = &PL_sv_no;
+    specialsv_list[4] = pWARN_ALL;
+    specialsv_list[5] = pWARN_NONE;
 
     while ((insn = BGET_FGETC()) != EOF) {
        switch (insn) {
@@ -95,7 +92,7 @@ byterun(pTHXo_ struct bytestream bs)
            {
                svindex arg;
                BGET_svindex(arg);
-               bytecode_sv = arg;
+               bstate->bs_sv = arg;
                break;
            }
          case INSN_LDOP:               /* 2 */
@@ -109,7 +106,7 @@ byterun(pTHXo_ struct bytestream bs)
            {
                U32 arg;
                BGET_U32(arg);
-               BSET_OBJ_STORE(bytecode_sv, arg);
+               BSET_OBJ_STORE(bstate->bs_sv, arg);
                break;
            }
          case INSN_STOP:               /* 4 */
@@ -119,778 +116,806 @@ byterun(pTHXo_ struct bytestream bs)
                BSET_OBJ_STORE(PL_op, arg);
                break;
            }
-         case INSN_LDSPECSV:           /* 5 */
+         case INSN_STPV:               /* 5 */
+           {
+               U32 arg;
+               BGET_U32(arg);
+               BSET_stpv(bstate->bs_pv.xpv_pv, arg);
+               break;
+           }
+         case INSN_LDSPECSV:           /* 6 */
            {
                U8 arg;
                BGET_U8(arg);
-               BSET_ldspecsv(bytecode_sv, arg);
+               BSET_ldspecsv(bstate->bs_sv, arg);
                break;
            }
-         case INSN_NEWSV:              /* 6 */
+         case INSN_NEWSV:              /* 7 */
            {
                U8 arg;
                BGET_U8(arg);
-               BSET_newsv(bytecode_sv, arg);
+               BSET_newsv(bstate->bs_sv, arg);
                break;
            }
-         case INSN_NEWOP:              /* 7 */
+         case INSN_NEWOP:              /* 8 */
            {
                U8 arg;
                BGET_U8(arg);
                BSET_newop(PL_op, arg);
                break;
            }
-         case INSN_NEWOPN:             /* 8 */
+         case INSN_NEWOPN:             /* 9 */
            {
                U8 arg;
                BGET_U8(arg);
                BSET_newopn(PL_op, arg);
                break;
            }
-         case INSN_NEWPV:              /* 9 */
+         case INSN_NEWPV:              /* 11 */
            {
                PV arg;
                BGET_PV(arg);
                break;
            }
-         case INSN_PV_CUR:             /* 11 */
+         case INSN_PV_CUR:             /* 12 */
            {
                STRLEN arg;
                BGET_U32(arg);
-               bytecode_pv.xpv_cur = arg;
+               bstate->bs_pv.xpv_cur = arg;
                break;
            }
-         case INSN_PV_FREE:            /* 12 */
+         case INSN_PV_FREE:            /* 13 */
            {
-               BSET_pv_free(bytecode_pv);
+               BSET_pv_free(bstate->bs_pv);
                break;
            }
-         case INSN_SV_UPGRADE:         /* 13 */
+         case INSN_SV_UPGRADE:         /* 14 */
            {
                char arg;
                BGET_U8(arg);
-               BSET_sv_upgrade(bytecode_sv, arg);
+               BSET_sv_upgrade(bstate->bs_sv, arg);
                break;
            }
-         case INSN_SV_REFCNT:          /* 14 */
+         case INSN_SV_REFCNT:          /* 15 */
            {
                U32 arg;
                BGET_U32(arg);
-               SvREFCNT(bytecode_sv) = arg;
+               SvREFCNT(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_SV_REFCNT_ADD:              /* 15 */
+         case INSN_SV_REFCNT_ADD:              /* 16 */
            {
                I32 arg;
                BGET_I32(arg);
-               BSET_sv_refcnt_add(SvREFCNT(bytecode_sv), arg);
+               BSET_sv_refcnt_add(SvREFCNT(bstate->bs_sv), arg);
                break;
            }
-         case INSN_SV_FLAGS:           /* 16 */
+         case INSN_SV_FLAGS:           /* 17 */
            {
                U32 arg;
                BGET_U32(arg);
-               SvFLAGS(bytecode_sv) = arg;
+               SvFLAGS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XRV:                /* 17 */
+         case INSN_XRV:                /* 18 */
            {
                svindex arg;
                BGET_svindex(arg);
-               SvRV(bytecode_sv) = arg;
+               SvRV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XPV:                /* 18 */
+         case INSN_XPV:                /* 19 */
            {
-               BSET_xpv(bytecode_sv);
+               BSET_xpv(bstate->bs_sv);
                break;
            }
-         case INSN_XIV32:              /* 19 */
+         case INSN_XIV32:              /* 20 */
            {
                I32 arg;
                BGET_I32(arg);
-               SvIVX(bytecode_sv) = arg;
+               SvIVX(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIV64:              /* 20 */
+         case INSN_XIV64:              /* 21 */
            {
                IV64 arg;
                BGET_IV64(arg);
-               SvIVX(bytecode_sv) = arg;
+               SvIVX(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XNV:                /* 21 */
+         case INSN_XNV:                /* 22 */
            {
                NV arg;
                BGET_NV(arg);
-               SvNVX(bytecode_sv) = arg;
+               SvNVX(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XLV_TARGOFF:                /* 22 */
+         case INSN_XLV_TARGOFF:                /* 23 */
            {
                STRLEN arg;
                BGET_U32(arg);
-               LvTARGOFF(bytecode_sv) = arg;
+               LvTARGOFF(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XLV_TARGLEN:                /* 23 */
+         case INSN_XLV_TARGLEN:                /* 24 */
            {
                STRLEN arg;
                BGET_U32(arg);
-               LvTARGLEN(bytecode_sv) = arg;
+               LvTARGLEN(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XLV_TARG:           /* 24 */
+         case INSN_XLV_TARG:           /* 25 */
            {
                svindex arg;
                BGET_svindex(arg);
-               LvTARG(bytecode_sv) = arg;
+               LvTARG(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XLV_TYPE:           /* 25 */
+         case INSN_XLV_TYPE:           /* 26 */
            {
                char arg;
                BGET_U8(arg);
-               LvTYPE(bytecode_sv) = arg;
+               LvTYPE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XBM_USEFUL:         /* 26 */
+         case INSN_XBM_USEFUL:         /* 27 */
            {
                I32 arg;
                BGET_I32(arg);
-               BmUSEFUL(bytecode_sv) = arg;
+               BmUSEFUL(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XBM_PREVIOUS:               /* 27 */
+         case INSN_XBM_PREVIOUS:               /* 28 */
            {
                U16 arg;
                BGET_U16(arg);
-               BmPREVIOUS(bytecode_sv) = arg;
+               BmPREVIOUS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XBM_RARE:           /* 28 */
+         case INSN_XBM_RARE:           /* 29 */
            {
                U8 arg;
                BGET_U8(arg);
-               BmRARE(bytecode_sv) = arg;
+               BmRARE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XFM_LINES:          /* 29 */
+         case INSN_XFM_LINES:          /* 30 */
            {
                I32 arg;
                BGET_I32(arg);
-               FmLINES(bytecode_sv) = arg;
+               FmLINES(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_LINES:          /* 30 */
+         case INSN_XIO_LINES:          /* 31 */
            {
                long arg;
                BGET_I32(arg);
-               IoLINES(bytecode_sv) = arg;
+               IoLINES(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_PAGE:           /* 31 */
+         case INSN_XIO_PAGE:           /* 32 */
            {
                long arg;
                BGET_I32(arg);
-               IoPAGE(bytecode_sv) = arg;
+               IoPAGE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_PAGE_LEN:               /* 32 */
+         case INSN_XIO_PAGE_LEN:               /* 33 */
            {
                long arg;
                BGET_I32(arg);
-               IoPAGE_LEN(bytecode_sv) = arg;
+               IoPAGE_LEN(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_LINES_LEFT:             /* 33 */
+         case INSN_XIO_LINES_LEFT:             /* 34 */
            {
                long arg;
                BGET_I32(arg);
-               IoLINES_LEFT(bytecode_sv) = arg;
+               IoLINES_LEFT(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_TOP_NAME:               /* 34 */
+         case INSN_XIO_TOP_NAME:               /* 36 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
-               IoTOP_NAME(bytecode_sv) = arg;
+               IoTOP_NAME(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_TOP_GV:         /* 36 */
+         case INSN_XIO_TOP_GV:         /* 37 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&IoTOP_GV(bytecode_sv) = arg;
+               *(SV**)&IoTOP_GV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_FMT_NAME:               /* 37 */
+         case INSN_XIO_FMT_NAME:               /* 38 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
-               IoFMT_NAME(bytecode_sv) = arg;
+               IoFMT_NAME(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_FMT_GV:         /* 38 */
+         case INSN_XIO_FMT_GV:         /* 39 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&IoFMT_GV(bytecode_sv) = arg;
+               *(SV**)&IoFMT_GV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_BOTTOM_NAME:            /* 39 */
+         case INSN_XIO_BOTTOM_NAME:            /* 40 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
-               IoBOTTOM_NAME(bytecode_sv) = arg;
+               IoBOTTOM_NAME(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_BOTTOM_GV:              /* 40 */
+         case INSN_XIO_BOTTOM_GV:              /* 41 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&IoBOTTOM_GV(bytecode_sv) = arg;
+               *(SV**)&IoBOTTOM_GV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_SUBPROCESS:             /* 41 */
+         case INSN_XIO_SUBPROCESS:             /* 42 */
            {
                short arg;
                BGET_U16(arg);
-               IoSUBPROCESS(bytecode_sv) = arg;
+               IoSUBPROCESS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_TYPE:           /* 42 */
+         case INSN_XIO_TYPE:           /* 43 */
            {
                char arg;
                BGET_U8(arg);
-               IoTYPE(bytecode_sv) = arg;
+               IoTYPE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XIO_FLAGS:          /* 43 */
+         case INSN_XIO_FLAGS:          /* 44 */
            {
                char arg;
                BGET_U8(arg);
-               IoFLAGS(bytecode_sv) = arg;
+               IoFLAGS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_STASH:          /* 44 */
+         case INSN_XCV_STASH:          /* 45 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&CvSTASH(bytecode_sv) = arg;
+               *(SV**)&CvSTASH(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_START:          /* 45 */
+         case INSN_XCV_START:          /* 46 */
            {
                opindex arg;
                BGET_opindex(arg);
-               CvSTART(bytecode_sv) = arg;
+               CvSTART(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_ROOT:           /* 46 */
+         case INSN_XCV_ROOT:           /* 47 */
            {
                opindex arg;
                BGET_opindex(arg);
-               CvROOT(bytecode_sv) = arg;
+               CvROOT(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_GV:             /* 47 */
+         case INSN_XCV_GV:             /* 48 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&CvGV(bytecode_sv) = arg;
+               *(SV**)&CvGV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_FILE:           /* 48 */
+         case INSN_XCV_FILE:           /* 49 */
            {
-               pvcontents arg;
-               BGET_pvcontents(arg);
-               CvFILE(bytecode_sv) = arg;
+               pvindex arg;
+               BGET_pvindex(arg);
+               CvFILE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_DEPTH:          /* 49 */
+         case INSN_XCV_DEPTH:          /* 50 */
            {
                long arg;
                BGET_I32(arg);
-               CvDEPTH(bytecode_sv) = arg;
+               CvDEPTH(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_PADLIST:                /* 50 */
+         case INSN_XCV_PADLIST:                /* 51 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&CvPADLIST(bytecode_sv) = arg;
+               *(SV**)&CvPADLIST(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_OUTSIDE:                /* 51 */
+         case INSN_XCV_OUTSIDE:                /* 52 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&CvOUTSIDE(bytecode_sv) = arg;
+               *(SV**)&CvOUTSIDE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XCV_FLAGS:          /* 52 */
+         case INSN_XCV_FLAGS:          /* 53 */
            {
                U16 arg;
                BGET_U16(arg);
-               CvFLAGS(bytecode_sv) = arg;
+               CvFLAGS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_AV_EXTEND:          /* 53 */
+         case INSN_AV_EXTEND:          /* 54 */
            {
                SSize_t arg;
                BGET_I32(arg);
-               BSET_av_extend(bytecode_sv, arg);
+               BSET_av_extend(bstate->bs_sv, arg);
                break;
            }
-         case INSN_AV_PUSH:            /* 54 */
+         case INSN_AV_PUSH:            /* 55 */
            {
                svindex arg;
                BGET_svindex(arg);
-               BSET_av_push(bytecode_sv, arg);
+               BSET_av_push(bstate->bs_sv, arg);
                break;
            }
-         case INSN_XAV_FILL:           /* 55 */
+         case INSN_XAV_FILL:           /* 56 */
            {
                SSize_t arg;
                BGET_I32(arg);
-               AvFILLp(bytecode_sv) = arg;
+               AvFILLp(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XAV_MAX:            /* 56 */
+         case INSN_XAV_MAX:            /* 57 */
            {
                SSize_t arg;
                BGET_I32(arg);
-               AvMAX(bytecode_sv) = arg;
+               AvMAX(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XAV_FLAGS:          /* 57 */
+         case INSN_XAV_FLAGS:          /* 58 */
            {
                U8 arg;
                BGET_U8(arg);
-               AvFLAGS(bytecode_sv) = arg;
+               AvFLAGS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XHV_RITER:          /* 58 */
+         case INSN_XHV_RITER:          /* 59 */
            {
                I32 arg;
                BGET_I32(arg);
-               HvRITER(bytecode_sv) = arg;
+               HvRITER(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_XHV_NAME:           /* 59 */
+         case INSN_XHV_NAME:           /* 60 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
-               HvNAME(bytecode_sv) = arg;
+               HvNAME(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_HV_STORE:           /* 60 */
+         case INSN_HV_STORE:           /* 61 */
            {
                svindex arg;
                BGET_svindex(arg);
-               BSET_hv_store(bytecode_sv, arg);
+               BSET_hv_store(bstate->bs_sv, arg);
                break;
            }
-         case INSN_SV_MAGIC:           /* 61 */
+         case INSN_SV_MAGIC:           /* 62 */
            {
                char arg;
                BGET_U8(arg);
-               BSET_sv_magic(bytecode_sv, arg);
+               BSET_sv_magic(bstate->bs_sv, arg);
                break;
            }
-         case INSN_MG_OBJ:             /* 62 */
+         case INSN_MG_OBJ:             /* 63 */
            {
                svindex arg;
                BGET_svindex(arg);
-               SvMAGIC(bytecode_sv)->mg_obj = arg;
+               SvMAGIC(bstate->bs_sv)->mg_obj = arg;
                break;
            }
-         case INSN_MG_PRIVATE:         /* 63 */
+         case INSN_MG_PRIVATE:         /* 64 */
            {
                U16 arg;
                BGET_U16(arg);
-               SvMAGIC(bytecode_sv)->mg_private = arg;
+               SvMAGIC(bstate->bs_sv)->mg_private = arg;
                break;
            }
-         case INSN_MG_FLAGS:           /* 64 */
+         case INSN_MG_FLAGS:           /* 65 */
            {
                U8 arg;
                BGET_U8(arg);
-               SvMAGIC(bytecode_sv)->mg_flags = arg;
+               SvMAGIC(bstate->bs_sv)->mg_flags = arg;
                break;
            }
-         case INSN_MG_PV:              /* 65 */
+         case INSN_MG_PV:              /* 66 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
-               BSET_mg_pv(SvMAGIC(bytecode_sv), arg);
+               BSET_mg_pv(SvMAGIC(bstate->bs_sv), arg);
                break;
            }
-         case INSN_XMG_STASH:          /* 66 */
+         case INSN_XMG_STASH:          /* 67 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&SvSTASH(bytecode_sv) = arg;
+               *(SV**)&SvSTASH(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GV_FETCHPV:         /* 67 */
+         case INSN_GV_FETCHPV:         /* 68 */
            {
                strconst arg;
                BGET_strconst(arg);
-               BSET_gv_fetchpv(bytecode_sv, arg);
+               BSET_gv_fetchpv(bstate->bs_sv, arg);
                break;
            }
-         case INSN_GV_STASHPV:         /* 68 */
+         case INSN_GV_STASHPV:         /* 69 */
            {
                strconst arg;
                BGET_strconst(arg);
-               BSET_gv_stashpv(bytecode_sv, arg);
+               BSET_gv_stashpv(bstate->bs_sv, arg);
                break;
            }
-         case INSN_GP_SV:              /* 69 */
+         case INSN_GP_SV:              /* 70 */
            {
                svindex arg;
                BGET_svindex(arg);
-               GvSV(bytecode_sv) = arg;
+               GvSV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_REFCNT:          /* 70 */
+         case INSN_GP_REFCNT:          /* 71 */
            {
                U32 arg;
                BGET_U32(arg);
-               GvREFCNT(bytecode_sv) = arg;
+               GvREFCNT(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_REFCNT_ADD:              /* 71 */
+         case INSN_GP_REFCNT_ADD:              /* 72 */
            {
                I32 arg;
                BGET_I32(arg);
-               BSET_gp_refcnt_add(GvREFCNT(bytecode_sv), arg);
+               BSET_gp_refcnt_add(GvREFCNT(bstate->bs_sv), arg);
                break;
            }
-         case INSN_GP_AV:              /* 72 */
+         case INSN_GP_AV:              /* 73 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&GvAV(bytecode_sv) = arg;
+               *(SV**)&GvAV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_HV:              /* 73 */
+         case INSN_GP_HV:              /* 74 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&GvHV(bytecode_sv) = arg;
+               *(SV**)&GvHV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_CV:              /* 74 */
+         case INSN_GP_CV:              /* 75 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&GvCV(bytecode_sv) = arg;
+               *(SV**)&GvCV(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_FILE:            /* 75 */
+         case INSN_GP_FILE:            /* 76 */
            {
-               pvcontents arg;
-               BGET_pvcontents(arg);
-               GvFILE(bytecode_sv) = arg;
+               pvindex arg;
+               BGET_pvindex(arg);
+               GvFILE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_IO:              /* 76 */
+         case INSN_GP_IO:              /* 77 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&GvIOp(bytecode_sv) = arg;
+               *(SV**)&GvIOp(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_FORM:            /* 77 */
+         case INSN_GP_FORM:            /* 78 */
            {
                svindex arg;
                BGET_svindex(arg);
-               *(SV**)&GvFORM(bytecode_sv) = arg;
+               *(SV**)&GvFORM(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_CVGEN:           /* 78 */
+         case INSN_GP_CVGEN:           /* 79 */
            {
                U32 arg;
                BGET_U32(arg);
-               GvCVGEN(bytecode_sv) = arg;
+               GvCVGEN(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_LINE:            /* 79 */
+         case INSN_GP_LINE:            /* 80 */
            {
                line_t arg;
                BGET_U16(arg);
-               GvLINE(bytecode_sv) = arg;
+               GvLINE(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_GP_SHARE:           /* 80 */
+         case INSN_GP_SHARE:           /* 81 */
            {
                svindex arg;
                BGET_svindex(arg);
-               BSET_gp_share(bytecode_sv, arg);
+               BSET_gp_share(bstate->bs_sv, arg);
                break;
            }
-         case INSN_XGV_FLAGS:          /* 81 */
+         case INSN_XGV_FLAGS:          /* 82 */
            {
                U8 arg;
                BGET_U8(arg);
-               GvFLAGS(bytecode_sv) = arg;
+               GvFLAGS(bstate->bs_sv) = arg;
                break;
            }
-         case INSN_OP_NEXT:            /* 82 */
+         case INSN_OP_NEXT:            /* 83 */
            {
                opindex arg;
                BGET_opindex(arg);
                PL_op->op_next = arg;
                break;
            }
-         case INSN_OP_SIBLING:         /* 83 */
+         case INSN_OP_SIBLING:         /* 84 */
            {
                opindex arg;
                BGET_opindex(arg);
                PL_op->op_sibling = arg;
                break;
            }
-         case INSN_OP_PPADDR:          /* 84 */
+         case INSN_OP_PPADDR:          /* 85 */
            {
                strconst arg;
                BGET_strconst(arg);
                BSET_op_ppaddr(PL_op->op_ppaddr, arg);
                break;
            }
-         case INSN_OP_TARG:            /* 85 */
+         case INSN_OP_TARG:            /* 86 */
            {
                PADOFFSET arg;
                BGET_U32(arg);
                PL_op->op_targ = arg;
                break;
            }
-         case INSN_OP_TYPE:            /* 86 */
+         case INSN_OP_TYPE:            /* 87 */
            {
                OPCODE arg;
                BGET_U16(arg);
                BSET_op_type(PL_op, arg);
                break;
            }
-         case INSN_OP_SEQ:             /* 87 */
+         case INSN_OP_SEQ:             /* 88 */
            {
                U16 arg;
                BGET_U16(arg);
                PL_op->op_seq = arg;
                break;
            }
-         case INSN_OP_FLAGS:           /* 88 */
+         case INSN_OP_FLAGS:           /* 89 */
            {
                U8 arg;
                BGET_U8(arg);
                PL_op->op_flags = arg;
                break;
            }
-         case INSN_OP_PRIVATE:         /* 89 */
+         case INSN_OP_PRIVATE:         /* 90 */
            {
                U8 arg;
                BGET_U8(arg);
                PL_op->op_private = arg;
                break;
            }
-         case INSN_OP_FIRST:           /* 90 */
+         case INSN_OP_FIRST:           /* 91 */
            {
                opindex arg;
                BGET_opindex(arg);
                cUNOP->op_first = arg;
                break;
            }
-         case INSN_OP_LAST:            /* 91 */
+         case INSN_OP_LAST:            /* 92 */
            {
                opindex arg;
                BGET_opindex(arg);
                cBINOP->op_last = arg;
                break;
            }
-         case INSN_OP_OTHER:           /* 92 */
+         case INSN_OP_OTHER:           /* 93 */
            {
                opindex arg;
                BGET_opindex(arg);
                cLOGOP->op_other = arg;
                break;
            }
-         case INSN_OP_CHILDREN:                /* 93 */
+         case INSN_OP_CHILDREN:                /* 94 */
            {
                U32 arg;
                BGET_U32(arg);
                cLISTOP->op_children = arg;
                break;
            }
-         case INSN_OP_PMREPLROOT:              /* 94 */
+         case INSN_OP_PMREPLROOT:              /* 95 */
            {
                opindex arg;
                BGET_opindex(arg);
                cPMOP->op_pmreplroot = arg;
                break;
            }
-         case INSN_OP_PMREPLROOTGV:            /* 95 */
+         case INSN_OP_PMREPLROOTGV:            /* 96 */
            {
                svindex arg;
                BGET_svindex(arg);
                *(SV**)&cPMOP->op_pmreplroot = arg;
                break;
            }
-         case INSN_OP_PMREPLSTART:             /* 96 */
+         case INSN_OP_PMREPLSTART:             /* 97 */
            {
                opindex arg;
                BGET_opindex(arg);
                cPMOP->op_pmreplstart = arg;
                break;
            }
-         case INSN_OP_PMNEXT:          /* 97 */
+         case INSN_OP_PMNEXT:          /* 98 */
            {
                opindex arg;
                BGET_opindex(arg);
                *(OP**)&cPMOP->op_pmnext = arg;
                break;
            }
-         case INSN_PREGCOMP:           /* 98 */
+         case INSN_PREGCOMP:           /* 99 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
                BSET_pregcomp(PL_op, arg);
                break;
            }
-         case INSN_OP_PMFLAGS:         /* 99 */
+         case INSN_OP_PMFLAGS:         /* 100 */
            {
                U16 arg;
                BGET_U16(arg);
                cPMOP->op_pmflags = arg;
                break;
            }
-         case INSN_OP_PMPERMFLAGS:             /* 100 */
+         case INSN_OP_PMPERMFLAGS:             /* 101 */
            {
                U16 arg;
                BGET_U16(arg);
                cPMOP->op_pmpermflags = arg;
                break;
            }
-         case INSN_OP_SV:              /* 101 */
+         case INSN_OP_SV:              /* 102 */
            {
                svindex arg;
                BGET_svindex(arg);
                cSVOP->op_sv = arg;
                break;
            }
-         case INSN_OP_PADIX:           /* 102 */
+         case INSN_OP_PADIX:           /* 103 */
            {
                PADOFFSET arg;
                BGET_U32(arg);
                cPADOP->op_padix = arg;
                break;
            }
-         case INSN_OP_PV:              /* 103 */
+         case INSN_OP_PV:              /* 104 */
            {
                pvcontents arg;
                BGET_pvcontents(arg);
                cPVOP->op_pv = arg;
                break;
            }
-         case INSN_OP_PV_TR:           /* 104 */
+         case INSN_OP_PV_TR:           /* 105 */
            {
                op_tr_array arg;
                BGET_op_tr_array(arg);
                cPVOP->op_pv = arg;
                break;
            }
-         case INSN_OP_REDOOP:          /* 105 */
+         case INSN_OP_REDOOP:          /* 106 */
            {
                opindex arg;
                BGET_opindex(arg);
                cLOOP->op_redoop = arg;
                break;
            }
-         case INSN_OP_NEXTOP:          /* 106 */
+         case INSN_OP_NEXTOP:          /* 107 */
            {
                opindex arg;
                BGET_opindex(arg);
                cLOOP->op_nextop = arg;
                break;
            }
-         case INSN_OP_LASTOP:          /* 107 */
+         case INSN_OP_LASTOP:          /* 108 */
            {
                opindex arg;
                BGET_opindex(arg);
                cLOOP->op_lastop = arg;
                break;
            }
-         case INSN_COP_LABEL:          /* 108 */
+         case INSN_COP_LABEL:          /* 109 */
            {
-               pvcontents arg;
-               BGET_pvcontents(arg);
+               pvindex arg;
+               BGET_pvindex(arg);
                cCOP->cop_label = arg;
                break;
            }
-         case INSN_COP_STASHPV:                /* 109 */
+         case INSN_COP_STASHPV:                /* 110 */
            {
-               pvcontents arg;
-               BGET_pvcontents(arg);
+               pvindex arg;
+               BGET_pvindex(arg);
                BSET_cop_stashpv(cCOP, arg);
                break;
            }
-         case INSN_COP_FILE:           /* 110 */
+         case INSN_COP_FILE:           /* 111 */
            {
-               pvcontents arg;
-               BGET_pvcontents(arg);
+               pvindex arg;
+               BGET_pvindex(arg);
                BSET_cop_file(cCOP, arg);
                break;
            }
-         case INSN_COP_SEQ:            /* 111 */
+         case INSN_COP_SEQ:            /* 112 */
            {
                U32 arg;
                BGET_U32(arg);
                cCOP->cop_seq = arg;
                break;
            }
-         case INSN_COP_ARYBASE:                /* 112 */
+         case INSN_COP_ARYBASE:                /* 113 */
            {
                I32 arg;
                BGET_I32(arg);
                cCOP->cop_arybase = arg;
                break;
            }
-         case INSN_COP_LINE:           /* 113 */
+         case INSN_COP_LINE:           /* 114 */
            {
                line_t arg;
                BGET_U16(arg);
                BSET_cop_line(cCOP, arg);
                break;
            }
-         case INSN_COP_WARNINGS:               /* 114 */
+         case INSN_COP_WARNINGS:               /* 115 */
            {
                svindex arg;
                BGET_svindex(arg);
                cCOP->cop_warnings = arg;
                break;
            }
-         case INSN_MAIN_START:         /* 115 */
+         case INSN_MAIN_START:         /* 116 */
            {
                opindex arg;
                BGET_opindex(arg);
                PL_main_start = arg;
                break;
            }
-         case INSN_MAIN_ROOT:          /* 116 */
+         case INSN_MAIN_ROOT:          /* 117 */
            {
                opindex arg;
                BGET_opindex(arg);
                PL_main_root = arg;
                break;
            }
-         case INSN_CURPAD:             /* 117 */
+         case INSN_CURPAD:             /* 118 */
            {
                svindex arg;
                BGET_svindex(arg);
                BSET_curpad(PL_curpad, arg);
                break;
            }
+         case INSN_PUSH_BEGIN:         /* 119 */
+           {
+               svindex arg;
+               BGET_svindex(arg);
+               BSET_push_begin(PL_beginav, arg);
+               break;
+           }
+         case INSN_PUSH_INIT:          /* 120 */
+           {
+               svindex arg;
+               BGET_svindex(arg);
+               BSET_push_init(PL_initav, arg);
+               break;
+           }
+         case INSN_PUSH_END:           /* 121 */
+           {
+               svindex arg;
+               BGET_svindex(arg);
+               BSET_push_end(PL_endav, arg);
+               break;
+           }
          default:
            Perl_croak(aTHX_ "Illegal bytecode instruction %d\n", insn);
            /* NOTREACHED */
index f0de6b4..1e67b89 100644 (file)
 /*
  * This file is autogenerated from bytecode.pl. Changes made here will be lost.
  */
-struct bytestream {
-    void *data;
-    int (*pfgetc)(void *);
-    int (*pfread)(char *, size_t, size_t, void *);
-    void (*pfreadpv)(U32, void *, XPV *);
+struct byteloader_fdata {
+    SV *datasv;
+    int next_out;
+    int        idx;
 };
 
+struct byteloader_state {
+    struct byteloader_fdata    *bs_fdata;
+    SV                         *bs_sv;
+    void                       **bs_obj_list;
+    int                                bs_obj_list_fill;
+    XPV                                bs_pv;
+    int                                bs_iv_overflows;
+};
+
+int bl_getc(struct byteloader_fdata *);
+int bl_read(struct byteloader_fdata *, char *, size_t, size_t);
+extern void byterun(pTHXo_ struct byteloader_state *);
+
 enum {
     INSN_RET,                  /* 0 */
     INSN_LDSV,                 /* 1 */
     INSN_LDOP,                 /* 2 */
     INSN_STSV,                 /* 3 */
     INSN_STOP,                 /* 4 */
-    INSN_LDSPECSV,                     /* 5 */
-    INSN_NEWSV,                        /* 6 */
-    INSN_NEWOP,                        /* 7 */
-    INSN_NEWOPN,                       /* 8 */
-    INSN_NEWPV,                        /* 9 */
+    INSN_STPV,                 /* 5 */
+    INSN_LDSPECSV,                     /* 6 */
+    INSN_NEWSV,                        /* 7 */
+    INSN_NEWOP,                        /* 8 */
+    INSN_NEWOPN,                       /* 9 */
     INSN_NOP,                  /* 10 */
-    INSN_PV_CUR,                       /* 11 */
-    INSN_PV_FREE,                      /* 12 */
-    INSN_SV_UPGRADE,                   /* 13 */
-    INSN_SV_REFCNT,                    /* 14 */
-    INSN_SV_REFCNT_ADD,                        /* 15 */
-    INSN_SV_FLAGS,                     /* 16 */
-    INSN_XRV,                  /* 17 */
-    INSN_XPV,                  /* 18 */
-    INSN_XIV32,                        /* 19 */
-    INSN_XIV64,                        /* 20 */
-    INSN_XNV,                  /* 21 */
-    INSN_XLV_TARGOFF,                  /* 22 */
-    INSN_XLV_TARGLEN,                  /* 23 */
-    INSN_XLV_TARG,                     /* 24 */
-    INSN_XLV_TYPE,                     /* 25 */
-    INSN_XBM_USEFUL,                   /* 26 */
-    INSN_XBM_PREVIOUS,                 /* 27 */
-    INSN_XBM_RARE,                     /* 28 */
-    INSN_XFM_LINES,                    /* 29 */
-    INSN_XIO_LINES,                    /* 30 */
-    INSN_XIO_PAGE,                     /* 31 */
-    INSN_XIO_PAGE_LEN,                 /* 32 */
-    INSN_XIO_LINES_LEFT,                       /* 33 */
-    INSN_XIO_TOP_NAME,                 /* 34 */
+    INSN_NEWPV,                        /* 11 */
+    INSN_PV_CUR,                       /* 12 */
+    INSN_PV_FREE,                      /* 13 */
+    INSN_SV_UPGRADE,                   /* 14 */
+    INSN_SV_REFCNT,                    /* 15 */
+    INSN_SV_REFCNT_ADD,                        /* 16 */
+    INSN_SV_FLAGS,                     /* 17 */
+    INSN_XRV,                  /* 18 */
+    INSN_XPV,                  /* 19 */
+    INSN_XIV32,                        /* 20 */
+    INSN_XIV64,                        /* 21 */
+    INSN_XNV,                  /* 22 */
+    INSN_XLV_TARGOFF,                  /* 23 */
+    INSN_XLV_TARGLEN,                  /* 24 */
+    INSN_XLV_TARG,                     /* 25 */
+    INSN_XLV_TYPE,                     /* 26 */
+    INSN_XBM_USEFUL,                   /* 27 */
+    INSN_XBM_PREVIOUS,                 /* 28 */
+    INSN_XBM_RARE,                     /* 29 */
+    INSN_XFM_LINES,                    /* 30 */
+    INSN_XIO_LINES,                    /* 31 */
+    INSN_XIO_PAGE,                     /* 32 */
+    INSN_XIO_PAGE_LEN,                 /* 33 */
+    INSN_XIO_LINES_LEFT,                       /* 34 */
     INSN_COMMENT,                      /* 35 */
-    INSN_XIO_TOP_GV,                   /* 36 */
-    INSN_XIO_FMT_NAME,                 /* 37 */
-    INSN_XIO_FMT_GV,                   /* 38 */
-    INSN_XIO_BOTTOM_NAME,                      /* 39 */
-    INSN_XIO_BOTTOM_GV,                        /* 40 */
-    INSN_XIO_SUBPROCESS,                       /* 41 */
-    INSN_XIO_TYPE,                     /* 42 */
-    INSN_XIO_FLAGS,                    /* 43 */
-    INSN_XCV_STASH,                    /* 44 */
-    INSN_XCV_START,                    /* 45 */
-    INSN_XCV_ROOT,                     /* 46 */
-    INSN_XCV_GV,                       /* 47 */
-    INSN_XCV_FILE,                     /* 48 */
-    INSN_XCV_DEPTH,                    /* 49 */
-    INSN_XCV_PADLIST,                  /* 50 */
-    INSN_XCV_OUTSIDE,                  /* 51 */
-    INSN_XCV_FLAGS,                    /* 52 */
-    INSN_AV_EXTEND,                    /* 53 */
-    INSN_AV_PUSH,                      /* 54 */
-    INSN_XAV_FILL,                     /* 55 */
-    INSN_XAV_MAX,                      /* 56 */
-    INSN_XAV_FLAGS,                    /* 57 */
-    INSN_XHV_RITER,                    /* 58 */
-    INSN_XHV_NAME,                     /* 59 */
-    INSN_HV_STORE,                     /* 60 */
-    INSN_SV_MAGIC,                     /* 61 */
-    INSN_MG_OBJ,                       /* 62 */
-    INSN_MG_PRIVATE,                   /* 63 */
-    INSN_MG_FLAGS,                     /* 64 */
-    INSN_MG_PV,                        /* 65 */
-    INSN_XMG_STASH,                    /* 66 */
-    INSN_GV_FETCHPV,                   /* 67 */
-    INSN_GV_STASHPV,                   /* 68 */
-    INSN_GP_SV,                        /* 69 */
-    INSN_GP_REFCNT,                    /* 70 */
-    INSN_GP_REFCNT_ADD,                        /* 71 */
-    INSN_GP_AV,                        /* 72 */
-    INSN_GP_HV,                        /* 73 */
-    INSN_GP_CV,                        /* 74 */
-    INSN_GP_FILE,                      /* 75 */
-    INSN_GP_IO,                        /* 76 */
-    INSN_GP_FORM,                      /* 77 */
-    INSN_GP_CVGEN,                     /* 78 */
-    INSN_GP_LINE,                      /* 79 */
-    INSN_GP_SHARE,                     /* 80 */
-    INSN_XGV_FLAGS,                    /* 81 */
-    INSN_OP_NEXT,                      /* 82 */
-    INSN_OP_SIBLING,                   /* 83 */
-    INSN_OP_PPADDR,                    /* 84 */
-    INSN_OP_TARG,                      /* 85 */
-    INSN_OP_TYPE,                      /* 86 */
-    INSN_OP_SEQ,                       /* 87 */
-    INSN_OP_FLAGS,                     /* 88 */
-    INSN_OP_PRIVATE,                   /* 89 */
-    INSN_OP_FIRST,                     /* 90 */
-    INSN_OP_LAST,                      /* 91 */
-    INSN_OP_OTHER,                     /* 92 */
-    INSN_OP_CHILDREN,                  /* 93 */
-    INSN_OP_PMREPLROOT,                        /* 94 */
-    INSN_OP_PMREPLROOTGV,                      /* 95 */
-    INSN_OP_PMREPLSTART,                       /* 96 */
-    INSN_OP_PMNEXT,                    /* 97 */
-    INSN_PREGCOMP,                     /* 98 */
-    INSN_OP_PMFLAGS,                   /* 99 */
-    INSN_OP_PMPERMFLAGS,                       /* 100 */
-    INSN_OP_SV,                        /* 101 */
-    INSN_OP_PADIX,                     /* 102 */
-    INSN_OP_PV,                        /* 103 */
-    INSN_OP_PV_TR,                     /* 104 */
-    INSN_OP_REDOOP,                    /* 105 */
-    INSN_OP_NEXTOP,                    /* 106 */
-    INSN_OP_LASTOP,                    /* 107 */
-    INSN_COP_LABEL,                    /* 108 */
-    INSN_COP_STASHPV,                  /* 109 */
-    INSN_COP_FILE,                     /* 110 */
-    INSN_COP_SEQ,                      /* 111 */
-    INSN_COP_ARYBASE,                  /* 112 */
-    INSN_COP_LINE,                     /* 113 */
-    INSN_COP_WARNINGS,                 /* 114 */
-    INSN_MAIN_START,                   /* 115 */
-    INSN_MAIN_ROOT,                    /* 116 */
-    INSN_CURPAD,                       /* 117 */
-    MAX_INSN = 117
+    INSN_XIO_TOP_NAME,                 /* 36 */
+    INSN_XIO_TOP_GV,                   /* 37 */
+    INSN_XIO_FMT_NAME,                 /* 38 */
+    INSN_XIO_FMT_GV,                   /* 39 */
+    INSN_XIO_BOTTOM_NAME,                      /* 40 */
+    INSN_XIO_BOTTOM_GV,                        /* 41 */
+    INSN_XIO_SUBPROCESS,                       /* 42 */
+    INSN_XIO_TYPE,                     /* 43 */
+    INSN_XIO_FLAGS,                    /* 44 */
+    INSN_XCV_STASH,                    /* 45 */
+    INSN_XCV_START,                    /* 46 */
+    INSN_XCV_ROOT,                     /* 47 */
+    INSN_XCV_GV,                       /* 48 */
+    INSN_XCV_FILE,                     /* 49 */
+    INSN_XCV_DEPTH,                    /* 50 */
+    INSN_XCV_PADLIST,                  /* 51 */
+    INSN_XCV_OUTSIDE,                  /* 52 */
+    INSN_XCV_FLAGS,                    /* 53 */
+    INSN_AV_EXTEND,                    /* 54 */
+    INSN_AV_PUSH,                      /* 55 */
+    INSN_XAV_FILL,                     /* 56 */
+    INSN_XAV_MAX,                      /* 57 */
+    INSN_XAV_FLAGS,                    /* 58 */
+    INSN_XHV_RITER,                    /* 59 */
+    INSN_XHV_NAME,                     /* 60 */
+    INSN_HV_STORE,                     /* 61 */
+    INSN_SV_MAGIC,                     /* 62 */
+    INSN_MG_OBJ,                       /* 63 */
+    INSN_MG_PRIVATE,                   /* 64 */
+    INSN_MG_FLAGS,                     /* 65 */
+    INSN_MG_PV,                        /* 66 */
+    INSN_XMG_STASH,                    /* 67 */
+    INSN_GV_FETCHPV,                   /* 68 */
+    INSN_GV_STASHPV,                   /* 69 */
+    INSN_GP_SV,                        /* 70 */
+    INSN_GP_REFCNT,                    /* 71 */
+    INSN_GP_REFCNT_ADD,                        /* 72 */
+    INSN_GP_AV,                        /* 73 */
+    INSN_GP_HV,                        /* 74 */
+    INSN_GP_CV,                        /* 75 */
+    INSN_GP_FILE,                      /* 76 */
+    INSN_GP_IO,                        /* 77 */
+    INSN_GP_FORM,                      /* 78 */
+    INSN_GP_CVGEN,                     /* 79 */
+    INSN_GP_LINE,                      /* 80 */
+    INSN_GP_SHARE,                     /* 81 */
+    INSN_XGV_FLAGS,                    /* 82 */
+    INSN_OP_NEXT,                      /* 83 */
+    INSN_OP_SIBLING,                   /* 84 */
+    INSN_OP_PPADDR,                    /* 85 */
+    INSN_OP_TARG,                      /* 86 */
+    INSN_OP_TYPE,                      /* 87 */
+    INSN_OP_SEQ,                       /* 88 */
+    INSN_OP_FLAGS,                     /* 89 */
+    INSN_OP_PRIVATE,                   /* 90 */
+    INSN_OP_FIRST,                     /* 91 */
+    INSN_OP_LAST,                      /* 92 */
+    INSN_OP_OTHER,                     /* 93 */
+    INSN_OP_CHILDREN,                  /* 94 */
+    INSN_OP_PMREPLROOT,                        /* 95 */
+    INSN_OP_PMREPLROOTGV,                      /* 96 */
+    INSN_OP_PMREPLSTART,                       /* 97 */
+    INSN_OP_PMNEXT,                    /* 98 */
+    INSN_PREGCOMP,                     /* 99 */
+    INSN_OP_PMFLAGS,                   /* 100 */
+    INSN_OP_PMPERMFLAGS,                       /* 101 */
+    INSN_OP_SV,                        /* 102 */
+    INSN_OP_PADIX,                     /* 103 */
+    INSN_OP_PV,                        /* 104 */
+    INSN_OP_PV_TR,                     /* 105 */
+    INSN_OP_REDOOP,                    /* 106 */
+    INSN_OP_NEXTOP,                    /* 107 */
+    INSN_OP_LASTOP,                    /* 108 */
+    INSN_COP_LABEL,                    /* 109 */
+    INSN_COP_STASHPV,                  /* 110 */
+    INSN_COP_FILE,                     /* 111 */
+    INSN_COP_SEQ,                      /* 112 */
+    INSN_COP_ARYBASE,                  /* 113 */
+    INSN_COP_LINE,                     /* 114 */
+    INSN_COP_WARNINGS,                 /* 115 */
+    INSN_MAIN_START,                   /* 116 */
+    INSN_MAIN_ROOT,                    /* 117 */
+    INSN_CURPAD,                       /* 118 */
+    INSN_PUSH_BEGIN,                   /* 119 */
+    INSN_PUSH_INIT,                    /* 120 */
+    INSN_PUSH_END,                     /* 121 */
+    MAX_INSN = 121
 };
 
 enum {
@@ -151,11 +167,3 @@ enum {
     OPt_COP            /* 10 */
 };
 
-extern void byterun(pTHXo_ struct bytestream bs);
-
-#define INIT_SPECIALSV_LIST STMT_START { \
-       PL_specialsv_list[0] = Nullsv; \
-       PL_specialsv_list[1] = &PL_sv_undef; \
-       PL_specialsv_list[2] = &PL_sv_yes; \
-       PL_specialsv_list[3] = &PL_sv_no; \
-    } STMT_END
index 93b87f9..a8e59ab 100644 (file)
@@ -9,7 +9,7 @@
 
 package Data::Dumper;
 
-$VERSION = '2.101';
+$VERSION = '2.102';
 
 #$| = 1;
 
@@ -291,8 +291,7 @@ sub _dump {
     $s->{level}++;
     $ipad = $s->{xpad} x $s->{level};
 
-    
-    if ($realtype eq 'SCALAR') {
+    if ($realtype eq 'SCALAR' || $realtype eq 'REF') {
       if ($realpack) {
        $out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}';
       }
@@ -685,7 +684,7 @@ the last.
 
 Returns the stringified form of the values stored in the object (preserving
 the order in which they were supplied to C<new>), subject to the
-configuration options below.  In an array context, it returns a list
+configuration options below.  In a list context, it returns a list
 of strings corresponding to the supplied values.
 
 The second form, for convenience, simply calls the C<new> method on its
@@ -701,7 +700,7 @@ dumping subroutine references.
 
 Expects a anonymous hash of name => value pairs.  Same rules apply for names
 as in C<new>.  If no argument is supplied, will return the "seen" list of
-name => value pairs, in an array context.  Otherwise, returns the object
+name => value pairs, in a list context.  Otherwise, returns the object
 itself.
 
 =item I<$OBJ>->Values(I<[ARRAYREF]>)
@@ -732,7 +731,7 @@ itself.
 Returns the stringified form of the values in the list, subject to the
 configuration options below.  The values will be named C<$VAR>I<n> in the
 output, where I<n> is a numeric suffix.  Will return a list of strings
-in an array context.
+in a list context.
 
 =back
 
index 3c6dbf5..f6d0cc9 100644 (file)
@@ -2,6 +2,7 @@ use ExtUtils::MakeMaker;
 WriteMakefile(
        NAME            => "Devel::Peek",
        VERSION_FROM    => 'Peek.pm',
+        XSPROTOARG      => '-noprototypes',
        'dist'          => {
                             COMPRESS   => 'gzip -9f',
                             SUFFIX     => 'gz',
index 101adcd..0850172 100644 (file)
@@ -10,7 +10,8 @@ require Exporter;
 use XSLoader ();
 
 @ISA = qw(Exporter);
-@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg);
+@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg
+            fill_mstats mstats_fillhash mstats2hash);
 @EXPORT_OK = qw(SvREFCNT SvREFCNT_inc SvREFCNT_dec CvGV);
 %EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]);
 
@@ -58,8 +59,7 @@ C<CV>.  Devel::Peek also supplies C<SvREFCNT()>, C<SvREFCNT_inc()>, and
 C<SvREFCNT_dec()> which can query, increment, and decrement reference
 counts on SVs.  This document will take a passive, and safe, approach
 to data debugging and for that it will describe only the C<Dump()>
-function.  For more information on the format of output of mstat() see
-L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+function.
 
 Function C<DumpArray()> allows dumping of multiple values (useful when you
 need to analyze returns of functions).
@@ -68,6 +68,67 @@ The global variable $Devel::Peek::pv_limit can be set to limit the
 number of character printed in various string values.  Setting it to 0
 means no limit.
 
+=head2 Memory footprint debugging
+
+When perl is compiled with support for memory footprint debugging
+(default with Perl's malloc()), Devel::Peek provides an access to this API.
+
+Use mstat() function to emit a memory state statistic to the terminal.
+For more information on the format of output of mstat() see
+L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>.
+
+Three additional functions allow access to this statistic from Perl.
+First, use C<mstats_fillhash(%hash)> to get the information contained
+in the output of mstat() into %hash. The field of this hash are
+
+  minbucket nbuckets sbrk_good sbrk_slack sbrked_remains sbrks start_slack
+  topbucket topbucket_ev topbucket_odd total total_chain total_sbrk totfree
+
+Two additional fields C<free>, C<used> contain array references which
+provide per-bucket count of free and used chunks.  Two other fields
+C<mem_size>, C<available_size> contain array references which provide
+the information about the allocated size and usable size of chunks in
+each bucket.  Again, see L<perldebug/Using C<$ENV{PERL_DEBUG_MSTATS}>>
+for details.
+
+Keep in mind that only the first several "odd-numbered" buckets are
+used, so the information on size of the "odd-numbered" buckets which are
+not used is probably meaningless.
+
+The information in
+
+ mem_size available_size minbucket nbuckets
+
+is the property of a particular build of perl, and does not depend on
+the current process.  If you do not provide the optional argument to
+the functions mstats_fillhash(), fill_mstats(), mstats2hash(), then
+the information in fields C<mem_size>, C<available_size> is not
+updated.
+
+C<fill_mstats($buf)> is a much cheaper call (both speedwise and
+memory-wise) which collects the statistic into $buf in
+machine-readable form.  At a later moment you may need to call
+C<mstats2hash($buf, %hash)> to use this information to fill %hash.
+
+All three APIs C<fill_mstats($buf)>, C<mstats_fillhash(%hash)>, and
+C<mstats2hash($buf, %hash)> are designed to allocate no memory if used
+I<the second time> on the same $buf and/or %hash.
+
+So, if you want to collect memory info in a cycle, you may call
+
+  $#buf = 999;
+  fill_mstats($_) for @buf;
+  mstats_fillhash(%report, 1);         # Static info too
+
+  foreach (@buf) {
+    # Do something...
+    fill_mstats $_;                    # Collect statistic
+  }
+  foreach (@buf) {
+    mstats2hash($_, %report);          # Preserve static info
+    # Do something with %report
+  }
+
 =head1 EXAMPLES
 
 The following examples don't attempt to show everything as that would be a
@@ -403,8 +464,9 @@ it has no prototype (C<PROTOTYPE> field is missing).
 =head1 EXPORTS
 
 C<Dump>, C<mstat>, C<DeadCode>, C<DumpArray>, C<DumpWithOP> and
-C<DumpProg> by default. Additionally available C<SvREFCNT>,
-C<SvREFCNT_inc> and C<SvREFCNT_dec>.
+C<DumpProg>, C<fill_mstats>, C<mstats_fillhash>, C<mstats2hash> by
+default. Additionally available C<SvREFCNT>, C<SvREFCNT_inc> and
+C<SvREFCNT_dec>.
 
 =head1 BUGS
 
index 9837e9c..e5fc8ae 100644 (file)
@@ -125,6 +125,180 @@ DeadCode(pTHX)
        PerlIO_printf(Perl_debug_log, "%s: perl not compiled with DEBUGGING_MSTATS\n",str);
 #endif
 
+#if defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS) \
+       || (defined(MYMALLOC) && !defined(PLAIN_MALLOC))
+
+/* Very coarse overestimate, 2-per-power-of-2, one more to determine NBUCKETS. */
+#  define _NBUCKETS (2*8*IVSIZE+1)
+
+struct mstats_buffer 
+{
+    perl_mstats_t buffer;
+    UV buf[_NBUCKETS*4];
+};
+
+void
+_fill_mstats(struct mstats_buffer *b, int level)
+{
+    b->buffer.nfree  = b->buf;
+    b->buffer.ntotal = b->buf + _NBUCKETS;
+    b->buffer.bucket_mem_size = b->buf + 2*_NBUCKETS;
+    b->buffer.bucket_available_size = b->buf + 3*_NBUCKETS;
+    Zero(b->buf, (level ? 4*_NBUCKETS: 2*_NBUCKETS), unsigned long);
+    get_mstats(&(b->buffer), _NBUCKETS, level);
+}
+
+void
+fill_mstats(SV *sv, int level)
+{
+    int nbuckets;
+    struct mstats_buffer buf;
+
+    if (SvREADONLY(sv))
+       croak("Cannot modify a readonly value");
+    SvGROW(sv, sizeof(struct mstats_buffer)+1);
+    _fill_mstats((struct mstats_buffer*)SvPVX(sv),level);
+    SvCUR_set(sv, sizeof(struct mstats_buffer));
+    *SvEND(sv) = '\0';
+    SvPOK_only(sv);
+}
+
+void
+_mstats_to_hv(HV *hv, struct mstats_buffer *b, int level)
+{
+    SV **svp;
+    int type;
+
+    svp = hv_fetch(hv, "topbucket", 9, 1);
+    sv_setiv(*svp, b->buffer.topbucket);
+
+    svp = hv_fetch(hv, "topbucket_ev", 12, 1);
+    sv_setiv(*svp, b->buffer.topbucket_ev);
+
+    svp = hv_fetch(hv, "topbucket_odd", 13, 1);
+    sv_setiv(*svp, b->buffer.topbucket_odd);
+
+    svp = hv_fetch(hv, "totfree", 7, 1);
+    sv_setiv(*svp, b->buffer.totfree);
+
+    svp = hv_fetch(hv, "total", 5, 1);
+    sv_setiv(*svp, b->buffer.total);
+
+    svp = hv_fetch(hv, "total_chain", 11, 1);
+    sv_setiv(*svp, b->buffer.total_chain);
+
+    svp = hv_fetch(hv, "total_sbrk", 10, 1);
+    sv_setiv(*svp, b->buffer.total_sbrk);
+
+    svp = hv_fetch(hv, "sbrks", 5, 1);
+    sv_setiv(*svp, b->buffer.sbrks);
+
+    svp = hv_fetch(hv, "sbrk_good", 9, 1);
+    sv_setiv(*svp, b->buffer.sbrk_good);
+
+    svp = hv_fetch(hv, "sbrk_slack", 10, 1);
+    sv_setiv(*svp, b->buffer.sbrk_slack);
+
+    svp = hv_fetch(hv, "start_slack", 11, 1);
+    sv_setiv(*svp, b->buffer.start_slack);
+
+    svp = hv_fetch(hv, "sbrked_remains", 14, 1);
+    sv_setiv(*svp, b->buffer.sbrked_remains);
+    
+    svp = hv_fetch(hv, "minbucket", 9, 1);
+    sv_setiv(*svp, b->buffer.minbucket);
+    
+    svp = hv_fetch(hv, "nbuckets", 8, 1);
+    sv_setiv(*svp, b->buffer.nbuckets);
+
+    if (_NBUCKETS < b->buffer.nbuckets) 
+       warn("FIXME: internal mstats buffer too short");
+    
+    for (type = 0; type < (level ? 4 : 2); type++) {
+       UV *p, *p1;
+       AV *av;
+       int i;
+       static const char *types[4] = { 
+           "free", "used", "mem_size", "available_size"    
+       };
+
+       svp = hv_fetch(hv, types[type], strlen(types[type]), 1);
+
+       if (SvOK(*svp) && !(SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV))
+           croak("Unexpected value for the key '%s' in the mstats hash", types[type]);
+       if (!SvOK(*svp)) {
+           av = newAV();
+           SvUPGRADE(*svp, SVt_RV);
+           SvRV(*svp) = (SV*)av;
+           SvROK_on(*svp);
+       } else
+           av = (AV*)SvRV(*svp);
+
+       av_extend(av, b->buffer.nbuckets - 1);
+       /* XXXX What is the official way to reduce the size of the array? */
+       switch (type) {
+       case 0:
+           p = b->buffer.nfree;
+           break;
+       case 1:
+           p = b->buffer.ntotal;
+           p1 = b->buffer.nfree;
+           break;
+       case 2:
+           p = b->buffer.bucket_mem_size;
+           break;
+       case 3:
+           p = b->buffer.bucket_available_size;
+           break;
+       }
+       for (i = 0; i < b->buffer.nbuckets; i++) {
+           svp = av_fetch(av, i, 1);
+           if (type == 1)
+               sv_setiv(*svp, p[i]-p1[i]);
+           else
+               sv_setuv(*svp, p[i]);
+       }
+    }
+}
+void
+mstats_fillhash(SV *sv, int level)
+{
+    struct mstats_buffer buf;
+
+    if (!(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVHV))
+       croak("Not a hash reference");
+    _fill_mstats(&buf, level);
+    _mstats_to_hv((HV *)SvRV(sv), &buf, level);
+}
+void
+mstats2hash(SV *sv, SV *rv, int level)
+{
+    if (!(SvROK(rv) && SvTYPE(SvRV(rv)) == SVt_PVHV))
+       croak("Not a hash reference");
+    if (!SvPOK(sv))
+       croak("Undefined value when expecting mstats buffer");
+    if (SvCUR(sv) != sizeof(struct mstats_buffer))
+       croak("Wrong size for a value with a mstats buffer");
+    _mstats_to_hv((HV *)SvRV(rv), (struct mstats_buffer*)SvPVX(sv), level);
+}
+#else  /* !( defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS) \ ) */ 
+void
+fill_mstats(SV *sv, int level)
+{
+    croak("Cannot report mstats without Perl malloc");
+}
+void
+mstats_fillhash(SV *sv, int level)
+{
+    croak("Cannot report mstats without Perl malloc");
+}
+void
+mstats2hash(SV *sv, SV *rv, int level)
+{
+    croak("Cannot report mstats without Perl malloc");
+}
+#endif /* defined(PERL_DEBUGGING_MSTATS) || defined(DEBUGGING_MSTATS)... */ 
+
 #define _CvGV(cv)                                      \
        (SvROK(cv) && (SvTYPE(SvRV(cv))==SVt_PVCV)      \
         ? SvREFCNT_inc(CvGV((CV*)SvRV(cv))) : &PL_sv_undef)
@@ -136,6 +310,17 @@ mstat(str="Devel::Peek::mstat: ")
 char *str
 
 void
+fill_mstats(SV *sv, int level = 0)
+
+void
+mstats_fillhash(SV *sv, int level = 0)
+    PROTOTYPE: \%;$
+
+void
+mstats2hash(SV *sv, SV *rv, int level = 0)
+    PROTOTYPE: $\%;$
+
+void
 Dump(sv,lim=4)
 SV *   sv
 I32    lim
@@ -173,7 +358,7 @@ void
 DumpProg()
 PPCODE:
 {
-    warn("dumpindent is %d", PL_dumpindent);
+    warn("dumpindent is %d", (int)PL_dumpindent);
     if (PL_main_root)
        op_dump(PL_main_root);
 }
index 8e4936d..350b0d5 100644 (file)
@@ -198,7 +198,7 @@ int
 dl_unload_file(libref)
     void *     libref
   CODE:
-    DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_unload_file(%lx):\n", libref));
+    DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_unload_file(%lx):\n", PTR2ul(libref)));
     RETVAL = (dlclose(libref) == 0 ? 1 : 0);
     if (!RETVAL)
         SaveError(aTHX_ "%s", dlerror()) ;
diff --git a/ext/Encode/Encode.pm b/ext/Encode/Encode.pm
new file mode 100644 (file)
index 0000000..8ba7232
--- /dev/null
@@ -0,0 +1,602 @@
+package Encode;
+
+$VERSION = 0.01;
+
+require DynaLoader;
+require Exporter;
+
+@ISA = qw(Exporter DynaLoader);
+
+@EXPORT_OK =
+    qw(
+       bytes_to_utf8
+       utf8_to_bytes
+       chars_to_utf8
+       utf8_to_chars
+       utf8_to_chars_check
+       bytes_to_chars
+       chars_to_bytes
+       from_to
+       is_utf8
+       on_utf8
+       off_utf8
+       utf_to_utf
+       encodings
+      );
+
+bootstrap Encode ();
+
+=pod
+
+=head1 NAME
+
+Encode - character encodings
+
+=head2 TERMINOLOGY
+
+=over
+
+=item *
+
+I<char>: a character in the range 0..maxint (at least 2**32-1)
+
+=item *
+
+I<byte>: a character in the range 0..255
+
+=back
+
+The marker [INTERNAL] marks Internal Implementation Details, in
+general meant only for those who think they know what they are doing,
+and such details may change in future releases.
+
+=head2 bytes
+
+=over 4
+
+=item *
+
+        bytes_to_utf8(STRING [, FROM])
+
+The bytes in STRING are recoded in-place into UTF-8.  If no FROM is
+specified the bytes are expected to be encoded in US-ASCII or ISO
+8859-1 (Latin 1).  Returns the new size of STRING, or C<undef> if
+there's a failure.
+
+[INTERNAL] Also the UTF-8 flag of STRING is turned on.
+
+=item *
+
+        utf8_to_bytes(STRING [, TO [, CHECK]])
+
+The UTF-8 in STRING is decoded in-place into bytes.  If no TO encoding
+is specified the bytes are expected to be encoded in US-ASCII or ISO
+8859-1 (Latin 1).  Returns the new size of STRING, or C<undef> if
+there's a failure.
+
+What if there are characters > 255?  What if the UTF-8 in STRING is
+malformed?  See L</"Handling Malformed Data">.
+
+[INTERNAL] The UTF-8 flag of STRING is not checked.
+
+=back
+
+=head2 chars
+
+=over 4
+
+=item *
+
+        chars_to_utf8(STRING)
+
+The chars in STRING are encoded in-place into UTF-8.  Returns the new
+size of STRING, or C<undef> if there's a failure.
+
+No assumptions are made on the encoding of the chars.  If you want to
+assume that the chars are Unicode and to trap illegal Unicode
+characters, you must use C<from_to('Unicode', ...)>.
+
+[INTERNAL] Also the UTF-8 flag of STRING is turned on.
+
+=over 4
+
+=item *
+
+        utf8_to_chars(STRING)
+
+The UTF-8 in STRING is decoded in-place into chars.  Returns the new
+size of STRING, or C<undef> if there's a failure.
+
+If the UTF-8 in STRING is malformed C<undef> is returned, and also an
+optional lexical warning (category utf8) is given.
+
+[INTERNAL] The UTF-8 flag of STRING is not checked.
+
+=item *
+
+        utf8_to_chars_check(STRING [, CHECK])
+
+(Note that special naming of this interface since a two-argument
+utf8_to_chars() has different semantics.)
+
+The UTF-8 in STRING is decoded in-place into chars.  Returns the new
+size of STRING, or C<undef> if there is a failure.
+
+If the UTF-8 in STRING is malformed?  See L</"Handling Malformed Data">.
+
+[INTERNAL] The UTF-8 flag of STRING is not checked.
+
+=back
+
+=head2 chars With Encoding
+
+=over 4
+
+=item *
+
+        chars_to_utf8(STRING, FROM [, CHECK])
+
+The chars in STRING encoded in FROM are recoded in-place into UTF-8.
+Returns the new size of STRING, or C<undef> if there's a failure.
+
+No assumptions are made on the encoding of the chars.  If you want to
+assume that the chars are Unicode and to trap illegal Unicode
+characters, you must use C<from_to('Unicode', ...)>.
+
+[INTERNAL] Also the UTF-8 flag of STRING is turned on.
+
+=item *
+
+        utf8_to_chars(STRING, TO [, CHECK])
+
+The UTF-8 in STRING is decoded in-place into chars encoded in TO.
+Returns the new size of STRING, or C<undef> if there's a failure.
+
+If the UTF-8 in STRING is malformed?  See L</"Handling Malformed Data">.
+
+[INTERNAL] The UTF-8 flag of STRING is not checked.
+
+=item *
+
+       bytes_to_chars(STRING, FROM [, CHECK])
+
+The bytes in STRING encoded in FROM are recoded in-place into chars.
+Returns the new size of STRING in bytes, or C<undef> if there's a
+failure.
+
+If the mapping is impossible?  See L</"Handling Malformed Data">.
+
+=item *
+
+       chars_to_bytes(STRING, TO [, CHECK])
+
+The chars in STRING are recoded in-place to bytes encoded in TO.
+Returns the new size of STRING in bytes, or C<undef> if there's a
+failure.
+
+If the mapping is impossible?  See L</"Handling Malformed Data">.
+
+=item *
+
+        from_to(STRING, FROM, TO [, CHECK])
+
+The chars in STRING encoded in FROM are recoded in-place into TO.
+Returns the new size of STRING, or C<undef> if there's a failure.
+
+If mapping between the encodings is impossible?
+See L</"Handling Malformed Data">.
+
+[INTERNAL] If TO is UTF-8, also the UTF-8 flag of STRING is turned on.
+
+=back
+
+=head2 Testing For UTF-8
+
+=over 4
+
+=item *
+
+        is_utf8(STRING [, CHECK])
+
+[INTERNAL] Test whether the UTF-8 flag is turned on in the STRING.
+If CHECK is true, also checks the data in STRING for being
+well-formed UTF-8.  Returns true if successful, false otherwise.
+
+=back
+
+=head2 Toggling UTF-8-ness
+
+=over 4
+
+=item *
+
+        on_utf8(STRING)
+
+[INTERNAL] Turn on the UTF-8 flag in STRING.  The data in STRING is
+B<not> checked for being well-formed UTF-8.  Do not use unless you
+B<know> that the STRING is well-formed UTF-8.  Returns the previous
+state of the UTF-8 flag (so please don't test the return value as
+I<not> success or failure), or C<undef> if STRING is not a string.
+
+=item *
+
+        off_utf8(STRING)
+
+[INTERNAL] Turn off the UTF-8 flag in STRING.  Do not use frivolously.
+Returns the previous state of the UTF-8 flag (so please don't test the
+return value as I<not> success or failure), or C<undef> if STRING is
+not a string.
+
+=back
+
+=head2 UTF-16 and UTF-32 Encodings
+
+=over 4
+
+=item *
+
+        utf_to_utf(STRING, FROM, TO [, CHECK])
+
+The data in STRING is converted from Unicode Transfer Encoding FROM to
+Unicode Transfer Encoding TO.  Both FROM and TO may be any of the
+following tags (case-insensitive, with or without 'utf' or 'utf-' prefix):
+
+        tag             meaning
+
+        '7'             UTF-7
+        '8'             UTF-8
+        '16be'          UTF-16 big-endian
+        '16le'          UTF-16 little-endian
+        '16'            UTF-16 native-endian
+        '32be'          UTF-32 big-endian
+        '32le'          UTF-32 little-endian
+        '32'            UTF-32 native-endian
+
+UTF-16 is also known as UCS-2, 16 bit or 2-byte chunks, and UTF-32 as
+UCS-4, 32-bit or 4-byte chunks.  Returns the new size of STRING, or
+C<undef> is there's a failure.
+
+If FROM is UTF-8 and the UTF-8 in STRING is malformed?  See
+L</"Handling Malformed Data">.
+
+[INTERNAL] Even if CHECK is true and FROM is UTF-8, the UTF-8 flag of
+STRING is not checked.  If TO is UTF-8, also the UTF-8 flag of STRING is
+turned on.  Identical FROM and TO are fine.
+
+=back
+
+=head2 Handling Malformed Data
+
+If CHECK is not set, C<undef> is returned.  If the data is supposed to
+be UTF-8, an optional lexical warning (category utf8) is given.  If
+CHECK is true but not a code reference, dies.  If CHECK is a code
+reference, it is called with the arguments
+
+       (MALFORMED_STRING, STRING_FROM_SO_FAR, STRING_TO_SO_FAR)
+
+Two return values are expected from the call: the string to be used in
+the result string in place of the malformed section, and the length of
+the malformed section in bytes.
+
+=cut
+
+sub bytes_to_utf8 {
+    &_bytes_to_utf8;
+}
+
+sub utf8_to_bytes {
+    &_utf8_to_bytes;
+}
+
+sub chars_to_utf8 {
+    &C_to_utf8;
+}
+
+sub utf8_to_chars {
+    &_utf8_to_chars;
+}
+
+sub utf8_to_chars_check {
+    &_utf8_to_chars_check;
+}
+
+sub bytes_to_chars {
+    &_bytes_to_chars;
+}
+
+sub chars_to_bytes {
+    &_chars_to_bytes;
+}
+
+sub is_utf8 {
+    &_is_utf8;
+}
+
+sub on_utf8 {
+    &_on_utf8;
+}
+
+sub off_utf8 {
+    &_off_utf8;
+}
+
+sub utf_to_utf {
+    &_utf_to_utf;
+}
+
+use Carp;
+
+sub from_to
+{
+ my ($string,$from,$to,$check) = @_;
+ my $f = __PACKAGE__->getEncoding($from);
+ croak("Unknown encoding '$from'") unless $f;
+ my $t = __PACKAGE__->getEncoding($to);
+ croak("Unknown encoding '$to'") unless $t;
+ my $uni = $f->toUnicode($string,$check);
+ return undef if ($check && length($string));
+ $string = $t->fromUnicode($uni,$check);
+ return undef if ($check && length($uni));
+ return length($_[0] = $string);
+}
+
+my %encoding = ( Unicode      => bless({},'Encode::Unicode'),
+                 'iso10646-1' => bless({},'Encode::iso10646_1'),
+               );
+
+sub encodings
+{
+ my ($class) = @_;
+ foreach my $dir (@INC)
+  {
+   if (opendir(my $dh,"$dir/Encode"))
+    {
+     while (defined(my $name = readdir($dh)))
+      {
+       if ($name =~ /^(.*)\.enc$/)
+        {
+         next if exists $encoding{$1};
+         $encoding{$1} = "$dir/$name";
+        }
+      }
+     closedir($dh);
+    }
+  }
+ return keys %encoding;
+}
+
+sub loadEncoding
+{
+ my ($class,$name,$file) = @_;
+ if (open(my $fh,$file))
+  {
+   my $type;
+   while (1)
+    {
+     my $line = <$fh>;
+     $type = substr($line,0,1);
+     last unless $type eq '#';
+    }
+   $class .= ('::'.(($type eq 'E') ? 'Escape' : 'Table'));
+   return $class->read($fh,$name,$type);
+  }
+ else
+  {
+   return undef;
+  }
+}
+
+sub getEncoding
+{
+ my ($class,$name) = @_;
+ my $enc;
+ unless (ref($enc = $encoding{$name}))
+  {
+   $enc = $class->loadEncoding($name,$enc) if defined $enc;
+   unless (ref($enc))
+    {
+     foreach my $dir (@INC)
+      {
+       last if ($enc = $class->loadEncoding($name,"$dir/Encode/$name.enc"));
+      }
+    }
+   $encoding{$name} = $enc;
+  }
+ return $enc;
+}
+
+package Encode::Unicode;
+
+# Dummy package that provides the encode interface
+
+sub name { 'Unicode' }
+
+sub toUnicode   { $_[1] }
+
+sub fromUnicode { $_[1] }
+
+package Encode::Table;
+
+sub read
+{
+ my ($class,$fh,$name,$type) = @_;
+ my $rep = $class->can("rep_$type");
+ my ($def,$sym,$pages) = split(/\s+/,scalar(<$fh>));
+ my @touni;
+ my %fmuni;
+ my $count = 0;
+ $def = hex($def);
+ while ($pages--)
+  {
+   my $line = <$fh>;
+   chomp($line);
+   my $page = hex($line);
+   my @page;
+   my $ch = $page * 256;
+   for (my $i = 0; $i < 16; $i++)
+    {
+     my $line = <$fh>;
+     for (my $j = 0; $j < 16; $j++)
+      {
+       my $val = hex(substr($line,0,4,''));
+       if ($val || !$ch)
+        {
+         my $uch = chr($val);
+         push(@page,$uch);
+         $fmuni{$uch} = $ch;
+         $count++;
+        }
+       else
+        {
+         push(@page,undef);
+        }
+       $ch++;
+      }
+    }
+   $touni[$page] = \@page;
+  }
+
+ return bless {Name  => $name,
+               Rep   => $rep,
+               ToUni => \@touni,
+               FmUni => \%fmuni,
+               Def   => $def,
+               Num   => $count,
+              },$class;
+}
+
+sub name { shift->{'Name'} }
+
+sub rep_S { 'C' }
+
+sub rep_D { 'n' }
+
+sub rep_M { ($_[0] > 255) ? 'n' : 'C' }
+
+sub representation
+{
+ my ($obj,$ch) = @_;
+ $ch = 0 unless @_ > 1;
+ $obj-{'Rep'}->($ch);
+}
+
+sub toUnicode
+{
+ my ($obj,$str,$chk) = @_;
+ my $rep   = $obj->{'Rep'};
+ my $touni = $obj->{'ToUni'};
+ my $uni   = '';
+ while (length($str))
+  {
+   my $ch = ord(substr($str,0,1,''));
+   my $x;
+   if (&$rep($ch) eq 'C')
+    {
+     $x = $touni->[0][$ch];
+    }
+   else
+    {
+     $x = $touni->[$ch][ord(substr($str,0,1,''))];
+    }
+   unless (defined $x)
+    {
+     last if $chk;
+     # What do we do here ?
+     $x = '';
+    }
+   $uni .= $x;
+  }
+ $_[1] = $str if $chk;
+ return $uni;
+}
+
+sub fromUnicode
+{
+ my ($obj,$uni,$chk) = @_;
+ my $fmuni = $obj->{'FmUni'};
+ my $str   = '';
+ my $def   = $obj->{'Def'};
+ my $rep   = $obj->{'Rep'};
+ while (length($uni))
+  {
+   my $ch = substr($uni,0,1,'');
+   my $x  = $fmuni->{chr(ord($ch))};
+   unless (defined $x)
+    {
+     last if ($chk);
+     $x = $def;
+    }
+   $str .= pack(&$rep($x),$x);
+  }
+ $_[1] = $uni if $chk;
+ return $str;
+}
+
+package Encode::iso10646_1;#
+
+sub name { 'iso10646-1' }
+
+sub toUnicode
+{
+ my ($obj,$str,$chk) = @_;
+ my $uni   = '';
+ while (length($str))
+  {
+   my $code = unpack('n',substr($str,0,2,'')) & 0xffff;
+   $uni .= chr($code);
+  }
+ $_[1] = $str if $chk;
+ return $uni;
+}
+
+sub fromUnicode
+{
+ my ($obj,$uni,$chk) = @_;
+ my $str   = '';
+ while (length($uni))
+  {
+   my $ch = substr($uni,0,1,'');
+   my $x  = ord($ch);
+   unless ($x < 32768)
+    {
+     last if ($chk);
+     $x = 0;
+    }
+   $str .= pack('n',$x);
+  }
+ $_[1] = $uni if $chk;
+ return $str;
+}
+
+package Encode::Escape;
+use Carp;
+
+sub read
+{
+ my ($class,$fh,$name) = @_;
+ my %self = (Name => $name, Num => 0);
+ while (<$fh>)
+  {
+   my ($key,$val) = /^(\S+)\s+(.*)$/;
+   $val =~ s/^\{(.*?)\}/$1/g;
+   $val =~ s/\\x([0-9a-f]{2})/chr(hex($1))/ge;
+   $self{$key} = $val;
+  }
+ return bless \%self,$class;
+}
+
+sub name { shift->{'Name'} }
+
+sub toUnicode
+{
+ croak("Not implemented yet");
+}
+
+sub fromUnicode
+{
+ croak("Not implemented yet");
+}
+
+1;
+
+__END__
diff --git a/ext/Encode/Encode.xs b/ext/Encode/Encode.xs
new file mode 100644 (file)
index 0000000..c231bba
--- /dev/null
@@ -0,0 +1,241 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define UNIMPLEMENTED(x,y) y x (SV *sv, char *encoding) {   \
+                         Perl_croak(aTHX_ "panic_unimplemented"); \
+                        return (y)0; /* fool picky compilers */ \
+                         }
+UNIMPLEMENTED(_encoded_utf8_to_bytes, I32)
+UNIMPLEMENTED(_encoded_bytes_to_utf8, I32)
+
+void call_failure (SV *routine, U8* done, U8* dest, U8* orig) {}
+
+MODULE = Encode         PACKAGE = Encode
+
+PROTOTYPES: ENABLE
+
+I32
+_bytes_to_utf8(sv, ...)
+        SV *    sv
+      CODE:
+        {
+          SV * encoding = items == 2 ? ST(1) : Nullsv;
+
+          if (encoding)
+            RETVAL = _encoded_bytes_to_utf8(sv, SvPV_nolen(encoding));
+          else {
+            STRLEN len;
+            U8*    s = (U8*)SvPV(sv, len);
+            U8*    converted;
+
+            converted = bytes_to_utf8(s, &len); /* This allocs */
+            sv_setpvn(sv, (char *)converted, len);
+            SvUTF8_on(sv); /* XXX Should we? */
+            Safefree(converted);                /* ... so free it */
+            RETVAL = len;
+          }
+        }
+      OUTPUT:
+        RETVAL
+
+I32
+_utf8_to_bytes(sv, ...)
+        SV *    sv
+      CODE:
+        {
+          SV * to    = items > 1 ? ST(1) : Nullsv;
+          SV * check = items > 2 ? ST(2) : Nullsv;
+
+          if (to)
+            RETVAL = _encoded_utf8_to_bytes(sv, SvPV_nolen(to));
+          else {
+            STRLEN len;
+            U8 *s = (U8*)SvPV(sv, len);
+
+            if (SvTRUE(check)) {
+              /* Must do things the slow way */
+              U8 *dest;
+              U8 *src  = (U8*)savepv((char *)s); /* We need a copy to pass to check() */
+              U8 *send = s + len;
+
+              New(83, dest, len, U8); /* I think */
+
+              while (s < send) {
+                if (*s < 0x80)
+                  *dest++ = *s++;
+                else {
+                  STRLEN ulen;
+                 UV uv = *s++;
+
+                  /* Have to do it all ourselves because of error routine,
+                    aargh. */
+                 if (!(uv & 0x40))
+                   goto failure;
+                 if      (!(uv & 0x20)) { ulen = 2;  uv &= 0x1f; }
+                 else if (!(uv & 0x10)) { ulen = 3;  uv &= 0x0f; }
+                 else if (!(uv & 0x08)) { ulen = 4;  uv &= 0x07; }
+                 else if (!(uv & 0x04)) { ulen = 5;  uv &= 0x03; }
+                 else if (!(uv & 0x02)) { ulen = 6;  uv &= 0x01; }
+                 else if (!(uv & 0x01)) { ulen = 7;  uv = 0; }
+                 else                   { ulen = 13; uv = 0; }
+               
+                 /* Note change to utf8.c variable naming, for variety */
+                 while (ulen--) {
+                   if ((*s & 0xc0) != 0x80)
+                     goto failure;
+               
+                   else
+                     uv = (uv << 6) | (*s++ & 0x3f);
+                 }
+                 if (uv > 256) {
+                 failure:
+                   call_failure(check, s, dest, src);
+                   /* Now what happens? */
+                 }
+                 *dest++ = (U8)uv;
+               }
+               }
+           } else
+             RETVAL = (utf8_to_bytes(s, &len) ? len : 0);
+         }
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_chars_to_utf8(sv, from, ...)
+       SV *    sv
+       SV *    from
+      CODE:
+       {
+         SV * check = items == 3 ? ST(2) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_utf8_to_chars(sv, to, ...)
+       SV *    sv
+       SV *    to
+      CODE:
+       {
+         SV * check = items == 3 ? ST(2) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_utf8_to_chars_check(sv, ...)
+       SV *    sv
+      CODE:
+       {
+         SV * check = items == 2 ? ST(1) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_bytes_to_chars(sv, from, ...)
+       SV *    sv
+       SV *    from
+      CODE:
+       {
+         SV * check = items == 3 ? ST(2) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_chars_to_bytes(sv, to, ...)
+       SV *    sv
+       SV *    to
+      CODE:
+       {
+         SV * check = items == 3 ? ST(2) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_from_to(sv, from, to, ...)
+       SV *    sv
+       SV *    from
+       SV *    to
+      CODE:
+       {
+         SV * check = items == 4 ? ST(3) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
+bool
+_is_utf8(sv, ...)
+       SV *    sv
+      CODE:
+       {
+         SV *  check = items == 2 ? ST(1) : Nullsv;
+         if (SvPOK(sv)) {
+           RETVAL = SvUTF8(sv);
+           if (RETVAL &&
+               SvTRUE(check) &&
+               !is_utf8_string((U8*)SvPVX(sv), SvCUR(sv)))
+             RETVAL = FALSE;
+         } else {
+           RETVAL = FALSE;
+         }
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_on_utf8(sv)
+       SV *    sv
+      CODE:
+       {
+         if (SvPOK(sv)) {
+           SV *rsv = newSViv(SvUTF8(sv));
+           RETVAL = rsv;
+           SvUTF8_on(sv);
+         } else {
+           RETVAL = &PL_sv_undef;
+         }
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_off_utf8(sv)
+       SV *    sv
+      CODE:
+       {
+         if (SvPOK(sv)) {
+           SV *rsv = newSViv(SvUTF8(sv));
+           RETVAL = rsv;
+           SvUTF8_off(sv);
+         } else {
+           RETVAL = &PL_sv_undef;
+         }
+       }
+      OUTPUT:
+       RETVAL
+
+SV *
+_utf_to_utf(sv, from, to, ...)
+       SV *    sv
+       SV *    from
+       SV *    to
+      CODE:
+       {
+         SV * check = items == 4 ? ST(3) : Nullsv;
+         RETVAL = &PL_sv_undef;
+       }
+      OUTPUT:
+       RETVAL
+
diff --git a/ext/Encode/Encode/ascii.enc b/ext/Encode/Encode/ascii.enc
new file mode 100644 (file)
index 0000000..e0320b8
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: ascii, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/big5.enc b/ext/Encode/Encode/big5.enc
new file mode 100644 (file)
index 0000000..26179f4
--- /dev/null
@@ -0,0 +1,1516 @@
+# Encoding file: big5, multi-byte
+M
+003F 0 89
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3000FF0C30013002FF0E2022FF1BFF1AFF1FFF01FE3020262025FE50FF64FE52
+00B7FE54FE55FE56FE57FF5C2013FE312014FE33FFFDFE34FE4FFF08FF09FE35
+FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D
+FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A
+203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC
+32A32105203EFFFDFF3FFFFDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B
+FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63
+FE64FE65FE66223C2229222A22A52220221F22BF33D233D1222B222E22352234
+26402642264126092191219321902192219621972199219822252223FFFD0000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FFFDFF0FFF3CFF0400A5301200A200A3FF05FF2021032109FE69FE6AFE6B33D5
+339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7
+74E97CCE25812582258325842585258625872588258F258E258D258C258B258A
+2589253C2534252C2524251C2594250025022595250C251025142518256D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10
+FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166
+216721682169302130223023302430253026302730283029FFFD5344FFFDFF21
+FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31
+FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47
+FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C
+039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4
+03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5
+03C603C703C803C931053106310731083109310A310B310C310D310E310F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00003110311131123113311431153116311731183119311A311B311C311D311E
+311F312031213122312331243125312631273128312902D902C902CA02C702CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B
+53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E
+4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8
+5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1
+4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6
+52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD
+58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3
+62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79
+6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4
+4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317
+531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8
+53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01
+5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63
+6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529
+7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB
+4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10
+4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5171518D51B0521752115212520E521652A3530853215320537053715409540F
+540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD
+573357305728572D572C572F57295919591A59375938598459785983597D5979
+598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC
+65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F
+6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A
+7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B
+821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57
+4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225
+52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426
+544E542754465443543354485442541B5429544A5439543B5438542E54355436
+5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996
+598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F
+5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77
+5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276
+6289626D628A627C627E627962736292626F6298626E62956293629162866539
+653B653865F166F4675F674E674F67506751675C6756675E6749674667600000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70
+6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076
+707C707D707872627261726072C472C27396752C752B75377538768276EF77E3
+79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B
+8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E
+9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F
+4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154
+51525155516951775176517851BD51FD523B52385237523A5230522E52365241
+52BE52BB5352535453535351536653775378537953D653D453D7547354750000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5496547854955480547B5477548454925486547C549054715476548C549A5462
+5468548B547D548E56FA57835777576A5769576157665764577C591C59495947
+59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF
+59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78
+5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD
+5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215
+623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB
+62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC
+62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000
+AA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6607670D670B676D678B67956771679C677367776787679D6797676F6770677F
+6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3
+6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9
+6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7
+72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD
+793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2
+80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F
+82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE
+8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000
+AB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD
+4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192
+519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B
+539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2
+57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA
+59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9
+5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B
+5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C
+606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000
+AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F
+661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF
+67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83
+6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB
+70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7
+73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2
+75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC
+770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F
+7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000
+AD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD
+81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301
+82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4
+8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C
+964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D
+50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014
+50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5
+51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8
+55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000
+AE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A
+5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0
+5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8
+5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006063606560506055606D6069606F6084609F609A608D6094608C60856096
+624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A
+632B6328634D634C65486549659965C165C566426649664F66436652664C6645
+664166F867146715671768216838684868466853683968426854682968B36817
+684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7
+6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000
+AF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9
+70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE
+7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B
+76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4
+79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A
+7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006
+8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108
+80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354
+834A83388350834983358334834F833283398336831783408331832883430000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18
+8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77
+8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095
+90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A
+507D505C50475043504C505A504950655076504E5055507550745077504F500F
+506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340
+533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F
+55645538552E555C552C55635533554155575708570B570957DF5805580A5806
+57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60
+5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2
+5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97
+5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248
+63A063A76372639663A263A563776367639863AA637163A963896383639B636B
+63A863846388639963A163AC6392638F6380637B63696368637A655D65566551
+65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A
+666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7
+689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB
+6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA
+6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D
+7281731C731B73167313731973877405740A7403740673FE740D74E074F60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4
+76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92
+7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E
+7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2
+801C804A8046812F81168123812B81298130812482028235823782368239838E
+839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E
+888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B
+8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019
+900D901A90179023901F901D90109015901E9020900F90229016901B90140000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673
+96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75
+9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274
+5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C
+55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589
+55AB5599570D582F582A58345824583058315821581D582058F958FA59600000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C
+5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9
+5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1
+610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E
+6566656265636591659065AF666E667066746676666F6691667A667E667766FE
+66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2
+68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC
+6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B
+6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C
+724C728472807336732573347329743A742A743374227425743574367434742F
+741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C
+7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F
+7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5
+800B8052808581558154814B8151814E81398146813E814C815381748212821C
+83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC
+83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB
+86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB
+8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB
+8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163
+916591CF9214921592239209921E920D9210920792119594958F958B95910000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000095939592958E968A968E968B967D96859686968D9672968496C196C596C4
+96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD
+9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F
+5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1
+55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A
+5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148
+611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137
+622162226413643E641E642A642D643D642C640F641C6414640D643664166417
+6406656C659F65B06697668966876688669666846698668D67036994696D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000695A697769606954697569306982694A6968696B695E695369796986695D
+6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7
+6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159
+7169716471497167715C716C7166714C7165715E714671687156723A72527337
+7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600
+75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891
+7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77
+7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A
+7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008179817A81668205824784828477843D843184758466846B8449846C845B
+843C8435846184638469846D8446865E865C865F86F9871387088707870086FE
+86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2
+899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62
+8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2
+8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E
+904191129117916C916A916991C9923792579238923D9240923E925B924B9264
+925192349249924D92459239923F925A959896989694969596CD96CB96C996CA
+96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6
+50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600
+561B561755FD561456065609560D560E55F75616561F5608561055F657185716
+5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6
+5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D
+5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+613F614B617761626163615F615A61586175622A64876458645464A46478645F
+647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995
+69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3
+6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2
+6ECC6EF771947199717D718A71847192723E729272967344735074647463746A
+7470746D750475917627760D760B7609761376E176E37784777D777F776178C1
+789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95
+7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD
+7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA
+82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3
+849084BC84D184CA873F871C873B872287258734871887558737872988F38902
+88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99
+8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B
+91199118911E917591789177917492789280928592989296927B9293929C92A8
+927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785
+97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4
+9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+528752885289528D528A52F053B2562E563B56395632563F563456295653564E
+565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB
+5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2
+5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469
+646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A
+64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E
+6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F
+6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58
+6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C
+7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B
+7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB
+7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513
+851185238521851484EC852584FF850687828774877687608766877887688759
+8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95
+8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0
+8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D
+8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8F259069906E9068906D90779130912D9127913191879189918B918392C592BB
+92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707
+97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF
+99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291
+529352F35659566B5679566956645678566A566856655671566F566C56625676
+58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD
+61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF
+64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58
+6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8
+71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D
+76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E
+7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3
+81A981A881FB820882588259854A855985488568856985438549856D856A855E
+8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB
+8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93
+8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078
+9072907C907A913491929320933692F89333932F932292FC932B9304931A0000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713
+970F975B975C9766979898309838983B9837982D9839982499109928991E991B
+9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12
+9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8
+5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6
+64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E
+6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80
+6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235
+72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7
+7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B
+7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070
+806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2
+87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B
+8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B
+8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E
+919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA
+95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2
+569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7
+66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE
+70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A
+7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076
+81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0
+898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0
+8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0
+9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03
+9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133
+56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5
+6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F
+7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9
+85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41
+8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A
+8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6
+93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A
+9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6
+5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662
+76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815
+896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4
+91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D
+9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC
+61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3
+7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B
+95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D
+9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9
+5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61
+9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31
+9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10
+74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463
+946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F
+9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA
+9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470
+9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5
+947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030FE309D309E3005304130423043304430453046304730483049304A304B
+304C304D304E304F3050305130523053305430553056305730583059305A305B
+305C305D305E305F3060306130623063306430653066306730683069306A306B
+306C306D306E306F3070307130723073307430753076307730783079307A307B
+307C307D307E307F3080308130823083308430853086308730883089308A308B
+308C308D308E308F309030913092309330A130A230A330A430A530A630A70000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30A830A930AA30AB30AC30AD30AE30AF30B030B130B230B330B430B530B630B7
+30B830B930BA30BB30BC30BD30BE30BF30C030C130C230C330C430C530C630C7
+30C830C930CA30CB30CC30CD30CE30CF30D030D130D230D330D430D530D630D7
+30D830D930DA30DB30DC30DD30DE30DF30E030E130E230E330E430E530E60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030E730E830E930EA30EB30EC30ED30EE30EF30F030F130F230F330F430F5
+30F60414041504010416041704180419041A041B041C04230424042504260427
+04280429042A042B042C042D042E042F04300431043204330434043504510436
+043704380439043A043B043C043D043E043F0440044104420443044404450446
+044704480449044A044B044C044D044E044F2460246124622463246424652466
+246724682469247424752476247724782479247A247B247C247D000000000000
+C9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E
+4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3
+6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723
+5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14
+4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210
+52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B
+597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74
+5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E
+67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D
+897E909990979098909B909496229624962096234F564F3B4F624F494F534F64
+4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD
+52AE530953635372538E538F54305437542A545454455419541C542554180000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000543D544F544154285424544756EE56E756E557415745574C5749574B5752
+5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A
+5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C
+5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3
+5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A
+6270628162886277627D62726274653765F065F465F365F265F5674567470000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B
+6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A
+726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594
+75957681793D80348095809980908092809C8290828F8285828E829182930000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F
+962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A
+4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE
+5235523252335246523152BC530A530B533C539253945487547F548154915482
+5488546B547A547E5465546C54745466548D546F546154605498546354675464
+56F756F9576F5772576D576B57715770577657805775577B5773577457620000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1
+59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF
+5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19
+5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006034600A60176033601A601E602C6022600D6010602E60136011600C6009
+601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0
+62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611
+661066F6670A6785676C678E67926776677B6798678667846774678D678C677A
+679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC
+6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1
+709470987085709370867084709170967082709A7083726A72D672CB72D872C9
+72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8
+753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5
+80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8
+82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD
+8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3
+4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC
+5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0
+57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4
+590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB
+59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9
+5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037
+603960546072605E6045605360476049605B604C60406042605F602460446058
+6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6
+63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C
+662666226633662B663A661D66346639662E670F671067C167F267C867BA0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE
+67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9
+67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D
+6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F
+70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4
+72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB
+73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4
+7708770377047705770A76F776FB76FA77E777E878067811781278057810780F
+780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D
+7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9
+80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8
+830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3
+8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8
+91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5
+4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194
+519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E
+552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6
+57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15
+5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1
+5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000604160A26088608060926081609D60836095609B60976087609C608E6219
+624662F263106356632C634463456336634363E46339634B634A633C63296341
+6334635863546359632D63476333635A63516338635763406348654A654665C6
+65C365C465C2664A665F6647665167126713681F681A684968326833683B684B
+684F68166831681C6835682B682D682F684E68446834681D6812681468266828
+682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F
+6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68
+6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39
+70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC
+73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5
+7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710
+771377127723771177157719771A772277277823782C78227835782F7828782E
+782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0
+79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85
+7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D
+7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100
+8201822F82258333832D83448319835183258356833F83418326831C83220000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008342834E831B832A8308833C834D8316832483208337832F832983478345
+834C8353831E832C834B832783488653865286A286A88696868D8691869E8687
+86978686868B869A868586A5869986A186A786958698868E869D869086948843
+8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57
+8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004
+8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E
+50605053504B505D50725048504D5041505B504A506250155045505F5069506B
+5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D
+539C55755576553C554D55505534552A55515562553655355530555255450000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2
+57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5
+57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58
+5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52
+5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72
+5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96
+5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB
+60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397
+63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006378638563816391638D6370655365CD66656661665B6659665C66626718
+687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2
+688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4
+6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A
+6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6
+6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104
+70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F
+731D7317730773117318730A730872FF730F731E738873F673F873F574047401
+73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D
+7725773B7735784878527849784D784A784C782678457850796479677969796A
+7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30
+7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98
+7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B
+7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+801E801B804780438048811881258119811B812D811F812C811E812181158127
+811D8122821182388233823A823482328274839083A383A8838D837A837383A4
+8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E
+83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD
+86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897
+88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C
+8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7
+8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB
+90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5
+9997509B50955094509E508B50A35083508C508E509D5068509C509250825087
+515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F
+55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005819581E58275823582857F558485825581C581B5833583F5836582E5839
+5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC
+5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D
+5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35
+5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36
+5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104
+610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5
+63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0
+63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC
+68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970
+68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD
+68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97
+6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45
+6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64
+6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125
+71227132711F7128713A711B724B725A7288728972867285728B7312730B7330
+73227331733373277332732D732673237335730C742E742C7430742B74160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7
+75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A
+774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868
+785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B
+7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56
+7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D
+814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423
+83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5
+83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB
+83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1
+88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9
+89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52
+8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89
+8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F
+9106912C910490FF90FC910890F990FB9101910091079105910391619164915F
+916291609201920A92259203921A9226920F920C9200921291FF91FD92069204
+92279202921C92249219921792059216957B958D958C95909687967E96880000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6
+9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA
+50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA
+55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9
+55C25714585358685864584F584D5849586F5855584E585D58595865585B583D
+5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A
+5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6
+5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F
+612961406220916862236225622463C563F163EB641064126409642064240000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064336443641F641564186439643764226423640C64266430642864416435
+642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686
+668C66956690668B668A66996694667867206966695F6938694E69626971693F
+6945696A6939694269576959697A694869496935696C6933693D696568F06978
+693469696940696F69446976695869416974694C693B694B6937695C694F6951
+69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2
+6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92
+6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160
+7141715D716271727178716A7161714271587143714B7170715F715071530000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A
+73497444744A744B7452745174577440744F7450744E74427446744D745474E1
+74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610
+75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767
+77547759776D77E07887789A7894788F788478957885788678A1788378797899
+78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70
+7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B
+7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB
+7FDC8021816481608177815C8169815B816281726721815E81768167816F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081448161821D8249824482408242824584F1843F845684768479848F848D
+846584518440848684678430844D847D845A845984748473845D8507845E8437
+843A8434847A8443847884328445842983D9844B842F8442842D845F84708439
+844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454
+846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D
+870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81
+8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C
+8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2
+8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090449049903D9110910D910F911191169114910B910E916E916F92489252
+9230923A926692339265925E9283922E924A9246926D926C924F92609267926F
+92369261927092319254926392509272924E9253924C92569232959F959C959E
+959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D
+980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD
+50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613
+560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A
+58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA
+5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D
+5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43
+5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A
+615B6165613B616A6161615662296227622B642B644D645B645D647464766472
+6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C
+646B645964656477657365A066A166A0669F67056704672269B169B669C90000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4
+69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2
+69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03
+6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD
+6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182
+718F717B718671817197724472537297729572937343734D7351734C74627473
+7471747574727467746E750075027503757D759076167608760C76157611760A
+761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8
+787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C
+7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF
+7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC
+7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008024805D805C8189818681838187818D818C818B8215849784A484A1849F
+84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7
+84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4
+84D284DB84B084918661873387238728876B8740872E871E87218719871B8743
+872C8741873E874687208732872A872D873C8712873A87318735874287268727
+87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96
+8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06
+8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124
+9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1
+928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D
+977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900
+9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60
+9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C
+50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF
+58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05
+5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D
+5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496
+64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579
+657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15
+69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40
+6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16
+6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57
+6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77
+6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA
+719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000736274877489748A74867481747D74857488747C747975087507757E7625
+761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788
+78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2
+799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5
+7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE
+7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+819E819581A2819981978216824F825382528250824E82518524853B850F8500
+8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2
+851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E
+84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000875687638764877787E1877387588754875B87528761875A8751875E876D
+876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767
+8769885A8905890C8914890B891789188919890689168911890E890989A289A4
+89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5
+8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0
+8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073
+9070906F9067906B912F912B9129912A91329126912E91859186918A91819182
+9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC
+92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702
+975A978A978E978897D097CF981E981D9826982998289820981B982798B29908
+98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB
+99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75
+9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04
+9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC
+58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1
+5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9
+5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533
+657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66
+6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A
+6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54
+6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8
+6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4
+71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365
+736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633
+763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44
+7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9
+7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C
+7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43
+7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC
+81B481B281B781A781F282558256825785568545856B854D8553856185580000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+854085468564854185628544855185478563853E855B8571854E856E85758555
+85678560858C8566855D85548565856C866386658664879B878F879787938792
+87888781879687988779878787A3878587908791879D87848794879C879A8789
+891E89268930892D892E89278931892289298923892F892C891F89F18AE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF
+8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38
+8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34
+90769079907B908690FA913391359136919391909191918D918F9327931E9308
+931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D
+92FA9325931392F992F793349302932492FF932993399335932A9314930C0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9
+96D4970B9712971097999797979497F097F89835982F98329924991F99279929
+999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA
+9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88
+9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4
+5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25
+5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3
+61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580
+65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9
+6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2
+71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510
+75117512750F7584764376487649764776A476E977B577AB77B277B777B60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB
+79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB
+7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8
+7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44
+7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9
+825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8577857C858985A1857A85788557858E85968586858D8599859D858185A28582
+858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5
+87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE
+87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13
+8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47
+8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF
+936493569347937C9358935C93769349935093519360936D938F934C936A9379
+935793559352934F93719377937B9361935E936393679380934E935995C795C0
+95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+979E979D97D597D497F198419844984A9849984598439925992B992C992A9933
+9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB
+99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1
+9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA
+9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699
+59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6
+61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD
+6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005
+7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657
+765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC
+7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56
+7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB
+85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB
+87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4
+87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35
+8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75
+8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5
+91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395
+93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3
+96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F
+9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35
+9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C
+9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C
+9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4
+56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1
+6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016
+702B702170227023702970177024701C702A720C720A72077202720572A572A6
+72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76
+7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE
+807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2
+85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7
+8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958
+895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D
+8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD
+93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3
+93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948
+9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C
+9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4
+9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78
+9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F
+9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF
+66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034
+703170427038703F703A70397040703B703370417213721472A8737D737C74BA
+76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80
+7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604
+86098605860C85FD8819881088118817881388168963896689B989F78B608B6A
+8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A
+908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410
+94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862
+9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36
+9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8
+9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6
+9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91
+513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC
+6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A
+77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030
+81DD8618862A8626861F8623861C86198627862E862186208629861E86250000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45
+8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B
+94369429943D943C94309439942A9437942C9440943195E595E495E39735973A
+97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29
+9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9
+9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18
+9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2
+65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F
+74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826
+882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A
+8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449
+9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33
+9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF
+9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2
+513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB
+6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C
+863A86408639863C8631863B863E88308832882E883389768974897389FE0000
+F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4
+97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C
+9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC
+9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D
+7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835
+884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743
+974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03
+9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E
+65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000
+F9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5
+8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10
+9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2
+8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874
+98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482
+948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D
+7069706A9EA49F7E9F499F980000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/cp1250.enc b/ext/Encode/Encode/cp1250.enc
new file mode 100644 (file)
index 0000000..934539a
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1250, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0083201E2026202020210088203001602039015A0164017D0179
+009020182019201C201D202220132014009821220161203A015B0165017E017A
+00A002C702D8014100A4010400A600A700A800A9015E00AB000000AD00AE017B
+00B000B102DB014200B400B500B600B700B80105015F00BB013D02DD013E017C
+015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E
+01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF
+015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F
+01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9
diff --git a/ext/Encode/Encode/cp1251.enc b/ext/Encode/Encode/cp1251.enc
new file mode 100644 (file)
index 0000000..7daed16
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1251, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+04020403201A0453201E2026202020210088203004092039040A040C040B040F
+045220182019201C201D202220132014009821220459203A045A045C045B045F
+00A0040E045E040800A4049000A600A7040100A9040400AB00AC00AD00AE0407
+00B000B104060456049100B500B600B704512116045400BB0458040504550457
+0410041104120413041404150416041704180419041A041B041C041D041E041F
+0420042104220423042404250426042704280429042A042B042C042D042E042F
+0430043104320433043404350436043704380439043A043B043C043D043E043F
+0440044104420443044404450446044704480449044A044B044C044D044E044F
diff --git a/ext/Encode/Encode/cp1252.enc b/ext/Encode/Encode/cp1252.enc
new file mode 100644 (file)
index 0000000..fe55a46
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1252, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E20262020202102C62030016020390152008D008E008F
+009020182019201C201D20222013201402DC21220161203A0153009D009E0178
+00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
+00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
+00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF
+00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
+00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF
diff --git a/ext/Encode/Encode/cp1253.enc b/ext/Encode/Encode/cp1253.enc
new file mode 100644 (file)
index 0000000..a934bc9
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1253, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E20262020202100882030008A2039008C008D008E008F
+009020182019201C201D20222013201400982122009A203A009C009D009E009F
+00A00385038600A300A400A500A600A700A800A9000000AB00AC00AD00AE2015
+00B000B100B200B3038400B500B600B703880389038A00BB038C00BD038E038F
+0390039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF
+03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000
diff --git a/ext/Encode/Encode/cp1254.enc b/ext/Encode/Encode/cp1254.enc
new file mode 100644 (file)
index 0000000..d8553a2
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1254, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E20262020202102C62030016020390152008D008E008F
+009020182019201C201D20222013201402DC21220161203A0153009D009E0178
+00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
+00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
+011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF
+00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
+011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF
diff --git a/ext/Encode/Encode/cp1255.enc b/ext/Encode/Encode/cp1255.enc
new file mode 100644 (file)
index 0000000..275c016
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1255, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E20262020202102C62030008A2039008C008D008E008F
+009020182019201C201D20222013201402DC2122009A203A009C009D009E009F
+00A0000000A200A320AA00A500A600A700A800A9000000AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B7000000B9000000BB00BC00BD00BE0000
+05B005B105B205B305B405B505B605B705B805B905BA05BB05BC05BD05BE05BF
+05C005C105C205C305F005F105F2000000000000000000000000000000000000
+05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF
+05E005E105E205E305E405E505E605E705E805E905EA00000000200E200F0000
diff --git a/ext/Encode/Encode/cp1256.enc b/ext/Encode/Encode/cp1256.enc
new file mode 100644 (file)
index 0000000..1a9d8a6
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1256, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080067E201A0192201E20262020202102C62030008A2039015206860698008F
+06AF20182019201C201D20222013201400982122009A203A0153200C200D009F
+00A0060C00A200A300A400A500A600A700A800A9000000AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B9061B00BB00BC00BD00BE061F
+0000062106220623062406250626062706280629062A062B062C062D062E062F
+063006310632063306340635063600D7063706380639063A0640064106420643
+00E0064400E2064506460647064800E700E800E900EA00EB0649064A00EE00EF
+064B064C064D064E00F4064F065000F7065100F9065200FB00FC200E200F0000
diff --git a/ext/Encode/Encode/cp1257.enc b/ext/Encode/Encode/cp1257.enc
new file mode 100644 (file)
index 0000000..4aab0c6
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1257, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0083201E20262020202100882030008A2039008C00A802C700B8
+009020182019201C201D20222013201400982122009A203A009C00AF02DB009F
+00A0000000A200A300A4000000A600A700D800A9015600AB00AC00AD00AE00C6
+00B000B100B200B300B400B500B600B700F800B9015700BB00BC00BD00BE00E6
+0104012E0100010600C400C501180112010C00C90179011601220136012A013B
+01600143014500D3014C00D500D600D701720141015A016A00DC017B017D00DF
+0105012F0101010700E400E501190113010D00E9017A011701230137012B013C
+01610144014600F3014D00F500F600F701730142015B016B00FC017C017E02D9
diff --git a/ext/Encode/Encode/cp1258.enc b/ext/Encode/Encode/cp1258.enc
new file mode 100644 (file)
index 0000000..8c1fce8
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp1258, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00800081201A0192201E20262020202102C62030008A20390152008D008E008F
+009020182019201C201D20222013201402DC2122009A203A0153009D009E0178
+00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
+00C000C100C2010200C400C500C600C700C800C900CA00CB034000CD00CE00CF
+011000D1030900D300D401A000D600D700D800D900DA00DB00DC01AF030300DF
+00E000E100E2010300E400E500E600E700E800E900EA00EB034100ED00EE00EF
+011100F1032300F300F401A100F600F700F800F900FA00FB00FC01B020AB00FF
diff --git a/ext/Encode/Encode/cp437.enc b/ext/Encode/Encode/cp437.enc
new file mode 100644 (file)
index 0000000..ecae4e6
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp437, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5
+00C900E600C600F400F600F200FB00F900FF00D600DC00A200A300A520A70192
+00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp737.enc b/ext/Encode/Encode/cp737.enc
new file mode 100644 (file)
index 0000000..5b59661
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp737, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+039103920393039403950396039703980399039A039B039C039D039E039F03A0
+03A103A303A403A503A603A703A803A903B103B203B303B403B503B603B703B8
+03B903BA03BB03BC03BD03BE03BF03C003C103C303C203C403C503C603C703C8
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03C903AC03AD03AE03CA03AF03CC03CD03CB03CE038603880389038A038C038E
+038F00B12265226403AA03AB00F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp775.enc b/ext/Encode/Encode/cp775.enc
new file mode 100644 (file)
index 0000000..71b65c3
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp775, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+010600FC00E9010100E4012300E501070142011301560157012B017900C400C5
+00C900E600C6014D00F6012200A2015A015B00D600DC00F800A300D800D700A4
+0100012A00F3017B017C017A201D00A600A900AE00AC00BD00BC014100AB00BB
+259125922593250225240104010C01180116256325512557255D012E01602510
+25142534252C251C2500253C0172016A255A25542569256625602550256C017D
+0105010D01190117012F01610173016B017E2518250C25882584258C25902580
+00D300DF014C014300F500D500B5014401360137013B013C0146011201452019
+00AD00B1201C00BE00B600A700F7201E00B0221900B700B900B300B225A000A0
diff --git a/ext/Encode/Encode/cp850.enc b/ext/Encode/Encode/cp850.enc
new file mode 100644 (file)
index 0000000..4e7a90d
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp850, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5
+00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D800D70192
+00E100ED00F300FA00F100D100AA00BA00BF00AE00AC00BD00BC00A100AB00BB
+2591259225932502252400C100C200C000A9256325512557255D00A200A52510
+25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4
+00F000D000CA00CB00C8013100CD00CE00CF2518250C2588258400A600CC2580
+00D300DF00D400D200F500D500B500FE00DE00DA00DB00D900FD00DD00AF00B4
+00AD00B1201700BE00B600A700F700B800B000A800B700B900B300B225A000A0
diff --git a/ext/Encode/Encode/cp852.enc b/ext/Encode/Encode/cp852.enc
new file mode 100644 (file)
index 0000000..f34899e
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp852, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E4016F010700E7014200EB0150015100EE017900C40106
+00C90139013A00F400F6013D013E015A015B00D600DC01640165014100D7010D
+00E100ED00F300FA01040105017D017E0118011900AC017A010C015F00AB00BB
+2591259225932502252400C100C2011A015E256325512557255D017B017C2510
+25142534252C251C2500253C01020103255A25542569256625602550256C00A4
+01110110010E00CB010F014700CD00CE011B2518250C258825840162016E2580
+00D300DF00D401430144014801600161015400DA0155017000FD00DD016300B4
+00AD02DD02DB02C702D800A700F700B800B000A802D901710158015925A000A0
diff --git a/ext/Encode/Encode/cp855.enc b/ext/Encode/Encode/cp855.enc
new file mode 100644 (file)
index 0000000..4d58b86
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp855, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0452040204530403045104010454040404550405045604060457040704580408
+04590409045A040A045B040B045C040C045E040E045F040F044E042E044A042A
+0430041004310411044604260434041404350415044404240433041300AB00BB
+259125922593250225240445042504380418256325512557255D043904192510
+25142534252C251C2500253C043A041A255A25542569256625602550256C00A4
+043B041B043C041C043D041D043E041E043F2518250C25882584041F044F2580
+042F044004200441042104420422044304230436041604320412044C042C2116
+00AD044B042B0437041704480428044D042D044904290447042700A725A000A0
diff --git a/ext/Encode/Encode/cp857.enc b/ext/Encode/Encode/cp857.enc
new file mode 100644 (file)
index 0000000..b42ed55
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp857, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE013100C400C5
+00C900E600C600F400F600F200FB00F9013000D600DC00F800A300D8015E015F
+00E100ED00F300FA00F100D1011E011F00BF00AE00AC00BD00BC00A100AB00BB
+2591259225932502252400C100C200C000A9256325512557255D00A200A52510
+25142534252C251C2500253C00E300C3255A25542569256625602550256C00A4
+00BA00AA00CA00CB00C8000000CD00CE00CF2518250C2588258400A600CC2580
+00D300DF00D400D200F500D500B5000000D700DA00DB00D900EC00FF00AF00B4
+00AD00B1000000BE00B600A700F700B800B000A800B700B900B300B225A000A0
diff --git a/ext/Encode/Encode/cp860.enc b/ext/Encode/Encode/cp860.enc
new file mode 100644 (file)
index 0000000..871943b
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp860, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E300E000C100E700EA00CA00E800CD00D400EC00C300C2
+00C900C000C800F400F500F200DA00F900CC00D500DC00A200A300D920A700D3
+00E100ED00F300FA00F100D100AA00BA00BF00D200AC00BD00BC00A100AB00BB
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp861.enc b/ext/Encode/Encode/cp861.enc
new file mode 100644 (file)
index 0000000..3f8f605
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp861, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E400E000E500E700EA00EB00E800D000F000DE00C400C5
+00C900E600C600F400F600FE00FB00DD00FD00D600DC00F800A300D820A70192
+00E100ED00F300FA00C100CD00D300DA00BF231000AC00BD00BC00A100AB00BB
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp862.enc b/ext/Encode/Encode/cp862.enc
new file mode 100644 (file)
index 0000000..5f9d16c
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp862, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF
+05E005E105E205E305E405E505E605E705E805E905EA00A200A300A520A70192
+00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00BB
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp863.enc b/ext/Encode/Encode/cp863.enc
new file mode 100644 (file)
index 0000000..c8b8686
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp863, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200C200E000B600E700EA00EB00E800EF00EE201700C000A7
+00C900C800CA00F400CB00CF00FB00F900A400D400DC00A200A300D900DB0192
+00A600B400F300FA00A800B800B300AF00CE231000AC00BD00BC00BE00AB00BB
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp864.enc b/ext/Encode/Encode/cp864.enc
new file mode 100644 (file)
index 0000000..71f9e62
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp864, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+00200021002200230024066A0026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00B000B72219221A259225002502253C2524252C251C25342510250C25142518
+03B2221E03C600B100BD00BC224800AB00BBFEF7FEF8009B009CFEFBFEFC009F
+00A000ADFE8200A300A4FE8400000000FE8EFE8FFE95FE99060CFE9DFEA1FEA5
+0660066106620663066406650666066706680669FED1061BFEB1FEB5FEB9061F
+00A2FE80FE81FE83FE85FECAFE8BFE8DFE91FE93FE97FE9BFE9FFEA3FEA7FEA9
+FEABFEADFEAFFEB3FEB7FEBBFEBFFEC1FEC5FECBFECF00A600AC00F700D7FEC9
+0640FED3FED7FEDBFEDFFEE3FEE7FEEBFEEDFEEFFEF3FEBDFECCFECEFECDFEE1
+FE7D0651FEE5FEE9FEECFEF0FEF2FED0FED5FEF5FEF6FEDDFED9FEF125A00000
diff --git a/ext/Encode/Encode/cp865.enc b/ext/Encode/Encode/cp865.enc
new file mode 100644 (file)
index 0000000..543da9c
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp865, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C700FC00E900E200E400E000E500E700EA00EB00E800EF00EE00EC00C400C5
+00C900E600C600F400F600F200FB00F900FF00D600DC00F800A300D820A70192
+00E100ED00F300FA00F100D100AA00BA00BF231000AC00BD00BC00A100AB00A4
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+03B100DF039303C003A303C300B503C403A6039803A903B4221E03C603B52229
+226100B1226522642320232100F7224800B0221900B7221A207F00B225A000A0
diff --git a/ext/Encode/Encode/cp866.enc b/ext/Encode/Encode/cp866.enc
new file mode 100644 (file)
index 0000000..b851cf5
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp866, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0410041104120413041404150416041704180419041A041B041C041D041E041F
+0420042104220423042404250426042704280429042A042B042C042D042E042F
+0430043104320433043404350436043704380439043A043B043C043D043E043F
+259125922593250225242561256225562555256325512557255D255C255B2510
+25142534252C251C2500253C255E255F255A25542569256625602550256C2567
+2568256425652559255825522553256B256A2518250C25882584258C25902580
+0440044104420443044404450446044704480449044A044B044C044D044E044F
+040104510404045404070457040E045E00B0221900B7221A211600A425A000A0
diff --git a/ext/Encode/Encode/cp869.enc b/ext/Encode/Encode/cp869.enc
new file mode 100644 (file)
index 0000000..9fd2929
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp869, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850386008700B700AC00A620182019038820150389
+038A03AA038C00930094038E03AB00A9038F00B200B303AC00A303AD03AE03AF
+03CA039003CC03CD039103920393039403950396039700BD0398039900AB00BB
+25912592259325022524039A039B039C039D256325512557255D039E039F2510
+25142534252C251C2500253C03A003A1255A25542569256625602550256C03A3
+03A403A503A603A703A803A903B103B203B32518250C2588258403B403B52580
+03B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C203C40384
+00AD00B103C503C603C700A703C8038500B000A803C903CB03B003CE25A000A0
diff --git a/ext/Encode/Encode/cp874.enc b/ext/Encode/Encode/cp874.enc
new file mode 100644 (file)
index 0000000..cdcca32
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: cp874, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008420260086008700880089008A008B008C008D008E008F
+009020182019201C201D20222013201400980099009A009B009C009D009E009F
+00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F
+0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F
+0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F
+0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F
+0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F
+0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000
diff --git a/ext/Encode/Encode/cp932.enc b/ext/Encode/Encode/cp932.enc
new file mode 100644 (file)
index 0000000..027f7d8
--- /dev/null
@@ -0,0 +1,785 @@
+# Encoding file: cp932, multi-byte
+M
+003F 0 46
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080000000000000000000850086000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E
+FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C
+FF5E2225FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B
+FF5D30083009300A300B300C300D300E300F30103011FF0BFF0D00B100D70000
+00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5
+FF04FFE0FFE1FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC203B301221922190219121933013000000000000
+000000000000000000000000000000002208220B2286228722822283222A2229
+0000000000000000000000000000000022272228FFE221D221D4220022030000
+0000000000000000000000000000000000000000222022A52312220222072261
+2252226A226B221A223D221D2235222B222C0000000000000000000000000000
+212B2030266F266D266A2020202100B6000000000000000025EF000000000000
+82
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000FF10
+FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000
+FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30
+FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000
+0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041
+30423043304430453046304730483049304A304B304C304D304E304F30503051
+30523053305430553056305730583059305A305B305C305D305E305F30603061
+30623063306430653066306730683069306A306B306C306D306E306F30703071
+30723073307430753076307730783079307A307B307C307D307E307F30803081
+30823083308430853086308730883089308A308B308C308D308E308F30903091
+3092309300000000000000000000000000000000000000000000000000000000
+83
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0
+30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0
+30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0
+30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000391
+03920393039403950396039703980399039A039B039C039D039E039F03A003A1
+03A303A403A503A603A703A803A90000000000000000000000000000000003B1
+03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1
+03C303C403C503C603C703C803C9000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+04100411041204130414041504010416041704180419041A041B041C041D041E
+041F0420042104220423042404250426042704280429042A042B042C042D042E
+042F000000000000000000000000000000000000000000000000000000000000
+04300431043204330434043504510436043704380439043A043B043C043D0000
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000002500
+2502250C251025182514251C252C25242534253C25012503250F2513251B2517
+25232533252B253B254B2520252F25282537253F251D25302525253825420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+87
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2460246124622463246424652466246724682469246A246B246C246D246E246F
+2470247124722473216021612162216321642165216621672168216900003349
+33143322334D331833273303333633513357330D33263323332B334A333B339C
+339D339E338E338F33C433A100000000000000000000000000000000337B0000
+301D301F211633CD212132A432A532A632A732A8323132323239337E337D337C
+22522261222B222E2211221A22A52220221F22BF22352229222A000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+88
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000004E9C
+55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466
+82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7
+5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4
+5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863
+8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328
+828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000
+89
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893
+81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2
+834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834
+82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000
+5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01
+827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC
+65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6
+81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1
+4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2
+798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E
+971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A
+89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000
+8A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916
+54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3
+67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A
+89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000
+6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39
+53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5
+520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98
+5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22
+6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3
+8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9
+764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947
+5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000
+8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC
+8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947
+7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD
+53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000
+673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45
+5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B
+4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F
+6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF
+99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747
+5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1
+91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177
+611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000
+8C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB
+8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951
+5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C
+7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000
+5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6
+503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C
+6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A
+98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA
+96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0
+7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348
+5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9
+4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000
+8D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18
+6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69
+6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154
+818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000
+980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B
+544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64
+98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E
+9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750
+5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08
+707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A
+8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E
+6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09
+509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178
+991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9
+59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000
+6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C
+8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21
+6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58
+9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA
+5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E
+793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8
+932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3
+91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000
+8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846
+89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4
+6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA
+88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000
+6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2
+7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD
+5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84
+5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35
+6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7
+7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E
+9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE
+676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000
+90
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507
+5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E
+79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875
+58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000
+9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F
+745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84
+647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F
+667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB
+901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D
+7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0
+8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0
+681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000
+91
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D
+55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9
+758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC
+53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000
+64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061
+83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3
+85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA
+65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70
+8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010
+5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E
+968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258
+629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000
+92
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39
+53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6
+86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B
+6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000
+901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877
+8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16
+5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139
+817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD
+8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43
+6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4
+4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5
+633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000
+93
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9
+64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9
+4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B
+83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000
+51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF
+76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463
+856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C
+58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3
+6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB
+5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3
+51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3
+6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000
+94
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5
+637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2
+899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3
+5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000
+6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD
+67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD
+7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA
+4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06
+642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169
+981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2
+6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB
+907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000
+95
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867
+59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF
+63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3
+983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000
+65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB
+6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F
+8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E
+711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4
+4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909
+72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355
+6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305
+5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000
+96
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD
+9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2
+51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2
+6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000
+646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE
+9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B
+85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11
+772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF
+8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984
+5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B
+7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384
+5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000
+97
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C
+733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89
+8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194
+75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000
+6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A
+4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2
+88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559
+786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599
+68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B
+539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4
+4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6
+6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000
+98
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C
+69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6
+502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900
+6E7E789781550000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000005F0C
+4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D
+4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED
+4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70
+4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A
+50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047
+6703505550505048505A5056506C50785080509A508550B450B2000000000000
+99
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116
+51155114511A5121513A5137513C513B513F51405152514C515451627AF85169
+516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9
+51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000
+51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C
+525E5254526A527452695273527F527D528D529452925271528852918FA88FA7
+52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9
+530653087538530D5310530F5315531A5323532F533153335338534053465345
+4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE
+53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C
+542D543C542E54365429541D544E548F5475548E545F5471547754705492547B
+5480547654845490548654C754A254B854A554AC54C454C854A8000000000000
+9A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539
+55405563554C552E555C55455556555755385533555D5599558054AF558A559F
+557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4
+55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000
+566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2
+56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708
+570B570D57135718571655C7571C572657375738574E573B5740574F576957C0
+57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A
+57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9
+589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4
+58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932
+5938593E7AD259555950594E595A5958596259605967596C5969000000000000
+9B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11
+5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD
+5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43
+5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000
+5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6
+5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50
+5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7
+5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B
+5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82
+5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2
+5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62
+5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000
+9C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE
+5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51
+5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99
+5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000
+601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F
+604A6046604D6063604360646042606C606B60596081608D60E76083609A6084
+609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8
+614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E
+61286127614A613F613C612C6134613D614261446173617761586159615A616B
+6174616F61656171615F615D6153617561996196618761AC6194619A618A6191
+61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6
+61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000
+9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+621E6221622A622E6230623262336241624E625E6263625B62606268627C6282
+6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8
+62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350
+633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000
+636963BE63E963C063C663E363C963D263F663C4641664346406641364266436
+651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA
+64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6
+64F464F264FA650064FD6518651C650565246523652B65346535653765366538
+754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB
+65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB
+6773663566366634661C664F664466496641665E665D666466676668665F6662
+667066836688668E668966846698669D66C166B966C966BE66BC000000000000
+9E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727
+9738672E673F67366741673867376746675E67606759676367646789677067A9
+677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE
+67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000
+68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874
+68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4
+68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921
+68C669796977695C6978696B6954697E696E69396974693D695969306961695E
+695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3
+69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7
+6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78
+6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000
+9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05
+86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59
+6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA
+6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000
+9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B
+6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA
+6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63
+6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8
+6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E
+6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D
+6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2
+6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E
+6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1
+6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030
+703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000
+70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184
+719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9
+71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258
+7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2
+72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E
+734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0
+73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C
+746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D
+75157513751E7526752C753C7544754D754A7549755B7546755A756975647567
+756B756D75787576758675877574758A758975827594759A759D75A575A375C2
+75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000
+75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634
+7630763B764776487646765C76587661766276687669766A7667766C76707672
+76767678767C768076837688768B768E769676937699769A76B076B476B876B9
+76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729
+7724771E77257726771B773777387747775A7768776B775B7765777F777E7779
+778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA
+77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C
+78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955
+7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC
+79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49
+7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000
+7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2
+7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A
+7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F
+7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9
+7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A
+7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C
+7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0
+7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68
+7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB
+7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A
+7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000
+7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D
+8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45
+7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86
+7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71
+7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018
+8019801C80218028803F803B804A804680528058805A805F8062806880738072
+807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5
+80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+968B8146813E8153815180FC8171816E81658166817481838188818A81808182
+81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9
+81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207
+820A820D821082168229822B82388233824082598258825D825A825F82640000
+82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1
+82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335
+83348316833283318340833983508345832F832B831783188385839A83AA839F
+83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB
+83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506
+83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479
+843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521
+84FF84F485178518852C851F8515851484FC8540856385588548000000000000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C
+8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B
+85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9
+86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000
+86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F
+8737873B87258729871A8760875F8778874C874E877487578768876E87598753
+8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7
+87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822
+88218831883688398827883B8844884288528859885E8862886B8881887E889E
+8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3
+88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943
+891E8925892A892B89418944893B89368938894C891D8960895E000000000000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89668964896D896A896F89748977897E89838988898A8993899889A189A989A6
+89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10
+8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82
+8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000
+8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20
+8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F
+8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48
+8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C
+8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA
+8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71
+8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3
+8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87
+8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5
+8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F
+8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000
+8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4
+90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F
+905090519052900E9049903E90569058905E9068906F907696A890729082907D
+90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119
+91329130914A9156915891639165916991739172918B9189918291A291AB91AF
+91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6
+921E91FF9214922C92159211925E925792459249926492489295923F924B9250
+929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394
+93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407
+94109436942B94359421943A944194529444945B94609462945E946A92299470
+94759477947D945A947C947E9481947F95829587958A95949596959895990000
+95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6
+95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D
+965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8
+96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711
+970F971697199724972A97309739973D973E97449746974897429749975C9760
+97649766976852D2976B977197799785977C9781977A9786978B978F9790979C
+97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5
+980F980C9838982498219837983D9846984F984B986B986F9870000000000000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914
+99189921991D991E99249920992C992E993D993E9942994999459950994B9951
+9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE
+99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000
+9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0
+9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB
+9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43
+9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0
+9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15
+9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47
+9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06
+9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2
+9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A
+9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8
+9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000
+9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52
+9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F
+69C79059746451DC719900000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E8A891C9348928884DC4FC970BB663168C892F966FB5F454E284EE14EFC4F00
+4F034F394F564F924F8A4F9A4F944FCD504050224FFF501E5046507050425094
+50F450D8514A5164519D51BE51EC5215529C52A652C052DB5300530753245372
+539353B253DDFA0E549C548A54A954FF55865759576557AC57C857C7FA0F0000
+FA10589E58B2590B5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E
+5CA65CBA5CF55D275D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE
+605D6085608A60DE60D5612060F26111613761306198621362A663F56460649D
+64CE654E66006615663B6609662E661E6624666566576659FA126673669966A0
+66B266BF66FA670EF929676667BB685267C06801684468CFFA136968FA146998
+69E26A306A6B6A466A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D87
+6D6F6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF57005
+70077028708570AB710F7104715C71467147FA1571C171FE72B1000000000000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72BE7324FA16737773BD73C973D673E373D2740773F57426742A7429742E7462
+7489749F7501756F7682769C769E769B76A6FA17774652AF7821784E7864787A
+7930FA18FA19FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB7
+7DA07DD67E527F477FA1FA1E83018362837F83C783F6844884B4855385590000
+856BFA1F85B0FA20FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B53
+8B7F8CF08CF48D128D76FA238ECFFA24FA25906790DEFA269115912791DA91D7
+91DE91ED91EE91E491E592069210920A923A9240923C924E9259925192399267
+92A79277927892E792D792D992D0FA2792D592E092D39325932192FBFA28931E
+92FF931D93029370935793A493C693DE93F89431944594489592F9DCFA29969D
+96AF9733973B9743974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E
+9AD99ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED1000000002170
+217121722173217421752176217721782179FFE2FFE4FF07FF02000000000000
+FA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2170217121722173217421752176217721782179216021612162216321642165
+2166216721682169FFE2FFE4FF07FF0232312116212122357E8A891C93489288
+84DC4FC970BB663168C892F966FB5F454E284EE14EFC4F004F034F394F564F92
+4F8A4F9A4F944FCD504050224FFF501E504650705042509450F450D8514A0000
+5164519D51BE51EC5215529C52A652C052DB5300530753245372539353B253DD
+FA0E549C548A54A954FF55865759576557AC57C857C7FA0FFA10589E58B2590B
+5953595B595D596359A459BA5B565BC0752F5BD85BEC5C1E5CA65CBA5CF55D27
+5D53FA115D425D6D5DB85DB95DD05F215F345F675FB75FDE605D6085608A60DE
+60D5612060F26111613761306198621362A663F56460649D64CE654E66006615
+663B6609662E661E6624666566576659FA126673669966A066B266BF66FA670E
+F929676667BB685267C06801684468CFFA136968FA14699869E26A306A6B6A46
+6A736A7E6AE26AE46BD66C3F6C5C6C866C6F6CDA6D046D876D6F000000000000
+FB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D966DAC6DCF6DF86DF26DFC6E396E5C6E276E3C6EBF6F886FB56FF570057007
+7028708570AB710F7104715C71467147FA1571C171FE72B172BE7324FA167377
+73BD73C973D673E373D2740773F57426742A7429742E74627489749F7501756F
+7682769C769E769B76A6FA17774652AF7821784E7864787A7930FA18FA190000
+FA1A7994FA1B799B7AD17AE7FA1C7AEB7B9EFA1D7D487D5C7DB77DA07DD67E52
+7F477FA1FA1E83018362837F83C783F6844884B485538559856BFA1F85B0FA20
+FA21880788F58A128A378A798AA78ABE8ADFFA228AF68B538B7F8CF08CF48D12
+8D76FA238ECFFA24FA25906790DEFA269115912791DA91D791DE91ED91EE91E4
+91E592069210920A923A9240923C924E925992519239926792A79277927892E7
+92D792D992D0FA2792D592E092D39325932192FBFA28931E92FF931D93029370
+935793A493C693DE93F89431944594489592F9DCFA29969D96AF9733973B9743
+974D974F9751975598579865FA2AFA2B9927FA2C999E9A4E9AD9000000000000
+FC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9ADC9B759B729B8F9BB19BBB9C009D709D6BFA2D9E199ED10000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/cp936.enc b/ext/Encode/Encode/cp936.enc
new file mode 100644 (file)
index 0000000..53d975c
--- /dev/null
@@ -0,0 +1,2162 @@
+# Encoding file: cp936, multi-byte
+M
+003F 0 127
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E024E044E054E064E0F4E124E174E1F4E204E214E234E264E294E2E4E2F4E31
+4E334E354E374E3C4E404E414E424E444E464E4A4E514E554E574E5A4E5B4E62
+4E634E644E654E674E684E6A4E6B4E6C4E6D4E6E4E6F4E724E744E754E764E77
+4E784E794E7A4E7B4E7C4E7D4E7F4E804E814E824E834E844E854E874E8A0000
+4E904E964E974E994E9C4E9D4E9E4EA34EAA4EAF4EB04EB14EB44EB64EB74EB8
+4EB94EBC4EBD4EBE4EC84ECC4ECF4ED04ED24EDA4EDB4EDC4EE04EE24EE64EE7
+4EE94EED4EEE4EEF4EF14EF44EF84EF94EFA4EFC4EFE4F004F024F034F044F05
+4F064F074F084F0B4F0C4F124F134F144F154F164F1C4F1D4F214F234F284F29
+4F2C4F2D4F2E4F314F334F354F374F394F3B4F3E4F3F4F404F414F424F444F45
+4F474F484F494F4A4F4B4F4C4F524F544F564F614F624F664F684F6A4F6B4F6D
+4F6E4F714F724F754F774F784F794F7A4F7D4F804F814F824F854F864F874F8A
+4F8C4F8E4F904F924F934F954F964F984F994F9A4F9C4F9E4F9F4FA14FA20000
+82
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4FA44FAB4FAD4FB04FB14FB24FB34FB44FB64FB74FB84FB94FBA4FBB4FBC4FBD
+4FBE4FC04FC14FC24FC64FC74FC84FC94FCB4FCC4FCD4FD24FD34FD44FD54FD6
+4FD94FDB4FE04FE24FE44FE54FE74FEB4FEC4FF04FF24FF44FF54FF64FF74FF9
+4FFB4FFC4FFD4FFF5000500150025003500450055006500750085009500A0000
+500B500E501050115013501550165017501B501D501E50205022502350245027
+502B502F5030503150325033503450355036503750385039503B503D503F5040
+504150425044504550465049504A504B504D5050505150525053505450565057
+50585059505B505D505E505F506050615062506350645066506750685069506A
+506B506D506E506F50705071507250735074507550785079507A507C507D5081
+508250835084508650875089508A508B508C508E508F50905091509250935094
+50955096509750985099509A509B509C509D509E509F50A050A150A250A450A6
+50AA50AB50AD50AE50AF50B050B150B350B450B550B650B750B850B950BC0000
+83
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50BD50BE50BF50C050C150C250C350C450C550C650C750C850C950CA50CB50CC
+50CD50CE50D050D150D250D350D450D550D750D850D950DB50DC50DD50DE50DF
+50E050E150E250E350E450E550E850E950EA50EB50EF50F050F150F250F450F6
+50F750F850F950FA50FC50FD50FE50FF51005101510251035104510551080000
+5109510A510C510D510E510F511051115113511451155116511751185119511A
+511B511C511D511E511F512051225123512451255126512751285129512A512B
+512C512D512E512F5130513151325133513451355136513751385139513A513B
+513C513D513E51425147514A514C514E514F515051525153515751585159515B
+515D515E515F5160516151635164516651675169516A516F5172517A517E517F
+5183518451865187518A518B518E518F51905191519351945198519A519D519E
+519F51A151A351A651A751A851A951AA51AD51AE51B451B851B951BA51BE51BF
+51C151C251C351C551C851CA51CD51CE51D051D251D351D451D551D651D70000
+84
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51D851D951DA51DC51DE51DF51E251E351E551E651E751E851E951EA51EC51EE
+51F151F251F451F751FE520452055209520B520C520F5210521352145215521C
+521E521F522152225223522552265227522A522C522F5231523252345235523C
+523E524452455246524752485249524B524E524F525252535255525752580000
+5259525A525B525D525F526052625263526452665268526B526C526D526E5270
+52715273527452755276527752785279527A527B527C527E5280528352845285
+528652875289528A528B528C528D528E528F5291529252945295529652975298
+5299529A529C52A452A552A652A752AE52AF52B052B452B552B652B752B852B9
+52BA52BB52BC52BD52C052C152C252C452C552C652C852CA52CC52CD52CE52CF
+52D152D352D452D552D752D952DA52DB52DC52DD52DE52E052E152E252E352E5
+52E652E752E852E952EA52EB52EC52ED52EE52EF52F152F252F352F452F552F6
+52F752F852FB52FC52FD530153025303530453075309530A530B530C530E0000
+85
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53115312531353145318531B531C531E531F532253245325532753285329532B
+532C532D532F533053315332533353345335533653375338533C533D53405342
+53445346534B534C534D5350535453585359535B535D53655368536A536C536D
+537253765379537B537C537D537E53805381538353875388538A538E538F0000
+53905391539253935394539653975399539B539C539E53A053A153A453A753AA
+53AB53AC53AD53AF53B053B153B253B353B453B553B753B853B953BA53BC53BD
+53BE53C053C353C453C553C653C753CE53CF53D053D253D353D553DA53DC53DD
+53DE53E153E253E753F453FA53FE53FF5400540254055407540B541454185419
+541A541C542254245425542A5430543354365437543A543D543F544154425444
+544554475449544C544D544E544F5451545A545D545E545F5460546154635465
+54675469546A546B546C546D546E546F547054745479547A547E547F54815483
+5485548754885489548A548D5491549354975498549C549E549F54A054A10000
+86
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54A254A554AE54B054B254B554B654B754B954BA54BC54BE54C354C554CA54CB
+54D654D854DB54E054E154E254E354E454EB54EC54EF54F054F154F454F554F6
+54F754F854F954FB54FE550055025503550455055508550A550B550C550D550E
+5512551355155516551755185519551A551C551D551E551F5521552555260000
+55285529552B552D553255345535553655385539553A553B553D554055425545
+55475548554B554C554D554E554F5551555255535554555755585559555A555B
+555D555E555F55605562556355685569556B556F557055715572557355745579
+557A557D557F55855586558C558D558E559055925593559555965597559A559B
+559E55A055A155A255A355A455A555A655A855A955AA55AB55AC55AD55AE55AF
+55B055B255B455B655B855BA55BC55BF55C055C155C255C355C655C755C855CA
+55CB55CE55CF55D055D555D755D855D955DA55DB55DE55E055E255E755E955ED
+55EE55F055F155F455F655F855F955FA55FB55FC55FF56025603560456050000
+87
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56065607560A560B560D561056115612561356145615561656175619561A561C
+561D5620562156225625562656285629562A562B562E562F5630563356355637
+5638563A563C563D563E5640564156425643564456455646564756485649564A
+564B564F565056515652565356555656565A565B565D565E565F566056610000
+5663566556665667566D566E566F56705672567356745675567756785679567A
+567D567E567F56805681568256835684568756885689568A568B568C568D5690
+56915692569456955696569756985699569A569B569C569D569E569F56A056A1
+56A256A456A556A656A756A856A956AA56AB56AC56AD56AE56B056B156B256B3
+56B456B556B656B856B956BA56BB56BD56BE56BF56C056C156C256C356C456C5
+56C656C756C856C956CB56CC56CD56CE56CF56D056D156D256D356D556D656D8
+56D956DC56E356E556E656E756E856E956EA56EC56EE56EF56F256F356F656F7
+56F856FB56FC57005701570257055707570B570C570D570E570F571057110000
+88
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57125713571457155716571757185719571A571B571D571E5720572157225724
+572557265727572B5731573257345735573657375738573C573D573F57415743
+57445745574657485749574B5752575357545755575657585759576257635765
+5767576C576E5770577157725774577557785779577A577D577E577F57800000
+5781578757885789578A578D578E578F57905791579457955796579757985799
+579A579C579D579E579F57A557A857AA57AC57AF57B057B157B357B557B657B7
+57B957BA57BB57BC57BD57BE57BF57C057C157C457C557C657C757C857C957CA
+57CC57CD57D057D157D357D657D757DB57DC57DE57E157E257E357E557E657E7
+57E857E957EA57EB57EC57EE57F057F157F257F357F557F657F757FB57FC57FE
+57FF580158035804580558085809580A580C580E580F58105812581358145816
+58175818581A581B581C581D581F5822582358255826582758285829582B582C
+582D582E582F58315832583358345836583758385839583A583B583C583D0000
+89
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+583E583F584058415842584358455846584758485849584A584B584E584F5850
+585258535855585658575859585A585B585C585D585F58605861586258635864
+5866586758685869586A586D586E586F58705871587258735874587558765877
+58785879587A587B587C587D587F58825884588658875888588A588B588C0000
+588D588E588F5890589158945895589658975898589B589C589D58A058A158A2
+58A358A458A558A658A758AA58AB58AC58AD58AE58AF58B058B158B258B358B4
+58B558B658B758B858B958BA58BB58BD58BE58BF58C058C258C358C458C658C7
+58C858C958CA58CB58CC58CD58CE58CF58D058D258D358D458D658D758D858D9
+58DA58DB58DC58DD58DE58DF58E058E158E258E358E558E658E758E858E958EA
+58ED58EF58F158F258F458F558F758F858FA58FB58FC58FD58FE58FF59005901
+59035905590659085909590A590B590C590E591059115912591359175918591B
+591D591E592059215922592359265928592C59305932593359355936593B0000
+8A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+593D593E593F5940594359455946594A594C594D5950595259535959595B595C
+595D595E595F5961596359645966596759685969596A596B596C596D596E596F
+59705971597259755977597A597B597C597E597F598059855989598B598C598E
+598F59905991599459955998599A599B599C599D599F59A059A159A259A60000
+59A759AC59AD59B059B159B359B459B559B659B759B859BA59BC59BD59BF59C0
+59C159C259C359C459C559C759C859C959CC59CD59CE59CF59D559D659D959DB
+59DE59DF59E059E159E259E459E659E759E959EA59EB59ED59EE59EF59F059F1
+59F259F359F459F559F659F759F859FA59FC59FD59FE5A005A025A0A5A0B5A0D
+5A0E5A0F5A105A125A145A155A165A175A195A1A5A1B5A1D5A1E5A215A225A24
+5A265A275A285A2A5A2B5A2C5A2D5A2E5A2F5A305A335A355A375A385A395A3A
+5A3B5A3D5A3E5A3F5A415A425A435A445A455A475A485A4B5A4C5A4D5A4E5A4F
+5A505A515A525A535A545A565A575A585A595A5B5A5C5A5D5A5E5A5F5A600000
+8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A615A635A645A655A665A685A695A6B5A6C5A6D5A6E5A6F5A705A715A725A73
+5A785A795A7B5A7C5A7D5A7E5A805A815A825A835A845A855A865A875A885A89
+5A8A5A8B5A8C5A8D5A8E5A8F5A905A915A935A945A955A965A975A985A995A9C
+5A9D5A9E5A9F5AA05AA15AA25AA35AA45AA55AA65AA75AA85AA95AAB5AAC0000
+5AAD5AAE5AAF5AB05AB15AB45AB65AB75AB95ABA5ABB5ABC5ABD5ABF5AC05AC3
+5AC45AC55AC65AC75AC85ACA5ACB5ACD5ACE5ACF5AD05AD15AD35AD55AD75AD9
+5ADA5ADB5ADD5ADE5ADF5AE25AE45AE55AE75AE85AEA5AEC5AED5AEE5AEF5AF0
+5AF25AF35AF45AF55AF65AF75AF85AF95AFA5AFB5AFC5AFD5AFE5AFF5B005B01
+5B025B035B045B055B065B075B085B0A5B0B5B0C5B0D5B0E5B0F5B105B115B12
+5B135B145B155B185B195B1A5B1B5B1C5B1D5B1E5B1F5B205B215B225B235B24
+5B255B265B275B285B295B2A5B2B5B2C5B2D5B2E5B2F5B305B315B335B355B36
+5B385B395B3A5B3B5B3C5B3D5B3E5B3F5B415B425B435B445B455B465B470000
+8C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B485B495B4A5B4B5B4C5B4D5B4E5B4F5B525B565B5E5B605B615B675B685B6B
+5B6D5B6E5B6F5B725B745B765B775B785B795B7B5B7C5B7E5B7F5B825B865B8A
+5B8D5B8E5B905B915B925B945B965B9F5BA75BA85BA95BAC5BAD5BAE5BAF5BB1
+5BB25BB75BBA5BBB5BBC5BC05BC15BC35BC85BC95BCA5BCB5BCD5BCE5BCF0000
+5BD15BD45BD55BD65BD75BD85BD95BDA5BDB5BDC5BE05BE25BE35BE65BE75BE9
+5BEA5BEB5BEC5BED5BEF5BF15BF25BF35BF45BF55BF65BF75BFD5BFE5C005C02
+5C035C055C075C085C0B5C0C5C0D5C0E5C105C125C135C175C195C1B5C1E5C1F
+5C205C215C235C265C285C295C2A5C2B5C2D5C2E5C2F5C305C325C335C355C36
+5C375C435C445C465C475C4C5C4D5C525C535C545C565C575C585C5A5C5B5C5C
+5C5D5C5F5C625C645C675C685C695C6A5C6B5C6C5C6D5C705C725C735C745C75
+5C765C775C785C7B5C7C5C7D5C7E5C805C835C845C855C865C875C895C8A5C8B
+5C8E5C8F5C925C935C955C9D5C9E5C9F5CA05CA15CA45CA55CA65CA75CA80000
+8D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5CAA5CAE5CAF5CB05CB25CB45CB65CB95CBA5CBB5CBC5CBE5CC05CC25CC35CC5
+5CC65CC75CC85CC95CCA5CCC5CCD5CCE5CCF5CD05CD15CD35CD45CD55CD65CD7
+5CD85CDA5CDB5CDC5CDD5CDE5CDF5CE05CE25CE35CE75CE95CEB5CEC5CEE5CEF
+5CF15CF25CF35CF45CF55CF65CF75CF85CF95CFA5CFC5CFD5CFE5CFF5D000000
+5D015D045D055D085D095D0A5D0B5D0C5D0D5D0F5D105D115D125D135D155D17
+5D185D195D1A5D1C5D1D5D1F5D205D215D225D235D255D285D2A5D2B5D2C5D2F
+5D305D315D325D335D355D365D375D385D395D3A5D3B5D3C5D3F5D405D415D42
+5D435D445D455D465D485D495D4D5D4E5D4F5D505D515D525D535D545D555D56
+5D575D595D5A5D5C5D5E5D5F5D605D615D625D635D645D655D665D675D685D6A
+5D6D5D6E5D705D715D725D735D755D765D775D785D795D7A5D7B5D7C5D7D5D7E
+5D7F5D805D815D835D845D855D865D875D885D895D8A5D8B5D8C5D8D5D8E5D8F
+5D905D915D925D935D945D955D965D975D985D9A5D9B5D9C5D9E5D9F5DA00000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5DA15DA25DA35DA45DA55DA65DA75DA85DA95DAA5DAB5DAC5DAD5DAE5DAF5DB0
+5DB15DB25DB35DB45DB55DB65DB85DB95DBA5DBB5DBC5DBD5DBE5DBF5DC05DC1
+5DC25DC35DC45DC65DC75DC85DC95DCA5DCB5DCC5DCE5DCF5DD05DD15DD25DD3
+5DD45DD55DD65DD75DD85DD95DDA5DDC5DDF5DE05DE35DE45DEA5DEC5DED0000
+5DF05DF55DF65DF85DF95DFA5DFB5DFC5DFF5E005E045E075E095E0A5E0B5E0D
+5E0E5E125E135E175E1E5E1F5E205E215E225E235E245E255E285E295E2A5E2B
+5E2C5E2F5E305E325E335E345E355E365E395E3A5E3E5E3F5E405E415E435E46
+5E475E485E495E4A5E4B5E4D5E4E5E4F5E505E515E525E535E565E575E585E59
+5E5A5E5C5E5D5E5F5E605E635E645E655E665E675E685E695E6A5E6B5E6C5E6D
+5E6E5E6F5E705E715E755E775E795E7E5E815E825E835E855E885E895E8C5E8D
+5E8E5E925E985E9B5E9D5EA15EA25EA35EA45EA85EA95EAA5EAB5EAC5EAE5EAF
+5EB05EB15EB25EB45EBA5EBB5EBC5EBD5EBF5EC05EC15EC25EC35EC45EC50000
+8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5EC65EC75EC85ECB5ECC5ECD5ECE5ECF5ED05ED45ED55ED75ED85ED95EDA5EDC
+5EDD5EDE5EDF5EE05EE15EE25EE35EE45EE55EE65EE75EE95EEB5EEC5EED5EEE
+5EEF5EF05EF15EF25EF35EF55EF85EF95EFB5EFC5EFD5F055F065F075F095F0C
+5F0D5F0E5F105F125F145F165F195F1A5F1C5F1D5F1E5F215F225F235F240000
+5F285F2B5F2C5F2E5F305F325F335F345F355F365F375F385F3B5F3D5F3E5F3F
+5F415F425F435F445F455F465F475F485F495F4A5F4B5F4C5F4D5F4E5F4F5F51
+5F545F595F5A5F5B5F5C5F5E5F5F5F605F635F655F675F685F6B5F6E5F6F5F72
+5F745F755F765F785F7A5F7D5F7E5F7F5F835F865F8D5F8E5F8F5F915F935F94
+5F965F9A5F9B5F9D5F9E5F9F5FA05FA25FA35FA45FA55FA65FA75FA95FAB5FAC
+5FAF5FB05FB15FB25FB35FB45FB65FB85FB95FBA5FBB5FBE5FBF5FC05FC15FC2
+5FC75FC85FCA5FCB5FCE5FD35FD45FD55FDA5FDB5FDC5FDE5FDF5FE25FE35FE5
+5FE65FE85FE95FEC5FEF5FF05FF25FF35FF45FF65FF75FF95FFA5FFC60070000
+90
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60086009600B600C60106011601360176018601A601E601F602260236024602C
+602D602E603060316032603360346036603760386039603A603D603E60406044
+60456046604760486049604A604C604E604F605160536054605660576058605B
+605C605E605F6060606160656066606E60716072607460756077607E60800000
+608160826085608660876088608A608B608E608F609060916093609560976098
+6099609C609E60A160A260A460A560A760A960AA60AE60B060B360B560B660B7
+60B960BA60BD60BE60BF60C060C160C260C360C460C760C860C960CC60CD60CE
+60CF60D060D260D360D460D660D760D960DB60DE60E160E260E360E460E560EA
+60F160F260F560F760F860FB60FC60FD60FE60FF61026103610461056107610A
+610B610C611061116112611361146116611761186119611B611C611D611E6121
+6122612561286129612A612C612D612E612F6130613161326133613461356136
+613761386139613A613B613C613D613E61406141614261436144614561460000
+91
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61476149614B614D614F61506152615361546156615761586159615A615B615C
+615E615F6160616161636164616561666169616A616B616C616D616E616F6171
+617261736174617661786179617A617B617C617D617E617F6180618161826183
+618461856186618761886189618A618C618D618F619061916192619361950000
+6196619761986199619A619B619C619E619F61A061A161A261A361A461A561A6
+61AA61AB61AD61AE61AF61B061B161B261B361B461B561B661B861B961BA61BB
+61BC61BD61BF61C061C161C361C461C561C661C761C961CC61CD61CE61CF61D0
+61D361D561D661D761D861D961DA61DB61DC61DD61DE61DF61E061E161E261E3
+61E461E561E761E861E961EA61EB61EC61ED61EE61EF61F061F161F261F361F4
+61F661F761F861F961FA61FB61FC61FD61FE6200620162026203620462056207
+6209621362146219621C621D621E622062236226622762286229622B622D622F
+6230623162326235623662386239623A623B623C6242624462456246624A0000
+92
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+624F62506255625662576259625A625C625D625E625F62606261626262646265
+6268627162726274627562776278627A627B627D628162826283628562866287
+6288628B628C628D628E628F629062946299629C629D629E62A362A662A762A9
+62AA62AD62AE62AF62B062B262B362B462B662B762B862BA62BE62C062C10000
+62C362CB62CF62D162D562DD62DE62E062E162E462EA62EB62F062F262F562F8
+62F962FA62FB63006303630463056306630A630B630C630D630F631063126313
+63146315631763186319631C632663276329632C632D632E6330633163336334
+6335633663376338633B633C633E633F63406341634463476348634A63516352
+635363546356635763586359635A635B635C635D63606364636563666368636A
+636B636C636F6370637263736374637563786379637C637D637E637F63816383
+638463856386638B638D639163936394639563976399639A639B639C639D639E
+639F63A163A463A663AB63AF63B163B263B563B663B963BB63BD63BF63C00000
+93
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63C163C263C363C563C763C863CA63CB63CC63D163D363D463D563D763D863D9
+63DA63DB63DC63DD63DF63E263E463E563E663E763E863EB63EC63EE63EF63F0
+63F163F363F563F763F963FA63FB63FC63FE640364046406640764086409640A
+640D640E6411641264156416641764186419641A641D641F6422642364240000
+6425642764286429642B642E642F643064316432643364356436643764386439
+643B643C643E6440644264436449644B644C644D644E644F6450645164536455
+645664576459645A645B645C645D645F64606461646264636464646564666468
+646A646B646C646E646F64706471647264736474647564766477647B647C647D
+647E647F648064816483648664886489648A648B648C648D648E648F64906493
+649464976498649A649B649C649D649F64A064A164A264A364A564A664A764A8
+64AA64AB64AF64B164B264B364B464B664B964BB64BD64BE64BF64C164C364C4
+64C664C764C864C964CA64CB64CC64CF64D164D364D464D564D664D964DA0000
+94
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64DB64DC64DD64DF64E064E164E364E564E764E864E964EA64EB64EC64ED64EE
+64EF64F064F164F264F364F464F564F664F764F864F964FA64FB64FC64FD64FE
+64FF65016502650365046505650665076508650A650B650C650D650E650F6510
+6511651365146515651665176519651A651B651C651D651E651F652065210000
+6522652365246526652765286529652A652C652D65306531653265336537653A
+653C653D6540654165426543654465466547654A654B654D654E655065526553
+655465576558655A655C655F6560656165646565656765686569656A656D656E
+656F657165736575657665786579657A657B657C657D657E657F658065816582
+658365846585658665886589658A658D658E658F65926594659565966598659A
+659D659E65A065A265A365A665A865AA65AC65AE65B165B265B365B465B565B6
+65B765B865BA65BB65BE65BF65C065C265C765C865C965CA65CD65D065D165D3
+65D465D565D865D965DA65DB65DC65DD65DE65DF65E165E365E465EA65EB0000
+95
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65F265F365F465F565F865F965FB65FC65FD65FE65FF66016604660566076608
+6609660B660D661066116612661666176618661A661B661C661E662166226623
+662466266629662A662B662C662E663066326633663766386639663A663B663D
+663F66406642664466456646664766486649664A664D664E6650665166580000
+6659665B665C665D665E666066626663666566676669666A666B666C666D6671
+66726673667566786679667B667C667D667F6680668166836685668666886689
+668A668B668D668E668F6690669266936694669566986699669A669B669C669E
+669F66A066A166A266A366A466A566A666A966AA66AB66AC66AD66AF66B066B1
+66B266B366B566B666B766B866BA66BB66BC66BD66BF66C066C166C266C366C4
+66C566C666C766C866C966CA66CB66CC66CD66CE66CF66D066D166D266D366D4
+66D566D666D766D866DA66DE66DF66E066E166E266E366E466E566E766E866EA
+66EB66EC66ED66EE66EF66F166F566F666F866FA66FB66FD6701670267030000
+96
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6704670567066707670C670E670F671167126713671667186719671A671C671E
+67206721672267236724672567276729672E6730673267336736673767386739
+673B673C673E673F6741674467456747674A674B674D67526754675567576758
+6759675A675B675D67626763676467666767676B676C676E6771677467760000
+67786779677A677B677D678067826783678567866788678A678C678D678E678F
+679167926793679467966799679B679F67A067A167A467A667A967AC67AE67B1
+67B267B467B967BA67BB67BC67BD67BE67BF67C067C267C567C667C767C867C9
+67CA67CB67CC67CD67CE67D567D667D767DB67DF67E167E367E467E667E767E8
+67EA67EB67ED67EE67F267F567F667F767F867F967FA67FB67FC67FE68016802
+680368046806680D681068126814681568186819681A681B681C681E681F6820
+6822682368246825682668276828682B682C682D682E682F6830683168346835
+6836683A683B683F6847684B684D684F68526856685768586859685A685B0000
+97
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+685C685D685E685F686A686C686D686E686F6870687168726873687568786879
+687A687B687C687D687E687F688068826884688768886889688A688B688C688D
+688E68906891689268946895689668986899689A689B689C689D689E689F68A0
+68A168A368A468A568A968AA68AB68AC68AE68B168B268B468B668B768B80000
+68B968BA68BB68BC68BD68BE68BF68C168C368C468C568C668C768C868CA68CC
+68CE68CF68D068D168D368D468D668D768D968DB68DC68DD68DE68DF68E168E2
+68E468E568E668E768E868E968EA68EB68EC68ED68EF68F268F368F468F668F7
+68F868FB68FD68FE68FF69006902690369046906690769086909690A690C690F
+69116913691469156916691769186919691A691B691C691D691E692169226923
+69256926692769286929692A692B692C692E692F693169326933693569366937
+6938693A693B693C693E694069416943694469456946694769486949694A694B
+694C694D694E694F69506951695269536955695669586959695B695C695F0000
+98
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6961696269646965696769686969696A696C696D696F69706972697369746975
+6976697A697B697D697E697F698169836985698A698B698C698E698F69906991
+69926993699669976999699A699D699E699F69A069A169A269A369A469A569A6
+69A969AA69AC69AE69AF69B069B269B369B569B669B869B969BA69BC69BD0000
+69BE69BF69C069C269C369C469C569C669C769C869C969CB69CD69CF69D169D2
+69D369D569D669D769D869D969DA69DC69DD69DE69E169E269E369E469E569E6
+69E769E869E969EA69EB69EC69EE69EF69F069F169F369F469F569F669F769F8
+69F969FA69FB69FC69FE6A006A016A026A036A046A056A066A076A086A096A0B
+6A0C6A0D6A0E6A0F6A106A116A126A136A146A156A166A196A1A6A1B6A1C6A1D
+6A1E6A206A226A236A246A256A266A276A296A2B6A2C6A2D6A2E6A306A326A33
+6A346A366A376A386A396A3A6A3B6A3C6A3F6A406A416A426A436A456A466A48
+6A496A4A6A4B6A4C6A4D6A4E6A4F6A516A526A536A546A556A566A576A5A0000
+99
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A5C6A5D6A5E6A5F6A606A626A636A646A666A676A686A696A6A6A6B6A6C6A6D
+6A6E6A6F6A706A726A736A746A756A766A776A786A7A6A7B6A7D6A7E6A7F6A81
+6A826A836A856A866A876A886A896A8A6A8B6A8C6A8D6A8F6A926A936A946A95
+6A966A986A996A9A6A9B6A9C6A9D6A9E6A9F6AA16AA26AA36AA46AA56AA60000
+6AA76AA86AAA6AAD6AAE6AAF6AB06AB16AB26AB36AB46AB56AB66AB76AB86AB9
+6ABA6ABB6ABC6ABD6ABE6ABF6AC06AC16AC26AC36AC46AC56AC66AC76AC86AC9
+6ACA6ACB6ACC6ACD6ACE6ACF6AD06AD16AD26AD36AD46AD56AD66AD76AD86AD9
+6ADA6ADB6ADC6ADD6ADE6ADF6AE06AE16AE26AE36AE46AE56AE66AE76AE86AE9
+6AEA6AEB6AEC6AED6AEE6AEF6AF06AF16AF26AF36AF46AF56AF66AF76AF86AF9
+6AFA6AFB6AFC6AFD6AFE6AFF6B006B016B026B036B046B056B066B076B086B09
+6B0A6B0B6B0C6B0D6B0E6B0F6B106B116B126B136B146B156B166B176B186B19
+6B1A6B1B6B1C6B1D6B1E6B1F6B256B266B286B296B2A6B2B6B2C6B2D6B2E0000
+9A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B2F6B306B316B336B346B356B366B386B3B6B3C6B3D6B3F6B406B416B426B44
+6B456B486B4A6B4B6B4D6B4E6B4F6B506B516B526B536B546B556B566B576B58
+6B5A6B5B6B5C6B5D6B5E6B5F6B606B616B686B696B6B6B6C6B6D6B6E6B6F6B70
+6B716B726B736B746B756B766B776B786B7A6B7D6B7E6B7F6B806B856B880000
+6B8C6B8E6B8F6B906B916B946B956B976B986B996B9C6B9D6B9E6B9F6BA06BA2
+6BA36BA46BA56BA66BA76BA86BA96BAB6BAC6BAD6BAE6BAF6BB06BB16BB26BB6
+6BB86BB96BBA6BBB6BBC6BBD6BBE6BC06BC36BC46BC66BC76BC86BC96BCA6BCC
+6BCE6BD06BD16BD86BDA6BDC6BDD6BDE6BDF6BE06BE26BE36BE46BE56BE66BE7
+6BE86BE96BEC6BED6BEE6BF06BF16BF26BF46BF66BF76BF86BFA6BFB6BFC6BFE
+6BFF6C006C016C026C036C046C086C096C0A6C0B6C0C6C0E6C126C176C1C6C1D
+6C1E6C206C236C256C2B6C2C6C2D6C316C336C366C376C396C3A6C3B6C3C6C3E
+6C3F6C436C446C456C486C4B6C4C6C4D6C4E6C4F6C516C526C536C566C580000
+9B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C596C5A6C626C636C656C666C676C6B6C6C6C6D6C6E6C6F6C716C736C756C77
+6C786C7A6C7B6C7C6C7F6C806C846C876C8A6C8B6C8D6C8E6C916C926C956C96
+6C976C986C9A6C9C6C9D6C9E6CA06CA26CA86CAC6CAF6CB06CB46CB56CB66CB7
+6CBA6CC06CC16CC26CC36CC66CC76CC86CCB6CCD6CCE6CCF6CD16CD26CD80000
+6CD96CDA6CDC6CDD6CDF6CE46CE66CE76CE96CEC6CED6CF26CF46CF96CFF6D00
+6D026D036D056D066D086D096D0A6D0D6D0F6D106D116D136D146D156D166D18
+6D1C6D1D6D1F6D206D216D226D236D246D266D286D296D2C6D2D6D2F6D306D34
+6D366D376D386D3A6D3F6D406D426D446D496D4C6D506D556D566D576D586D5B
+6D5D6D5F6D616D626D646D656D676D686D6B6D6C6D6D6D706D716D726D736D75
+6D766D796D7A6D7B6D7D6D7E6D7F6D806D816D836D846D866D876D8A6D8B6D8D
+6D8F6D906D926D966D976D986D996D9A6D9C6DA26DA56DAC6DAD6DB06DB16DB3
+6DB46DB66DB76DB96DBA6DBB6DBC6DBD6DBE6DC16DC26DC36DC86DC96DCA0000
+9C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6DCD6DCE6DCF6DD06DD26DD36DD46DD56DD76DDA6DDB6DDC6DDF6DE26DE36DE5
+6DE76DE86DE96DEA6DED6DEF6DF06DF26DF46DF56DF66DF86DFA6DFD6DFE6DFF
+6E006E016E026E036E046E066E076E086E096E0B6E0F6E126E136E156E186E19
+6E1B6E1C6E1E6E1F6E226E266E276E286E2A6E2C6E2E6E306E316E336E350000
+6E366E376E396E3B6E3C6E3D6E3E6E3F6E406E416E426E456E466E476E486E49
+6E4A6E4B6E4C6E4F6E506E516E526E556E576E596E5A6E5C6E5D6E5E6E606E61
+6E626E636E646E656E666E676E686E696E6A6E6C6E6D6E6F6E706E716E726E73
+6E746E756E766E776E786E796E7A6E7B6E7C6E7D6E806E816E826E846E876E88
+6E8A6E8B6E8C6E8D6E8E6E916E926E936E946E956E966E976E996E9A6E9B6E9D
+6E9E6EA06EA16EA36EA46EA66EA86EA96EAB6EAC6EAD6EAE6EB06EB36EB56EB8
+6EB96EBC6EBE6EBF6EC06EC36EC46EC56EC66EC86EC96ECA6ECC6ECD6ECE6ED0
+6ED26ED66ED86ED96EDB6EDC6EDD6EE36EE76EEA6EEB6EEC6EED6EEE6EEF0000
+9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6EF06EF16EF26EF36EF56EF66EF76EF86EFA6EFB6EFC6EFD6EFE6EFF6F006F01
+6F036F046F056F076F086F0A6F0B6F0C6F0D6F0E6F106F116F126F166F176F18
+6F196F1A6F1B6F1C6F1D6F1E6F1F6F216F226F236F256F266F276F286F2C6F2E
+6F306F326F346F356F376F386F396F3A6F3B6F3C6F3D6F3F6F406F416F420000
+6F436F446F456F486F496F4A6F4C6F4E6F4F6F506F516F526F536F546F556F56
+6F576F596F5A6F5B6F5D6F5F6F606F616F636F646F656F676F686F696F6A6F6B
+6F6C6F6F6F706F716F736F756F766F776F796F7B6F7D6F7E6F7F6F806F816F82
+6F836F856F866F876F8A6F8B6F8F6F906F916F926F936F946F956F966F976F98
+6F996F9A6F9B6F9D6F9E6F9F6FA06FA26FA36FA46FA56FA66FA86FA96FAA6FAB
+6FAC6FAD6FAE6FAF6FB06FB16FB26FB46FB56FB76FB86FBA6FBB6FBC6FBD6FBE
+6FBF6FC16FC36FC46FC56FC66FC76FC86FCA6FCB6FCC6FCD6FCE6FCF6FD06FD3
+6FD46FD56FD66FD76FD86FD96FDA6FDB6FDC6FDD6FDF6FE26FE36FE46FE50000
+9E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6FE66FE76FE86FE96FEA6FEB6FEC6FED6FF06FF16FF26FF36FF46FF56FF66FF7
+6FF86FF96FFA6FFB6FFC6FFD6FFE6FFF70007001700270037004700570067007
+70087009700A700B700C700D700E700F70107012701370147015701670177018
+7019701C701D701E701F702070217022702470257026702770287029702A0000
+702B702C702D702E702F70307031703270337034703670377038703A703B703C
+703D703E703F7040704170427043704470457046704770487049704A704B704D
+704E7050705170527053705470557056705770587059705A705B705C705D705F
+7060706170627063706470657066706770687069706A706E7071707270737074
+70777079707A707B707D7081708270837084708670877088708B708C708D708F
+70907091709370977098709A709B709E709F70A070A170A270A370A470A570A6
+70A770A870A970AA70B070B270B470B570B670BA70BE70BF70C470C570C670C7
+70C970CB70CC70CD70CE70CF70D070D170D270D370D470D570D670D770DA0000
+9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+70DC70DD70DE70E070E170E270E370E570EA70EE70F070F170F270F370F470F5
+70F670F870FA70FB70FC70FE70FF710071017102710371047105710671077108
+710B710C710D710E710F7111711271147117711B711C711D711E711F71207121
+7122712371247125712771287129712A712B712C712D712E7132713371340000
+7135713771387139713A713B713C713D713E713F714071417142714371447146
+714771487149714B714D714F7150715171527153715471557156715771587159
+715A715B715D715F716071617162716371657169716A716B716C716D716F7170
+717171747175717671777179717B717C717E717F718071817182718371857186
+718771887189718B718C718D718E7190719171927193719571967197719A719B
+719C719D719E71A171A271A371A471A571A671A771A971AA71AB71AD71AE71AF
+71B071B171B271B471B671B771B871BA71BB71BC71BD71BE71BF71C071C171C2
+71C471C571C671C771C871C971CA71CB71CC71CD71CF71D071D171D271D30000
+A0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+71D671D771D871D971DA71DB71DC71DD71DE71DF71E171E271E371E471E671E8
+71E971EA71EB71EC71ED71EF71F071F171F271F371F471F571F671F771F871FA
+71FB71FC71FD71FE71FF720072017202720372047205720772087209720A720B
+720C720D720E720F7210721172127213721472157216721772187219721A0000
+721B721C721E721F722072217222722372247225722672277229722B722D722E
+722F723272337234723A723C723E72407241724272437244724572467249724A
+724B724E724F7250725172537254725572577258725A725C725E726072637264
+72657268726A726B726C726D7270727172737274727672777278727B727C727D
+7282728372857286728772887289728C728E7290729172937294729572967297
+72987299729A729B729C729D729E72A072A172A272A372A472A572A672A772A8
+72A972AA72AB72AE72B172B272B372B572BA72BB72BC72BD72BE72BF72C072C5
+72C672C772C972CA72CB72CC72CF72D172D372D472D572D672D872DA72DB0000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300200B702C902C700A8300330052014FF5E2016202620182019
+201C201D3014301530083009300A300B300C300D300E300F3016301730103011
+00B100D700F72236222722282211220F222A222922082237221A22A522252220
+23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235
+22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605
+25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000217021712172217321742175217621772178217900000000000000000000
+000024882489248A248B248C248D248E248F2490249124922493249424952496
+249724982499249A249B247424752476247724782479247A247B247C247D247E
+247F248024812482248324842485248624872460246124622463246424652466
+2467246824690000000032203221322232233224322532263227322832290000
+00002160216121622163216421652166216721682169216A216B000000000000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+FE35FE36FE39FE3AFE3FFE40FE3DFE3EFE41FE42FE43FE4400000000FE3BFE3C
+FE37FE38FE310000FE33FE340000000000000000000000000000000000000000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+02CA02CB02D920132015202520352105210921962197219821992215221F2223
+22522266226722BF2550255125522553255425552556255725582559255A255B
+255C255D255E255F2560256125622563256425652566256725682569256A256B
+256C256D256E256F257025712572257325812582258325842585258625870000
+25882589258A258B258C258D258E258F25932594259525BC25BD25E225E325E4
+25E5260922953012301D301E0000000000000000000000000000000000000000
+0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2
+00F2016B00FA01D400F901D601D801DA01DC00FC00EA02510000014401480000
+0261000000000000000031053106310731083109310A310B310C310D310E310F
+3110311131123113311431153116311731183119311A311B311C311D311E311F
+3120312131223123312431253126312731283129000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30213022302330243025302630273028302932A3338E338F339C339D339E33A1
+33C433CE33D133D233D5FE30FFE2FFE400002121323100002010000000000000
+30FC309B309C30FD30FE3006309D309EFE49FE4AFE4BFE4CFE4DFE4EFE4FFE50
+FE51FE52FE54FE55FE56FE57FE59FE5AFE5BFE5CFE5DFE5EFE5FFE60FE610000
+FE62FE63FE64FE65FE66FE68FE69FE6AFE6B0000000000000000000000000000
+0000000000000000000000003007000000000000000000000000000000000000
+00000000000000002500250125022503250425052506250725082509250A250B
+250C250D250E250F2510251125122513251425152516251725182519251A251B
+251C251D251E251F2520252125222523252425252526252725282529252A252B
+252C252D252E252F2530253125322533253425352536253725382539253A253B
+253C253D253E253F2540254125422543254425452546254725482549254A254B
+0000000000000000000000000000000000000000000000000000000000000000
+AA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72DC72DD72DF72E272E372E472E572E672E772EA72EB72F572F672F972FD72FE
+72FF73007302730473057306730773087309730B730C730D730F731073117312
+731473187319731A731F732073237324732673277328732D732F733073327333
+73357336733A733B733C733D7340734173427343734473457346734773480000
+7349734A734B734C734E734F7351735373547355735673587359735A735B735C
+735D735E735F736173627363736473657366736773687369736A736B736E7370
+7371000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73727373737473757376737773787379737A737B737C737D737F738073817382
+7383738573867388738A738C738D738F73907392739373947395739773987399
+739A739C739D739E73A073A173A373A473A573A673A773A873AA73AC73AD73B1
+73B473B573B673B873B973BC73BD73BE73BF73C173C373C473C573C673C70000
+73CB73CC73CE73D273D373D473D573D673D773D873DA73DB73DC73DD73DF73E1
+73E273E373E473E673E873EA73EB73EC73EE73EF73F073F173F373F473F573F6
+73F7000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73F873F973FA73FB73FC73FD73FE73FF740074017402740474077408740B740C
+740D740E741174127413741474157416741774187419741C741D741E741F7420
+74217423742474277429742B742D742F74317432743774387439743A743B743D
+743E743F744074427443744474457446744774487449744A744B744C744D0000
+744E744F7450745174527453745474567458745D746074617462746374647465
+7466746774687469746A746B746C746E746F7471747274737474747574787479
+747A000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+747B747C747D747F748274847485748674887489748A748C748D748F74917492
+7493749474957496749774987499749A749B749D749F74A074A174A274A374A4
+74A574A674AA74AB74AC74AD74AE74AF74B074B174B274B374B474B574B674B7
+74B874B974BB74BC74BD74BE74BF74C074C174C274C374C474C574C674C70000
+74C874C974CA74CB74CC74CD74CE74CF74D074D174D374D474D574D674D774D8
+74D974DA74DB74DD74DF74E174E574E774E874E974EA74EB74EC74ED74F074F1
+74F2000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74F374F574F874F974FA74FB74FC74FD74FE7500750175027503750575067507
+75087509750A750B750C750E751075127514751575167517751B751D751E7520
+752175227523752475267527752A752E753475367539753C753D753F75417542
+75437544754675477549754A754D755075517552755375557556755775580000
+755D755E755F75607561756275637564756775687569756B756C756D756E756F
+757075717573757575767577757A757B757C757D757E75807581758275847585
+7587000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+75887589758A758C758D758E7590759375957598759B759C759E75A275A675A7
+75A875A975AA75AD75B675B775BA75BB75BF75C075C175C675CB75CC75CE75CF
+75D075D175D375D775D975DA75DC75DD75DF75E075E175E575E975EC75ED75EE
+75EF75F275F375F575F675F775F875FA75FB75FD75FE76027604760676070000
+76087609760B760D760E760F76117612761376147616761A761C761D761E7621
+762376277628762C762E762F76317632763676377639763A763B763D76417642
+7644000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+76457646764776487649764A764B764E764F7650765176527653765576577658
+7659765A765B765D765F766076617662766476657666766776687669766A766C
+766D766E767076717672767376747675767676777679767A767C767F76807681
+768376857689768A768C768D768F769076927694769576977698769A769B0000
+769C769D769E769F76A076A176A276A376A576A676A776A876A976AA76AB76AC
+76AD76AF76B076B376B576B676B776B876B976BA76BB76BC76BD76BE76C076C1
+76C3554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698
+978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1
+888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB
+9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591
+73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E
+6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+76C476C776C976CB76CC76D376D576D976DA76DC76DD76DE76E076E176E276E3
+76E476E676E776E876E976EA76EB76EC76ED76F076F376F576F676F776FA76FB
+76FD76FF77007702770377057706770A770C770E770F77107711771277137714
+7715771677177718771B771C771D771E77217723772477257727772A772B0000
+772C772E773077317732773377347739773B773D773E773F7742774477457746
+77487749774A774B774C774D774E774F77527753775477557756775777587759
+775C858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2
+535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28
+5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5
+6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9
+7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B
+522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+775D775E775F7760776477677769776A776D776E776F77707771777277737774
+7775777677777778777A777B777C7781778277837786778777887789778A778B
+778F77907793779477957796779777987799779A779B779C779D779E77A177A3
+77A477A677A877AB77AD77AE77AF77B177B277B477B677B777B877B977BA0000
+77BC77BE77C077C177C277C377C477C577C677C777C877C977CA77CB77CC77CE
+77CF77D077D177D277D377D477D577D677D877D977DA77DD77DE77DF77E077E1
+77E475C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B
+82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8
+601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695
+6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56
+4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7
+62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77E677E877EA77EF77F077F177F277F477F577F777F977FA77FB77FC78037804
+7805780678077808780A780B780E780F7810781378157819781B781E78207821
+782278247828782A782B782E782F78317832783378357836783D783F78417842
+78437844784678487849784A784B784D784F78517853785478587859785A0000
+785B785C785E785F7860786178627863786478657866786778687869786F7870
+78717872787378747875787678787879787A787B787D787E787F788078817882
+7883573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D
+56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668
+5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA
+627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A
+8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79
+4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7884788578867888788A788B788F789078927894789578967899789D789E78A0
+78A278A478A678A878A978AA78AB78AC78AD78AE78AF78B578B678B778B878BA
+78BB78BC78BD78BF78C078C278C378C478C678C778C878CC78CD78CE78CF78D1
+78D278D378D678D778D878DA78DB78DC78DD78DE78DF78E078E178E278E30000
+78E478E578E678E778E978EA78EB78ED78EE78EF78F078F178F378F578F678F8
+78F978FB78FC78FD78FE78FF79007902790379047906790779087909790A790B
+790C784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE
+7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF
+882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A
+847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC
+810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE
+7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+790D790E790F791079117912791479157916791779187919791A791B791C791D
+791F792079217922792379257926792779287929792A792B792C792D792E792F
+793079317932793379357936793779387939793D793F79427943794479457947
+794A794B794C794D794E794F7950795179527954795579587959796179630000
+796479667969796A796B796C796E79707971797279737974797579767979797B
+797C797D797E797F798279837986798779887989798B798C798D798E79907991
+79926020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39
+86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC
+905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA
+654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0
+63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889
+53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7993799479957996799779987999799B799C799D799E799F79A079A179A279A3
+79A479A579A679A879A979AA79AB79AC79AD79AE79AF79B079B179B279B479B5
+79B679B779B879BC79BF79C279C479C579C779C879CA79CC79CE79CF79D079D3
+79D479D679D779D979DA79DB79DC79DD79DE79E079E179E279E579E879EA0000
+79EC79EE79F179F279F379F479F579F679F779F979FA79FC79FE79FF7A017A04
+7A057A077A087A097A0A7A0C7A0F7A107A117A127A137A157A167A187A197A1B
+7A1C4E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8
+680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A
+72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD
+7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6
+591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9
+5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A1D7A1F7A217A227A247A257A267A277A287A297A2A7A2B7A2C7A2D7A2E7A2F
+7A307A317A327A347A357A367A387A3A7A3E7A407A417A427A437A447A457A47
+7A487A497A4A7A4B7A4C7A4D7A4E7A4F7A507A527A537A547A557A567A587A59
+7A5A7A5B7A5C7A5D7A5E7A5F7A607A617A627A637A647A657A667A677A680000
+7A697A6A7A6B7A6C7A6D7A6E7A6F7A717A727A737A757A7B7A7C7A7D7A7E7A82
+7A857A877A897A8A7A8B7A8C7A8E7A8F7A907A937A947A997A9A7A9B7A9E7AA1
+7AA28D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE
+94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F
+963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F
+6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124
+7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4
+4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7AA37AA47AA77AA97AAA7AAB7AAE7AAF7AB07AB17AB27AB47AB57AB67AB77AB8
+7AB97ABA7ABB7ABC7ABD7ABE7AC07AC17AC27AC37AC47AC57AC67AC77AC87AC9
+7ACA7ACC7ACD7ACE7ACF7AD07AD17AD27AD37AD47AD57AD77AD87ADA7ADB7ADC
+7ADD7AE17AE27AE47AE77AE87AE97AEA7AEB7AEC7AEE7AF07AF17AF27AF30000
+7AF47AF57AF67AF77AF87AFB7AFC7AFE7B007B017B027B057B077B097B0C7B0D
+7B0E7B107B127B137B167B177B187B1A7B1C7B1D7B1F7B217B227B237B277B29
+7B2D6D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150
+8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A
+54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76
+611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8
+818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769
+845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7B2F7B307B327B347B357B367B377B397B3B7B3D7B3F7B407B417B427B437B44
+7B467B487B4A7B4D7B4E7B537B557B577B597B5C7B5E7B5F7B617B637B647B65
+7B667B677B687B697B6A7B6B7B6C7B6D7B6F7B707B737B747B767B787B7A7B7C
+7B7D7B7F7B817B827B837B847B867B877B887B897B8A7B8B7B8C7B8E7B8F0000
+7B917B927B937B967B987B997B9A7B9B7B9E7B9F7BA07BA37BA47BA57BAE7BAF
+7BB07BB27BB37BB57BB67BB77BB97BBA7BBB7BBC7BBD7BBE7BBF7BC07BC27BC3
+7BC457C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E
+62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D
+4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC
+52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF
+704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678
+684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7BC57BC87BC97BCA7BCB7BCD7BCE7BCF7BD07BD27BD47BD57BD67BD77BD87BDB
+7BDC7BDE7BDF7BE07BE27BE37BE47BE77BE87BE97BEB7BEC7BED7BEF7BF07BF2
+7BF37BF47BF57BF67BF87BF97BFA7BFB7BFD7BFF7C007C017C027C037C047C05
+7C067C087C097C0A7C0D7C0E7C107C117C127C137C147C157C177C187C190000
+7C1A7C1B7C1C7C1D7C1E7C207C217C227C237C247C257C287C297C2B7C2C7C2D
+7C2E7C2F7C307C317C327C337C347C357C367C377C397C3A7C3B7C3C7C3D7C3E
+7C429AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD
+558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E
+8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408
+76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC
+4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334
+543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7C437C447C457C467C477C487C497C4A7C4B7C4C7C4E7C4F7C507C517C527C53
+7C547C557C567C577C587C597C5A7C5B7C5C7C5D7C5E7C5F7C607C617C627C63
+7C647C657C667C677C687C697C6A7C6B7C6C7C6D7C6E7C6F7C707C717C727C75
+7C767C777C787C797C7A7C7E7C7F7C807C817C827C837C847C857C867C870000
+7C887C8A7C8B7C8C7C8D7C8E7C8F7C907C937C947C967C997C9A7C9B7CA07CA1
+7CA37CA67CA77CA87CA97CAB7CAC7CAD7CAF7CB07CB47CB57CB67CB77CB87CBA
+7CBB5F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316
+8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62
+71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C
+604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F
+79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19
+706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7CBF7CC07CC27CC37CC47CC67CC97CCB7CCE7CCF7CD07CD17CD27CD37CD47CD8
+7CDA7CDB7CDD7CDE7CE17CE27CE37CE47CE57CE67CE77CE97CEA7CEB7CEC7CED
+7CEE7CF07CF17CF27CF37CF47CF57CF67CF77CF97CFA7CFC7CFD7CFE7CFF7D00
+7D017D027D037D047D057D067D077D087D097D0B7D0C7D0D7D0E7D0F7D100000
+7D117D127D137D147D157D167D177D187D197D1A7D1B7D1C7D1D7D1E7D1F7D21
+7D237D247D257D267D287D297D2A7D2C7D2D7D2E7D307D317D327D337D347D35
+7D36808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6
+53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E
+796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7
+59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C
+76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877
+62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D377D387D397D3A7D3B7D3C7D3D7D3E7D3F7D407D417D427D437D447D457D46
+7D477D487D497D4A7D4B7D4C7D4D7D4E7D4F7D507D517D527D537D547D557D56
+7D577D587D597D5A7D5B7D5C7D5D7D5E7D5F7D607D617D627D637D647D657D66
+7D677D687D697D6A7D6B7D6C7D6D7D6F7D707D717D727D737D747D757D760000
+7D787D797D7A7D7B7D7C7D7D7D7E7D7F7D807D817D827D837D847D857D867D87
+7D887D897D8A7D8B7D8C7D8D7D8E7D8F7D907D917D927D937D947D957D967D97
+7D98506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B
+686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07
+56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83
+53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED
+6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4
+91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D997D9A7D9B7D9C7D9D7D9E7D9F7DA07DA17DA27DA37DA47DA57DA77DA87DA9
+7DAA7DAB7DAC7DAD7DAF7DB07DB17DB27DB37DB47DB57DB67DB77DB87DB97DBA
+7DBB7DBC7DBD7DBE7DBF7DC07DC17DC27DC37DC47DC57DC67DC77DC87DC97DCA
+7DCB7DCC7DCD7DCE7DCF7DD07DD17DD27DD37DD47DD57DD67DD77DD87DD90000
+7DDA7DDB7DDC7DDD7DDE7DDF7DE07DE17DE27DE37DE47DE57DE67DE77DE87DE9
+7DEA7DEB7DEC7DED7DEE7DEF7DF07DF17DF27DF37DF47DF57DF67DF77DF87DF9
+7DFA5C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66
+666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76
+7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0
+62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177
+8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485
+652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7DFB7DFC7DFD7DFE7DFF7E007E017E027E037E047E057E067E077E087E097E0A
+7E0B7E0C7E0D7E0E7E0F7E107E117E127E137E147E157E167E177E187E197E1A
+7E1B7E1C7E1D7E1E7E1F7E207E217E227E237E247E257E267E277E287E297E2A
+7E2B7E2C7E2D7E2E7E2F7E307E317E327E337E347E357E367E377E387E390000
+7E3A7E3C7E3D7E3E7E3F7E407E427E437E447E457E467E487E497E4A7E4B7E4C
+7E4D7E4E7E4F7E507E517E527E537E547E557E567E577E587E597E5A7E5B7E5C
+7E5D4FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A
+582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760
+577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF
+554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F
+82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321
+7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E5E7E5F7E607E617E627E637E647E657E667E677E687E697E6A7E6B7E6C7E6D
+7E6E7E6F7E707E717E727E737E747E757E767E777E787E797E7A7E7B7E7C7E7D
+7E7E7E7F7E807E817E837E847E857E867E877E887E897E8A7E8B7E8C7E8D7E8E
+7E8F7E907E917E927E937E947E957E967E977E987E997E9A7E9C7E9D7E9E0000
+7EAE7EB47EBB7EBC7ED67EE47EEC7EF97F0A7F107F1E7F377F397F3B7F3C7F3D
+7F3E7F3F7F407F417F437F467F477F487F497F4A7F4B7F4C7F4D7F4E7F4F7F52
+7F53998861276E8357646606634656F062EC62695ED39614578362C955878721
+814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD
+89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001
+4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B
+7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC
+9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7F567F597F5B7F5C7F5D7F5E7F607F637F647F657F667F677F6B7F6C7F6D7F6F
+7F707F737F757F767F777F787F7A7F7B7F7C7F7D7F7F7F807F827F837F847F85
+7F867F877F887F897F8B7F8D7F8F7F907F917F927F937F957F967F977F987F99
+7F9B7F9C7FA07FA27FA37FA57FA67FA87FA97FAA7FAB7FAC7FAD7FAE7FB10000
+7FB37FB47FB57FB67FB77FBA7FBB7FBE7FC07FC27FC37FC47FC67FC77FC87FC9
+7FCB7FCD7FCF7FD07FD17FD27FD37FD67FD77FD97FDA7FDB7FDC7FDD7FDE7FE2
+7FE375E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C
+6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF
+667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599
+521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D
+62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C
+740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7FE47FE77FE87FEA7FEB7FEC7FED7FEF7FF27FF47FF57FF67FF77FF87FF97FFA
+7FFD7FFE7FFF8002800780088009800A800E800F80118013801A801B801D801E
+801F802180238024802B802C802D802E802F8030803280348039803A803C803E
+8040804180448045804780488049804E804F8050805180538055805680570000
+8059805B805C805D805E805F806080618062806380648065806680678068806B
+806C806D806E806F807080728073807480758076807780788079807A807B807C
+807D9686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089
+63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74
+541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A
+6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B
+95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B
+541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+807E8081808280858088808A808D808E808F8090809180928094809580978099
+809E80A380A680A780A880AC80B080B380B580B680B880B980BB80C580C780C8
+80C980CA80CB80CF80D080D180D280D380D480D580D880DF80E080E280E380E6
+80EE80F580F780F980FB80FE80FF8100810181038104810581078108810B0000
+810C811581178119811B811C811D811F81208121812281238124812581268127
+81288129812A812B812D812E813081338134813581378139813A813B813C813D
+813F8C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302
+51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF
+7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F
+772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720
+7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511
+706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81408141814281438144814581478149814D814E814F8152815681578158815B
+815C815D815E815F816181628163816481668168816A816B816C816F81728173
+81758176817781788181818381848185818681878189818B818C818D818E8190
+8192819381948195819681978199819A819E819F81A081A181A281A481A50000
+81A781A981AB81AC81AD81AE81AF81B081B181B281B481B581B681B781B881B9
+81BC81BD81BE81BF81C481C581C781C881C981CB81CD81CE81CF81D081D181D2
+81D3647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE
+964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE
+776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357
+753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A
+6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18
+917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81D481D581D681D781D881D981DA81DB81DC81DD81DE81DF81E081E181E281E4
+81E581E681E881E981EB81EE81EF81F081F181F281F581F681F781F881F981FA
+81FD81FF8203820782088209820A820B820E820F821182138215821682178218
+8219821A821D822082248225822682278229822E8232823A823C823D823F0000
+8240824182428243824582468248824A824C824D824E82508251825282538254
+8255825682578259825B825C825D825E82608261826282638264826582668267
+826962E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696
+8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4
+722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554
+522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA
+57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA
+787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+826A826B826C826D82718275827682778278827B827C82808281828382858286
+82878289828C82908293829482958296829A829B829E82A082A282A382A782B2
+82B582B682BA82BB82BC82BF82C082C282C382C582C682C982D082D682D982DA
+82DD82E282E782E882E982EA82EC82ED82EE82F082F282F382F582F682F80000
+82FA82FC82FD82FE82FF8300830A830B830D831083128313831683188319831D
+831E831F83208321832283238324832583268329832A832E833083328337833B
+833D5564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02
+74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6
+8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461
+83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03
+51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91
+8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+833E833F83418342834483458348834A834B834C834D834E8353835583568357
+83588359835D836283708371837283738374837583768379837A837E837F8380
+838183828383838483878388838A838B838C838D838F83908391839483958396
+83978399839A839D839F83A183A283A383A483A583A683A783AC83AD83AE0000
+83AF83B583BB83BE83BF83C283C383C483C683C883C983CB83CD83CE83D083D1
+83D283D383D583D783D983DA83DB83DE83E283E383E483E683E783E883EB83EC
+83ED60706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3
+524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A
+62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D
+520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81
+97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB
+4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000
+C8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+83EE83EF83F383F483F583F683F783FA83FB83FC83FE83FF8400840284058407
+84088409840A84108412841384148415841684178419841A841B841E841F8420
+8421842284238429842A842B842C842D842E842F843084328433843484358436
+84378439843A843B843E843F8440844184428443844484458447844884490000
+844A844B844C844D844E844F8450845284538454845584568458845D845E845F
+8460846284648465846684678468846A846E846F84708472847484778479847B
+847C53D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238
+529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4
+58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4
+5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197
+63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A
+745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000
+C9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+847D847E847F848084818483848484858486848A848D848F8490849184928493
+8494849584968498849A849B849D849E849F84A084A284A384A484A584A684A7
+84A884A984AA84AB84AC84AD84AE84B084B184B384B584B684B784BB84BC84BE
+84C084C284C384C584C684C784C884CB84CC84CE84CF84D284D484D584D70000
+84D884D984DA84DB84DC84DE84E184E284E484E784E884E984EA84EB84ED84EE
+84EF84F184F284F384F484F584F684F784F884F984FA84FB84FD84FE85008501
+85024F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E
+7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D
+886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A
+5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7
+820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20
+7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8503850485058506850785088509850A850B850D850E850F8510851285148515
+851685188519851B851C851D851E852085228523852485258526852785288529
+852A852D852E852F8530853185328533853485358536853E853F854085418542
+8544854585468547854B854C854D854E854F8550855185528553855485550000
+85578558855A855B855C855D855F85608561856285638565856685678569856A
+856B856C856D856E856F8570857185738575857685778578857C857D857F8580
+8581770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3
+62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB
+4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F
+5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C
+67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9
+7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85828583858685888589858A858B858C858D858E859085918592859385948595
+8596859785988599859A859D859E859F85A085A185A285A385A585A685A785A9
+85AB85AC85AD85B185B285B385B485B585B685B885BA85BB85BC85BD85BE85BF
+85C085C285C385C485C585C685C785C885CA85CB85CC85CD85CE85D185D20000
+85D485D685D785D885D985DA85DB85DD85DE85DF85E085E185E285E385E585E6
+85E785E885EA85EB85EC85ED85EE85EF85F085F185F285F385F485F585F685F7
+85F860555237800D6454887075295E05681362F4971C53CC723D8C016C347761
+7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D
+6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC
+8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9
+80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59
+635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85F985FA85FC85FD85FE860086018602860386048606860786088609860A860B
+860C860D860E860F86108612861386148615861786188619861A861B861C861D
+861E861F86208621862286238624862586268628862A862B862C862D862E862F
+863086318632863386348635863686378639863A863B863D863E863F86400000
+864186428643864486458646864786488649864A864B864C8652865386558656
+865786588659865B865C865D865F866086618663866486658666866786688669
+866A736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A
+8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD
+6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4
+7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22
+951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530
+751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+866D866F86708672867386748675867686778678868386848685868686878688
+8689868E868F86908691869286948696869786988699869A869B869E869F86A0
+86A186A286A586A686AB86AD86AE86B286B386B786B886B986BB86BC86BD86BE
+86BF86C186C286C386C586C886CC86CD86D286D386D586D686D786DA86DC0000
+86DD86E086E186E286E386E586E686E786E886EA86EB86EC86EF86F586F686F7
+86FA86FB86FC86FD86FF8701870487058706870B870C870E870F871087118714
+87166C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5
+687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82
+5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6
+625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6
+889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB
+5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8719871B871D871F87208724872687278728872A872B872C872D872F87308732
+87338735873687388739873A873C873D8740874187428743874487458746874A
+874B874D874F8750875187528754875587568758875A875B875C875D875E875F
+876187628766876787688769876A876B876C876D876F87718772877387750000
+877787788779877A877F878087818784878687878789878A878C878E878F8790
+8791879287948795879687988799879A879B879C879D879E87A087A187A287A3
+87A45DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4
+4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170
+536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717
+6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C
+68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269
+52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+87A587A687A787A987AA87AE87B087B187B287B487B687B787B887B987BB87BC
+87BE87BF87C187C287C387C487C587C787C887C987CC87CD87CE87CF87D087D4
+87D587D687D787D887D987DA87DC87DD87DE87DF87E187E287E387E487E687E7
+87E887E987EB87EC87ED87EF87F087F187F287F387F487F587F687F787F80000
+87FA87FB87FC87FD87FF880088018802880488058806880788088809880B880C
+880D880E880F8810881188128814881788188819881A881C881D881E881F8820
+88237A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D
+4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1
+4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237
+95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF
+76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7
+6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+882488258826882788288829882A882B882C882D882E882F8830883188338834
+8835883688378838883A883B883D883E883F8841884288438846884788488849
+884A884B884E884F8850885188528853885588568858885A885B885C885D885E
+885F886088668867886A886D886F8871887388748875887688788879887A0000
+887B887C88808883888688878889888A888C888E888F88908891889388948895
+889788988899889A889B889D889E889F88A088A188A388A588A688A788A888A9
+88AA5C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A
+90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C
+6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2
+884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E
+673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157
+53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+88AC88AE88AF88B088B288B388B488B588B688B888B988BA88BB88BD88BE88BF
+88C088C388C488C788C888CA88CB88CC88CD88CF88D088D188D388D688D788DA
+88DB88DC88DD88DE88E088E188E688E788E988EA88EB88EC88ED88EE88EF88F2
+88F588F688F788FA88FB88FD88FF890089018903890489058906890789080000
+8909890B890C890D890E890F891189148915891689178918891C891D891E891F
+89208922892389248926892789288929892C892D892E892F8931893289338935
+89379009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2
+5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD
+7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25
+781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830
+71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C
+4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89388939893A893B893C893D893E893F89408942894389458946894789488949
+894A894B894C894D894E894F8950895189528953895489558956895789588959
+895A895B895C895D896089618962896389648965896789688969896A896B896C
+896D896E896F8970897189728973897489758976897789788979897A897C0000
+897D897E8980898289848985898789888989898A898B898C898D898E898F8990
+899189928993899489958996899789988999899A899B899C899D899E899F89A0
+89A164475C2790657A918C2359DA54AC8200836F898180006930564E80367237
+91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1
+4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681
+501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB
+4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE
+8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89A289A389A489A589A689A789A889A989AA89AB89AC89AD89AE89AF89B089B1
+89B289B389B489B589B689B789B889B989BA89BB89BC89BD89BE89BF89C089C3
+89CD89D389D489D589D789D889D989DB89DD89DF89E089E189E289E489E789E8
+89E989EA89EC89ED89EE89F089F189F289F489F589F689F789F889F989FA0000
+89FB89FC89FD89FE89FF8A018A028A038A048A058A068A088A098A0A8A0B8A0C
+8A0D8A0E8A0F8A108A118A128A138A148A158A168A178A188A198A1A8A1B8A1C
+8A1D537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8
+5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C
+6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149
+670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206
+4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED
+7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8A1E8A1F8A208A218A228A238A248A258A268A278A288A298A2A8A2B8A2C8A2D
+8A2E8A2F8A308A318A328A338A348A358A368A378A388A398A3A8A3B8A3C8A3D
+8A3F8A408A418A428A438A448A458A468A478A498A4A8A4B8A4C8A4D8A4E8A4F
+8A508A518A528A538A548A558A568A578A588A598A5A8A5B8A5C8A5D8A5E0000
+8A5F8A608A618A628A638A648A658A668A678A688A698A6A8A6B8A6C8A6D8A6E
+8A6F8A708A718A728A738A748A758A768A778A788A7A8A7B8A7C8A7D8A7E8A7F
+8A806D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95
+56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5
+5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5
+5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43
+810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5
+8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8A818A828A838A848A858A868A878A888A8B8A8C8A8D8A8E8A8F8A908A918A92
+8A948A958A968A978A988A998A9A8A9B8A9C8A9D8A9E8A9F8AA08AA18AA28AA3
+8AA48AA58AA68AA78AA88AA98AAA8AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB3
+8AB48AB58AB68AB78AB88AB98ABA8ABB8ABC8ABD8ABE8ABF8AC08AC18AC20000
+8AC38AC48AC58AC68AC78AC88AC98ACA8ACB8ACC8ACD8ACE8ACF8AD08AD18AD2
+8AD38AD48AD58AD68AD78AD88AD98ADA8ADB8ADC8ADD8ADE8ADF8AE08AE18AE2
+8AE394E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8
+77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B
+7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C
+62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005
+951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA
+9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8AE48AE58AE68AE78AE88AE98AEA8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF3
+8AF48AF58AF68AF78AF88AF98AFA8AFB8AFC8AFD8AFE8AFF8B008B018B028B03
+8B048B058B068B088B098B0A8B0B8B0C8B0D8B0E8B0F8B108B118B128B138B14
+8B158B168B178B188B198B1A8B1B8B1C8B1D8B1E8B1F8B208B218B228B230000
+8B248B258B278B288B298B2A8B2B8B2C8B2D8B2E8B2F8B308B318B328B338B34
+8B358B368B378B388B398B3A8B3B8B3C8B3D8B3E8B3F8B408B418B428B438B44
+8B455E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7
+804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A
+63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92
+4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC
+7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB
+90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B468B478B488B498B4A8B4B8B4C8B4D8B4E8B4F8B508B518B528B538B548B55
+8B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B65
+8B678B688B698B6A8B6B8B6D8B6E8B6F8B708B718B728B738B748B758B768B77
+8B788B798B7A8B7B8B7C8B7D8B7E8B7F8B808B818B828B838B848B858B860000
+8B878B888B898B8A8B8B8B8C8B8D8B8E8B8F8B908B918B928B938B948B958B96
+8B978B988B998B9A8B9B8B9C8B9D8B9E8B9F8BAC8BB18BBB8BC78BD08BEA8C09
+8C1E4F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84
+88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353
+684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B
+4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70
+594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A
+5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8C388C398C3A8C3B8C3C8C3D8C3E8C3F8C408C428C438C448C458C488C4A8C4B
+8C4D8C4E8C4F8C508C518C528C538C548C568C578C588C598C5B8C5C8C5D8C5E
+8C5F8C608C638C648C658C668C678C688C698C6C8C6D8C6E8C6F8C708C718C72
+8C748C758C768C778C7B8C7C8C7D8C7E8C7F8C808C818C838C848C868C870000
+8C888C8B8C8D8C8E8C8F8C908C918C928C938C958C968C978C998C9A8C9B8C9C
+8C9D8C9E8C9F8CA08CA18CA28CA38CA48CA58CA68CA78CA88CA98CAA8CAB8CAC
+8CAD4E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F
+53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C
+4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5
+5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261
+525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB
+4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8CAE8CAF8CB08CB18CB28CB38CB48CB58CB68CB78CB88CB98CBA8CBB8CBC8CBD
+8CBE8CBF8CC08CC18CC28CC38CC48CC58CC68CC78CC88CC98CCA8CCB8CCC8CCD
+8CCE8CCF8CD08CD18CD28CD38CD48CD58CD68CD78CD88CD98CDA8CDB8CDC8CDD
+8CDE8CDF8CE08CE18CE28CE38CE48CE58CE68CE78CE88CE98CEA8CEB8CEC0000
+8CED8CEE8CEF8CF08CF18CF28CF38CF48CF58CF68CF78CF88CF98CFA8CFB8CFC
+8CFD8CFE8CFF8D008D018D028D038D048D058D068D078D088D098D0A8D0B8D0C
+8D0D4F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC
+4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F
+502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7
+50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0
+6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0
+51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8D0E8D0F8D108D118D128D138D148D158D168D178D188D198D1A8D1B8D1C8D20
+8D518D528D578D5F8D658D688D698D6A8D6C8D6E8D6F8D718D728D788D798D7A
+8D7B8D7C8D7D8D7E8D7F8D808D828D838D868D878D888D898D8C8D8D8D8E8D8F
+8D908D928D938D958D968D978D988D998D9A8D9B8D9C8D9D8D9E8DA08DA10000
+8DA28DA48DA58DA68DA78DA88DA98DAA8DAB8DAC8DAD8DAE8DAF8DB08DB28DB6
+8DB78DB98DBB8DBD8DC08DC18DC28DC58DC78DC88DC98DCA8DCD8DD08DD28DD3
+8DD451C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF
+8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3
+8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19
+8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36
+5369537A961D962296219631962A963D963C964296499654965F9667966C9672
+96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8DD58DD88DD98DDC8DE08DE18DE28DE58DE68DE78DE98DED8DEE8DF08DF18DF2
+8DF48DF68DFC8DFE8DFF8E008E018E028E038E048E068E078E088E0B8E0D8E0E
+8E108E118E128E138E158E168E178E188E198E1A8E1B8E1C8E208E218E248E25
+8E268E278E288E2B8E2D8E308E328E338E348E368E378E388E3B8E3C8E3E0000
+8E3F8E438E458E468E4C8E4D8E4E8E4F8E508E538E548E558E568E578E588E5A
+8E5B8E5C8E5D8E5E8E5F8E608E618E628E638E648E658E678E688E6A8E6B8E6E
+8E7190B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB
+90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD
+52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF
+574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B
+574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF
+57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E738E758E778E788E798E7A8E7B8E7D8E7E8E808E828E838E848E868E888E89
+8E8A8E8B8E8C8E8D8E8E8E918E928E938E958E968E978E988E998E9A8E9B8E9D
+8E9F8EA08EA18EA28EA38EA48EA58EA68EA78EA88EA98EAA8EAD8EAE8EB08EB1
+8EB38EB48EB58EB68EB78EB88EB98EBB8EBC8EBD8EBE8EBF8EC08EC18EC20000
+8EC38EC48EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECF8ED08ED18ED28ED3
+8ED48ED58ED68ED78ED88ED98EDA8EDB8EDC8EDD8EDE8EDF8EE08EE18EE28EE3
+8EE4580B580D57FD57ED5800581E5819584458205865586C58815889589A5880
+99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8
+82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F
+82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3
+8311831A83068314831582E082D5831C8351835B835C83088392833C83348331
+839B835E832F834F83478343835F834083178360832D833A8333836683650000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8EE58EE68EE78EE88EE98EEA8EEB8EEC8EED8EEE8EEF8EF08EF18EF28EF38EF4
+8EF58EF68EF78EF88EF98EFA8EFB8EFC8EFD8EFE8EFF8F008F018F028F038F04
+8F058F068F078F088F098F0A8F0B8F0C8F0D8F0E8F0F8F108F118F128F138F14
+8F158F168F178F188F198F1A8F1B8F1C8F1D8F1E8F1F8F208F218F228F230000
+8F248F258F268F278F288F298F2A8F2B8F2C8F2D8F2E8F2F8F308F318F328F33
+8F348F358F368F378F388F398F3A8F3B8F3C8F3D8F3E8F3F8F408F418F428F43
+8F448368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C
+8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8
+58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9
+83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478
+843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF
+84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8F458F468F478F488F498F4A8F4B8F4C8F4D8F4E8F4F8F508F518F528F538F54
+8F558F568F578F588F598F5A8F5B8F5C8F5D8F5E8F5F8F608F618F628F638F64
+8F658F6A8F808F8C8F928F9D8FA08FA18FA28FA48FA58FA68FA78FAA8FAC8FAD
+8FAE8FAF8FB28FB38FB48FB58FB78FB88FBA8FBB8FBC8FBF8FC08FC38FC60000
+8FC98FCA8FCB8FCC8FCD8FCF8FD28FD68FD78FDA8FE08FE18FE38FE78FEC8FEF
+8FF18FF28FF48FF58FF68FFA8FFB8FFC8FFE8FFF90079008900C900E90139015
+90188556853B84FF84FC8559854885688564855E857A77A285438572857B85A4
+85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605
+86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34
+624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371
+637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE
+645263C663BE64456441640B641B6420640C64266421645E6484646D64960000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9019901C902390249025902790289029902A902B902C90309031903290339034
+90379039903A903D903F904090439045904690489049904A904B904C904E9054
+905590569059905A905C905D905E905F906090619064906690679069906A906B
+906C906F90709071907290739076907790789079907A907B907C907E90810000
+90849085908690879089908A908C908D908E908F90909092909490969098909A
+909C909E909F90A090A490A590A790A890A990AB90AD90B290B790BC90BD90BF
+90C0647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2
+75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456
+54435421545754595423543254825494547754715464549A549B548454765466
+549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC
+54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522
+5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+90C290C390C690C890C990CB90CC90CD90D290D490D590D690D890D990DA90DE
+90DF90E090E390E490E590E990EA90EC90EE90F090F190F290F390F590F690F7
+90F990FA90FB90FC90FF91009101910391059106910791089109910A910B910C
+910D910E910F911091119112911391149115911691179118911A911B911C0000
+911D911F91209121912491259126912791289129912A912B912C912D912E9130
+9132913391349135913691379138913A913B913C913D913E913F914091419142
+91445537555655755576557755335530555C558B55D2558355B155B955885581
+559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB
+55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E
+5608560C56015624562355FE56005627562D565856395657562C564D56625659
+565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1
+56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9145914791489151915391549155915691589159915B915C915F916091669167
+9168916B916D9173917A917B917C9180918191829183918491869188918A918E
+918F9193919491959196919791989199919C919D919E919F91A091A191A491A5
+91A691A791A891A991AB91AC91B091B191B291B391B691B791B891B991BB0000
+91BC91BD91BE91BF91C091C191C291C391C491C591C691C891CB91D091D291D3
+91D491D591D691D791D891D991DA91DB91DD91DE91DF91E091E191E291E391E4
+91E55E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91
+5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5
+5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F
+5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87
+5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8
+72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+91E691E791E891E991EA91EB91EC91ED91EE91EF91F091F191F291F391F491F5
+91F691F791F891F991FA91FB91FC91FD91FE91FF920092019202920392049205
+9206920792089209920A920B920C920D920E920F921092119212921392149215
+9216921792189219921A921B921C921D921E921F922092219222922392240000
+92259226922792289229922A922B922C922D922E922F92309231923292339234
+92359236923792389239923A923B923C923D923E923F92409241924292439244
+924572FB731773137321730A731E731D7315732273397325732C733873317350
+734D73577360736C736F737E821B592598E7592459029963996799689969996A
+996B996C99749977997D998099849987998A998D999099919993999499955E80
+5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA
+5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019
+60356026601B600F600D6029602B600A603F602160786079607B607A60420000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9246924792489249924A924B924C924D924E924F925092519252925392549255
+9256925792589259925A925B925C925D925E925F926092619262926392649265
+9266926792689269926A926B926C926D926E926F927092719272927392759276
+927792789279927A927B927C927D927E927F9280928192829283928492850000
+9286928792889289928A928B928C928D928F9290929192929293929492959296
+929792989299929A929B929C929D929E929F92A092A192A292A392A492A592A6
+92A7606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8
+60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7
+61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606
+9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35
+6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4
+6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+92A892A992AA92AB92AC92AD92AF92B092B192B292B392B492B592B692B792B8
+92B992BA92BB92BC92BD92BE92BF92C092C192C292C392C492C592C692C792C9
+92CA92CB92CC92CD92CE92CF92D092D192D292D392D492D592D692D792D892D9
+92DA92DB92DC92DD92DE92DF92E092E192E292E392E492E592E692E792E80000
+92E992EA92EB92EC92ED92EE92EF92F092F192F292F392F492F592F692F792F8
+92F992FA92FB92FC92FD92FE92FF930093019302930393049305930693079308
+93096D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F
+6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7
+6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E
+6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5
+6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9
+6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+930A930B930C930D930E930F9310931193129313931493159316931793189319
+931A931B931C931D931E931F9320932193229323932493259326932793289329
+932A932B932C932D932E932F9330933193329333933493359336933793389339
+933A933B933C933D933F93409341934293439344934593469347934893490000
+934A934B934C934D934E934F9350935193529353935493559356935793589359
+935A935B935C935D935E935F9360936193629363936493659366936793689369
+936B6FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035
+704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47
+8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011
+900D9016902190359036902D902F9044905190529050906890589062905B66B9
+9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63
+5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+936C936D936E936F9370937193729373937493759376937793789379937A937B
+937C937D937E937F9380938193829383938493859386938793889389938A938B
+938C938D938E9390939193929393939493959396939793989399939A939B939C
+939D939E939F93A093A193A293A393A493A593A693A793A893A993AA93AB0000
+93AC93AD93AE93AF93B093B193B293B393B493B593B693B793B893B993BA93BB
+93BC93BD93BE93BF93C093C193C293C393C493C593C693C793C893C993CB93CC
+93CD599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3
+59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75
+80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6
+5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62
+9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98
+9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93CE93CF93D093D193D293D393D493D593D793D893D993DA93DB93DC93DD93DE
+93DF93E093E193E293E393E493E593E693E793E893E993EA93EB93EC93ED93EE
+93EF93F093F193F293F393F493F593F693F793F893F993FA93FB93FC93FD93FE
+93FF9400940194029403940494059406940794089409940A940B940C940D0000
+940E940F9410941194129413941494159416941794189419941A941B941C941D
+941E941F9420942194229423942494259426942794289429942A942B942C942D
+942E7EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1
+7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08
+7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26
+7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095
+738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C
+740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+942F9430943194329433943494359436943794389439943A943B943C943D943F
+9440944194429443944494459446944794489449944A944B944C944D944E944F
+9450945194529453945494559456945794589459945A945B945C945D945E945F
+9460946194629463946494659466946794689469946A946C946D946E946F0000
+9470947194729473947494759476947794789479947A947B947C947D947E947F
+9480948194829483948494919496949894C794CF94D394D494DA94E694FB951C
+9520741B741A7441745C7457745574597477746D747E749C748E748074817487
+748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769
+67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8
+680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD
+6832683368606861684E6862684468646883681D68556866684168676840683E
+684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+95279533953D95439548954B9555955A9560956E95749575957795789579957A
+957B957C957D957E9580958195829583958495859586958795889589958A958B
+958C958D958E958F9590959195929593959495959596959795989599959A959B
+959C959D959E959F95A095A195A295A395A495A595A695A795A895A995AA0000
+95AB95AC95AD95AE95AF95B095B195B295B395B495B595B695B795B895B995BA
+95BB95BC95BD95BE95BF95C095C195C295C395C495C595C695C795C895C995CA
+95CB692468F0690B6901695768E369106971693969606942695D6984696B6980
+69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD
+69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44
+6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB
+733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71
+8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB
+95DC95DD95DE95DF95E095E195E295E395E495E595E695E795EC95FF96079613
+9618961B961E96209623962496259626962796289629962B962C962D962F9630
+963796389639963A963E96419643964A964E964F965196529653965696570000
+96589659965A965C965D965E9660966396659666966B966D966E966F96709671
+967396789679967A967B967C967D967E967F9680968196829683968496879689
+968A8F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C
+81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615
+6600708566F7661D66346631663666358006665F66546641664F665666616657
+66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40
+8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1
+726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+968C968E96919692969396959696969A969B969D969E969F96A096A196A296A3
+96A496A596A696A896A996AA96AB96AC96AD96AE96AF96B196B296B496B596B7
+96B896BA96BB96BF96C296C396C896CA96CB96D096D196D396D496D696D796D8
+96D996DA96DB96DC96DD96DE96DF96E196E296E396E496E596E696E796EB0000
+96EC96ED96EE96F096F196F296F496F596F896FA96FB96FC96FD96FF97029703
+9705970A970B970C97109711971297149715971797189719971A971B971D971F
+9720643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19
+6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F
+809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2
+80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112
+8C5A8136811E812C811881328148814C815381748159815A817181608169817C
+817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+972197229723972497259726972797289729972B972C972E972F973197339734
+973597369737973A973B973C973D973F97409741974297439744974597469747
+97489749974A974B974C974D974E974F975097519754975597579758975A975C
+975D975F97639764976697679768976A976B976C976D976E976F977097710000
+97729775977797789779977A977B977D977E977F978097819782978397849786
+978797889789978A978C978E978F979097939795979697979799979A979B979C
+979D81C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3
+5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C
+7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C
+716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D
+7228706C7118716671B9623E623D624362486249793B794079467949795B795C
+7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+979E979F97A197A297A497A597A697A797A897A997AA97AC97AE97B097B197B3
+97B597B697B797B897B997BA97BB97BC97BD97BE97BF97C097C197C297C397C4
+97C597C697C797C897C997CA97CB97CC97CD97CE97CF97D097D197D297D397D4
+97D597D697D797D897D997DA97DB97DC97DD97DE97DF97E097E197E297E30000
+97E497E597E897EE97EF97F097F197F297F497F797F897F997FA97FB97FC97FD
+97FE97FF9800980198029803980498059806980798089809980A980B980C980D
+980E603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1
+62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C
+781D7839783A783B781F783C7825782C78237829784E786D7856785778267850
+7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9
+78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9
+77077708771A77227719772D7726773577387750775177477743775A77680000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+980F9810981198129813981498159816981798189819981A981B981C981D981E
+981F9820982198229823982498259826982798289829982A982B982C982D982E
+982F9830983198329833983498359836983798389839983A983B983C983D983E
+983F9840984198429843984498459846984798489849984A984B984C984D0000
+984E984F9850985198529853985498559856985798589859985A985B985C985D
+985E985F9860986198629863986498659866986798689869986A986B986C986D
+986E77627765777F778D777D7780778C7791779F77A077B077B577BD753A7540
+754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81
+7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495
+949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8
+94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2
+94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+986F98709871987298739874988B988E98929895989998A398A898A998AA98AB
+98AC98AD98AE98AF98B098B198B298B398B498B598B698B798B898B998BA98BB
+98BC98BD98BE98BF98C098C198C298C398C498C598C698C798C898C998CA98CB
+98CC98CD98CF98D098D498D698D798DB98DC98DD98E098E198E298E398E40000
+98E598E698E998EA98EB98EC98ED98EE98EF98F098F198F298F398F498F598F6
+98F798F898F998FA98FB98FC98FD98FE98FF9900990199029903990499059906
+990794E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506
+95079509950A950D950E950F951295139514951595169518951B951D951E951F
+9522952A952B9529952C953195329534953695379538953C953E953F95429535
+9544954595469549954C954E954F9552955395549556955795589559955B955E
+955F955D95619562956495659566956795689569956A956B956C956F95719572
+9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+99089909990A990B990C990E990F991199129913991499159916991799189919
+991A991B991C991D991E991F9920992199229923992499259926992799289929
+992A992B992C992D992F9930993199329933993499359936993799389939993A
+993B993C993D993E993F99409941994299439944994599469947994899490000
+994A994B994C994D994E994F99509951995299539956995799589959995A995B
+995C995D995E995F99609961996299649966997399789979997B997E99829983
+99897A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20
+9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42
+9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63
+9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC
+75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB
+75E7760375F175FC75FF761076007605760C7617760A76257618761576190000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+998C998E999A999B999C999D999E999F99A099A199A299A399A499A699A799A9
+99AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B9
+99BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C9
+99CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D80000
+99D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E8
+99E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F599F699F799F8
+99F9761B763C762276207640762D7630763F76357643763E7633764D765E7654
+765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8
+7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3
+88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941
+8966897B758B80E576B276B477DC801280148016801C80208022802580268027
+802980288031800B803580438046804D80528069807189839878988098830000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+99FA99FB99FC99FD99FE99FF9A009A019A029A039A049A059A069A079A089A09
+9A0A9A0B9A0C9A0D9A0E9A0F9A109A119A129A139A149A159A169A179A189A19
+9A1A9A1B9A1C9A1D9A1E9A1F9A209A219A229A239A249A259A269A279A289A29
+9A2A9A2B9A2C9A2D9A2E9A2F9A309A319A329A339A349A359A369A379A380000
+9A399A3A9A3B9A3C9A3D9A3E9A3F9A409A419A429A439A449A459A469A479A48
+9A499A4A9A4B9A4C9A4D9A4E9A4F9A509A519A529A539A549A559A569A579A58
+9A599889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654
+866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9
+86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3
+86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B
+871E8725872E871A873E87488734873187298737873F87828722877D877E877B
+87608770874C876E878B87538763877C876487598765879387AF87A887D20000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9A5A9A5B9A5C9A5D9A5E9A5F9A609A619A629A639A649A659A669A679A689A69
+9A6A9A6B9A729A839A899A8D9A8E9A949A959A999AA69AA99AAA9AAB9AAC9AAD
+9AAE9AAF9AB29AB39AB49AB59AB99ABB9ABD9ABE9ABF9AC39AC49AC69AC79AC8
+9AC99ACA9ACD9ACE9ACF9AD09AD29AD49AD59AD69AD79AD99ADA9ADB9ADC0000
+9ADD9ADE9AE09AE29AE39AE49AE59AE79AE89AE99AEA9AEC9AEE9AF09AF19AF2
+9AF39AF49AF59AF69AF79AF89AFA9AFC9AFD9AFE9AFF9B009B019B029B049B05
+9B0687C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1
+87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42
+7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19
+7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E
+7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB
+7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9B079B099B0A9B0B9B0C9B0D9B0E9B109B119B129B149B159B169B179B189B19
+9B1A9B1B9B1C9B1D9B1E9B209B219B229B249B259B269B279B289B299B2A9B2B
+9B2C9B2D9B2E9B309B319B339B349B359B369B379B389B399B3A9B3D9B3E9B3F
+9B409B469B4A9B4B9B4C9B4E9B509B529B539B559B569B579B589B599B5A0000
+9B5B9B5C9B5D9B5E9B5F9B609B619B629B639B649B659B669B679B689B699B6A
+9B6B9B6C9B6D9B6E9B6F9B709B719B729B739B749B759B769B779B789B799B7A
+9B7B7C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223
+822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268
+887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D
+7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8
+7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8
+9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9B7C9B7D9B7E9B7F9B809B819B829B839B849B859B869B879B889B899B8A9B8B
+9B8C9B8D9B8E9B8F9B909B919B929B939B949B959B969B979B989B999B9A9B9B
+9B9C9B9D9B9E9B9F9BA09BA19BA29BA39BA49BA59BA69BA79BA89BA99BAA9BAB
+9BAC9BAD9BAE9BAF9BB09BB19BB29BB39BB49BB59BB69BB79BB89BB99BBA0000
+9BBB9BBC9BBD9BBE9BBF9BC09BC19BC29BC39BC49BC59BC69BC79BC89BC99BCA
+9BCB9BCC9BCD9BCE9BCF9BD09BD19BD29BD39BD49BD59BD69BD79BD89BD99BDA
+9BDB9162916191709169916F917D917E917291749179918C91859190918D9191
+91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69
+8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8
+8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39
+8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F
+8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9BDC9BDD9BDE9BDF9BE09BE19BE29BE39BE49BE59BE69BE79BE89BE99BEA9BEB
+9BEC9BED9BEE9BEF9BF09BF19BF29BF39BF49BF59BF69BF79BF89BF99BFA9BFB
+9BFC9BFD9BFE9BFF9C009C019C029C039C049C059C069C079C089C099C0A9C0B
+9C0C9C0D9C0E9C0F9C109C119C129C139C149C159C169C179C189C199C1A0000
+9C1B9C1C9C1D9C1E9C1F9C209C219C229C239C249C259C269C279C289C299C2A
+9C2B9C2C9C2D9C2E9C2F9C309C319C329C339C349C359C369C379C389C399C3A
+9C3B89E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A
+972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9
+96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F
+9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E
+9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2
+9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9C3C9C3D9C3E9C3F9C409C419C429C439C449C459C469C479C489C499C4A9C4B
+9C4C9C4D9C4E9C4F9C509C519C529C539C549C559C569C579C589C599C5A9C5B
+9C5C9C5D9C5E9C5F9C609C619C629C639C649C659C669C679C689C699C6A9C6B
+9C6C9C6D9C6E9C6F9C709C719C729C739C749C759C769C779C789C799C7A0000
+9C7B9C7D9C7E9C809C839C849C899C8A9C8C9C8F9C939C969C979C989C999C9D
+9CAA9CAC9CAF9CB99CBE9CBF9CC09CC19CC29CC89CC99CD19CD29CDA9CDB9CE0
+9CE19CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2
+977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA
+9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8
+990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F
+9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0
+9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000
+F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9CE39CE49CE59CE69CE79CE89CE99CEA9CEB9CEC9CED9CEE9CEF9CF09CF19CF2
+9CF39CF49CF59CF69CF79CF89CF99CFA9CFB9CFC9CFD9CFE9CFF9D009D019D02
+9D039D049D059D069D079D089D099D0A9D0B9D0C9D0D9D0E9D0F9D109D119D12
+9D139D149D159D169D179D189D199D1A9D1B9D1C9D1D9D1E9D1F9D209D210000
+9D229D239D249D259D269D279D289D299D2A9D2B9D2C9D2D9D2E9D2F9D309D31
+9D329D339D349D359D369D379D389D399D3A9D3B9D3C9D3D9D3E9D3F9D409D41
+9D42000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+F9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9D439D449D459D469D479D489D499D4A9D4B9D4C9D4D9D4E9D4F9D509D519D52
+9D539D549D559D569D579D589D599D5A9D5B9D5C9D5D9D5E9D5F9D609D619D62
+9D639D649D659D669D679D689D699D6A9D6B9D6C9D6D9D6E9D6F9D709D719D72
+9D739D749D759D769D779D789D799D7A9D7B9D7C9D7D9D7E9D7F9D809D810000
+9D829D839D849D859D869D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D909D91
+9D929D939D949D959D969D979D989D999D9A9D9B9D9C9D9D9D9E9D9F9DA09DA1
+9DA2000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9DA39DA49DA59DA69DA79DA89DA99DAA9DAB9DAC9DAD9DAE9DAF9DB09DB19DB2
+9DB39DB49DB59DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2
+9DC39DC49DC59DC69DC79DC89DC99DCA9DCB9DCC9DCD9DCE9DCF9DD09DD19DD2
+9DD39DD49DD59DD69DD79DD89DD99DDA9DDB9DDC9DDD9DDE9DDF9DE09DE10000
+9DE29DE39DE49DE59DE69DE79DE89DE99DEA9DEB9DEC9DED9DEE9DEF9DF09DF1
+9DF29DF39DF49DF59DF69DF79DF89DF99DFA9DFB9DFC9DFD9DFE9DFF9E009E01
+9E02000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9E039E049E059E069E079E089E099E0A9E0B9E0C9E0D9E0E9E0F9E109E119E12
+9E139E149E159E169E179E189E199E1A9E1B9E1C9E1D9E1E9E249E279E2E9E30
+9E349E3B9E3C9E409E4D9E509E529E539E549E569E599E5D9E5F9E609E619E62
+9E659E6E9E6F9E729E749E759E769E779E789E799E7A9E7B9E7C9E7D9E800000
+9E819E839E849E859E869E899E8A9E8C9E8D9E8E9E8F9E909E919E949E959E96
+9E979E989E999E9A9E9B9E9C9E9E9EA09EA19EA29EA39EA49EA59EA79EA89EA9
+9EAA000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9EAB9EAC9EAD9EAE9EAF9EB09EB19EB29EB39EB59EB69EB79EB99EBA9EBC9EBF
+9EC09EC19EC29EC39EC59EC69EC79EC89ECA9ECB9ECC9ED09ED29ED39ED59ED6
+9ED79ED99EDA9EDE9EE19EE39EE49EE69EE89EEB9EEC9EED9EEE9EF09EF19EF2
+9EF39EF49EF59EF69EF79EF89EFA9EFD9EFF9F009F019F029F039F049F050000
+9F069F079F089F099F0A9F0C9F0F9F119F129F149F159F169F189F1A9F1B9F1C
+9F1D9F1E9F1F9F219F239F249F259F269F279F289F299F2A9F2B9F2D9F2E9F30
+9F31000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9F329F339F349F359F369F389F3A9F3C9F3F9F409F419F429F439F459F469F47
+9F489F499F4A9F4B9F4C9F4D9F4E9F4F9F529F539F549F559F569F579F589F59
+9F5A9F5B9F5C9F5D9F5E9F5F9F609F619F629F639F649F659F669F679F689F69
+9F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F739F749F759F769F779F780000
+9F799F7A9F7B9F7C9F7D9F7E9F819F829F8D9F8E9F8F9F909F919F929F939F94
+9F959F969F979F989F9C9F9D9F9E9FA19FA29FA39FA49FA5F92CF979F995F9E7
+F9F1000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FA0CFA0DFA0EFA0FFA11FA13FA14FA18FA1FFA20FA21FA23FA24FA27FA28FA29
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/cp949.enc b/ext/Encode/Encode/cp949.enc
new file mode 100644 (file)
index 0000000..697fc6f
--- /dev/null
@@ -0,0 +1,2128 @@
+# Encoding file: cp949, multi-byte
+M
+003F 0 125
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AC02AC03AC05AC06AC0BAC0CAC0DAC0EAC0FAC18AC1EAC1FAC21AC22AC23
+AC25AC26AC27AC28AC29AC2AAC2BAC2EAC32AC33AC3400000000000000000000
+0000AC35AC36AC37AC3AAC3BAC3DAC3EAC3FAC41AC42AC43AC44AC45AC46AC47
+AC48AC49AC4AAC4CAC4EAC4FAC50AC51AC52AC53AC5500000000000000000000
+0000AC56AC57AC59AC5AAC5BAC5DAC5EAC5FAC60AC61AC62AC63AC64AC65AC66
+AC67AC68AC69AC6AAC6BAC6CAC6DAC6EAC6FAC72AC73AC75AC76AC79AC7BAC7C
+AC7DAC7EAC7FAC82AC87AC88AC8DAC8EAC8FAC91AC92AC93AC95AC96AC97AC98
+AC99AC9AAC9BAC9EACA2ACA3ACA4ACA5ACA6ACA7ACABACADACAEACB1ACB2ACB3
+ACB4ACB5ACB6ACB7ACBAACBEACBFACC0ACC2ACC3ACC5ACC6ACC7ACC9ACCAACCB
+ACCDACCEACCFACD0ACD1ACD2ACD3ACD4ACD6ACD8ACD9ACDAACDBACDCACDDACDE
+ACDFACE2ACE3ACE5ACE6ACE9ACEBACEDACEEACF2ACF4ACF7ACF8ACF9ACFAACFB
+ACFEACFFAD01AD02AD03AD05AD07AD08AD09AD0AAD0BAD0EAD10AD12AD130000
+82
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AD14AD15AD16AD17AD19AD1AAD1BAD1DAD1EAD1FAD21AD22AD23AD24AD25
+AD26AD27AD28AD2AAD2BAD2EAD2FAD30AD31AD32AD3300000000000000000000
+0000AD36AD37AD39AD3AAD3BAD3DAD3EAD3FAD40AD41AD42AD43AD46AD48AD4A
+AD4BAD4CAD4DAD4EAD4FAD51AD52AD53AD55AD56AD5700000000000000000000
+0000AD59AD5AAD5BAD5CAD5DAD5EAD5FAD60AD62AD64AD65AD66AD67AD68AD69
+AD6AAD6BAD6EAD6FAD71AD72AD77AD78AD79AD7AAD7EAD80AD83AD84AD85AD86
+AD87AD8AAD8BAD8DAD8EAD8FAD91AD92AD93AD94AD95AD96AD97AD98AD99AD9A
+AD9BAD9EAD9FADA0ADA1ADA2ADA3ADA5ADA6ADA7ADA8ADA9ADAAADABADACADAD
+ADAEADAFADB0ADB1ADB2ADB3ADB4ADB5ADB6ADB8ADB9ADBAADBBADBCADBDADBE
+ADBFADC2ADC3ADC5ADC6ADC7ADC9ADCAADCBADCCADCDADCEADCFADD2ADD4ADD5
+ADD6ADD7ADD8ADD9ADDAADDBADDDADDEADDFADE1ADE2ADE3ADE5ADE6ADE7ADE8
+ADE9ADEAADEBADECADEDADEEADEFADF0ADF1ADF2ADF3ADF4ADF5ADF6ADF70000
+83
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000ADFAADFBADFDADFEAE02AE03AE04AE05AE06AE07AE0AAE0CAE0EAE0FAE10
+AE11AE12AE13AE15AE16AE17AE18AE19AE1AAE1BAE1C00000000000000000000
+0000AE1DAE1EAE1FAE20AE21AE22AE23AE24AE25AE26AE27AE28AE29AE2AAE2B
+AE2CAE2DAE2EAE2FAE32AE33AE35AE36AE39AE3BAE3C00000000000000000000
+0000AE3DAE3EAE3FAE42AE44AE47AE48AE49AE4BAE4FAE51AE52AE53AE55AE57
+AE58AE59AE5AAE5BAE5EAE62AE63AE64AE66AE67AE6AAE6BAE6DAE6EAE6FAE71
+AE72AE73AE74AE75AE76AE77AE7AAE7EAE7FAE80AE81AE82AE83AE86AE87AE88
+AE89AE8AAE8BAE8DAE8EAE8FAE90AE91AE92AE93AE94AE95AE96AE97AE98AE99
+AE9AAE9BAE9CAE9DAE9EAE9FAEA0AEA1AEA2AEA3AEA4AEA5AEA6AEA7AEA8AEA9
+AEAAAEABAEACAEADAEAEAEAFAEB0AEB1AEB2AEB3AEB4AEB5AEB6AEB7AEB8AEB9
+AEBAAEBBAEBFAEC1AEC2AEC3AEC5AEC6AEC7AEC8AEC9AECAAECBAECEAED2AED3
+AED4AED5AED6AED7AEDAAEDBAEDDAEDEAEDFAEE0AEE1AEE2AEE3AEE4AEE50000
+84
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AEE6AEE7AEE9AEEAAEECAEEEAEEFAEF0AEF1AEF2AEF3AEF5AEF6AEF7AEF9
+AEFAAEFBAEFDAEFEAEFFAF00AF01AF02AF03AF04AF0500000000000000000000
+0000AF06AF09AF0AAF0BAF0CAF0EAF0FAF11AF12AF13AF14AF15AF16AF17AF18
+AF19AF1AAF1BAF1CAF1DAF1EAF1FAF20AF21AF22AF2300000000000000000000
+0000AF24AF25AF26AF27AF28AF29AF2AAF2BAF2EAF2FAF31AF33AF35AF36AF37
+AF38AF39AF3AAF3BAF3EAF40AF44AF45AF46AF47AF4AAF4BAF4CAF4DAF4EAF4F
+AF51AF52AF53AF54AF55AF56AF57AF58AF59AF5AAF5BAF5EAF5FAF60AF61AF62
+AF63AF66AF67AF68AF69AF6AAF6BAF6CAF6DAF6EAF6FAF70AF71AF72AF73AF74
+AF75AF76AF77AF78AF7AAF7BAF7CAF7DAF7EAF7FAF81AF82AF83AF85AF86AF87
+AF89AF8AAF8BAF8CAF8DAF8EAF8FAF92AF93AF94AF96AF97AF98AF99AF9AAF9B
+AF9DAF9EAF9FAFA0AFA1AFA2AFA3AFA4AFA5AFA6AFA7AFA8AFA9AFAAAFABAFAC
+AFADAFAEAFAFAFB0AFB1AFB2AFB3AFB4AFB5AFB6AFB7AFBAAFBBAFBDAFBE0000
+85
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AFBFAFC1AFC2AFC3AFC4AFC5AFC6AFCAAFCCAFCFAFD0AFD1AFD2AFD3AFD5
+AFD6AFD7AFD8AFD9AFDAAFDBAFDDAFDEAFDFAFE0AFE100000000000000000000
+0000AFE2AFE3AFE4AFE5AFE6AFE7AFEAAFEBAFECAFEDAFEEAFEFAFF2AFF3AFF5
+AFF6AFF7AFF9AFFAAFFBAFFCAFFDAFFEAFFFB002B00300000000000000000000
+0000B005B006B007B008B009B00AB00BB00DB00EB00FB011B012B013B015B016
+B017B018B019B01AB01BB01EB01FB020B021B022B023B024B025B026B027B029
+B02AB02BB02CB02DB02EB02FB030B031B032B033B034B035B036B037B038B039
+B03AB03BB03CB03DB03EB03FB040B041B042B043B046B047B049B04BB04DB04F
+B050B051B052B056B058B05AB05BB05CB05EB05FB060B061B062B063B064B065
+B066B067B068B069B06AB06BB06CB06DB06EB06FB070B071B072B073B074B075
+B076B077B078B079B07AB07BB07EB07FB081B082B083B085B086B087B088B089
+B08AB08BB08EB090B092B093B094B095B096B097B09BB09DB09EB0A3B0A40000
+86
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B0A5B0A6B0A7B0AAB0B0B0B2B0B6B0B7B0B9B0BAB0BBB0BDB0BEB0BFB0C0
+B0C1B0C2B0C3B0C6B0CAB0CBB0CCB0CDB0CEB0CFB0D200000000000000000000
+0000B0D3B0D5B0D6B0D7B0D9B0DAB0DBB0DCB0DDB0DEB0DFB0E1B0E2B0E3B0E4
+B0E6B0E7B0E8B0E9B0EAB0EBB0ECB0EDB0EEB0EFB0F000000000000000000000
+0000B0F1B0F2B0F3B0F4B0F5B0F6B0F7B0F8B0F9B0FAB0FBB0FCB0FDB0FEB0FF
+B100B101B102B103B104B105B106B107B10AB10DB10EB10FB111B114B115B116
+B117B11AB11EB11FB120B121B122B126B127B129B12AB12BB12DB12EB12FB130
+B131B132B133B136B13AB13BB13CB13DB13EB13FB142B143B145B146B147B149
+B14AB14BB14CB14DB14EB14FB152B153B156B157B159B15AB15BB15DB15EB15F
+B161B162B163B164B165B166B167B168B169B16AB16BB16CB16DB16EB16FB170
+B171B172B173B174B175B176B177B17AB17BB17DB17EB17FB181B183B184B185
+B186B187B18AB18CB18EB18FB190B191B195B196B197B199B19AB19BB19D0000
+87
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B19EB19FB1A0B1A1B1A2B1A3B1A4B1A5B1A6B1A7B1A9B1AAB1ABB1ACB1AD
+B1AEB1AFB1B0B1B1B1B2B1B3B1B4B1B5B1B6B1B7B1B800000000000000000000
+0000B1B9B1BAB1BBB1BCB1BDB1BEB1BFB1C0B1C1B1C2B1C3B1C4B1C5B1C6B1C7
+B1C8B1C9B1CAB1CBB1CDB1CEB1CFB1D1B1D2B1D3B1D500000000000000000000
+0000B1D6B1D7B1D8B1D9B1DAB1DBB1DEB1E0B1E1B1E2B1E3B1E4B1E5B1E6B1E7
+B1EAB1EBB1EDB1EEB1EFB1F1B1F2B1F3B1F4B1F5B1F6B1F7B1F8B1FAB1FCB1FE
+B1FFB200B201B202B203B206B207B209B20AB20DB20EB20FB210B211B212B213
+B216B218B21AB21BB21CB21DB21EB21FB221B222B223B224B225B226B227B228
+B229B22AB22BB22CB22DB22EB22FB230B231B232B233B235B236B237B238B239
+B23AB23BB23DB23EB23FB240B241B242B243B244B245B246B247B248B249B24A
+B24BB24CB24DB24EB24FB250B251B252B253B254B255B256B257B259B25AB25B
+B25DB25EB25FB261B262B263B264B265B266B267B26AB26BB26CB26DB26E0000
+88
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B26FB270B271B272B273B276B277B278B279B27AB27BB27DB27EB27FB280
+B281B282B283B286B287B288B28AB28BB28CB28DB28E00000000000000000000
+0000B28FB292B293B295B296B297B29BB29CB29DB29EB29FB2A2B2A4B2A7B2A8
+B2A9B2ABB2ADB2AEB2AFB2B1B2B2B2B3B2B5B2B6B2B700000000000000000000
+0000B2B8B2B9B2BAB2BBB2BCB2BDB2BEB2BFB2C0B2C1B2C2B2C3B2C4B2C5B2C6
+B2C7B2CAB2CBB2CDB2CEB2CFB2D1B2D3B2D4B2D5B2D6B2D7B2DAB2DCB2DEB2DF
+B2E0B2E1B2E3B2E7B2E9B2EAB2F0B2F1B2F2B2F6B2FCB2FDB2FEB302B303B305
+B306B307B309B30AB30BB30CB30DB30EB30FB312B316B317B318B319B31AB31B
+B31DB31EB31FB320B321B322B323B324B325B326B327B328B329B32AB32BB32C
+B32DB32EB32FB330B331B332B333B334B335B336B337B338B339B33AB33BB33C
+B33DB33EB33FB340B341B342B343B344B345B346B347B348B349B34AB34BB34C
+B34DB34EB34FB350B351B352B353B357B359B35AB35DB360B361B362B3630000
+89
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B366B368B36AB36CB36DB36FB372B373B375B376B377B379B37AB37BB37C
+B37DB37EB37FB382B386B387B388B389B38AB38BB38D00000000000000000000
+0000B38EB38FB391B392B393B395B396B397B398B399B39AB39BB39CB39DB39E
+B39FB3A2B3A3B3A4B3A5B3A6B3A7B3A9B3AAB3ABB3AD00000000000000000000
+0000B3AEB3AFB3B0B3B1B3B2B3B3B3B4B3B5B3B6B3B7B3B8B3B9B3BAB3BBB3BC
+B3BDB3BEB3BFB3C0B3C1B3C2B3C3B3C6B3C7B3C9B3CAB3CDB3CFB3D1B3D2B3D3
+B3D6B3D8B3DAB3DCB3DEB3DFB3E1B3E2B3E3B3E5B3E6B3E7B3E9B3EAB3EBB3EC
+B3EDB3EEB3EFB3F0B3F1B3F2B3F3B3F4B3F5B3F6B3F7B3F8B3F9B3FAB3FBB3FD
+B3FEB3FFB400B401B402B403B404B405B406B407B408B409B40AB40BB40CB40D
+B40EB40FB411B412B413B414B415B416B417B419B41AB41BB41DB41EB41FB421
+B422B423B424B425B426B427B42AB42CB42DB42EB42FB430B431B432B433B435
+B436B437B438B439B43AB43BB43CB43DB43EB43FB440B441B442B443B4440000
+8A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B445B446B447B448B449B44AB44BB44CB44DB44EB44FB452B453B455B456
+B457B459B45AB45BB45CB45DB45EB45FB462B464B46600000000000000000000
+0000B467B468B469B46AB46BB46DB46EB46FB470B471B472B473B474B475B476
+B477B478B479B47AB47BB47CB47DB47EB47FB481B48200000000000000000000
+0000B483B484B485B486B487B489B48AB48BB48CB48DB48EB48FB490B491B492
+B493B494B495B496B497B498B499B49AB49BB49CB49EB49FB4A0B4A1B4A2B4A3
+B4A5B4A6B4A7B4A9B4AAB4ABB4ADB4AEB4AFB4B0B4B1B4B2B4B3B4B4B4B6B4B8
+B4BAB4BBB4BCB4BDB4BEB4BFB4C1B4C2B4C3B4C5B4C6B4C7B4C9B4CAB4CBB4CC
+B4CDB4CEB4CFB4D1B4D2B4D3B4D4B4D6B4D7B4D8B4D9B4DAB4DBB4DEB4DFB4E1
+B4E2B4E5B4E7B4E8B4E9B4EAB4EBB4EEB4F0B4F2B4F3B4F4B4F5B4F6B4F7B4F9
+B4FAB4FBB4FCB4FDB4FEB4FFB500B501B502B503B504B505B506B507B508B509
+B50AB50BB50CB50DB50EB50FB510B511B512B513B516B517B519B51AB51D0000
+8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B51EB51FB520B521B522B523B526B52BB52CB52DB52EB52FB532B533B535
+B536B537B539B53AB53BB53CB53DB53EB53FB542B54600000000000000000000
+0000B547B548B549B54AB54EB54FB551B552B553B555B556B557B558B559B55A
+B55BB55EB562B563B564B565B566B567B568B569B56A00000000000000000000
+0000B56BB56CB56DB56EB56FB570B571B572B573B574B575B576B577B578B579
+B57AB57BB57CB57DB57EB57FB580B581B582B583B584B585B586B587B588B589
+B58AB58BB58CB58DB58EB58FB590B591B592B593B594B595B596B597B598B599
+B59AB59BB59CB59DB59EB59FB5A2B5A3B5A5B5A6B5A7B5A9B5ACB5ADB5AEB5AF
+B5B2B5B6B5B7B5B8B5B9B5BAB5BEB5BFB5C1B5C2B5C3B5C5B5C6B5C7B5C8B5C9
+B5CAB5CBB5CEB5D2B5D3B5D4B5D5B5D6B5D7B5D9B5DAB5DBB5DCB5DDB5DEB5DF
+B5E0B5E1B5E2B5E3B5E4B5E5B5E6B5E7B5E8B5E9B5EAB5EBB5EDB5EEB5EFB5F0
+B5F1B5F2B5F3B5F4B5F5B5F6B5F7B5F8B5F9B5FAB5FBB5FCB5FDB5FEB5FF0000
+8C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B600B601B602B603B604B605B606B607B608B609B60AB60BB60CB60DB60E
+B60FB612B613B615B616B617B619B61AB61BB61CB61D00000000000000000000
+0000B61EB61FB620B621B622B623B624B626B627B628B629B62AB62BB62DB62E
+B62FB630B631B632B633B635B636B637B638B639B63A00000000000000000000
+0000B63BB63CB63DB63EB63FB640B641B642B643B644B645B646B647B649B64A
+B64BB64CB64DB64EB64FB650B651B652B653B654B655B656B657B658B659B65A
+B65BB65CB65DB65EB65FB660B661B662B663B665B666B667B669B66AB66BB66C
+B66DB66EB66FB670B671B672B673B674B675B676B677B678B679B67AB67BB67C
+B67DB67EB67FB680B681B682B683B684B685B686B687B688B689B68AB68BB68C
+B68DB68EB68FB690B691B692B693B694B695B696B697B698B699B69AB69BB69E
+B69FB6A1B6A2B6A3B6A5B6A6B6A7B6A8B6A9B6AAB6ADB6AEB6AFB6B0B6B2B6B3
+B6B4B6B5B6B6B6B7B6B8B6B9B6BAB6BBB6BCB6BDB6BEB6BFB6C0B6C1B6C20000
+8D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B6C3B6C4B6C5B6C6B6C7B6C8B6C9B6CAB6CBB6CCB6CDB6CEB6CFB6D0B6D1
+B6D2B6D3B6D5B6D6B6D7B6D8B6D9B6DAB6DBB6DCB6DD00000000000000000000
+0000B6DEB6DFB6E0B6E1B6E2B6E3B6E4B6E5B6E6B6E7B6E8B6E9B6EAB6EBB6EC
+B6EDB6EEB6EFB6F1B6F2B6F3B6F5B6F6B6F7B6F9B6FA00000000000000000000
+0000B6FBB6FCB6FDB6FEB6FFB702B703B704B706B707B708B709B70AB70BB70C
+B70DB70EB70FB710B711B712B713B714B715B716B717B718B719B71AB71BB71C
+B71DB71EB71FB720B721B722B723B724B725B726B727B72AB72BB72DB72EB731
+B732B733B734B735B736B737B73AB73CB73DB73EB73FB740B741B742B743B745
+B746B747B749B74AB74BB74DB74EB74FB750B751B752B753B756B757B758B759
+B75AB75BB75CB75DB75EB75FB761B762B763B765B766B767B769B76AB76BB76C
+B76DB76EB76FB772B774B776B777B778B779B77AB77BB77EB77FB781B782B783
+B785B786B787B788B789B78AB78BB78EB793B794B795B79AB79BB79DB79E0000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B79FB7A1B7A2B7A3B7A4B7A5B7A6B7A7B7AAB7AEB7AFB7B0B7B1B7B2B7B3
+B7B6B7B7B7B9B7BAB7BBB7BCB7BDB7BEB7BFB7C0B7C100000000000000000000
+0000B7C2B7C3B7C4B7C5B7C6B7C8B7CAB7CBB7CCB7CDB7CEB7CFB7D0B7D1B7D2
+B7D3B7D4B7D5B7D6B7D7B7D8B7D9B7DAB7DBB7DCB7DD00000000000000000000
+0000B7DEB7DFB7E0B7E1B7E2B7E3B7E4B7E5B7E6B7E7B7E8B7E9B7EAB7EBB7EE
+B7EFB7F1B7F2B7F3B7F5B7F6B7F7B7F8B7F9B7FAB7FBB7FEB802B803B804B805
+B806B80AB80BB80DB80EB80FB811B812B813B814B815B816B817B81AB81CB81E
+B81FB820B821B822B823B826B827B829B82AB82BB82DB82EB82FB830B831B832
+B833B836B83AB83BB83CB83DB83EB83FB841B842B843B845B846B847B848B849
+B84AB84BB84CB84DB84EB84FB850B852B854B855B856B857B858B859B85AB85B
+B85EB85FB861B862B863B865B866B867B868B869B86AB86BB86EB870B872B873
+B874B875B876B877B879B87AB87BB87DB87EB87FB880B881B882B883B8840000
+8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B885B886B887B888B889B88AB88BB88CB88EB88FB890B891B892B893B894
+B895B896B897B898B899B89AB89BB89CB89DB89EB89F00000000000000000000
+0000B8A0B8A1B8A2B8A3B8A4B8A5B8A6B8A7B8A9B8AAB8ABB8ACB8ADB8AEB8AF
+B8B1B8B2B8B3B8B5B8B6B8B7B8B9B8BAB8BBB8BCB8BD00000000000000000000
+0000B8BEB8BFB8C2B8C4B8C6B8C7B8C8B8C9B8CAB8CBB8CDB8CEB8CFB8D1B8D2
+B8D3B8D5B8D6B8D7B8D8B8D9B8DAB8DBB8DCB8DEB8E0B8E2B8E3B8E4B8E5B8E6
+B8E7B8EAB8EBB8EDB8EEB8EFB8F1B8F2B8F3B8F4B8F5B8F6B8F7B8FAB8FCB8FE
+B8FFB900B901B902B903B905B906B907B908B909B90AB90BB90CB90DB90EB90F
+B910B911B912B913B914B915B916B917B919B91AB91BB91CB91DB91EB91FB921
+B922B923B924B925B926B927B928B929B92AB92BB92CB92DB92EB92FB930B931
+B932B933B934B935B936B937B938B939B93AB93BB93EB93FB941B942B943B945
+B946B947B948B949B94AB94BB94DB94EB950B952B953B954B955B956B9570000
+90
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B95AB95BB95DB95EB95FB961B962B963B964B965B966B967B96AB96CB96E
+B96FB970B971B972B973B976B977B979B97AB97BB97D00000000000000000000
+0000B97EB97FB980B981B982B983B986B988B98BB98CB98FB990B991B992B993
+B994B995B996B997B998B999B99AB99BB99CB99DB99E00000000000000000000
+0000B99FB9A0B9A1B9A2B9A3B9A4B9A5B9A6B9A7B9A8B9A9B9AAB9ABB9AEB9AF
+B9B1B9B2B9B3B9B5B9B6B9B7B9B8B9B9B9BAB9BBB9BEB9C0B9C2B9C3B9C4B9C5
+B9C6B9C7B9CAB9CBB9CDB9D3B9D4B9D5B9D6B9D7B9DAB9DCB9DFB9E0B9E2B9E6
+B9E7B9E9B9EAB9EBB9EDB9EEB9EFB9F0B9F1B9F2B9F3B9F6B9FBB9FCB9FDB9FE
+B9FFBA02BA03BA04BA05BA06BA07BA09BA0ABA0BBA0CBA0DBA0EBA0FBA10BA11
+BA12BA13BA14BA16BA17BA18BA19BA1ABA1BBA1CBA1DBA1EBA1FBA20BA21BA22
+BA23BA24BA25BA26BA27BA28BA29BA2ABA2BBA2CBA2DBA2EBA2FBA30BA31BA32
+BA33BA34BA35BA36BA37BA3ABA3BBA3DBA3EBA3FBA41BA43BA44BA45BA460000
+91
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BA47BA4ABA4CBA4FBA50BA51BA52BA56BA57BA59BA5ABA5BBA5DBA5EBA5F
+BA60BA61BA62BA63BA66BA6ABA6BBA6CBA6DBA6EBA6F00000000000000000000
+0000BA72BA73BA75BA76BA77BA79BA7ABA7BBA7CBA7DBA7EBA7FBA80BA81BA82
+BA86BA88BA89BA8ABA8BBA8DBA8EBA8FBA90BA91BA9200000000000000000000
+0000BA93BA94BA95BA96BA97BA98BA99BA9ABA9BBA9CBA9DBA9EBA9FBAA0BAA1
+BAA2BAA3BAA4BAA5BAA6BAA7BAAABAADBAAEBAAFBAB1BAB3BAB4BAB5BAB6BAB7
+BABABABCBABEBABFBAC0BAC1BAC2BAC3BAC5BAC6BAC7BAC9BACABACBBACCBACD
+BACEBACFBAD0BAD1BAD2BAD3BAD4BAD5BAD6BAD7BADABADBBADCBADDBADEBADF
+BAE0BAE1BAE2BAE3BAE4BAE5BAE6BAE7BAE8BAE9BAEABAEBBAECBAEDBAEEBAEF
+BAF0BAF1BAF2BAF3BAF4BAF5BAF6BAF7BAF8BAF9BAFABAFBBAFDBAFEBAFFBB01
+BB02BB03BB05BB06BB07BB08BB09BB0ABB0BBB0CBB0EBB10BB12BB13BB14BB15
+BB16BB17BB19BB1ABB1BBB1DBB1EBB1FBB21BB22BB23BB24BB25BB26BB270000
+92
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BB28BB2ABB2CBB2DBB2EBB2FBB30BB31BB32BB33BB37BB39BB3ABB3FBB40
+BB41BB42BB43BB46BB48BB4ABB4BBB4CBB4EBB51BB5200000000000000000000
+0000BB53BB55BB56BB57BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB62BB64BB65
+BB66BB67BB68BB69BB6ABB6BBB6DBB6EBB6FBB70BB7100000000000000000000
+0000BB72BB73BB74BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB7FBB80
+BB81BB82BB83BB84BB85BB86BB87BB89BB8ABB8BBB8DBB8EBB8FBB91BB92BB93
+BB94BB95BB96BB97BB98BB99BB9ABB9BBB9CBB9DBB9EBB9FBBA0BBA1BBA2BBA3
+BBA5BBA6BBA7BBA9BBAABBABBBADBBAEBBAFBBB0BBB1BBB2BBB3BBB5BBB6BBB8
+BBB9BBBABBBBBBBCBBBDBBBEBBBFBBC1BBC2BBC3BBC5BBC6BBC7BBC9BBCABBCB
+BBCCBBCDBBCEBBCFBBD1BBD2BBD4BBD5BBD6BBD7BBD8BBD9BBDABBDBBBDCBBDD
+BBDEBBDFBBE0BBE1BBE2BBE3BBE4BBE5BBE6BBE7BBE8BBE9BBEABBEBBBECBBED
+BBEEBBEFBBF0BBF1BBF2BBF3BBF4BBF5BBF6BBF7BBFABBFBBBFDBBFEBC010000
+93
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BC03BC04BC05BC06BC07BC0ABC0EBC10BC12BC13BC19BC1ABC20BC21BC22
+BC23BC26BC28BC2ABC2BBC2CBC2EBC2FBC32BC33BC3500000000000000000000
+0000BC36BC37BC39BC3ABC3BBC3CBC3DBC3EBC3FBC42BC46BC47BC48BC4ABC4B
+BC4EBC4FBC51BC52BC53BC54BC55BC56BC57BC58BC5900000000000000000000
+0000BC5ABC5BBC5CBC5EBC5FBC60BC61BC62BC63BC64BC65BC66BC67BC68BC69
+BC6ABC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78BC79
+BC7ABC7BBC7CBC7DBC7EBC7FBC80BC81BC82BC83BC86BC87BC89BC8ABC8DBC8F
+BC90BC91BC92BC93BC96BC98BC9BBC9CBC9DBC9EBC9FBCA2BCA3BCA5BCA6BCA9
+BCAABCABBCACBCADBCAEBCAFBCB2BCB6BCB7BCB8BCB9BCBABCBBBCBEBCBFBCC1
+BCC2BCC3BCC5BCC6BCC7BCC8BCC9BCCABCCBBCCCBCCEBCD2BCD3BCD4BCD6BCD7
+BCD9BCDABCDBBCDDBCDEBCDFBCE0BCE1BCE2BCE3BCE4BCE5BCE6BCE7BCE8BCE9
+BCEABCEBBCECBCEDBCEEBCEFBCF0BCF1BCF2BCF3BCF7BCF9BCFABCFBBCFD0000
+94
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BCFEBCFFBD00BD01BD02BD03BD06BD08BD0ABD0BBD0CBD0DBD0EBD0FBD11
+BD12BD13BD15BD16BD17BD18BD19BD1ABD1BBD1CBD1D00000000000000000000
+0000BD1EBD1FBD20BD21BD22BD23BD25BD26BD27BD28BD29BD2ABD2BBD2DBD2E
+BD2FBD30BD31BD32BD33BD34BD35BD36BD37BD38BD3900000000000000000000
+0000BD3ABD3BBD3CBD3DBD3EBD3FBD41BD42BD43BD44BD45BD46BD47BD4ABD4B
+BD4DBD4EBD4FBD51BD52BD53BD54BD55BD56BD57BD5ABD5BBD5CBD5DBD5EBD5F
+BD60BD61BD62BD63BD65BD66BD67BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71
+BD72BD73BD74BD75BD76BD77BD78BD79BD7ABD7BBD7CBD7DBD7EBD7FBD82BD83
+BD85BD86BD8BBD8CBD8DBD8EBD8FBD92BD94BD96BD97BD98BD9BBD9DBD9EBD9F
+BDA0BDA1BDA2BDA3BDA5BDA6BDA7BDA8BDA9BDAABDABBDACBDADBDAEBDAFBDB1
+BDB2BDB3BDB4BDB5BDB6BDB7BDB9BDBABDBBBDBCBDBDBDBEBDBFBDC0BDC1BDC2
+BDC3BDC4BDC5BDC6BDC7BDC8BDC9BDCABDCBBDCCBDCDBDCEBDCFBDD0BDD10000
+95
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BDD2BDD3BDD6BDD7BDD9BDDABDDBBDDDBDDEBDDFBDE0BDE1BDE2BDE3BDE4
+BDE5BDE6BDE7BDE8BDEABDEBBDECBDEDBDEEBDEFBDF100000000000000000000
+0000BDF2BDF3BDF5BDF6BDF7BDF9BDFABDFBBDFCBDFDBDFEBDFFBE01BE02BE04
+BE06BE07BE08BE09BE0ABE0BBE0EBE0FBE11BE12BE1300000000000000000000
+0000BE15BE16BE17BE18BE19BE1ABE1BBE1EBE20BE21BE22BE23BE24BE25BE26
+BE27BE28BE29BE2ABE2BBE2CBE2DBE2EBE2FBE30BE31BE32BE33BE34BE35BE36
+BE37BE38BE39BE3ABE3BBE3CBE3DBE3EBE3FBE40BE41BE42BE43BE46BE47BE49
+BE4ABE4BBE4DBE4FBE50BE51BE52BE53BE56BE58BE5CBE5DBE5EBE5FBE62BE63
+BE65BE66BE67BE69BE6BBE6CBE6DBE6EBE6FBE72BE76BE77BE78BE79BE7ABE7E
+BE7FBE81BE82BE83BE85BE86BE87BE88BE89BE8ABE8BBE8EBE92BE93BE94BE95
+BE96BE97BE9ABE9BBE9CBE9DBE9EBE9FBEA0BEA1BEA2BEA3BEA4BEA5BEA6BEA7
+BEA9BEAABEABBEACBEADBEAEBEAFBEB0BEB1BEB2BEB3BEB4BEB5BEB6BEB70000
+96
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BEB8BEB9BEBABEBBBEBCBEBDBEBEBEBFBEC0BEC1BEC2BEC3BEC4BEC5BEC6
+BEC7BEC8BEC9BECABECBBECCBECDBECEBECFBED2BED300000000000000000000
+0000BED5BED6BED9BEDABEDBBEDCBEDDBEDEBEDFBEE1BEE2BEE6BEE7BEE8BEE9
+BEEABEEBBEEDBEEEBEEFBEF0BEF1BEF2BEF3BEF4BEF500000000000000000000
+0000BEF6BEF7BEF8BEF9BEFABEFBBEFCBEFDBEFEBEFFBF00BF02BF03BF04BF05
+BF06BF07BF0ABF0BBF0CBF0DBF0EBF0FBF10BF11BF12BF13BF14BF15BF16BF17
+BF1ABF1EBF1FBF20BF21BF22BF23BF24BF25BF26BF27BF28BF29BF2ABF2BBF2C
+BF2DBF2EBF2FBF30BF31BF32BF33BF34BF35BF36BF37BF38BF39BF3ABF3BBF3C
+BF3DBF3EBF3FBF42BF43BF45BF46BF47BF49BF4ABF4BBF4CBF4DBF4EBF4FBF52
+BF53BF54BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63
+BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73
+BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF7FBF80BF81BF820000
+97
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BF83BF84BF85BF86BF87BF88BF89BF8ABF8BBF8CBF8DBF8EBF8FBF90BF91
+BF92BF93BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9D00000000000000000000
+0000BF9EBF9FBFA0BFA1BFA2BFA3BFA4BFA5BFA6BFA7BFA8BFA9BFAABFABBFAC
+BFADBFAEBFAFBFB1BFB2BFB3BFB4BFB5BFB6BFB7BFB800000000000000000000
+0000BFB9BFBABFBBBFBCBFBDBFBEBFBFBFC0BFC1BFC2BFC3BFC4BFC6BFC7BFC8
+BFC9BFCABFCBBFCEBFCFBFD1BFD2BFD3BFD5BFD6BFD7BFD8BFD9BFDABFDBBFDD
+BFDEBFE0BFE2BFE3BFE4BFE5BFE6BFE7BFE8BFE9BFEABFEBBFECBFEDBFEEBFEF
+BFF0BFF1BFF2BFF3BFF4BFF5BFF6BFF7BFF8BFF9BFFABFFBBFFCBFFDBFFEBFFF
+C000C001C002C003C004C005C006C007C008C009C00AC00BC00CC00DC00EC00F
+C010C011C012C013C014C015C016C017C018C019C01AC01BC01CC01DC01EC01F
+C020C021C022C023C024C025C026C027C028C029C02AC02BC02CC02DC02EC02F
+C030C031C032C033C034C035C036C037C038C039C03AC03BC03DC03EC03F0000
+98
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04E
+C04FC050C052C053C054C055C056C057C059C05AC05B00000000000000000000
+0000C05DC05EC05FC061C062C063C064C065C066C067C06AC06BC06CC06DC06E
+C06FC070C071C072C073C074C075C076C077C078C07900000000000000000000
+0000C07AC07BC07CC07DC07EC07FC080C081C082C083C084C085C086C087C088
+C089C08AC08BC08CC08DC08EC08FC092C093C095C096C097C099C09AC09BC09C
+C09DC09EC09FC0A2C0A4C0A6C0A7C0A8C0A9C0AAC0ABC0AEC0B1C0B2C0B7C0B8
+C0B9C0BAC0BBC0BEC0C2C0C3C0C4C0C6C0C7C0CAC0CBC0CDC0CEC0CFC0D1C0D2
+C0D3C0D4C0D5C0D6C0D7C0DAC0DEC0DFC0E0C0E1C0E2C0E3C0E6C0E7C0E9C0EA
+C0EBC0EDC0EEC0EFC0F0C0F1C0F2C0F3C0F6C0F8C0FAC0FBC0FCC0FDC0FEC0FF
+C101C102C103C105C106C107C109C10AC10BC10CC10DC10EC10FC111C112C113
+C114C116C117C118C119C11AC11BC121C122C125C128C129C12AC12BC12E0000
+99
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C132C133C134C135C137C13AC13BC13DC13EC13FC141C142C143C144C145
+C146C147C14AC14EC14FC150C151C152C153C156C15700000000000000000000
+0000C159C15AC15BC15DC15EC15FC160C161C162C163C166C16AC16BC16CC16D
+C16EC16FC171C172C173C175C176C177C179C17AC17B00000000000000000000
+0000C17CC17DC17EC17FC180C181C182C183C184C186C187C188C189C18AC18B
+C18FC191C192C193C195C197C198C199C19AC19BC19EC1A0C1A2C1A3C1A4C1A6
+C1A7C1AAC1ABC1ADC1AEC1AFC1B1C1B2C1B3C1B4C1B5C1B6C1B7C1B8C1B9C1BA
+C1BBC1BCC1BEC1BFC1C0C1C1C1C2C1C3C1C5C1C6C1C7C1C9C1CAC1CBC1CDC1CE
+C1CFC1D0C1D1C1D2C1D3C1D5C1D6C1D9C1DAC1DBC1DCC1DDC1DEC1DFC1E1C1E2
+C1E3C1E5C1E6C1E7C1E9C1EAC1EBC1ECC1EDC1EEC1EFC1F2C1F4C1F5C1F6C1F7
+C1F8C1F9C1FAC1FBC1FEC1FFC201C202C203C205C206C207C208C209C20AC20B
+C20EC210C212C213C214C215C216C217C21AC21BC21DC21EC221C222C2230000
+9A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C224C225C226C227C22AC22CC22EC230C233C235C236C237C238C239C23A
+C23BC23CC23DC23EC23FC240C241C242C243C244C24500000000000000000000
+0000C246C247C249C24AC24BC24CC24DC24EC24FC252C253C255C256C257C259
+C25AC25BC25CC25DC25EC25FC261C262C263C264C26600000000000000000000
+0000C267C268C269C26AC26BC26EC26FC271C272C273C275C276C277C278C279
+C27AC27BC27EC280C282C283C284C285C286C287C28AC28BC28CC28DC28EC28F
+C291C292C293C294C295C296C297C299C29AC29CC29EC29FC2A0C2A1C2A2C2A3
+C2A6C2A7C2A9C2AAC2ABC2AEC2AFC2B0C2B1C2B2C2B3C2B6C2B8C2BAC2BBC2BC
+C2BDC2BEC2BFC2C0C2C1C2C2C2C3C2C4C2C5C2C6C2C7C2C8C2C9C2CAC2CBC2CC
+C2CDC2CEC2CFC2D0C2D1C2D2C2D3C2D4C2D5C2D6C2D7C2D8C2D9C2DAC2DBC2DE
+C2DFC2E1C2E2C2E5C2E6C2E7C2E8C2E9C2EAC2EEC2F0C2F2C2F3C2F4C2F5C2F7
+C2FAC2FDC2FEC2FFC301C302C303C304C305C306C307C30AC30BC30EC30F0000
+9B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C310C311C312C316C317C319C31AC31BC31DC31EC31FC320C321C322C323
+C326C327C32AC32BC32CC32DC32EC32FC330C331C33200000000000000000000
+0000C333C334C335C336C337C338C339C33AC33BC33CC33DC33EC33FC340C341
+C342C343C344C346C347C348C349C34AC34BC34CC34D00000000000000000000
+0000C34EC34FC350C351C352C353C354C355C356C357C358C359C35AC35BC35C
+C35DC35EC35FC360C361C362C363C364C365C366C367C36AC36BC36DC36EC36F
+C371C373C374C375C376C377C37AC37BC37EC37FC380C381C382C383C385C386
+C387C389C38AC38BC38DC38EC38FC390C391C392C393C394C395C396C397C398
+C399C39AC39BC39CC39DC39EC39FC3A0C3A1C3A2C3A3C3A4C3A5C3A6C3A7C3A8
+C3A9C3AAC3ABC3ACC3ADC3AEC3AFC3B0C3B1C3B2C3B3C3B4C3B5C3B6C3B7C3B8
+C3B9C3BAC3BBC3BCC3BDC3BEC3BFC3C1C3C2C3C3C3C4C3C5C3C6C3C7C3C8C3C9
+C3CAC3CBC3CCC3CDC3CEC3CFC3D0C3D1C3D2C3D3C3D4C3D5C3D6C3D7C3DA0000
+9C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C3DBC3DDC3DEC3E1C3E3C3E4C3E5C3E6C3E7C3EAC3EBC3ECC3EEC3EFC3F0
+C3F1C3F2C3F3C3F6C3F7C3F9C3FAC3FBC3FCC3FDC3FE00000000000000000000
+0000C3FFC400C401C402C403C404C405C406C407C409C40AC40BC40CC40DC40E
+C40FC411C412C413C414C415C416C417C418C419C41A00000000000000000000
+0000C41BC41CC41DC41EC41FC420C421C422C423C425C426C427C428C429C42A
+C42BC42DC42EC42FC431C432C433C435C436C437C438C439C43AC43BC43EC43F
+C440C441C442C443C444C445C446C447C449C44AC44BC44CC44DC44EC44FC450
+C451C452C453C454C455C456C457C458C459C45AC45BC45CC45DC45EC45FC460
+C461C462C463C466C467C469C46AC46BC46DC46EC46FC470C471C472C473C476
+C477C478C47AC47BC47CC47DC47EC47FC481C482C483C484C485C486C487C488
+C489C48AC48BC48CC48DC48EC48FC490C491C492C493C495C496C497C498C499
+C49AC49BC49DC49EC49FC4A0C4A1C4A2C4A3C4A4C4A5C4A6C4A7C4A8C4A90000
+9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C4AAC4ABC4ACC4ADC4AEC4AFC4B0C4B1C4B2C4B3C4B4C4B5C4B6C4B7C4B9
+C4BAC4BBC4BDC4BEC4BFC4C0C4C1C4C2C4C3C4C4C4C500000000000000000000
+0000C4C6C4C7C4C8C4C9C4CAC4CBC4CCC4CDC4CEC4CFC4D0C4D1C4D2C4D3C4D4
+C4D5C4D6C4D7C4D8C4D9C4DAC4DBC4DCC4DDC4DEC4DF00000000000000000000
+0000C4E0C4E1C4E2C4E3C4E4C4E5C4E6C4E7C4E8C4EAC4EBC4ECC4EDC4EEC4EF
+C4F2C4F3C4F5C4F6C4F7C4F9C4FBC4FCC4FDC4FEC502C503C504C505C506C507
+C508C509C50AC50BC50DC50EC50FC511C512C513C515C516C517C518C519C51A
+C51BC51DC51EC51FC520C521C522C523C524C525C526C527C52AC52BC52DC52E
+C52FC531C532C533C534C535C536C537C53AC53CC53EC53FC540C541C542C543
+C546C547C54BC54FC550C551C552C556C55AC55BC55CC55FC562C563C565C566
+C567C569C56AC56BC56CC56DC56EC56FC572C576C577C578C579C57AC57BC57E
+C57FC581C582C583C585C586C588C589C58AC58BC58EC590C592C593C5940000
+9E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C596C599C59AC59BC59DC59EC59FC5A1C5A2C5A3C5A4C5A5C5A6C5A7C5A8
+C5AAC5ABC5ACC5ADC5AEC5AFC5B0C5B1C5B2C5B3C5B600000000000000000000
+0000C5B7C5BAC5BFC5C0C5C1C5C2C5C3C5CBC5CDC5CFC5D2C5D3C5D5C5D6C5D7
+C5D9C5DAC5DBC5DCC5DDC5DEC5DFC5E2C5E4C5E6C5E700000000000000000000
+0000C5E8C5E9C5EAC5EBC5EFC5F1C5F2C5F3C5F5C5F8C5F9C5FAC5FBC602C603
+C604C609C60AC60BC60DC60EC60FC611C612C613C614C615C616C617C61AC61D
+C61EC61FC620C621C622C623C626C627C629C62AC62BC62FC631C632C636C638
+C63AC63CC63DC63EC63FC642C643C645C646C647C649C64AC64BC64CC64DC64E
+C64FC652C656C657C658C659C65AC65BC65EC65FC661C662C663C664C665C666
+C667C668C669C66AC66BC66DC66EC670C672C673C674C675C676C677C67AC67B
+C67DC67EC67FC681C682C683C684C685C686C687C68AC68CC68EC68FC690C691
+C692C693C696C697C699C69AC69BC69DC69EC69FC6A0C6A1C6A2C6A3C6A60000
+9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C6A8C6AAC6ABC6ACC6ADC6AEC6AFC6B2C6B3C6B5C6B6C6B7C6BBC6BCC6BD
+C6BEC6BFC6C2C6C4C6C6C6C7C6C8C6C9C6CAC6CBC6CE00000000000000000000
+0000C6CFC6D1C6D2C6D3C6D5C6D6C6D7C6D8C6D9C6DAC6DBC6DEC6DFC6E2C6E3
+C6E4C6E5C6E6C6E7C6EAC6EBC6EDC6EEC6EFC6F1C6F200000000000000000000
+0000C6F3C6F4C6F5C6F6C6F7C6FAC6FBC6FCC6FEC6FFC700C701C702C703C706
+C707C709C70AC70BC70DC70EC70FC710C711C712C713C716C718C71AC71BC71C
+C71DC71EC71FC722C723C725C726C727C729C72AC72BC72CC72DC72EC72FC732
+C734C736C738C739C73AC73BC73EC73FC741C742C743C745C746C747C748C749
+C74BC74EC750C759C75AC75BC75DC75EC75FC761C762C763C764C765C766C767
+C769C76AC76CC76DC76EC76FC770C771C772C773C776C777C779C77AC77BC77F
+C780C781C782C786C78BC78CC78DC78FC792C793C795C799C79BC79CC79DC79E
+C79FC7A2C7A7C7A8C7A9C7AAC7ABC7AEC7AFC7B1C7B2C7B3C7B5C7B6C7B70000
+A0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C7B8C7B9C7BAC7BBC7BEC7C2C7C3C7C4C7C5C7C6C7C7C7CAC7CBC7CDC7CF
+C7D1C7D2C7D3C7D4C7D5C7D6C7D7C7D9C7DAC7DBC7DC00000000000000000000
+0000C7DEC7DFC7E0C7E1C7E2C7E3C7E5C7E6C7E7C7E9C7EAC7EBC7EDC7EEC7EF
+C7F0C7F1C7F2C7F3C7F4C7F5C7F6C7F7C7F8C7F9C7FA00000000000000000000
+0000C7FBC7FCC7FDC7FEC7FFC802C803C805C806C807C809C80BC80CC80DC80E
+C80FC812C814C817C818C819C81AC81BC81EC81FC821C822C823C825C826C827
+C828C829C82AC82BC82EC830C832C833C834C835C836C837C839C83AC83BC83D
+C83EC83FC841C842C843C844C845C846C847C84AC84BC84EC84FC850C851C852
+C853C855C856C857C858C859C85AC85BC85CC85DC85EC85FC860C861C862C863
+C864C865C866C867C868C869C86AC86BC86CC86DC86EC86FC872C873C875C876
+C877C879C87BC87CC87DC87EC87FC882C884C888C889C88AC88EC88FC890C891
+C892C893C895C896C897C898C899C89AC89BC89CC89EC8A0C8A2C8A3C8A40000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C8A5C8A6C8A7C8A9C8AAC8ABC8ACC8ADC8AEC8AFC8B0C8B1C8B2C8B3C8B4
+C8B5C8B6C8B7C8B8C8B9C8BAC8BBC8BEC8BFC8C0C8C100000000000000000000
+0000C8C2C8C3C8C5C8C6C8C7C8C9C8CAC8CBC8CDC8CEC8CFC8D0C8D1C8D2C8D3
+C8D6C8D8C8DAC8DBC8DCC8DDC8DEC8DFC8E2C8E3C8E500000000000000000000
+0000C8E6C8E7C8E8C8E9C8EAC8EBC8ECC8EDC8EEC8EFC8F0C8F1C8F2C8F3C8F4
+C8F6C8F7C8F8C8F9C8FAC8FBC8FEC8FFC901C902C903C907C908C909C90AC90B
+C90E30003001300200B72025202600A8300300AD20152225FF3C223C20182019
+201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7
+00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640
+222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D
+221D2235222B222C2208220B2286228722822283222A222922272228FFE20000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C910C912C913C914C915C916C917C919C91AC91BC91CC91DC91EC91FC920
+C921C922C923C924C925C926C927C928C929C92AC92B00000000000000000000
+0000C92DC92EC92FC930C931C932C933C935C936C937C938C939C93AC93BC93C
+C93DC93EC93FC940C941C942C943C944C945C946C94700000000000000000000
+0000C948C949C94AC94BC94CC94DC94EC94FC952C953C955C956C957C959C95A
+C95BC95CC95DC95EC95FC962C964C965C966C967C968C969C96AC96BC96DC96E
+C96F21D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF
+02D0222E2211220F00A42109203025C125C025B725B626642660266126652667
+2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E
+261C261E00B62020202121952197219921962198266D2669266A266C327F321C
+211633C7212233C233D821210000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C971C972C973C975C976C977C978C979C97AC97BC97DC97EC97FC980C981
+C982C983C984C985C986C987C98AC98BC98DC98EC98F00000000000000000000
+0000C991C992C993C994C995C996C997C99AC99CC99EC99FC9A0C9A1C9A2C9A3
+C9A4C9A5C9A6C9A7C9A8C9A9C9AAC9ABC9ACC9ADC9AE00000000000000000000
+0000C9AFC9B0C9B1C9B2C9B3C9B4C9B5C9B6C9B7C9B8C9B9C9BAC9BBC9BCC9BD
+C9BEC9BFC9C2C9C3C9C5C9C6C9C9C9CBC9CCC9CDC9CEC9CFC9D2C9D4C9D7C9D8
+C9DBFF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C9DEC9DFC9E1C9E3C9E5C9E6C9E8C9E9C9EAC9EBC9EEC9F2C9F3C9F4C9F5
+C9F6C9F7C9FAC9FBC9FDC9FEC9FFCA01CA02CA03CA0400000000000000000000
+0000CA05CA06CA07CA0ACA0ECA0FCA10CA11CA12CA13CA15CA16CA17CA19CA1A
+CA1BCA1CCA1DCA1ECA1FCA20CA21CA22CA23CA24CA2500000000000000000000
+0000CA26CA27CA28CA2ACA2BCA2CCA2DCA2ECA2FCA30CA31CA32CA33CA34CA35
+CA36CA37CA38CA39CA3ACA3BCA3CCA3DCA3ECA3FCA40CA41CA42CA43CA44CA45
+CA46313131323133313431353136313731383139313A313B313C313D313E313F
+3140314131423143314431453146314731483149314A314B314C314D314E314F
+3150315131523153315431553156315731583159315A315B315C315D315E315F
+3160316131623163316431653166316731683169316A316B316C316D316E316F
+3170317131723173317431753176317731783179317A317B317C317D317E317F
+3180318131823183318431853186318731883189318A318B318C318D318E0000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CA47CA48CA49CA4ACA4BCA4ECA4FCA51CA52CA53CA55CA56CA57CA58CA59
+CA5ACA5BCA5ECA62CA63CA64CA65CA66CA67CA69CA6A00000000000000000000
+0000CA6BCA6CCA6DCA6ECA6FCA70CA71CA72CA73CA74CA75CA76CA77CA78CA79
+CA7ACA7BCA7CCA7ECA7FCA80CA81CA82CA83CA85CA8600000000000000000000
+0000CA87CA88CA89CA8ACA8BCA8CCA8DCA8ECA8FCA90CA91CA92CA93CA94CA95
+CA96CA97CA99CA9ACA9BCA9CCA9DCA9ECA9FCAA0CAA1CAA2CAA3CAA4CAA5CAA6
+CAA7217021712172217321742175217621772178217900000000000000000000
+2160216121622163216421652166216721682169000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CAA8CAA9CAAACAABCAACCAADCAAECAAFCAB0CAB1CAB2CAB3CAB4CAB5CAB6
+CAB7CAB8CAB9CABACABBCABECABFCAC1CAC2CAC3CAC500000000000000000000
+0000CAC6CAC7CAC8CAC9CACACACBCACECAD0CAD2CAD4CAD5CAD6CAD7CADACADB
+CADCCADDCADECADFCAE1CAE2CAE3CAE4CAE5CAE6CAE700000000000000000000
+0000CAE8CAE9CAEACAEBCAEDCAEECAEFCAF0CAF1CAF2CAF3CAF5CAF6CAF7CAF8
+CAF9CAFACAFBCAFCCAFDCAFECAFFCB00CB01CB02CB03CB04CB05CB06CB07CB09
+CB0A25002502250C251025182514251C252C25242534253C25012503250F2513
+251B251725232533252B253B254B2520252F25282537253F251D253025252538
+254225122511251A251925162515250E250D251E251F25212522252625272529
+252A252D252E25312532253525362539253A253D253E25402541254325442545
+2546254725482549254A00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CB0BCB0CCB0DCB0ECB0FCB11CB12CB13CB15CB16CB17CB19CB1ACB1BCB1C
+CB1DCB1ECB1FCB22CB23CB24CB25CB26CB27CB28CB2900000000000000000000
+0000CB2ACB2BCB2CCB2DCB2ECB2FCB30CB31CB32CB33CB34CB35CB36CB37CB38
+CB39CB3ACB3BCB3CCB3DCB3ECB3FCB40CB42CB43CB4400000000000000000000
+0000CB45CB46CB47CB4ACB4BCB4DCB4ECB4FCB51CB52CB53CB54CB55CB56CB57
+CB5ACB5BCB5CCB5ECB5FCB60CB61CB62CB63CB65CB66CB67CB68CB69CB6ACB6B
+CB6C3395339633972113339833C433A333A433A533A63399339A339B339C339D
+339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0
+33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB
+33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6
+33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6
+0000000000000000000000000000000000000000000000000000000000000000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CB6DCB6ECB6FCB70CB71CB72CB73CB74CB75CB76CB77CB7ACB7BCB7CCB7D
+CB7ECB7FCB80CB81CB82CB83CB84CB85CB86CB87CB8800000000000000000000
+0000CB89CB8ACB8BCB8CCB8DCB8ECB8FCB90CB91CB92CB93CB94CB95CB96CB97
+CB98CB99CB9ACB9BCB9DCB9ECB9FCBA0CBA1CBA2CBA300000000000000000000
+0000CBA4CBA5CBA6CBA7CBA8CBA9CBAACBABCBACCBADCBAECBAFCBB0CBB1CBB2
+CBB3CBB4CBB5CBB6CBB7CBB9CBBACBBBCBBCCBBDCBBECBBFCBC0CBC1CBC2CBC3
+CBC400C600D000AA0126000001320000013F014100D8015200BA00DE0166014A
+00003260326132623263326432653266326732683269326A326B326C326D326E
+326F3270327132723273327432753276327732783279327A327B24D024D124D2
+24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2
+24E324E424E524E624E724E824E9246024612462246324642465246624672468
+2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CBC5CBC6CBC7CBC8CBC9CBCACBCBCBCCCBCDCBCECBCFCBD0CBD1CBD2CBD3
+CBD5CBD6CBD7CBD8CBD9CBDACBDBCBDCCBDDCBDECBDF00000000000000000000
+0000CBE0CBE1CBE2CBE3CBE5CBE6CBE8CBEACBEBCBECCBEDCBEECBEFCBF0CBF1
+CBF2CBF3CBF4CBF5CBF6CBF7CBF8CBF9CBFACBFBCBFC00000000000000000000
+0000CBFDCBFECBFFCC00CC01CC02CC03CC04CC05CC06CC07CC08CC09CC0ACC0B
+CC0ECC0FCC11CC12CC13CC15CC16CC17CC18CC19CC1ACC1BCC1ECC1FCC20CC23
+CC2400E6011100F001270131013301380140014200F8015300DF00FE0167014B
+01493200320132023203320432053206320732083209320A320B320C320D320E
+320F3210321132123213321432153216321732183219321A321B249C249D249E
+249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE
+24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C
+247D247E247F24802481248200B900B200B32074207F20812082208320840000
+AA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CC25CC26CC2ACC2BCC2DCC2FCC31CC32CC33CC34CC35CC36CC37CC3ACC3F
+CC40CC41CC42CC43CC46CC47CC49CC4ACC4BCC4DCC4E00000000000000000000
+0000CC4FCC50CC51CC52CC53CC56CC5ACC5BCC5CCC5DCC5ECC5FCC61CC62CC63
+CC65CC67CC69CC6ACC6BCC6CCC6DCC6ECC6FCC71CC7200000000000000000000
+0000CC73CC74CC76CC77CC78CC79CC7ACC7BCC7CCC7DCC7ECC7FCC80CC81CC82
+CC83CC84CC85CC86CC87CC88CC89CC8ACC8BCC8CCC8DCC8ECC8FCC90CC91CC92
+CC93304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+AB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CC94CC95CC96CC97CC9ACC9BCC9DCC9ECC9FCCA1CCA2CCA3CCA4CCA5CCA6
+CCA7CCAACCAECCAFCCB0CCB1CCB2CCB3CCB6CCB7CCB900000000000000000000
+0000CCBACCBBCCBDCCBECCBFCCC0CCC1CCC2CCC3CCC6CCC8CCCACCCBCCCCCCCD
+CCCECCCFCCD1CCD2CCD3CCD5CCD6CCD7CCD8CCD9CCDA00000000000000000000
+0000CCDBCCDCCCDDCCDECCDFCCE0CCE1CCE2CCE3CCE5CCE6CCE7CCE8CCE9CCEA
+CCEBCCEDCCEECCEFCCF1CCF2CCF3CCF4CCF5CCF6CCF7CCF8CCF9CCFACCFBCCFC
+CCFD30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CCFECCFFCD00CD02CD03CD04CD05CD06CD07CD0ACD0BCD0DCD0ECD0FCD11
+CD12CD13CD14CD15CD16CD17CD1ACD1CCD1ECD1FCD2000000000000000000000
+0000CD21CD22CD23CD25CD26CD27CD29CD2ACD2BCD2DCD2ECD2FCD30CD31CD32
+CD33CD34CD35CD36CD37CD38CD3ACD3BCD3CCD3DCD3E00000000000000000000
+0000CD3FCD40CD41CD42CD43CD44CD45CD46CD47CD48CD49CD4ACD4BCD4CCD4D
+CD4ECD4FCD50CD51CD52CD53CD54CD55CD56CD57CD58CD59CD5ACD5BCD5DCD5E
+CD5F04100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+AD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CD61CD62CD63CD65CD66CD67CD68CD69CD6ACD6BCD6ECD70CD72CD73CD74
+CD75CD76CD77CD79CD7ACD7BCD7CCD7DCD7ECD7FCD8000000000000000000000
+0000CD81CD82CD83CD84CD85CD86CD87CD89CD8ACD8BCD8CCD8DCD8ECD8FCD90
+CD91CD92CD93CD96CD97CD99CD9ACD9BCD9DCD9ECD9F00000000000000000000
+0000CDA0CDA1CDA2CDA3CDA6CDA8CDAACDABCDACCDADCDAECDAFCDB1CDB2CDB3
+CDB4CDB5CDB6CDB7CDB8CDB9CDBACDBBCDBCCDBDCDBECDBFCDC0CDC1CDC2CDC3
+CDC5000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CDC6CDC7CDC8CDC9CDCACDCBCDCDCDCECDCFCDD1CDD2CDD3CDD4CDD5CDD6
+CDD7CDD8CDD9CDDACDDBCDDCCDDDCDDECDDFCDE0CDE100000000000000000000
+0000CDE2CDE3CDE4CDE5CDE6CDE7CDE9CDEACDEBCDEDCDEECDEFCDF1CDF2CDF3
+CDF4CDF5CDF6CDF7CDFACDFCCDFECDFFCE00CE01CE0200000000000000000000
+0000CE03CE05CE06CE07CE09CE0ACE0BCE0DCE0ECE0FCE10CE11CE12CE13CE15
+CE16CE17CE18CE1ACE1BCE1CCE1DCE1ECE1FCE22CE23CE25CE26CE27CE29CE2A
+CE2B000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+AF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CE2CCE2DCE2ECE2FCE32CE34CE36CE37CE38CE39CE3ACE3BCE3CCE3DCE3E
+CE3FCE40CE41CE42CE43CE44CE45CE46CE47CE48CE4900000000000000000000
+0000CE4ACE4BCE4CCE4DCE4ECE4FCE50CE51CE52CE53CE54CE55CE56CE57CE5A
+CE5BCE5DCE5ECE62CE63CE64CE65CE66CE67CE6ACE6C00000000000000000000
+0000CE6ECE6FCE70CE71CE72CE73CE76CE77CE79CE7ACE7BCE7DCE7ECE7FCE80
+CE81CE82CE83CE86CE88CE8ACE8BCE8CCE8DCE8ECE8FCE92CE93CE95CE96CE97
+CE99000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CE9ACE9BCE9CCE9DCE9ECE9FCEA2CEA6CEA7CEA8CEA9CEAACEABCEAECEAF
+CEB0CEB1CEB2CEB3CEB4CEB5CEB6CEB7CEB8CEB9CEBA00000000000000000000
+0000CEBBCEBCCEBDCEBECEBFCEC0CEC2CEC3CEC4CEC5CEC6CEC7CEC8CEC9CECA
+CECBCECCCECDCECECECFCED0CED1CED2CED3CED4CED500000000000000000000
+0000CED6CED7CED8CED9CEDACEDBCEDCCEDDCEDECEDFCEE0CEE1CEE2CEE3CEE6
+CEE7CEE9CEEACEEDCEEECEEFCEF0CEF1CEF2CEF3CEF6CEFACEFBCEFCCEFDCEFE
+CEFFAC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17
+AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40
+AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85
+AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC
+ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4
+ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CF02CF03CF05CF06CF07CF09CF0ACF0BCF0CCF0DCF0ECF0FCF12CF14CF16
+CF17CF18CF19CF1ACF1BCF1DCF1ECF1FCF21CF22CF2300000000000000000000
+0000CF25CF26CF27CF28CF29CF2ACF2BCF2ECF32CF33CF34CF35CF36CF37CF39
+CF3ACF3BCF3CCF3DCF3ECF3FCF40CF41CF42CF43CF4400000000000000000000
+0000CF45CF46CF47CF48CF49CF4ACF4BCF4CCF4DCF4ECF4FCF50CF51CF52CF53
+CF56CF57CF59CF5ACF5BCF5DCF5ECF5FCF60CF61CF62CF63CF66CF68CF6ACF6B
+CF6CAD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44
+AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B
+AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4
+ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B
+AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D
+AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CF6DCF6ECF6FCF72CF73CF75CF76CF77CF79CF7ACF7BCF7CCF7DCF7ECF7F
+CF81CF82CF83CF84CF86CF87CF88CF89CF8ACF8BCF8D00000000000000000000
+0000CF8ECF8FCF90CF91CF92CF93CF94CF95CF96CF97CF98CF99CF9ACF9BCF9C
+CF9DCF9ECF9FCFA0CFA2CFA3CFA4CFA5CFA6CFA7CFA900000000000000000000
+0000CFAACFABCFACCFADCFAECFAFCFB1CFB2CFB3CFB4CFB5CFB6CFB7CFB8CFB9
+CFBACFBBCFBCCFBDCFBECFBFCFC0CFC1CFC2CFC3CFC5CFC6CFC7CFC8CFC9CFCA
+CFCBAE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF
+AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C
+AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64
+AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9
+AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010
+B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CFCCCFCDCFCECFCFCFD0CFD1CFD2CFD3CFD4CFD5CFD6CFD7CFD8CFD9CFDA
+CFDBCFDCCFDDCFDECFDFCFE2CFE3CFE5CFE6CFE7CFE900000000000000000000
+0000CFEACFEBCFECCFEDCFEECFEFCFF2CFF4CFF6CFF7CFF8CFF9CFFACFFBCFFD
+CFFECFFFD001D002D003D005D006D007D008D009D00A00000000000000000000
+0000D00BD00CD00DD00ED00FD010D012D013D014D015D016D017D019D01AD01B
+D01CD01DD01ED01FD020D021D022D023D024D025D026D027D028D029D02AD02B
+D02CB05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0
+B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4
+B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112
+B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139
+B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182
+B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D02ED02FD030D031D032D033D036D037D039D03AD03BD03DD03ED03FD040
+D041D042D043D046D048D04AD04BD04CD04DD04ED04F00000000000000000000
+0000D051D052D053D055D056D057D059D05AD05BD05CD05DD05ED05FD061D062
+D063D064D065D066D067D068D069D06AD06BD06ED06F00000000000000000000
+0000D071D072D073D075D076D077D078D079D07AD07BD07ED07FD080D082D083
+D084D085D086D087D088D089D08AD08BD08CD08DD08ED08FD090D091D092D093
+D094B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215
+B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289
+B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8
+B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED
+B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310
+B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D095D096D097D098D099D09AD09BD09CD09DD09ED09FD0A0D0A1D0A2D0A3
+D0A6D0A7D0A9D0AAD0ABD0ADD0AED0AFD0B0D0B1D0B200000000000000000000
+0000D0B3D0B6D0B8D0BAD0BBD0BCD0BDD0BED0BFD0C2D0C3D0C5D0C6D0C7D0CA
+D0CBD0CCD0CDD0CED0CFD0D2D0D6D0D7D0D8D0D9D0DA00000000000000000000
+0000D0DBD0DED0DFD0E1D0E2D0E3D0E5D0E6D0E7D0E8D0E9D0EAD0EBD0EED0F2
+D0F3D0F4D0F5D0F6D0F7D0F9D0FAD0FBD0FCD0FDD0FED0FFD100D101D102D103
+D104B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390
+B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9
+B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451
+B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9
+B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8
+B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D105D106D107D108D109D10AD10BD10CD10ED10FD110D111D112D113D114
+D115D116D117D118D119D11AD11BD11CD11DD11ED11F00000000000000000000
+0000D120D121D122D123D124D125D126D127D128D129D12AD12BD12CD12DD12E
+D12FD132D133D135D136D137D139D13BD13CD13DD13E00000000000000000000
+0000D13FD142D146D147D148D149D14AD14BD14ED14FD151D152D153D155D156
+D157D158D159D15AD15BD15ED160D162D163D164D165D166D167D169D16AD16B
+D16DB540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561
+B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4
+B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664
+B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728
+B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770
+B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D16ED16FD170D171D172D173D174D175D176D177D178D179D17AD17BD17D
+D17ED17FD180D181D182D183D185D186D187D189D18A00000000000000000000
+0000D18BD18CD18DD18ED18FD190D191D192D193D194D195D196D197D198D199
+D19AD19BD19CD19DD19ED19FD1A2D1A3D1A5D1A6D1A700000000000000000000
+0000D1A9D1AAD1ABD1ACD1ADD1AED1AFD1B2D1B4D1B6D1B7D1B8D1B9D1BBD1BD
+D1BED1BFD1C1D1C2D1C3D1C4D1C5D1C6D1C7D1C8D1C9D1CAD1CBD1CCD1CDD1CE
+D1CFB798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC
+B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B
+B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D
+B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3
+B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904
+B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D1D0D1D1D1D2D1D3D1D4D1D5D1D6D1D7D1D9D1DAD1DBD1DCD1DDD1DED1DF
+D1E0D1E1D1E2D1E3D1E4D1E5D1E6D1E7D1E8D1E9D1EA00000000000000000000
+0000D1EBD1ECD1EDD1EED1EFD1F0D1F1D1F2D1F3D1F5D1F6D1F7D1F9D1FAD1FB
+D1FCD1FDD1FED1FFD200D201D202D203D204D205D20600000000000000000000
+0000D208D20AD20BD20CD20DD20ED20FD211D212D213D214D215D216D217D218
+D219D21AD21BD21CD21DD21ED21FD220D221D222D223D224D225D226D227D228
+D229B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD
+B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9
+B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00
+BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55
+BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C
+BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D22AD22BD22ED22FD231D232D233D235D236D237D238D239D23AD23BD23E
+D240D242D243D244D245D246D247D249D24AD24BD24C00000000000000000000
+0000D24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25B
+D25DD25ED25FD260D261D262D263D265D266D267D26800000000000000000000
+0000D269D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277
+D278D279D27AD27BD27CD27DD27ED27FD282D283D285D286D287D289D28AD28B
+D28CBB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B
+BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88
+BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF
+BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C
+BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44
+BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D28DD28ED28FD292D293D294D296D297D298D299D29AD29BD29DD29ED29F
+D2A1D2A2D2A3D2A5D2A6D2A7D2A8D2A9D2AAD2ABD2AD00000000000000000000
+0000D2AED2AFD2B0D2B2D2B3D2B4D2B5D2B6D2B7D2BAD2BBD2BDD2BED2C1D2C3
+D2C4D2C5D2C6D2C7D2CAD2CCD2CDD2CED2CFD2D0D2D100000000000000000000
+0000D2D2D2D3D2D5D2D6D2D7D2D9D2DAD2DBD2DDD2DED2DFD2E0D2E1D2E2D2E3
+D2E6D2E7D2E8D2E9D2EAD2EBD2ECD2EDD2EED2EFD2F2D2F3D2F5D2F6D2F7D2F9
+D2FABC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0
+BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07
+BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81
+BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4
+BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D
+BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D2FBD2FCD2FDD2FED2FFD302D304D306D307D308D309D30AD30BD30FD311
+D312D313D315D317D318D319D31AD31BD31ED322D32300000000000000000000
+0000D324D326D327D32AD32BD32DD32ED32FD331D332D333D334D335D336D337
+D33AD33ED33FD340D341D342D343D346D347D348D34900000000000000000000
+0000D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358
+D359D35AD35BD35CD35DD35ED35FD360D361D362D363D364D365D366D367D368
+D369BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F
+BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01
+BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0
+BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090
+C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC
+C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D36AD36BD36CD36DD36ED36FD370D371D372D373D374D375D376D377D378
+D379D37AD37BD37ED37FD381D382D383D385D386D38700000000000000000000
+0000D388D389D38AD38BD38ED392D393D394D395D396D397D39AD39BD39DD39E
+D39FD3A1D3A2D3A3D3A4D3A5D3A6D3A7D3AAD3ACD3AE00000000000000000000
+0000D3AFD3B0D3B1D3B2D3B3D3B5D3B6D3B7D3B9D3BAD3BBD3BDD3BED3BFD3C0
+D3C1D3C2D3C3D3C6D3C7D3CAD3CBD3CCD3CDD3CED3CFD3D1D3D2D3D3D3D4D3D5
+D3D6C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E
+C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140
+C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174
+C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC
+C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD
+C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D3D7D3D9D3DAD3DBD3DCD3DDD3DED3DFD3E0D3E2D3E4D3E5D3E6D3E7D3E8
+D3E9D3EAD3EBD3EED3EFD3F1D3F2D3F3D3F5D3F6D3F700000000000000000000
+0000D3F8D3F9D3FAD3FBD3FED400D402D403D404D405D406D407D409D40AD40B
+D40CD40DD40ED40FD410D411D412D413D414D415D41600000000000000000000
+0000D417D418D419D41AD41BD41CD41ED41FD420D421D422D423D424D425D426
+D427D428D429D42AD42BD42CD42DD42ED42FD430D431D432D433D434D435D436
+D437C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274
+C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4
+C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9
+C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329
+C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9
+C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D438D439D43AD43BD43CD43DD43ED43FD441D442D443D445D446D447D448
+D449D44AD44BD44CD44DD44ED44FD450D451D452D45300000000000000000000
+0000D454D455D456D457D458D459D45AD45BD45DD45ED45FD461D462D463D465
+D466D467D468D469D46AD46BD46CD46ED470D471D47200000000000000000000
+0000D473D474D475D476D477D47AD47BD47DD47ED481D483D484D485D486D487
+D48AD48CD48ED48FD490D491D492D493D495D496D497D498D499D49AD49BD49C
+D49DC434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8
+C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529
+C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554
+C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C
+C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5
+C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D49ED49FD4A0D4A1D4A2D4A3D4A4D4A5D4A6D4A7D4A8D4AAD4ABD4ACD4AD
+D4AED4AFD4B0D4B1D4B2D4B3D4B4D4B5D4B6D4B7D4B800000000000000000000
+0000D4B9D4BAD4BBD4BCD4BDD4BED4BFD4C0D4C1D4C2D4C3D4C4D4C5D4C6D4C7
+D4C8D4C9D4CAD4CBD4CDD4CED4CFD4D1D4D2D4D3D4D500000000000000000000
+0000D4D6D4D7D4D8D4D9D4DAD4DBD4DDD4DED4E0D4E1D4E2D4E3D4E4D4E5D4E6
+D4E7D4E9D4EAD4EBD4EDD4EED4EFD4F1D4F2D4F3D4F4D4F5D4F6D4F7D4F9D4FA
+D4FCC5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7
+C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C
+C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644
+C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680
+C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8
+C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D4FED4FFD500D501D502D503D505D506D507D509D50AD50BD50DD50ED50F
+D510D511D512D513D516D518D519D51AD51BD51CD51D00000000000000000000
+0000D51ED51FD520D521D522D523D524D525D526D527D528D529D52AD52BD52C
+D52DD52ED52FD530D531D532D533D534D535D536D53700000000000000000000
+0000D538D539D53AD53BD53ED53FD541D542D543D545D546D547D548D549D54A
+D54BD54ED550D552D553D554D555D556D557D55AD55BD55DD55ED55FD561D562
+D563C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720
+C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F
+C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C
+C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798
+C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1
+C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D564D566D567D56AD56CD56ED56FD570D571D572D573D576D577D579D57A
+D57BD57DD57ED57FD580D581D582D583D586D58AD58B00000000000000000000
+0000D58CD58DD58ED58FD591D592D593D594D595D596D597D598D599D59AD59B
+D59CD59DD59ED59FD5A0D5A1D5A2D5A3D5A4D5A6D5A700000000000000000000
+0000D5A8D5A9D5AAD5ABD5ACD5ADD5AED5AFD5B0D5B1D5B2D5B3D5B4D5B5D5B6
+D5B7D5B8D5B9D5BAD5BBD5BCD5BDD5BED5BFD5C0D5C1D5C2D5C3D5C4D5C5D5C6
+D5C7C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C
+C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886
+C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5
+C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911
+C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989
+C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D5CAD5CBD5CDD5CED5CFD5D1D5D3D5D4D5D5D5D6D5D7D5DAD5DCD5DED5DF
+D5E0D5E1D5E2D5E3D5E6D5E7D5E9D5EAD5EBD5EDD5EE00000000000000000000
+0000D5EFD5F0D5F1D5F2D5F3D5F6D5F8D5FAD5FBD5FCD5FDD5FED5FFD602D603
+D605D606D607D609D60AD60BD60CD60DD60ED60FD61200000000000000000000
+0000D616D617D618D619D61AD61BD61DD61ED61FD621D622D623D625D626D627
+D628D629D62AD62BD62CD62ED62FD630D631D632D633D634D635D636D637D63A
+D63BC9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1
+C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54
+CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF
+CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49
+CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D
+CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D63DD63ED63FD641D642D643D644D646D647D64AD64CD64ED64FD650D652
+D653D656D657D659D65AD65BD65DD65ED65FD660D66100000000000000000000
+0000D662D663D664D665D666D668D66AD66BD66CD66DD66ED66FD672D673D675
+D676D677D678D679D67AD67BD67CD67DD67ED67FD68000000000000000000000
+0000D681D682D684D686D687D688D689D68AD68BD68ED68FD691D692D693D695
+D696D697D698D699D69AD69BD69CD69ED6A0D6A2D6A3D6A4D6A5D6A6D6A7D6A9
+D6AACC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66
+CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC
+CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19
+CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94
+CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9
+CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D6ABD6ADD6AED6AFD6B1D6B2D6B3D6B4D6B5D6B6D6B7D6B8D6BAD6BCD6BD
+D6BED6BFD6C0D6C1D6C2D6C3D6C6D6C7D6C9D6CAD6CB00000000000000000000
+0000D6CDD6CED6CFD6D0D6D2D6D3D6D5D6D6D6D8D6DAD6DBD6DCD6DDD6DED6DF
+D6E1D6E2D6E3D6E5D6E6D6E7D6E9D6EAD6EBD6ECD6ED00000000000000000000
+0000D6EED6EFD6F1D6F2D6F3D6F4D6F6D6F7D6F8D6F9D6FAD6FBD6FED6FFD701
+D702D703D705D706D707D708D709D70AD70BD70CD70DD70ED70FD710D712D713
+D714CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84
+CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4
+CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13
+CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65
+CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4
+CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D715D716D717D71AD71BD71DD71ED71FD721D722D723D724D725D726D727
+D72AD72CD72ED72FD730D731D732D733D736D737D73900000000000000000000
+0000D73AD73BD73DD73ED73FD740D741D742D743D745D746D748D74AD74BD74C
+D74DD74ED74FD752D753D755D75AD75BD75CD75DD75E00000000000000000000
+0000D75FD762D764D766D767D768D76AD76BD76DD76ED76FD771D772D773D775
+D776D777D778D779D77AD77BD77ED77FD780D782D783D784D785D786D787D78A
+D78BD044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081
+D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3
+D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134
+D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168
+D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8
+D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D78DD78ED78FD791D792D793D794D795D796D797D79AD79CD79ED79FD7A0
+D7A1D7A2D7A30000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9
+D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8
+D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325
+D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C
+D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4
+D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482
+D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB
+D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558
+D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588
+D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC
+D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000
+C8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658
+D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8
+D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0
+D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735
+D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765
+D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF
+6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374
+5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79
+61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB
+95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F
+61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177
+6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB
+4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB
+F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E
+64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA
+61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1
+96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50
+7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F
+577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F
+74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015
+93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4
+53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD
+75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903
+8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11
+660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5
+6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98
+5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D
+62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366
+639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4
+50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0
+854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9
+69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC
+8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C
+570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F
+5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737
+53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73
+903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975
+969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949
+F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B
+53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668
+573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482
+74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C
+8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE
+685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912
+F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E
+F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948
+67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974
+5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B
+F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947
+8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10
+F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E
+7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1
+6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D
+5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D
+5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200
+52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3
+8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4
+7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC
+51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C
+6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D
+5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82
+53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C
+85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D
+5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2
+8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD
+9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9
+65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE
+8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4
+6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F
+7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262
+78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4
+964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D
+622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC
+51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C
+728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9
+541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C
+83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C
+8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9
+671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF
+71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF
+840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298
+9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F
+72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46
+9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7
+82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D
+7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C
+5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6
+610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A
+62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9
+99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4
+76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E
+65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17
+90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA
+88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61
+6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5
+6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08
+4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920
+9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C
+8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B
+99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC
+8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150
+8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9
+9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89
+7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C
+4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4
+6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C
+658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D
+4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11
+5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7
+6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7
+88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA
+715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7
+50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58
+723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD
+55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90
+60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673
+67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247
+657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239
+861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C
+859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89
+71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC
+562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4
+71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061
+90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D
+84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E
+9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407
+74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA
+88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996
+9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87
+5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C
+834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F
+66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD
+662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A
+57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38
+4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA
+85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E
+5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3
+5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F
+6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C
+83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3
+5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE
+5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059
+63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A
+F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD
+9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA
+513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987
+F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5
+582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93
+6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996
+7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F
+71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71
+F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD
+745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3
+F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6
+88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433
+55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465
+761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6
+7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897
+7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03
+6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5
+F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E
+6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C
+6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076
+512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991
+79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED
+6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3
+5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45
+9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09
+617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB
+9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108
+610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98
+8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089
+80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8
+F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1
+4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A
+51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0
+F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351
+F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC
+8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A
+8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038
+93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C
+606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE
+8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71
+68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB
+58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350
+748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1
+8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E
+6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019
+90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D
+7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168
+5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F
+92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360
+5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075
+544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968
+6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B
+7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C
+81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632
+5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5
+722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54
+8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352
+62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD
+80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D
+70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E
+9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC
+710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B
+6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A
+6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE
+907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84
+6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897
+8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6
+75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB
+7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8
+74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E
+50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0
+5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC
+50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC
+7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B
+85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F
+8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377
+7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243
+66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549
+8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2
+585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8
+690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318
+939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010
+6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2
+50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE
+75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5
+98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4
+7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD
+502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708
+803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86
+6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F
+8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957
+59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E
+722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000
+F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D
+5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6
+576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48
+5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832
+80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206
+FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000
+F9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339
+5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8
+66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068
+608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B
+54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4
+965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000
+FA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9
+89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE
+73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA
+9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729
+774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0
+5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000
+FB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3
+99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D
+5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0
+7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A
+93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4
+5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000
+FC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38
+559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25
+6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1
+6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB
+5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8
+8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000
+FD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166
+73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A
+8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566
+866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79
+7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC
+5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000
diff --git a/ext/Encode/Encode/cp950.enc b/ext/Encode/Encode/cp950.enc
new file mode 100644 (file)
index 0000000..8816284
--- /dev/null
@@ -0,0 +1,1499 @@
+# Encoding file: cp950, multi-byte
+M
+003F 0 88
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3000FF0C30013002FF0E2027FF1BFF1AFF1FFF01FE3020262025FE50FE51FE52
+00B7FE54FE55FE56FE57FF5C2013FE312014FE332574FE34FE4FFF08FF09FE35
+FE36FF5BFF5DFE37FE3830143015FE39FE3A30103011FE3BFE3C300A300BFE3D
+FE3E30083009FE3FFE40300C300DFE41FE42300E300FFE43FE44FE59FE5A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FE5BFE5CFE5DFE5E20182019201C201D301D301E20352032FF03FF06FF0A
+203B00A7300325CB25CF25B325B225CE2606260525C725C625A125A025BD25BC
+32A3210500AFFFE3FF3F02CDFE49FE4AFE4DFE4EFE4BFE4CFE5FFE60FE61FF0B
+FF0D00D700F700B1221AFF1CFF1EFF1D226622672260221E22522261FE62FE63
+FE64FE65FE66FF5E2229222A22A52220221F22BF33D233D1222B222E22352234
+26402642229522992191219321902192219621972199219822252223FF0F0000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FF3C2215FE68FF04FFE53012FFE0FFE1FF05FF2021032109FE69FE6AFE6B33D5
+339C339D339E33CE33A1338E338F33C400B05159515B515E515D5161516355E7
+74E97CCE25812582258325842585258625872588258F258E258D258C258B258A
+2589253C2534252C2524251C2594250025022595250C251025142518256D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000256E2570256F2550255E256A256125E225E325E525E4257125722573FF10
+FF11FF12FF13FF14FF15FF16FF17FF18FF192160216121622163216421652166
+216721682169302130223023302430253026302730283029534153445345FF21
+FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30FF31
+FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF41FF42FF43FF44FF45FF46FF47
+FF48FF49FF4AFF4BFF4CFF4DFF4EFF4FFF50FF51FF52FF53FF54FF55FF560000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FF57FF58FF59FF5A039103920393039403950396039703980399039A039B039C
+039D039E039F03A003A103A303A403A503A603A703A803A903B103B203B303B4
+03B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C103C303C403C5
+03C603C703C803C931053106310731083109310A310B310C310D310E310F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00003110311131123113311431153116311731183119311A311B311C311D311E
+311F312031213122312331243125312631273128312902D902C902CA02C702CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E004E594E014E034E434E5D4E864E8C4EBA513F5165516B51E052005201529B
+53155341535C53C84E094E0B4E084E0A4E2B4E3851E14E454E484E5F4E5E4E8E
+4EA15140520352FA534353C953E3571F58EB5915592759735B505B515B535BF8
+5C0F5C225C385C715DDD5DE55DF15DF25DF35DFE5E725EFE5F0B5F13624D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E114E104E0D4E2D4E304E394E4B5C394E884E914E954E924E944EA24EC1
+4EC04EC34EC64EC74ECD4ECA4ECB4EC4514351415167516D516E516C519751F6
+52065207520852FB52FE52FF53165339534853475345535E538453CB53CA53CD
+58EC5929592B592A592D5B545C115C245C3A5C6F5DF45E7B5EFF5F145F155FC3
+62086236624B624E652F6587659765A465B965E566F0670867286B206B626B79
+6BCB6BD46BDB6C0F6C34706B722A7236723B72477259725B72AC738B4E190000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E164E154E144E184E3B4E4D4E4F4E4E4EE54ED84ED44ED54ED64ED74EE34EE4
+4ED94EDE514551445189518A51AC51F951FA51F8520A52A0529F530553065317
+531D4EDF534A534953615360536F536E53BB53EF53E453F353EC53EE53E953E8
+53FC53F853F553EB53E653EA53F253F153F053E553ED53FB56DB56DA59160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000592E5931597459765B555B835C3C5DE85DE75DE65E025E035E735E7C5F01
+5F185F175FC5620A625362546252625165A565E6672E672C672A672B672D6B63
+6BCD6C116C106C386C416C406C3E72AF7384738974DC74E67518751F75287529
+7530753175327533758B767D76AE76BF76EE77DB77E277F3793A79BE7A747ACB
+4E1E4E1F4E524E534E694E994EA44EA64EA54EFF4F094F194F0A4F154F0D4F10
+4F114F0F4EF24EF64EFB4EF04EF34EFD4F014F0B514951475146514851680000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5171518D51B0521752115212520E521652A3530853215320537053715409540F
+540C540A54105401540B54045411540D54085403540E5406541256E056DE56DD
+573357305728572D572C572F57295919591A59375938598459785983597D5979
+598259815B575B585B875B885B855B895BFA5C165C795DDE5E065E765E740000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F0F5F1B5FD95FD6620E620C620D62106263625B6258653665E965E865EC
+65ED66F266F36709673D6734673167356B216B646B7B6C166C5D6C576C596C5F
+6C606C506C556C616C5B6C4D6C4E7070725F725D767E7AF97C737CF87F367F8A
+7FBD80018003800C80128033807F8089808B808C81E381EA81F381FC820C821B
+821F826E8272827E866B8840884C8863897F96214E324EA84F4D4F4F4F474F57
+4F5E4F344F5B4F554F304F504F514F3D4F3A4F384F434F544F3C4F464F630000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F5C4F604F2F4F4E4F364F594F5D4F484F5A514C514B514D517551B651B75225
+52245229522A522852AB52A952AA52AC532353735375541D542D541E543E5426
+544E542754465443543354485442541B5429544A5439543B5438542E54355436
+5420543C54405431542B541F542C56EA56F056E456EB574A57515740574D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005747574E573E5750574F573B58EF593E599D599259A8599E59A359995996
+598D59A45993598A59A55B5D5B5C5B5A5B5B5B8C5B8B5B8F5C2C5C405C415C3F
+5C3E5C905C915C945C8C5DEB5E0C5E8F5E875E8A5EF75F045F1F5F645F625F77
+5F795FD85FCC5FD75FCD5FF15FEB5FF85FEA6212621162846297629662806276
+6289626D628A627C627E627962736292626F6298626E62956293629162866539
+653B653865F166F4675F674E674F67506751675C6756675E6749674667600000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+675367576B656BCF6C426C5E6C996C816C886C896C856C9B6C6A6C7A6C906C70
+6C8C6C686C966C926C7D6C836C726C7E6C746C866C766C8D6C946C986C827076
+707C707D707872627261726072C472C27396752C752B75377538768276EF77E3
+79C179C079BF7A767CFB7F5580968093809D8098809B809A80B2826F82920000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000828B828D898B89D28A008C378C468C558C9D8D648D708DB38EAB8ECA8F9B
+8FB08FC28FC68FC58FC45DE1909190A290AA90A690A3914991C691CC9632962E
+9631962A962C4E264E564E734E8B4E9B4E9E4EAB4EAC4F6F4F9D4F8D4F734F7F
+4F6C4F9B4F8B4F864F834F704F754F884F694F7B4F964F7E4F8F4F914F7A5154
+51525155516951775176517851BD51FD523B52385237523A5230522E52365241
+52BE52BB5352535453535351536653775378537953D653D453D7547354750000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5496547854955480547B5477548454925486547C549054715476548C549A5462
+5468548B547D548E56FA57835777576A5769576157665764577C591C59495947
+59485944595459BE59BB59D459B959AE59D159C659D059CD59CB59D359CA59AF
+59B359D259C55B5F5B645B635B975B9A5B985B9C5B995B9B5C1A5C485C450000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C465CB75CA15CB85CA95CAB5CB15CB35E185E1A5E165E155E1B5E115E78
+5E9A5E975E9C5E955E965EF65F265F275F295F805F815F7F5F7C5FDD5FE05FFD
+5FF55FFF600F6014602F60356016602A6015602160276029602B601B62166215
+623F623E6240627F62C962CC62C462BF62C262B962D262DB62AB62D362D462CB
+62C862A862BD62BC62D062D962C762CD62B562DA62B162D862D662D762C662AC
+62CE653E65A765BC65FA66146613660C66066602660E6600660F6615660A0000
+AA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6607670D670B676D678B67956771679C677367776787679D6797676F6770677F
+6789677E67906775679A6793677C676A67726B236B666B676B7F6C136C1B6CE3
+6CE86CF36CB16CCC6CE56CB36CBD6CBE6CBC6CE26CAB6CD56CD36CB86CC46CB9
+6CC16CAE6CD76CC56CF16CBF6CBB6CE16CDB6CCA6CAC6CEF6CDC6CD66CE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007095708E7092708A7099722C722D723872487267726972C072CE72D972D7
+72D073A973A8739F73AB73A5753D759D7599759A768476C276F276F477E577FD
+793E7940794179C979C87A7A7A797AFA7CFE7F547F8C7F8B800580BA80A580A2
+80B180A180AB80A980B480AA80AF81E581FE820D82B3829D829982AD82BD829F
+82B982B182AC82A582AF82B882A382B082BE82B7864E8671521D88688ECB8FCE
+8FD48FD190B590B890B190B691C791D195779580961C9640963F963B96440000
+AB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+964296B996E89752975E4E9F4EAD4EAE4FE14FB54FAF4FBF4FE04FD14FCF4FDD
+4FC34FB64FD84FDF4FCA4FD74FAE4FD04FC44FC24FDA4FCE4FDE4FB751575192
+519151A0524E5243524A524D524C524B524752C752C952C352C1530D5357537B
+539A53DB54AC54C054A854CE54C954B854A654B354C754C254BD54AA54C10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054C454C854AF54AB54B154BB54A954A754BF56FF5782578B57A057A357A2
+57CE57AE579359555951594F594E595059DC59D859FF59E359E85A0359E559EA
+59DA59E65A0159FB5B695BA35BA65BA45BA25BA55C015C4E5C4F5C4D5C4B5CD9
+5CD25DF75E1D5E255E1F5E7D5EA05EA65EFA5F085F2D5F655F885F855F8A5F8B
+5F875F8C5F896012601D60206025600E6028604D60706068606260466043606C
+606B606A6064624162DC6316630962FC62ED630162EE62FD630762F162F70000
+AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62EF62EC62FE62F463116302653F654565AB65BD65E26625662D66206627662F
+661F66286631662466F767FF67D367F167D467D067EC67B667AF67F567E967EF
+67C467D167B467DA67E567B867CF67DE67F367B067D967E267DD67D26B6A6B83
+6B866BB56BD26BD76C1F6CC96D0B6D326D2A6D416D256D0C6D316D1E6D170000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D3B6D3D6D3E6D366D1B6CF56D396D276D386D296D2E6D356D0E6D2B70AB
+70BA70B370AC70AF70AD70B870AE70A472307272726F727472E972E072E173B7
+73CA73BB73B273CD73C073B3751A752D754F754C754E754B75AB75A475A575A2
+75A3767876867687768876C876C676C376C5770176F976F87709770B76FE76FC
+770777DC78027814780C780D794679497948794779B979BA79D179D279CB7A7F
+7A817AFF7AFD7C7D7D027D057D007D097D077D047D067F387F8E7FBF80040000
+AD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8010800D8011803680D680E580DA80C380C480CC80E180DB80CE80DE80E480DD
+81F4822282E78303830582E382DB82E6830482E58302830982D282D782F18301
+82DC82D482D182DE82D382DF82EF830686508679867B867A884D886B898189D4
+8A088A028A038C9E8CA08D748D738DB48ECD8ECC8FF08FE68FE28FEA8FE50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008FED8FEB8FE48FE890CA90CE90C190C3914B914A91CD95829650964B964C
+964D9762976997CB97ED97F3980198A898DB98DF999699994E584EB3500C500D
+50234FEF502650254FF8502950165006503C501F501A501250114FFA50005014
+50284FF15021500B501950184FF34FEE502D502A4FFE502B5009517C51A451A5
+51A251CD51CC51C651CB5256525C5254525B525D532A537F539F539D53DF54E8
+55105501553754FC54E554F2550654FA551454E954ED54E1550954EE54EA0000
+AE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54E65527550754FD550F5703570457C257D457CB57C35809590F59575958595A
+5A115A185A1C5A1F5A1B5A1359EC5A205A235A295A255A0C5A095B6B5C585BB0
+5BB35BB65BB45BAE5BB55BB95BB85C045C515C555C505CED5CFD5CFB5CEA5CE8
+5CF05CF65D015CF45DEE5E2D5E2B5EAB5EAD5EA75F315F925F915F9060590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006063606560506055606D6069606F6084609F609A608D6094608C60856096
+624762F3630862FF634E633E632F635563426346634F6349633A6350633D632A
+632B6328634D634C65486549659965C165C566426649664F66436652664C6645
+664166F867146715671768216838684868466853683968426854682968B36817
+684C6851683D67F468506840683C6843682A68456813681868416B8A6B896BB7
+6C236C276C286C266C246CF06D6A6D956D886D876D666D786D776D596D930000
+AF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D6C6D896D6E6D5A6D746D696D8C6D8A6D796D856D656D9470CA70D870E470D9
+70C870CF7239727972FC72F972FD72F872F7738673ED740973EE73E073EA73DE
+7554755D755C755A755975BE75C575C775B275B375BD75BC75B975C275B8768B
+76B076CA76CD76CE7729771F7720772877E9783078277838781D783478370000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007825782D7820781F7832795579507960795F7956795E795D7957795A79E4
+79E379E779DF79E679E979D87A847A887AD97B067B117C897D217D177D0B7D0A
+7D207D227D147D107D157D1A7D1C7D0D7D197D1B7F3A7F5F7F947FC57FC18006
+8018801580198017803D803F80F1810280F0810580ED80F4810680F880F38108
+80FD810A80FC80EF81ED81EC82008210822A822B8228822C82BB832B83528354
+834A83388350834983358334834F833283398336831783408331832883430000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8654868A86AA869386A486A9868C86A3869C8870887788818882887D88798A18
+8A108A0E8A0C8A158A0A8A178A138A168A0F8A118C488C7A8C798CA18CA28D77
+8EAC8ED28ED48ECF8FB1900190068FF790008FFA8FF490038FFD90058FF89095
+90E190DD90E29152914D914C91D891DD91D791DC91D995839662966396610000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000965B965D96649658965E96BB98E299AC9AA89AD89B259B329B3C4E7E507A
+507D505C50475043504C505A504950655076504E5055507550745077504F500F
+506F506D515C519551F0526A526F52D252D952D852D55310530F5319533F5340
+533E53C366FC5546556A55665544555E55615543554A55315556554F5555552F
+55645538552E555C552C55635533554155575708570B570957DF5805580A5806
+57E057E457FA5802583557F757F9592059625A365A415A495A665A6A5A400000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A3C5A625A5A5A465A4A5B705BC75BC55BC45BC25BBF5BC65C095C085C075C60
+5C5C5C5D5D075D065D0E5D1B5D165D225D115D295D145D195D245D275D175DE2
+5E385E365E335E375EB75EB85EB65EB55EBE5F355F375F575F6C5F695F6B5F97
+5F995F9E5F985FA15FA05F9C607F60A3608960A060A860CB60B460E660BD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060C560BB60B560DC60BC60D860D560C660DF60B860DA60C7621A621B6248
+63A063A76372639663A263A563776367639863AA637163A963896383639B636B
+63A863846388639963A163AC6392638F6380637B63696368637A655D65566551
+65596557555F654F655865556554659C659B65AC65CF65CB65CC65CE665D665A
+666466686666665E66F952D7671B688168AF68A2689368B5687F687668B168A7
+689768B0688368C468AD688668856894689D68A8689F68A168826B326BBA0000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BEB6BEC6C2B6D8E6DBC6DF36DD96DB26DE16DCC6DE46DFB6DFA6E056DC76DCB
+6DAF6DD16DAE6DDE6DF96DB86DF76DF56DC56DD26E1A6DB56DDA6DEB6DD86DEA
+6DF16DEE6DE86DC66DC46DAA6DEC6DBF6DE670F97109710A70FD70EF723D727D
+7281731C731B73167313731973877405740A7403740673FE740D74E074F60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000074F7751C75227565756675627570758F75D475D575B575CA75CD768E76D4
+76D276DB7737773E773C77367738773A786B7843784E79657968796D79FB7A92
+7A957B207B287B1B7B2C7B267B197B1E7B2E7C927C977C957D467D437D717D2E
+7D397D3C7D407D307D337D447D2F7D427D327D317F3D7F9E7F9A7FCC7FCE7FD2
+801C804A8046812F81168123812B81298130812482028235823782368239838E
+839E8398837883A2839683BD83AB8392838A8393838983A08377837B837C0000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+838683A786555F6A86C786C086B686C486B586C686CB86B186AF86C98853889E
+888888AB88928896888D888B8993898F8A2A8A1D8A238A258A318A2D8A1F8A1B
+8A228C498C5A8CA98CAC8CAB8CA88CAA8CA78D678D668DBE8DBA8EDB8EDF9019
+900D901A90179023901F901D90109015901E9020900F90229016901B90140000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090E890ED90FD915791CE91F591E691E391E791ED91E99589966A96759673
+96789670967496769677966C96C096EA96E97AE07ADF980298039B5A9CE59E75
+9E7F9EA59EBB50A2508D508550995091508050965098509A670051F152725274
+5275526952DE52DD52DB535A53A5557B558055A7557C558A559D55985582559C
+55AA55945587558B558355B355AE559F553E55B2559A55BB55AC55B1557E5589
+55AB5599570D582F582A58345824583058315821581D582058F958FA59600000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A775A9A5A7F5A925A9B5AA75B735B715BD25BCC5BD35BD05C0A5C0B5C315D4C
+5D505D345D475DFD5E455E3D5E405E435E7E5ECA5EC15EC25EC45F3C5F6D5FA9
+5FAA5FA860D160E160B260B660E0611C612360FA611560F060FB60F4616860F1
+610E60F6610961006112621F624963A3638C63CF63C063E963C963C663CD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000063D263E363D063E163D663ED63EE637663F463EA63DB645263DA63F9655E
+6566656265636591659065AF666E667066746676666F6691667A667E667766FE
+66FF671F671D68FA68D568E068D868D7690568DF68F568EE68E768F968D268F2
+68E368CB68CD690D6912690E68C968DA696E68FB6B3E6B3A6B3D6B986B966BBC
+6BEF6C2E6C2F6C2C6E2F6E386E546E216E326E676E4A6E206E256E236E1B6E5B
+6E586E246E566E6E6E2D6E266E6F6E346E4D6E3A6E2C6E436E1D6E3E6ECB0000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E896E196E4E6E636E446E726E696E5F7119711A7126713071217136716E711C
+724C728472807336732573347329743A742A743374227425743574367434742F
+741B7426742875257526756B756A75E275DB75E375D975D875DE75E0767B767C
+7696769376B476DC774F77ED785D786C786F7A0D7A087A0B7A057A007A980000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A977A967AE57AE37B497B567B467B507B527B547B4D7B4B7B4F7B517C9F
+7CA57D5E7D507D687D557D2B7D6E7D727D617D667D627D707D7355847FD47FD5
+800B8052808581558154814B8151814E81398146813E814C815381748212821C
+83E9840383F8840D83E083C5840B83C183EF83F183F48457840A83F0840C83CC
+83FD83F283CA8438840E840483DC840783D483DF865B86DF86D986ED86D486DB
+86E486D086DE885788C188C288B1898389968A3B8A608A558A5E8A3C8A410000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8A548A5B8A508A468A348A3A8A368A568C618C828CAF8CBC8CB38CBD8CC18CBB
+8CC08CB48CB78CB68CBF8CB88D8A8D858D818DCE8DDD8DCB8DDA8DD18DCC8DDB
+8DC68EFB8EF88EFC8F9C902E90359031903890329036910290F5910990FE9163
+916591CF9214921592239209921E920D9210920792119594958F958B95910000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000095939592958E968A968E968B967D96859686968D9672968496C196C596C4
+96C696C796EF96F297CC98059806980898E798EA98EF98E998F298ED99AE99AD
+9EC39ECD9ED14E8250AD50B550B250B350C550BE50AC50B750BB50AF50C7527F
+5277527D52DF52E652E452E252E3532F55DF55E855D355E655CE55DC55C755D1
+55E355E455EF55DA55E155C555C655E555C957125713585E585158585857585A
+5854586B584C586D584A58625852584B59675AC15AC95ACC5ABE5ABD5ABC0000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5AB35AC25AB25D695D6F5E4C5E795EC95EC85F125F595FAC5FAE611A610F6148
+611F60F3611B60F961016108614E614C6144614D613E61346127610D61066137
+622162226413643E641E642A642D643D642C640F641C6414640D643664166417
+6406656C659F65B06697668966876688669666846698668D67036994696D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000695A697769606954697569306982694A6968696B695E695369796986695D
+6963695B6B476B726BC06BBF6BD36BFD6EA26EAF6ED36EB66EC26E906E9D6EC7
+6EC56EA56E986EBC6EBA6EAB6ED16E966E9C6EC46ED46EAA6EA76EB4714E7159
+7169716471497167715C716C7166714C7165715E714671687156723A72527337
+7345733F733E746F745A7455745F745E7441743F7459745B745C757675787600
+75F0760175F275F175FA75FF75F475F376DE76DF775B776B7766775E77630000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7779776A776C775C77657768776277EE788E78B078977898788C7889787C7891
+7893787F797A797F7981842C79BD7A1C7A1A7A207A147A1F7A1E7A9F7AA07B77
+7BC07B607B6E7B677CB17CB37CB57D937D797D917D817D8F7D5B7F6E7F697F6A
+7F727FA97FA87FA480568058808680848171817081788165816E8173816B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008179817A81668205824784828477843D843184758466846B8449846C845B
+843C8435846184638469846D8446865E865C865F86F9871387088707870086FE
+86FB870287038706870A885988DF88D488D988DC88D888DD88E188CA88D588D2
+899C89E38A6B8A728A738A668A698A708A878A7C8A638AA08A718A858A6D8A62
+8A6E8A6C8A798A7B8A3E8A688C628C8A8C898CCA8CC78CC88CC48CB28CC38CC2
+8CC58DE18DDF8DE88DEF8DF38DFA8DEA8DE48DE68EB28F038F098EFE8F0A0000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8F9F8FB2904B904A905390429054903C905590509047904F904E904D9051903E
+904191129117916C916A916991C9923792579238923D9240923E925B924B9264
+925192349249924D92459239923F925A959896989694969596CD96CB96C996CA
+96F796FB96F996F6975697749776981098119813980A9812980C98FC98F40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000098FD98FE99B399B199B49AE19CE99E829F0E9F139F2050E750EE50E550D6
+50ED50DA50D550CF50D150F150CE50E9516251F352835282533153AD55FE5600
+561B561755FD561456065609560D560E55F75616561F5608561055F657185716
+5875587E58835893588A58795885587D58FD592559225924596A59695AE15AE6
+5AE95AD75AD65AD85AE35B755BDE5BE75BE15BE55BE65BE85BE25BE45BDF5C0D
+5C625D845D875E5B5E635E555E575E545ED35ED65F0A5F465F705FB961470000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+613F614B617761626163615F615A61586175622A64876458645464A46478645F
+647A645164676434646D647B657265A165D765D666A266A8669D699C69A86995
+69C169AE69D369CB699B69B769BB69AB69B469D069CD69AD69CC69A669C369A3
+6B496B4C6C336F336F146EFE6F136EF46F296F3E6F206F2C6F0F6F026F220000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006EFF6EEF6F066F316F386F326F236F156F2B6F2F6F886F2A6EEC6F016EF2
+6ECC6EF771947199717D718A71847192723E729272967344735074647463746A
+7470746D750475917627760D760B7609761376E176E37784777D777F776178C1
+789F78A778B378A978A3798E798F798D7A2E7A317AAA7AA97AED7AEF7BA17B95
+7B8B7B757B977B9D7B947B8F7BB87B877B847CB97CBD7CBE7DBB7DB07D9C7DBD
+7DBE7DA07DCA7DB47DB27DB17DBA7DA27DBF7DB57DB87DAD7DD27DC77DAC0000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7F707FE07FE17FDF805E805A808781508180818F8188818A817F818281E781FA
+82078214821E824B84C984BF84C684C48499849E84B2849C84CB84B884C084D3
+849084BC84D184CA873F871C873B872287258734871887558737872988F38902
+88F488F988F888FD88E8891A88EF8AA68A8C8A9E8AA38A8D8AA18A938AA40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AAA8AA58AA88A988A918A9A8AA78C6A8C8D8C8C8CD38CD18CD28D6B8D99
+8D958DFC8F148F128F158F138FA390609058905C90639059905E9062905D905B
+91199118911E917591789177917492789280928592989296927B9293929C92A8
+927C929195A195A895A995A395A595A49699969C969B96CC96D29700977C9785
+97F69817981898AF98B199039905990C990999C19AAF9AB09AE69B419B429CF4
+9CF69CF39EBC9F3B9F4A5104510050FB50F550F9510251085109510551DC0000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+528752885289528D528A52F053B2562E563B56395632563F563456295653564E
+565756745636562F56305880589F589E58B3589C58AE58A958A6596D5B095AFB
+5B0B5AF55B0C5B085BEE5BEC5BE95BEB5C645C655D9D5D945E625E5F5E615EE2
+5EDA5EDF5EDD5EE35EE05F485F715FB75FB561766167616E615D615561820000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000617C6170616B617E61A7619061AB618E61AC619A61A4619461AE622E6469
+646F6479649E64B26488649064B064A56493649564A9649264AE64AD64AB649A
+64AC649964A264B365756577657866AE66AB66B466B16A236A1F69E86A016A1E
+6A1969FD6A216A136A0A69F36A026A0569ED6A116B506B4E6BA46BC56BC66F3F
+6F7C6F846F516F666F546F866F6D6F5B6F786F6E6F8E6F7A6F706F646F976F58
+6ED56F6F6F606F5F719F71AC71B171A87256729B734E73577469748B74830000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+747E7480757F76207629761F7624762676217622769A76BA76E4778E7787778C
+7791778B78CB78C578BA78CA78BE78D578BC78D07A3F7A3C7A407A3D7A377A3B
+7AAF7AAE7BAD7BB17BC47BB47BC67BC77BC17BA07BCC7CCA7DE07DF47DEF7DFB
+7DD87DEC7DDD7DE87DE37DDA7DDE7DE97D9E7DD97DF27DF97F757F777FAF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007FE98026819B819C819D81A0819A81988517853D851A84EE852C852D8513
+851185238521851484EC852584FF850687828774877687608766877887688759
+8757874C8753885B885D89108907891289138915890A8ABC8AD28AC78AC48A95
+8ACB8AF88AB28AC98AC28ABF8AB08AD68ACD8AB68AB98ADB8C4C8C4E8C6C8CE0
+8CDE8CE68CE48CEC8CED8CE28CE38CDC8CEA8CE18D6D8D9F8DA38E2B8E108E1D
+8E228E0F8E298E1F8E218E1E8EBA8F1D8F1B8F1F8F298F268F2A8F1C8F1E0000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8F259069906E9068906D90779130912D9127913191879189918B918392C592BB
+92B792EA92AC92E492C192B392BC92D292C792F092B295AD95B1970497069707
+97099760978D978B978F9821982B981C98B3990A99139912991899DD99D099DF
+99DB99D199D599D299D99AB79AEE9AEF9B279B459B449B779B6F9D069D090000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D039EA99EBE9ECE58A89F5251125118511451105115518051AA51DD5291
+529352F35659566B5679566956645678566A566856655671566F566C56625676
+58C158BE58C758C5596E5B1D5B345B785BF05C0E5F4A61B2619161A9618A61CD
+61B661BE61CA61C8623064C564C164CB64BB64BC64DA64C464C764C264CD64BF
+64D264D464BE657466C666C966B966C466C766B86A3D6A386A3A6A596A6B6A58
+6A396A446A626A616A4B6A476A356A5F6A486B596B776C056FC26FB16FA10000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6FC36FA46FC16FA76FB36FC06FB96FB66FA66FA06FB471BE71C971D071D271C8
+71D571B971CE71D971DC71C371C47368749C74A37498749F749E74E2750C750D
+76347638763A76E776E577A0779E779F77A578E878DA78EC78E779A67A4D7A4E
+7A467A4C7A4B7ABA7BD97C117BC97BE47BDB7BE17BE97BE67CD57CD67E0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E117E087E1B7E237E1E7E1D7E097E107F797FB27FF07FF17FEE802881B3
+81A981A881FB820882588259854A855985488568856985438549856D856A855E
+8783879F879E87A2878D8861892A89328925892B892189AA89A68AE68AFA8AEB
+8AF18B008ADC8AE78AEE8AFE8B018B028AF78AED8AF38AF68AFC8C6B8C6D8C93
+8CF48E448E318E348E428E398E358F3B8F2F8F388F338FA88FA6907590749078
+9072907C907A913491929320933692F89333932F932292FC932B9304931A0000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9310932693219315932E931995BB96A796A896AA96D5970E97119716970D9713
+970F975B975C9766979898309838983B9837982D9839982499109928991E991B
+9921991A99ED99E299F19AB89ABC9AFB9AED9B289B919D159D239D269D289D12
+9D1B9ED89ED49F8D9F9C512A511F5121513252F5568E56805690568556870000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000568F58D558D358D158CE5B305B2A5B245B7A5C375C685DBC5DBA5DBD5DB8
+5E6B5F4C5FBD61C961C261C761E661CB6232623464CE64CA64D864E064F064E6
+64EC64F164E264ED6582658366D966D66A806A946A846AA26A9C6ADB6AA36A7E
+6A976A906AA06B5C6BAE6BDA6C086FD86FF16FDF6FE06FDB6FE46FEB6FEF6F80
+6FEC6FE16FE96FD56FEE6FF071E771DF71EE71E671E571ED71EC71F471E07235
+72467370737274A974B074A674A876467642764C76EA77B377AA77B077AC0000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77A777AD77EF78F778FA78F478EF790179A779AA7A577ABF7C077C0D7BFE7BF7
+7C0C7BE07CE07CDC7CDE7CE27CDF7CD97CDD7E2E7E3E7E467E377E327E437E2B
+7E3D7E317E457E417E347E397E487E357E3F7E2F7F447FF37FFC807180728070
+806F807381C681C381BA81C281C081BF81BD81C981BE81E88209827185AA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008584857E859C8591859485AF859B858785A8858A866787C087D187B387D2
+87C687AB87BB87BA87C887CB893B893689448938893D89AC8B0E8B178B198B1B
+8B0A8B208B1D8B048B108C418C3F8C738CFA8CFD8CFC8CF88CFB8DA88E498E4B
+8E488E4A8F448F3E8F428F458F3F907F907D9084908190829080913991A3919E
+919C934D938293289375934A9365934B9318937E936C935B9370935A935495CA
+95CB95CC95C895C696B196B896D6971C971E97A097D3984698B699359A010000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+99FF9BAE9BAB9BAA9BAD9D3B9D3F9E8B9ECF9EDE9EDC9EDD9EDB9F3E9F4B53E2
+569556AE58D958D85B385F5D61E3623364F464F264FE650664FA64FB64F765B7
+66DC67266AB36AAC6AC36ABB6AB86AC26AAE6AAF6B5F6B786BAF7009700B6FFE
+70066FFA7011700F71FB71FC71FE71F87377737574A774BF7515765676580000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000765277BD77BF77BB77BC790E79AE7A617A627A607AC47AC57C2B7C277C2A
+7C1E7C237C217CE77E547E557E5E7E5A7E617E527E597F487FF97FFB80778076
+81CD81CF820A85CF85A985CD85D085C985B085BA85B985A687EF87EC87F287E0
+898689B289F48B288B398B2C8B2B8C508D058E598E638E668E648E5F8E558EC0
+8F498F4D90879083908891AB91AC91D09394938A939693A293B393AE93AC93B0
+9398939A939795D495D695D095D596E296DC96D996DB96DE972497A397A60000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+97AD97F9984D984F984C984E985398BA993E993F993D992E99A59A0E9AC19B03
+9B069B4F9B4E9B4D9BCA9BC99BFD9BC89BC09D519D5D9D609EE09F159F2C5133
+56A558DE58DF58E25BF59F905EEC61F261F761F661F56500650F66E066DD6AE5
+6ADD6ADA6AD3701B701F7028701A701D701570187206720D725872A273780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000737A74BD74CA74E375877586765F766177C7791979B17A6B7A697C3E7C3F
+7C387C3D7C377C407E6B7E6D7E797E697E6A7F857E737FB67FB97FB881D885E9
+85DD85EA85D585E485E585F787FB8805880D87F987FE8960895F8956895E8B41
+8B5C8B588B498B5A8B4E8B4F8B468B598D088D0A8E7C8E728E878E768E6C8E7A
+8E748F548F4E8FAD908A908B91B191AE93E193D193DF93C393C893DC93DD93D6
+93E293CD93D893E493D793E895DC96B496E3972A9727976197DC97FB985E0000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9858985B98BC994599499A169A199B0D9BE89BE79BD69BDB9D899D619D729D6A
+9D6C9E929E979E939EB452F856A856B756B656B456BC58E45B405B435B7D5BF6
+5DC961F861FA65186514651966E667276AEC703E703070327210737B74CF7662
+76657926792A792C792B7AC77AF67C4C7C437C4D7CEF7CF08FAE7E7D7E7C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E827F4C800081DA826685FB85F9861185FA8606860B8607860A88148815
+896489BA89F88B708B6C8B668B6F8B5F8B6B8D0F8D0D8E898E818E858E8291B4
+91CB9418940393FD95E1973098C49952995199A89A2B9A309A379A359C139C0D
+9E799EB59EE89F2F9F5F9F639F615137513856C156C056C259145C6C5DCD61FC
+61FE651D651C659566E96AFB6B046AFA6BB2704C721B72A774D674D4766977D3
+7C507E8F7E8C7FBC8617862D861A882388228821881F896A896C89BD8B740000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B778B7D8D138E8A8E8D8E8B8F5F8FAF91BA942E94339435943A94389432942B
+95E297389739973297FF9867986599579A459A439A409A3E9ACF9B549B519C2D
+9C259DAF9DB49DC29DB89E9D9EEF9F199F5C9F669F67513C513B56C856CA56C9
+5B7F5DD45DD25F4E61FF65246B0A6B6170517058738074E4758A766E766C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079B37C607C5F807E807D81DF8972896F89FC8B808D168D178E918E938F61
+9148944494519452973D973E97C397C1986B99559A559A4D9AD29B1A9C499C31
+9C3E9C3B9DD39DD79F349F6C9F6A9F9456CC5DD662006523652B652A66EC6B10
+74DA7ACA7C647C637C657E937E967E9481E28638863F88318B8A9090908F9463
+946094649768986F995C9A5A9A5B9A579AD39AD49AD19C549C579C569DE59E9F
+9EF456D158E9652C705E7671767277D77F507F888836883988628B938B920000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B9682778D1B91C0946A97429748974497C698709A5F9B229B589C5F9DF99DFA
+9E7C9E7D9F079F779F725EF36B1670637C6C7C6E883B89C08EA191C194729470
+9871995E9AD69B239ECC706477DA8B9A947797C99A629A657E9C8B9C8EAA91C5
+947D947E947C9C779C789EF78C54947F9E1A72289A6A9B319E1B9E1E7C720000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+C9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E424E5C51F5531A53824E074E0C4E474E8D56D7FA0C5C6E5F734E0F51874E0E
+4E2E4E934EC24EC94EC8519852FC536C53B957205903592C5C105DFF65E16BB3
+6BCC6C14723F4E314E3C4EE84EDC4EE94EE14EDD4EDA520C531C534C57225723
+5917592F5B815B845C125C3B5C745C735E045E805E825FC9620962506C150000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C366C436C3F6C3B72AE72B0738A79B8808A961E4F0E4F184F2C4EF54F14
+4EF14F004EF74F084F1D4F024F054F224F134F044EF44F1251B1521352095210
+52A65322531F534D538A540756E156DF572E572A5734593C5980597C5985597B
+597E5977597F5B565C155C255C7C5C7A5C7B5C7E5DDF5E755E845F025F1A5F74
+5FD55FD45FCF625C625E626462616266626262596260625A626565EF65EE673E
+67396738673B673A673F673C67336C186C466C526C5C6C4F6C4A6C546C4B0000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C4C7071725E72B472B5738E752A767F7A757F518278827C8280827D827F864D
+897E909990979098909B909496229624962096234F564F3B4F624F494F534F64
+4F3E4F674F524F5F4F414F584F2D4F334F3F4F61518F51B9521C521E522152AD
+52AE530953635372538E538F54305437542A545454455419541C542554180000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000543D544F544154285424544756EE56E756E557415745574C5749574B5752
+5906594059A6599859A05997598E59A25990598F59A759A15B8E5B925C285C2A
+5C8D5C8F5C885C8B5C895C925C8A5C865C935C955DE05E0A5E0E5E8B5E895E8C
+5E885E8D5F055F1D5F785F765FD25FD15FD05FED5FE85FEE5FF35FE15FE45FE3
+5FFA5FEF5FF75FFB60005FF4623A6283628C628E628F629462876271627B627A
+6270628162886277627D62726274653765F065F465F365F265F5674567470000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67596755674C6748675D674D675A674B6BD06C196C1A6C786C676C6B6C846C8B
+6C8F6C716C6F6C696C9A6C6D6C876C956C9C6C666C736C656C7B6C8E7074707A
+726372BF72BD72C372C672C172BA72C573957397739373947392753A75397594
+75957681793D80348095809980908092809C8290828F8285828E829182930000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000828A828382848C788FC98FBF909F90A190A5909E90A790A096309628962F
+962D4E334F984F7C4F854F7D4F804F874F764F744F894F844F774F4C4F974F6A
+4F9A4F794F814F784F904F9C4F944F9E4F924F824F954F6B4F6E519E51BC51BE
+5235523252335246523152BC530A530B533C539253945487547F548154915482
+5488546B547A547E5465546C54745466548D546F546154605498546354675464
+56F756F9576F5772576D576B57715770577657805775577B5773577457620000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5768577D590C594559B559BA59CF59CE59B259CC59C159B659BC59C359D659B1
+59BD59C059C859B459C75B625B655B935B955C445C475CAE5CA45CA05CB55CAF
+5CA85CAC5C9F5CA35CAD5CA25CAA5CA75C9D5CA55CB65CB05CA65E175E145E19
+5F285F225F235F245F545F825F7E5F7D5FDE5FE5602D602660196032600B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006034600A60176033601A601E602C6022600D6010602E60136011600C6009
+601C6214623D62AD62B462D162BE62AA62B662CA62AE62B362AF62BB62A962B0
+62B8653D65A865BB660965FC66046612660865FB6603660B660D660565FD6611
+661066F6670A6785676C678E67926776677B6798678667846774678D678C677A
+679F679167996783677D67816778677967946B256B806B7E6BDE6C1D6C936CEC
+6CEB6CEE6CD96CB66CD46CAD6CE76CB76CD06CC26CBA6CC36CC66CED6CF20000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6CD26CDD6CB46C8A6C9D6C806CDE6CC06D306CCD6CC76CB06CF96CCF6CE96CD1
+709470987085709370867084709170967082709A7083726A72D672CB72D872C9
+72DC72D272D472DA72CC72D173A473A173AD73A673A273A073AC739D74DD74E8
+753F7540753E758C759876AF76F376F176F076F577F877FC77F977FB77FA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077F77942793F79C57A787A7B7AFB7C757CFD8035808F80AE80A380B880B5
+80AD822082A082C082AB829A8298829B82B582A782AE82BC829E82BA82B482A8
+82A182A982C282A482C382B682A28670866F866D866E8C568FD28FCB8FD38FCD
+8FD68FD58FD790B290B490AF90B390B09639963D963C963A96434FCD4FC54FD3
+4FB24FC94FCB4FC14FD44FDC4FD94FBB4FB34FDB4FC74FD64FBA4FC04FB94FEC
+5244524952C052C2533D537C539753965399539854BA54A154AD54A554CF0000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54C3830D54B754AE54D654B654C554C654A0547054BC54A254BE547254DE54B0
+57B5579E579F57A4578C5797579D579B57945798578F579957A5579A579558F4
+590D595359E159DE59EE5A0059F159DD59FA59FD59FC59F659E459F259F759DB
+59E959F359F559E059FE59F459ED5BA85C4C5CD05CD85CCC5CD75CCB5CDB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005CDE5CDA5CC95CC75CCA5CD65CD35CD45CCF5CC85CC65CCE5CDF5CF85DF9
+5E215E225E235E205E245EB05EA45EA25E9B5EA35EA55F075F2E5F565F866037
+603960546072605E6045605360476049605B604C60406042605F602460446058
+6066606E6242624362CF630D630B62F5630E630362EB62F9630F630C62F862F6
+63006313631462FA631562FB62F06541654365AA65BF6636662166326635661C
+662666226633662B663A661D66346639662E670F671067C167F267C867BA0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67DC67BB67F867D867C067B767C567EB67E467DF67B567CD67B367F767F667EE
+67E367C267B967CE67E767F067B267FC67C667ED67CC67AE67E667DB67FA67C9
+67CA67C367EA67CB6B286B826B846BB66BD66BD86BE06C206C216D286D346D2D
+6D1F6D3C6D3F6D126D0A6CDA6D336D046D196D3A6D1A6D116D006D1D6D420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D016D186D376D036D0F6D406D076D206D2C6D086D226D096D1070B7709F
+70BE70B170B070A170B470B570A972417249724A726C72707273726E72CA72E4
+72E872EB72DF72EA72E672E3738573CC73C273C873C573B973B673B573B473EB
+73BF73C773BE73C373C673B873CB74EC74EE752E7547754875A775AA767976C4
+7708770377047705770A76F776FB76FA77E777E878067811781278057810780F
+780E780978037813794A794C794B7945794479D579CD79CF79D679CE7A800000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A7E7AD17B007B017C7A7C787C797C7F7C807C817D037D087D017F587F917F8D
+7FBE8007800E800F8014803780D880C780E080D180C880C280D080C580E380D9
+80DC80CA80D580C980CF80D780E680CD81FF8221829482D982FE82F9830782E8
+830082D5833A82EB82D682F482EC82E182F282F5830C82FB82F682F082EA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000082E482E082FA82F382ED86778674867C86738841884E8867886A886989D3
+8A048A078D728FE38FE18FEE8FE090F190BD90BF90D590C590BE90C790CB90C8
+91D491D39654964F96519653964A964E501E50055007501350225030501B4FF5
+4FF450335037502C4FF64FF75017501C502050275035502F5031500E515A5194
+519351CA51C451C551C851CE5261525A5252525E525F5255526252CD530E539E
+552654E25517551254E754F354E4551A54FF5504550854EB5511550554F10000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+550A54FB54F754F854E0550E5503550B5701570257CC583257D557D257BA57C6
+57BD57BC57B857B657BF57C757D057B957C1590E594A5A195A165A2D5A2E5A15
+5A0F5A175A0A5A1E5A335B6C5BA75BAD5BAC5C035C565C545CEC5CFF5CEE5CF1
+5CF75D005CF95E295E285EA85EAE5EAA5EAC5F335F305F67605D605A60670000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000604160A26088608060926081609D60836095609B60976087609C608E6219
+624662F263106356632C634463456336634363E46339634B634A633C63296341
+6334635863546359632D63476333635A63516338635763406348654A654665C6
+65C365C465C2664A665F6647665167126713681F681A684968326833683B684B
+684F68166831681C6835682B682D682F684E68446834681D6812681468266828
+682E684D683A682568206B2C6B2F6B2D6B316B346B6D80826B886BE66BE40000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BE86BE36BE26BE76C256D7A6D636D646D766D0D6D616D926D586D626D6D6D6F
+6D916D8D6DEF6D7F6D866D5E6D676D606D976D706D7C6D5F6D826D986D2F6D68
+6D8B6D7E6D806D846D166D836D7B6D7D6D756D9070DC70D370D170DD70CB7F39
+70E270D770D270DE70E070D470CD70C570C670C770DA70CE70E1724272780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072777276730072FA72F472FE72F672F372FB730173D373D973E573D673BC
+73E773E373E973DC73D273DB73D473DD73DA73D773D873E874DE74DF74F474F5
+7521755B755F75B075C175BB75C475C075BF75B675BA768A76C9771D771B7710
+771377127723771177157719771A772277277823782C78227835782F7828782E
+782B782178297833782A78317954795B794F795C79537952795179EB79EC79E0
+79EE79ED79EA79DC79DE79DD7A867A897A857A8B7A8C7A8A7A877AD87B100000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7B047B137B057B0F7B087B0A7B0E7B097B127C847C917C8A7C8C7C887C8D7C85
+7D1E7D1D7D117D0E7D187D167D137D1F7D127D0F7D0C7F5C7F617F5E7F607F5D
+7F5B7F967F927FC37FC27FC08016803E803980FA80F280F980F5810180FB8100
+8201822F82258333832D83448319835183258356833F83418326831C83220000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008342834E831B832A8308833C834D8316832483208337832F832983478345
+834C8353831E832C834B832783488653865286A286A88696868D8691869E8687
+86978686868B869A868586A5869986A186A786958698868E869D869086948843
+8844886D88758876887288808871887F886F8883887E8874887C8A128C478C57
+8C7B8CA48CA38D768D788DB58DB78DB68ED18ED38FFE8FF590028FFF8FFB9004
+8FFC8FF690D690E090D990DA90E390DF90E590D890DB90D790DC90E491500000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+914E914F91D591E291DA965C965F96BC98E39ADF9B2F4E7F5070506A5061505E
+50605053504B505D50725048504D5041505B504A506250155045505F5069506B
+5063506450465040506E50735057505151D0526B526D526C526E52D652D3532D
+539C55755576553C554D55505534552A55515562553655355530555255450000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000550C55325565554E55395548552D553B5540554B570A570757FB581457E2
+57F657DC57F4580057ED57FD580857F8580B57F357CF580757EE57E357F257E5
+57EC57E1580E57FC581057E75801580C57F157E957F0580D5804595C5A605A58
+5A555A675A5E5A385A355A6D5A505A5F5A655A6C5A535A645A575A435A5D5A52
+5A445A5B5A485A8E5A3E5A4D5A395A4C5A705A695A475A515A565A425A5C5B72
+5B6E5BC15BC05C595D1E5D0B5D1D5D1A5D205D0C5D285D0D5D265D255D0F0000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D305D125D235D1F5D2E5E3E5E345EB15EB45EB95EB25EB35F365F385F9B5F96
+5F9F608A6090608660BE60B060BA60D360D460CF60E460D960DD60C860B160DB
+60B760CA60BF60C360CD60C063326365638A6382637D63BD639E63AD639D6397
+63AB638E636F63876390636E63AF6375639C636D63AE637C63A4633B639F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006378638563816391638D6370655365CD66656661665B6659665C66626718
+687968876890689C686D686E68AE68AB6956686F68A368AC68A96875687468B2
+688F68776892687C686B687268AA68806871687E689B6896688B68A0688968A4
+6878687B6891688C688A687D6B366B336B376B386B916B8F6B8D6B8E6B8C6C2A
+6DC06DAB6DB46DB36E746DAC6DE96DE26DB76DF66DD46E006DC86DE06DDF6DD6
+6DBE6DE56DDC6DDD6DDB6DF46DCA6DBD6DED6DF06DBA6DD56DC26DCF6DC90000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6DD06DF26DD36DFD6DD76DCD6DE36DBB70FA710D70F7711770F4710C70F07104
+70F3711070FC70FF71067113710070F870F6710B7102710E727E727B727C727F
+731D7317730773117318730A730872FF730F731E738873F673F873F574047401
+73FD7407740073FA73FC73FF740C740B73F474087564756375CE75D275CF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075CB75CC75D175D0768F768976D37739772F772D7731773277347733773D
+7725773B7735784878527849784D784A784C782678457850796479677969796A
+7963796B796179BB79FA79F879F679F77A8F7A947A907B357B477B347B257B30
+7B227B247B337B187B2A7B1D7B317B2B7B2D7B2F7B327B387B1A7B237C947C98
+7C967CA37D357D3D7D387D367D3A7D457D2C7D297D417D477D3E7D3F7D4A7D3B
+7D287F637F957F9C7F9D7F9B7FCA7FCB7FCD7FD07FD17FC77FCF7FC9801F0000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+801E801B804780438048811881258119811B812D811F812C811E812181158127
+811D8122821182388233823A823482328274839083A383A8838D837A837383A4
+8374838F8381839583998375839483A9837D8383838C839D839B83AA838B837E
+83A583AF8388839783B0837F83A6838783AE8376839A8659865686BF86B70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000086C286C186C586BA86B086C886B986B386B886CC86B486BB86BC86C386BD
+86BE88528889889588A888A288AA889A889188A1889F889888A78899889B8897
+88A488AC888C8893888E898289D689D989D58A308A278A2C8A1E8C398C3B8C5C
+8C5D8C7D8CA58D7D8D7B8D798DBC8DC28DB98DBF8DC18ED88EDE8EDD8EDC8ED7
+8EE08EE19024900B9011901C900C902190EF90EA90F090F490F290F390D490EB
+90EC90E991569158915A9153915591EC91F491F191F391F891E491F991EA0000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+91EB91F791E891EE957A95869588967C966D966B9671966F96BF976A980498E5
+9997509B50955094509E508B50A35083508C508E509D5068509C509250825087
+515F51D45312531153A453A7559155A855A555AD5577564555A255935588558F
+55B5558155A3559255A4557D558C55A6557F559555A1558E570C582958370000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005819581E58275823582857F558485825581C581B5833583F5836582E5839
+5838582D582C583B59615AAF5A945A9F5A7A5AA25A9E5A785AA65A7C5AA55AAC
+5A955AAE5A375A845A8A5A975A835A8B5AA95A7B5A7D5A8C5A9C5A8F5A935A9D
+5BEA5BCD5BCB5BD45BD15BCA5BCE5C0C5C305D375D435D6B5D415D4B5D3F5D35
+5D515D4E5D555D335D3A5D525D3D5D315D595D425D395D495D385D3C5D325D36
+5D405D455E445E415F585FA65FA55FAB60C960B960CC60E260CE60C461140000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60F2610A6116610560F5611360F860FC60FE60C161036118611D611060FF6104
+610B624A639463B163B063CE63E563E863EF63C3649D63F363CA63E063F663D5
+63F263F5646163DF63BE63DD63DC63C463D863D363C263C763CC63CB63C863F0
+63D763D965326567656A6564655C65686565658C659D659E65AE65D065D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000667C666C667B668066716679666A66726701690C68D3690468DC692A68EC
+68EA68F1690F68D668F768EB68E468F66913691068F368E1690768CC69086970
+68B4691168EF68C6691468F868D068FD68FC68E8690B690A691768CE68C868DD
+68DE68E668F468D1690668D468E96915692568C76B396B3B6B3F6B3C6B946B97
+6B996B956BBD6BF06BF26BF36C306DFC6E466E476E1F6E496E886E3C6E3D6E45
+6E626E2B6E3F6E416E5D6E736E1C6E336E4B6E406E516E3B6E036E2E6E5E0000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E686E5C6E616E316E286E606E716E6B6E396E226E306E536E656E276E786E64
+6E776E556E796E526E666E356E366E5A7120711E712F70FB712E713171237125
+71227132711F7128713A711B724B725A7288728972867285728B7312730B7330
+73227331733373277332732D732673237335730C742E742C7430742B74160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000741A7421742D743174247423741D74297420743274FB752F756F756C75E7
+75DA75E175E675DD75DF75E475D77695769276DA774677477744774D7745774A
+774E774B774C77DE77EC786078647865785C786D7871786A786E787078697868
+785E786279747973797279707A027A0A7A037A0C7A047A997AE67AE47B4A7B3B
+7B447B487B4C7B4E7B407B587B457CA27C9E7CA87CA17D587D6F7D637D537D56
+7D677D6A7D4F7D6D7D5C7D6B7D527D547D697D517D5F7D4E7F3E7F3F7F650000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7F667FA27FA07FA17FD78051804F805080FE80D48143814A8152814F8147813D
+814D813A81E681EE81F781F881F98204823C823D823F8275833B83CF83F98423
+83C083E8841283E783E483FC83F6841083C683C883EB83E383BF840183DD83E5
+83D883FF83E183CB83CE83D683F583C98409840F83DE8411840683C283F30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000083D583FA83C783D183EA841383C383EC83EE83C483FB83D783E2841B83DB
+83FE86D886E286E686D386E386DA86EA86DD86EB86DC86EC86E986D786E886D1
+88488856885588BA88D788B988B888C088BE88B688BC88B788BD88B2890188C9
+89958998899789DD89DA89DB8A4E8A4D8A398A598A408A578A588A448A458A52
+8A488A518A4A8A4C8A4F8C5F8C818C808CBA8CBE8CB08CB98CB58D848D808D89
+8DD88DD38DCD8DC78DD68DDC8DCF8DD58DD98DC88DD78DC58EEF8EF78EFA0000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8EF98EE68EEE8EE58EF58EE78EE88EF68EEB8EF18EEC8EF48EE9902D9034902F
+9106912C910490FF90FC910890F990FB9101910091079105910391619164915F
+916291609201920A92259203921A9226920F920C9200921291FF91FD92069204
+92279202921C92249219921792059216957B958D958C95909687967E96880000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000096899683968096C296C896C396F196F0976C9770976E980798A998EB9CE6
+9EF94E834E844EB650BD50BF50C650AE50C450CA50B450C850C250B050C150BA
+50B150CB50C950B650B851D7527A5278527B527C55C355DB55CC55D055CB55CA
+55DD55C055D455C455E955BF55D2558D55CF55D555E255D655C855F255CD55D9
+55C25714585358685864584F584D5849586F5855584E585D58595865585B583D
+5863587158FC5AC75AC45ACB5ABA5AB85AB15AB55AB05ABF5AC85ABB5AC60000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5AB75AC05ACA5AB45AB65ACD5AB95A905BD65BD85BD95C1F5C335D715D635D4A
+5D655D725D6C5D5E5D685D675D625DF05E4F5E4E5E4A5E4D5E4B5EC55ECC5EC6
+5ECB5EC75F405FAF5FAD60F76149614A612B614561366132612E6146612F614F
+612961406220916862236225622463C563F163EB641064126409642064240000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064336443641F641564186439643764226423640C64266430642864416435
+642F640A641A644064256427640B63E7641B642E6421640E656F659265D36686
+668C66956690668B668A66996694667867206966695F6938694E69626971693F
+6945696A6939694269576959697A694869496935696C6933693D696568F06978
+693469696940696F69446976695869416974694C693B694B6937695C694F6951
+69326952692F697B693C6B466B456B436B426B486B416B9BFA0D6BFB6BFC0000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6BF96BF76BF86E9B6ED66EC86E8F6EC06E9F6E936E946EA06EB16EB96EC66ED2
+6EBD6EC16E9E6EC96EB76EB06ECD6EA66ECF6EB26EBE6EC36EDC6ED86E996E92
+6E8E6E8D6EA46EA16EBF6EB36ED06ECA6E976EAE6EA371477154715271637160
+7141715D716271727178716A7161714271587143714B7170715F715071530000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007144714D715A724F728D728C72917290728E733C7342733B733A7340734A
+73497444744A744B7452745174577440744F7450744E74427446744D745474E1
+74FF74FE74FD751D75797577698375EF760F760375F775FE75FC75F975F87610
+75FB75F675ED75F575FD769976B576DD7755775F776077527756775A77697767
+77547759776D77E07887789A7894788F788478957885788678A1788378797899
+78807896787B797C7982797D79797A117A187A197A127A177A157A227A130000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A1B7A107AA37AA27A9E7AEB7B667B647B6D7B747B697B727B657B737B717B70
+7B617B787B767B637CB27CB47CAF7D887D867D807D8D7D7F7D857D7A7D8E7D7B
+7D837D7C7D8C7D947D847D7D7D927F6D7F6B7F677F687F6C7FA67FA57FA77FDB
+7FDC8021816481608177815C8169815B816281726721815E81768167816F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081448161821D8249824482408242824584F1843F845684768479848F848D
+846584518440848684678430844D847D845A845984748473845D8507845E8437
+843A8434847A8443847884328445842983D9844B842F8442842D845F84708439
+844E844C8452846F84C5848E843B8447843684338468847E8444842B84608454
+846E8450870B870486F7870C86FA86D686F5874D86F8870E8709870186F6870D
+870588D688CB88CD88CE88DE88DB88DA88CC88D08985899B89DF89E589E40000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89E189E089E289DC89E68A768A868A7F8A618A3F8A778A828A848A758A838A81
+8A748A7A8C3C8C4B8C4A8C658C648C668C868C848C858CCC8D688D698D918D8C
+8D8E8D8F8D8D8D938D948D908D928DF08DE08DEC8DF18DEE8DD08DE98DE38DE2
+8DE78DF28DEB8DF48F068EFF8F018F008F058F078F088F028F0B9052903F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090449049903D9110910D910F911191169114910B910E916E916F92489252
+9230923A926692339265925E9283922E924A9246926D926C924F92609267926F
+92369261927092319254926392509272924E9253924C92569232959F959C959E
+959B969296939691969796CE96FA96FD96F896F59773977797789772980F980D
+980E98AC98F698F999AF99B299B099B59AAD9AAB9B5B9CEA9CED9CE79E809EFD
+50E650D450D750E850F350DB50EA50DD50E450D350EC50F050EF50E350E00000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51D85280528152E952EB533053AC56275615560C561255FC560F561C56015613
+560255FA561D560455FF55F95889587C5890589858865881587F5874588B587A
+58875891588E587658825888587B5894588F58FE596B5ADC5AEE5AE55AD55AEA
+5ADA5AED5AEB5AF35AE25AE05ADB5AEC5ADE5ADD5AD95AE85ADF5B775BE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005BE35C635D825D805D7D5D865D7A5D815D775D8A5D895D885D7E5D7C5D8D
+5D795D7F5E585E595E535ED85ED15ED75ECE5EDC5ED55ED95ED25ED45F445F43
+5F6F5FB6612C61286141615E61716173615261536172616C618061746154617A
+615B6165613B616A6161615662296227622B642B644D645B645D647464766472
+6473647D6475646664A6644E6482645E645C644B645364606450647F643F646C
+646B645964656477657365A066A166A0669F67056704672269B169B669C90000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69A069CE699669B069AC69BC69916999698E69A7698D69A969BE69AF69BF69C4
+69BD69A469D469B969CA699A69CF69B3699369AA69A1699E69D96997699069C2
+69B569A569C66B4A6B4D6B4B6B9E6B9F6BA06BC36BC46BFE6ECE6EF56EF16F03
+6F256EF86F376EFB6F2E6F096F4E6F196F1A6F276F186F3B6F126EED6F0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F366F736EF96EEE6F2D6F406F306F3C6F356EEB6F076F0E6F436F056EFD
+6EF66F396F1C6EFC6F3A6F1F6F0D6F1E6F086F21718771907189718071857182
+718F717B718671817197724472537297729572937343734D7351734C74627473
+7471747574727467746E750075027503757D759076167608760C76157611760A
+761476B87781777C77857782776E7780776F777E778378B278AA78B478AD78A8
+787E78AB789E78A578A078AC78A278A47998798A798B79967995799479930000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+79977988799279907A2B7A4A7A307A2F7A287A267AA87AAB7AAC7AEE7B887B9C
+7B8A7B917B907B967B8D7B8C7B9B7B8E7B857B9852847B997BA47B827CBB7CBF
+7CBC7CBA7DA77DB77DC27DA37DAA7DC17DC07DC57D9D7DCE7DC47DC67DCB7DCC
+7DAF7DB97D967DBC7D9F7DA67DAE7DA97DA17DC97F737FE27FE37FE57FDE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008024805D805C8189818681838187818D818C818B8215849784A484A1849F
+84BA84CE84C284AC84AE84AB84B984B484C184CD84AA849A84B184D0849D84A7
+84BB84A2849484C784CC849B84A984AF84A884D6849884B684CF84A084D784D4
+84D284DB84B084918661873387238728876B8740872E871E87218719871B8743
+872C8741873E874687208732872A872D873C8712873A87318735874287268727
+87388724871A8730871188F788E788F188F288FA88FE88EE88FC88F688FB0000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+88F088EC88EB899D89A1899F899E89E989EB89E88AAB8A998A8B8A928A8F8A96
+8C3D8C688C698CD58CCF8CD78D968E098E028DFF8E0D8DFD8E0A8E038E078E06
+8E058DFE8E008E048F108F118F0E8F0D9123911C91209122911F911D911A9124
+9121911B917A91729179917392A592A49276929B927A92A0929492AA928D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000092A6929A92AB92799297927F92A392EE928E9282929592A2927D928892A1
+928A9286928C929992A7927E928792A9929D928B922D969E96A196FF9758977D
+977A977E978397809782977B97849781977F97CE97CD981698AD98AE99029900
+9907999D999C99C399B999BB99BA99C299BD99C79AB19AE39AE79B3E9B3F9B60
+9B619B5F9CF19CF29CF59EA750FF5103513050F85106510750F650FE510B510C
+50FD510A528B528C52F152EF56485642564C56355641564A5649564656580000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+565A56405633563D562C563E5638562A563A571A58AB589D58B158A058A358AF
+58AC58A558A158FF5AFF5AF45AFD5AF75AF65B035AF85B025AF95B015B075B05
+5B0F5C675D995D975D9F5D925DA25D935D955DA05D9C5DA15D9A5D9E5E695E5D
+5E605E5C7DF35EDB5EDE5EE15F495FB2618B6183617961B161B061A261890000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000619B619361AF61AD619F619261AA61A1618D616661B3622D646E64706496
+64A064856497649C648F648B648A648C64A3649F646864B164986576657A6579
+657B65B265B366B566B066A966B266B766AA66AF6A006A066A1769E569F86A15
+69F169E46A2069FF69EC69E26A1B6A1D69FE6A2769F269EE6A1469F769E76A40
+6A0869E669FB6A0D69FC69EB6A096A046A186A256A0F69F66A266A0769F46A16
+6B516BA56BA36BA26BA66C016C006BFF6C026F416F266F7E6F876FC66F920000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F8D6F896F8C6F626F4F6F856F5A6F966F766F6C6F826F556F726F526F506F57
+6F946F936F5D6F006F616F6B6F7D6F676F906F536F8B6F696F7F6F956F636F77
+6F6A6F7B71B271AF719B71B071A0719A71A971B5719D71A5719E71A471A171AA
+719C71A771B37298729A73587352735E735F7360735D735B7361735A73590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000736274877489748A74867481747D74857488747C747975087507757E7625
+761E7619761D761C7623761A7628761B769C769D769E769B778D778F77897788
+78CD78BB78CF78CC78D178CE78D478C878C378C478C9799A79A179A0799C79A2
+799B6B767A397AB27AB47AB37BB77BCB7BBE7BAC7BCE7BAF7BB97BCA7BB57CC5
+7CC87CCC7CCB7DF77DDB7DEA7DE77DD77DE17E037DFA7DE67DF67DF17DF07DEE
+7DDF7F767FAC7FB07FAD7FED7FEB7FEA7FEC7FE67FE88064806781A3819F0000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+819E819581A2819981978216824F825382528250824E82518524853B850F8500
+8529850E8509850D851F850A8527851C84FB852B84FA8508850C84F4852A84F2
+851584F784EB84F384FC851284EA84E9851684FE8528851D852E850284FD851E
+84F68531852684E784E884F084EF84F9851885208530850B8519852F86620000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000875687638764877787E1877387588754875B87528761875A8751875E876D
+876A8750874E875F875D876F876C877A876E875C8765874F877B877587628767
+8769885A8905890C8914890B891789188919890689168911890E890989A289A4
+89A389ED89F089EC8ACF8AC68AB88AD38AD18AD48AD58ABB8AD78ABE8AC08AC5
+8AD88AC38ABA8ABD8AD98C3E8C4D8C8F8CE58CDF8CD98CE88CDA8CDD8CE78DA0
+8D9C8DA18D9B8E208E238E258E248E2E8E158E1B8E168E118E198E268E270000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E148E128E188E138E1C8E178E1A8F2C8F248F188F1A8F208F238F168F179073
+9070906F9067906B912F912B9129912A91329126912E91859186918A91819182
+9184918092D092C392C492C092D992B692CF92F192DF92D892E992D792DD92CC
+92EF92C292E892CA92C892CE92E692CD92D592C992E092DE92E792D192D30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000092B592E192C692B4957C95AC95AB95AE95B096A496A296D3970597089702
+975A978A978E978897D097CF981E981D9826982998289820981B982798B29908
+98FA9911991499169917991599DC99CD99CF99D399D499CE99C999D699D899CB
+99D799CC9AB39AEC9AEB9AF39AF29AF19B469B439B679B749B719B669B769B75
+9B709B689B649B6C9CFC9CFA9CFD9CFF9CF79D079D009CF99CFB9D089D059D04
+9E839ED39F0F9F10511C51135117511A511151DE533453E156705660566E0000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+567356665663566D5672565E5677571C571B58C858BD58C958BF58BA58C258BC
+58C65B175B195B1B5B215B145B135B105B165B285B1A5B205B1E5BEF5DAC5DB1
+5DA95DA75DB55DB05DAE5DAA5DA85DB25DAD5DAF5DB45E675E685E665E6F5EE9
+5EE75EE65EE85EE55F4B5FBC619D61A8619661C561B461C661C161CC61BA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000061BF61B8618C64D764D664D064CF64C964BD648964C364DB64F364D96533
+657F657C65A266C866BE66C066CA66CB66CF66BD66BB66BA66CC67236A346A66
+6A496A676A326A686A3E6A5D6A6D6A766A5B6A516A286A5A6A3B6A3F6A416A6A
+6A646A506A4F6A546A6F6A696A606A3C6A5E6A566A556A4D6A4E6A466B556B54
+6B566BA76BAA6BAB6BC86BC76C046C036C066FAD6FCB6FA36FC76FBC6FCE6FC8
+6F5E6FC46FBD6F9E6FCA6FA870046FA56FAE6FBA6FAC6FAA6FCF6FBF6FB80000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6FA26FC96FAB6FCD6FAF6FB26FB071C571C271BF71B871D671C071C171CB71D4
+71CA71C771CF71BD71D871BC71C671DA71DB729D729E736973667367736C7365
+736B736A747F749A74A074947492749574A1750B7580762F762D7631763D7633
+763C76357632763076BB76E6779A779D77A1779C779B77A277A3779577990000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000779778DD78E978E578EA78DE78E378DB78E178E278ED78DF78E079A47A44
+7A487A477AB67AB87AB57AB17AB77BDE7BE37BE77BDD7BD57BE57BDA7BE87BF9
+7BD47BEA7BE27BDC7BEB7BD87BDF7CD27CD47CD77CD07CD17E127E217E177E0C
+7E1F7E207E137E0E7E1C7E157E1A7E227E0B7E0F7E167E0D7E147E257E247F43
+7F7B7F7C7F7A7FB17FEF802A8029806C81B181A681AE81B981B581AB81B081AC
+81B481B281B781A781F282558256825785568545856B854D8553856185580000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+854085468564854185628544855185478563853E855B8571854E856E85758555
+85678560858C8566855D85548565856C866386658664879B878F879787938792
+87888781879687988779878787A3878587908791879D87848794879C879A8789
+891E89268930892D892E89278931892289298923892F892C891F89F18AE00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AE28AF28AF48AF58ADD8B148AE48ADF8AF08AC88ADE8AE18AE88AFF8AEF
+8AFB8C918C928C908CF58CEE8CF18CF08CF38D6C8D6E8DA58DA78E338E3E8E38
+8E408E458E368E3C8E3D8E418E308E3F8EBD8F368F2E8F358F328F398F378F34
+90769079907B908690FA913391359136919391909191918D918F9327931E9308
+931F9306930F937A9338933C931B9323931293019346932D930E930D92CB931D
+92FA9325931392F992F793349302932492FF932993399335932A9314930C0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+930B92FE9309930092FB931695BC95CD95BE95B995BA95B695BF95B595BD96A9
+96D4970B9712971097999797979497F097F89835982F98329924991F99279929
+999E99EE99EC99E599E499F099E399EA99E999E79AB99ABF9AB49ABB9AF69AFA
+9AF99AF79B339B809B859B879B7C9B7E9B7B9B829B939B929B909B7A9B950000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B7D9B889D259D179D209D1E9D149D299D1D9D189D229D109D199D1F9E88
+9E869E879EAE9EAD9ED59ED69EFA9F129F3D51265125512251245120512952F4
+5693568C568D568656845683567E5682567F568158D658D458CF58D25B2D5B25
+5B325B235B2C5B275B265B2F5B2E5B7B5BF15BF25DB75E6C5E6A5FBE5FBB61C3
+61B561BC61E761E061E561E461E861DE64EF64E964E364EB64E464E865816580
+65B665DA66D26A8D6A966A816AA56A896A9F6A9B6AA16A9E6A876A936A8E0000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A956A836AA86AA46A916A7F6AA66A9A6A856A8C6A926B5B6BAD6C096FCC6FA9
+6FF46FD46FE36FDC6FED6FE76FE66FDE6FF26FDD6FE26FE871E171F171E871F2
+71E471F071E27373736E736F749774B274AB749074AA74AD74B174A574AF7510
+75117512750F7584764376487649764776A476E977B577AB77B277B777B60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077B477B177A877F078F378FD790278FB78FC78F2790578F978FE790479AB
+79A87A5C7A5B7A567A587A547A5A7ABE7AC07AC17C057C0F7BF27C007BFF7BFB
+7C0E7BF47C0B7BF37C027C097C037C017BF87BFD7C067BF07BF17C107C0A7CE8
+7E2D7E3C7E427E3398487E387E2A7E497E407E477E297E4C7E307E3B7E367E44
+7E3A7F457F7F7F7E7F7D7FF47FF2802C81BB81C481CC81CA81C581C781BC81E9
+825B825A825C85838580858F85A7859585A0858B85A3857B85A4859A859E0000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8577857C858985A1857A85788557858E85968586858D8599859D858185A28582
+858885858579857685988590859F866887BE87AA87AD87C587B087AC87B987B5
+87BC87AE87C987C387C287CC87B787AF87C487CA87B487B687BF87B887BD87DE
+87B289358933893C893E894189528937894289AD89AF89AE89F289F38B1E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B188B168B118B058B0B8B228B0F8B128B158B078B0D8B088B068B1C8B13
+8B1A8C4F8C708C728C718C6F8C958C948CF98D6F8E4E8E4D8E538E508E4C8E47
+8F438F409085907E9138919A91A2919B9199919F91A1919D91A093A1938393AF
+936493569347937C9358935C93769349935093519360936D938F934C936A9379
+935793559352934F93719377937B9361935E936393679380934E935995C795C0
+95C995C395C595B796AE96B096AC9720971F9718971D9719979A97A1979C0000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+979E979D97D597D497F198419844984A9849984598439925992B992C992A9933
+9932992F992D99319930999899A399A19A0299FA99F499F799F999F899F699FB
+99FD99FE99FC9A039ABE9AFE9AFD9B019AFC9B489B9A9BA89B9E9B9B9BA69BA1
+9BA59BA49B869BA29BA09BAF9D339D419D679D369D2E9D2F9D319D389D300000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D459D429D439D3E9D379D409D3D7FF59D2D9E8A9E899E8D9EB09EC89EDA
+9EFB9EFF9F249F239F229F549FA05131512D512E5698569C5697569A569D5699
+59705B3C5C695C6A5DC05E6D5E6E61D861DF61ED61EE61F161EA61F061EB61D6
+61E964FF650464FD64F86501650364FC659465DB66DA66DB66D86AC56AB96ABD
+6AE16AC66ABA6AB66AB76AC76AB46AAD6B5E6BC96C0B7007700C700D70017005
+7014700E6FFF70006FFB70266FFC6FF7700A720171FF71F9720371FD73760000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74B874C074B574C174BE74B674BB74C275147513765C76647659765076537657
+765A76A676BD76EC77C277BA78FF790C79137914790979107912791179AD79AC
+7A5F7C1C7C297C197C207C1F7C2D7C1D7C267C287C227C257C307E5C7E507E56
+7E637E587E627E5F7E517E607E577E537FB57FB37FF77FF8807581D181D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081D0825F825E85B485C685C085C385C285B385B585BD85C785C485BF85CB
+85CE85C885C585B185B685D2862485B885B785BE866987E787E687E287DB87EB
+87EA87E587DF87F387E487D487DC87D387ED87D887E387A487D787D9880187F4
+87E887DD8953894B894F894C89468950895189498B2A8B278B238B338B308B35
+8B478B2F8B3C8B3E8B318B258B378B268B368B2E8B248B3B8B3D8B3A8C428C75
+8C998C988C978CFE8D048D028D008E5C8E628E608E578E568E5E8E658E670000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E5B8E5A8E618E5D8E698E548F468F478F488F4B9128913A913B913E91A891A5
+91A791AF91AA93B5938C939293B7939B939D938993A7938E93AA939E93A69395
+93889399939F938D93B1939193B293A493A893B493A393A595D295D395D196B3
+96D796DA5DC296DF96D896DD97239722972597AC97AE97A897AB97A497AA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000097A297A597D797D997D697D897FA98509851985298B89941993C993A9A0F
+9A0B9A099A0D9A049A119A0A9A059A079A069AC09ADC9B089B049B059B299B35
+9B4A9B4C9B4B9BC79BC69BC39BBF9BC19BB59BB89BD39BB69BC49BB99BBD9D5C
+9D539D4F9D4A9D5B9D4B9D599D569D4C9D579D529D549D5F9D589D5A9E8E9E8C
+9EDF9F019F009F169F259F2B9F2A9F299F289F4C9F5551345135529652F753B4
+56AB56AD56A656A756AA56AC58DA58DD58DB59125B3D5B3E5B3F5DC35E700000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5FBF61FB65076510650D6509650C650E658465DE65DD66DE6AE76AE06ACC6AD1
+6AD96ACB6ADF6ADC6AD06AEB6ACF6ACD6ADE6B606BB06C0C7019702770207016
+702B702170227023702970177024701C702A720C720A72077202720572A572A6
+72A472A372A174CB74C574B774C37516766077C977CA77C477F1791D791B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007921791C7917791E79B07A677A687C337C3C7C397C2C7C3B7CEC7CEA7E76
+7E757E787E707E777E6F7E7A7E727E747E687F4B7F4A7F837F867FB77FFD7FFE
+807881D781D582648261826385EB85F185ED85D985E185E885DA85D785EC85F2
+85F885D885DF85E385DC85D185F085E685EF85DE85E2880087FA880387F687F7
+8809880C880B880687FC880887FF880A88028962895A895B89578961895C8958
+895D8959898889B789B689F68B508B488B4A8B408B538B568B548B4B8B550000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B518B428B528B578C438C778C768C9A8D068D078D098DAC8DAA8DAD8DAB8E6D
+8E788E738E6A8E6F8E7B8EC28F528F518F4F8F508F538FB49140913F91B091AD
+93DE93C793CF93C293DA93D093F993EC93CC93D993A993E693CA93D493EE93E3
+93D593C493CE93C093D293E7957D95DA95DB96E19729972B972C972897260000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000097B397B797B697DD97DE97DF985C9859985D985798BF98BD98BB98BE9948
+9947994399A699A79A1A9A159A259A1D9A249A1B9A229A209A279A239A1E9A1C
+9A149AC29B0B9B0A9B0E9B0C9B379BEA9BEB9BE09BDE9BE49BE69BE29BF09BD4
+9BD79BEC9BDC9BD99BE59BD59BE19BDA9D779D819D8A9D849D889D719D809D78
+9D869D8B9D8C9D7D9D6B9D749D759D709D699D859D739D7B9D829D6F9D799D7F
+9D879D689E949E919EC09EFC9F2D9F409F419F4D9F569F579F58533756B20000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56B556B358E35B455DC65DC75EEE5EEF5FC05FC161F9651765166515651365DF
+66E866E366E46AF36AF06AEA6AE86AF96AF16AEE6AEF703C7035702F70377034
+703170427038703F703A70397040703B703370417213721472A8737D737C74BA
+76AB76AA76BE76ED77CC77CE77CF77CD77F27925792379277928792479290000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079B27A6E7A6C7A6D7AF77C497C487C4A7C477C457CEE7E7B7E7E7E817E80
+7FBA7FFF807981DB81D9820B82688269862285FF860185FE861B860085F68604
+86098605860C85FD8819881088118817881388168963896689B989F78B608B6A
+8B5D8B688B638B658B678B6D8DAE8E868E888E848F598F568F578F558F588F5A
+908D9143914191B791B591B291B3940B941393FB9420940F941493FE94159410
+94289419940D93F5940093F79407940E9416941293FA940993F8940A93FF0000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93FC940C93F69411940695DE95E095DF972E972F97B997BB97FD97FE98609862
+9863985F98C198C29950994E9959994C994B99539A329A349A319A2C9A2A9A36
+9A299A2E9A389A2D9AC79ACA9AC69B109B129B119C0B9C089BF79C059C129BF8
+9C409C079C0E9C069C179C149C099D9F9D999DA49D9D9D929D989D909D9B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009DA09D949D9C9DAA9D979DA19D9A9DA29DA89D9E9DA39DBF9DA99D969DA6
+9DA79E999E9B9E9A9EE59EE49EE79EE69F309F2E9F5B9F609F5E9F5D9F599F91
+513A51395298529756C356BD56BE5B485B475DCB5DCF5EF161FD651B6B026AFC
+6B036AF86B0070437044704A7048704970457046721D721A7219737E7517766A
+77D0792D7931792F7C547C537CF27E8A7E877E887E8B7E867E8D7F4D7FBB8030
+81DD8618862A8626861F8623861C86198627862E862186208629861E86250000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8829881D881B88208824881C882B884A896D8969896E896B89FA8B798B788B45
+8B7A8B7B8D108D148DAF8E8E8E8C8F5E8F5B8F5D91469144914591B9943F943B
+94369429943D943C94309439942A9437942C9440943195E595E495E39735973A
+97BF97E1986498C998C698C0995899569A399A3D9A469A449A429A419A3A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009A3F9ACD9B159B179B189B169B3A9B529C2B9C1D9C1C9C2C9C239C289C29
+9C249C219DB79DB69DBC9DC19DC79DCA9DCF9DBE9DC59DC39DBB9DB59DCE9DB9
+9DBA9DAC9DC89DB19DAD9DCC9DB39DCD9DB29E7A9E9C9EEB9EEE9EED9F1B9F18
+9F1A9F319F4E9F659F649F924EB956C656C556CB59715B4B5B4C5DD55DD15EF2
+65216520652665226B0B6B086B096C0D7055705670577052721E721F72A9737F
+74D874D574D974D7766D76AD793579B47A707A717C577C5C7C597C5B7C5A0000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7CF47CF17E917F4F7F8781DE826B863486358633862C86328636882C88288826
+882A8825897189BF89BE89FB8B7E8B848B828B868B858B7F8D158E958E948E9A
+8E928E908E968E978F608F629147944C9450944A944B944F9447944594489449
+9446973F97E3986A986998CB9954995B9A4E9A539A549A4C9A4F9A489A4A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009A499A529A509AD09B199B2B9B3B9B569B559C469C489C3F9C449C399C33
+9C419C3C9C379C349C329C3D9C369DDB9DD29DDE9DDA9DCB9DD09DDC9DD19DDF
+9DE99DD99DD89DD69DF59DD59DDD9EB69EF09F359F339F329F429F6B9F959FA2
+513D529958E858E759725B4D5DD8882F5F4F62016203620465296525659666EB
+6B116B126B0F6BCA705B705A7222738273817383767077D47C677C667E95826C
+863A86408639863C8631863B863E88308832882E883389768974897389FE0000
+F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8B8C8B8E8B8B8B888C458D198E988F648F6391BC94629455945D9457945E97C4
+97C598009A569A599B1E9B1F9B209C529C589C509C4A9C4D9C4B9C559C599C4C
+9C4E9DFB9DF79DEF9DE39DEB9DF89DE49DF69DE19DEE9DE69DF29DF09DE29DEC
+9DF49DF39DE89DED9EC29ED09EF29EF39F069F1C9F389F379F369F439F4F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009F719F709F6E9F6F56D356CD5B4E5C6D652D66ED66EE6B13705F7061705D
+7060722374DB74E577D5793879B779B67C6A7E977F89826D8643883888378835
+884B8B948B958E9E8E9F8EA08E9D91BE91BD91C2946B9468946996E597469743
+974797C797E59A5E9AD59B599C639C679C669C629C5E9C609E029DFE9E079E03
+9E069E059E009E019E099DFF9DFD9E049EA09F1E9F469F749F759F7656D4652E
+65B86B186B196B176B1A7062722672AA77D877D979397C697C6B7CF67E9A0000
+F9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E987E9B7E9981E081E18646864786488979897A897C897B89FF8B988B998EA5
+8EA48EA3946E946D946F9471947397499872995F9C689C6E9C6D9E0B9E0D9E10
+9E0F9E129E119EA19EF59F099F479F789F7B9F7A9F79571E70667C6F883C8DB2
+8EA691C394749478947694759A609C749C739C719C759E149E139EF69F0A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009FA4706870657CF7866A883E883D883F8B9E8C9C8EA98EC9974B98739874
+98CC996199AB9A649A669A679B249E159E179F4862076B1E7227864C8EA89482
+948094819A699A689B2E9E197229864B8B9F94839C799EB776759A6B9C7A9E1D
+7069706A9EA49F7E9F499F98788192B988CF58BB60527CA75AFA255425662557
+2560256C2563255A2569255D255225642555255E256A256125582567255B2553
+25652556255F256B256225592568255C25512550256D256E2570256F25930000
diff --git a/ext/Encode/Encode/dingbats.enc b/ext/Encode/Encode/dingbats.enc
new file mode 100644 (file)
index 0000000..9729487
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: dingbats, single-byte
+S
+003F 1 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+00202701270227032704260E2706270727082709261B261E270C270D270E270F
+2710271127122713271427152716271727182719271A271B271C271D271E271F
+2720272127222723272427252726272726052729272A272B272C272D272E272F
+2730273127322733273427352736273727382739273A273B273C273D273E273F
+2740274127422743274427452746274727482749274A274B25CF274D25A0274F
+27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000276127622763276427652766276726632666266526602460246124622463
+2464246524662467246824692776277727782779277A277B277C277D277E277F
+2780278127822783278427852786278727882789278A278B278C278D278E278F
+2790279127922793279421922194219527982799279A279B279C279D279E279F
+27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF
+000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000
diff --git a/ext/Encode/Encode/euc-cn.enc b/ext/Encode/Encode/euc-cn.enc
new file mode 100644 (file)
index 0000000..4b2f8c7
--- /dev/null
@@ -0,0 +1,1397 @@
+# Encoding file: euc-cn, multi-byte
+M
+003F 0 82
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300230FB02C902C700A8300330052015FF5E2225202620182019
+201C201D3014301530083009300A300B300C300D300E300F3016301730103011
+00B100D700F72236222722282211220F222A222922082237221A22A522252220
+23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235
+22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605
+25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000024882489248A248B248C248D248E248F2490249124922493249424952496
+249724982499249A249B247424752476247724782479247A247B247C247D247E
+247F248024812482248324842485248624872460246124622463246424652466
+2467246824690000000032203221322232233224322532263227322832290000
+00002160216121622163216421652166216721682169216A216B000000000000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2
+00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000
+0000000000000000000031053106310731083109310A310B310C310D310E310F
+3110311131123113311431153116311731183119311A311B311C311D311E311F
+3120312131223123312431253126312731283129000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000002500250125022503250425052506250725082509250A250B
+250C250D250E250F2510251125122513251425152516251725182519251A251B
+251C251D251E251F2520252125222523252425252526252725282529252A252B
+252C252D252E252F2530253125322533253425352536253725382539253A253B
+253C253D253E253F2540254125422543254425452546254725482549254A254B
+0000000000000000000000000000000000000000000000000000000000000000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698
+978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1
+888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB
+9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591
+73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E
+6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2
+535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28
+5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5
+6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9
+7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B
+522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B
+82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8
+601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695
+6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56
+4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7
+62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D
+56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668
+5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA
+627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A
+8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79
+4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE
+7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF
+882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A
+847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC
+810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE
+7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39
+86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC
+905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA
+654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0
+63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889
+53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8
+680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A
+72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD
+7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6
+591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9
+5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE
+94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F
+963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F
+6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124
+7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4
+4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150
+8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A
+54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76
+611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8
+818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769
+845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E
+62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D
+4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC
+52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF
+704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678
+684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD
+558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E
+8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408
+76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC
+4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334
+543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316
+8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62
+71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C
+604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F
+79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19
+706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6
+53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E
+796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7
+59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C
+76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877
+62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B
+686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07
+56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83
+53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED
+6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4
+91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66
+666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76
+7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0
+62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177
+8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485
+652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A
+582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760
+577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF
+554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F
+82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321
+7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000998861276E8357646606634656F062EC62695ED39614578362C955878721
+814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD
+89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001
+4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B
+7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC
+9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C
+6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF
+667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599
+521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D
+62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C
+740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089
+63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74
+541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A
+6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B
+95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B
+541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302
+51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF
+7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F
+772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720
+7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511
+706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE
+964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE
+776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357
+753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A
+6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18
+917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696
+8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4
+722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554
+522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA
+57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA
+787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02
+74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6
+8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461
+83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03
+51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91
+8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3
+524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A
+62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D
+520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81
+97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB
+4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000
+C8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238
+529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4
+58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4
+5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197
+63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A
+745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000
+C9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E
+7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D
+886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A
+5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7
+820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20
+7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3
+62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB
+4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F
+5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C
+67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9
+7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761
+7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D
+6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC
+8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9
+80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59
+635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A
+8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD
+6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4
+7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22
+951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530
+751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5
+687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82
+5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6
+625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6
+889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB
+5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4
+4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170
+536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717
+6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C
+68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269
+52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D
+4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1
+4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237
+95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF
+76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7
+6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A
+90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C
+6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2
+884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E
+673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157
+53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2
+5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD
+7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25
+781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830
+71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C
+4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237
+91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1
+4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681
+501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB
+4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE
+8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8
+5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C
+6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149
+670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206
+4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED
+7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95
+56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5
+5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5
+5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43
+810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5
+8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8
+77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B
+7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C
+62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005
+951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA
+9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7
+804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A
+63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92
+4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC
+7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB
+90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84
+88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353
+684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B
+4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70
+594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A
+5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F
+53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C
+4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5
+5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261
+525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB
+4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC
+4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F
+502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7
+50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0
+6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0
+51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF
+8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3
+8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19
+8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36
+5369537A961D962296219631962A963D963C964296499654965F9667966C9672
+96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB
+90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD
+52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF
+574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B
+574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF
+57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880
+99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8
+82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F
+82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3
+8311831A83068314831582E082D5831C8351835B835C83088392833C83348331
+839B835E832F834F83478343835F834083178360832D833A8333836683650000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C
+8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8
+58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9
+83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478
+843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF
+84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4
+85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605
+86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34
+624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371
+637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE
+645263C663BE64456441640B641B6420640C64266421645E6484646D64960000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2
+75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456
+54435421545754595423543254825494547754715464549A549B548454765466
+549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC
+54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522
+5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005537555655755576557755335530555C558B55D2558355B155B955885581
+559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB
+55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E
+5608560C56015624562355FE56005627562D565856395657562C564D56625659
+565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1
+56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91
+5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5
+5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F
+5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87
+5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8
+72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072FB731773137321730A731E731D7315732273397325732C733873317350
+734D73577360736C736F737E821B592598E7592459029963996799689969996A
+996B996C99749977997D998099849987998A998D999099919993999499955E80
+5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA
+5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019
+60356026601B600F600D6029602B600A603F602160786079607B607A60420000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8
+60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7
+61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606
+9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35
+6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4
+6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F
+6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7
+6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E
+6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5
+6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9
+6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035
+704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47
+8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011
+900D9016902190359036902D902F9044905190529050906890589062905B66B9
+9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63
+5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3
+59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75
+80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6
+5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62
+9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98
+9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1
+7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08
+7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26
+7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095
+738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C
+740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000741B741A7441745C7457745574597477746D747E749C748E748074817487
+748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769
+67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8
+680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD
+6832683368606861684E6862684468646883681D68556866684168676840683E
+684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000692468F0690B6901695768E369106971693969606942695D6984696B6980
+69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD
+69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44
+6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB
+733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71
+8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C
+81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615
+6600708566F7661D66346631663666358006665F66546641664F665666616657
+66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40
+8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1
+726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19
+6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F
+809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2
+80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112
+8C5A8136811E812C811881328148814C815381748159815A817181608169817C
+817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3
+5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C
+7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C
+716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D
+7228706C7118716671B9623E623D624362486249793B794079467949795B795C
+7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1
+62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C
+781D7839783A783B781F783C7825782C78237829784E786D7856785778267850
+7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9
+78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9
+77077708771A77227719772D7726773577387750775177477743775A77680000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540
+754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81
+7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495
+949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8
+94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2
+94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506
+95079509950A950D950E950F951295139514951595169518951B951D951E951F
+9522952A952B9529952C953195329534953695379538953C953E953F95429535
+9544954595469549954C954E954F9552955395549556955795589559955B955E
+955F955D95619562956495659566956795689569956A956B956C956F95719572
+9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20
+9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42
+9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63
+9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC
+75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB
+75E7760375F175FC75FF761076007605760C7617760A76257618761576190000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000761B763C762276207640762D7630763F76357643763E7633764D765E7654
+765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8
+7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3
+88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941
+8966897B758B80E576B276B477DC801280148016801C80208022802580268027
+802980288031800B803580438046804D80528069807189839878988098830000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654
+866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9
+86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3
+86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B
+871E8725872E871A873E87488734873187298737873F87828722877D877E877B
+87608770874C876E878B87538763877C876487598765879387AF87A887D20000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1
+87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42
+7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19
+7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E
+7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB
+7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223
+822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268
+887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D
+7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8
+7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8
+9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009162916191709169916F917D917E917291749179918C91859190918D9191
+91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69
+8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8
+8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39
+8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F
+8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A
+972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9
+96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F
+9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E
+9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2
+9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2
+977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA
+9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8
+990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F
+9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0
+9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000
diff --git a/ext/Encode/Encode/euc-jp.enc b/ext/Encode/Encode/euc-jp.enc
new file mode 100644 (file)
index 0000000..9b7abb1
--- /dev/null
@@ -0,0 +1,1346 @@
+# Encoding file: euc-jp, multi-byte
+M
+003F 0 79
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D0000008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8
+FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F
+FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D
+FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7
+00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5
+FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025C625A125A025B325B225BD25BC203B3012219221902191219330130000
+00000000000000000000000000000000000000002208220B2286228722822283
+222A2229000000000000000000000000000000002227222800AC21D221D42200
+220300000000000000000000000000000000000000000000222022A523122202
+220722612252226A226B221A223D221D2235222B222C00000000000000000000
+00000000212B2030266F266D266A2020202100B6000000000000000025EF0000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000
+0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000
+0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025002502250C251025182514251C252C25242534253C25012503250F2513
+251B251725232533252B253B254B2520252F25282537253F251D253025252538
+2542000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25
+65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216
+7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2
+593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3
+840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038
+7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11
+789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B
+96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E
+983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186
+5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01
+827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104
+5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55
+4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3
+706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8
+8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5
+4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE
+591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9
+57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B
+899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B
+6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39
+53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6
+5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53
+6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266
+839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8
+5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668
+57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77
+8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591
+79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775
+9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551
+673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45
+5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37
+5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7
+93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5
+52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F
+8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8
+99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B
+85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B
+59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB
+7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8
+5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6
+503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063
+9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237
+8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF
+6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92
+4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190
+4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7
+5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A
+6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1
+8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D
+980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B
+544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5
+7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396
+88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D
+6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728
+67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A
+548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652
+4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB
+9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB
+59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62
+6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C
+8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F
+5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06
+75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66
+659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235
+914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E
+816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490
+884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E
+67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F
+51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3
+6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2
+7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11
+5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2
+6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0
+7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4
+9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38
+60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5
+55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F
+795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203
+587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8
+9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F
+745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F
+6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0
+8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790
+77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D
+7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226
+624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE
+524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A
+72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275
+53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB
+64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061
+83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7
+5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A
+592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806
+5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8
+9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544
+5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0
+4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D
+80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730
+5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4
+901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877
+8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A
+80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715
+6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4
+69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A
+91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F
+608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2
+5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B
+70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21
+767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC
+51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF
+76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD
+52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F
+5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A
+9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D
+594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960
+8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74
+5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF
+8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC
+4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885
+6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD
+67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000
+C8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A
+91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD
+53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4
+91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87
+5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB
+8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000
+C9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C
+686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79
+5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7
+8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577
+65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB
+6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3
+61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73
+5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86
+504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA
+570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023
+4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2
+98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0
+68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8
+64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6
+646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE
+9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999
+7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D
+660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21
+830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905
+5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25
+77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67
+6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E
+8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6
+719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32
+6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A
+4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C
+74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC
+5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B
+7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F
+985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97
+9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717
+697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332
+8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568
+69006E7E78978155000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A
+82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7
+4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B
+4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4
+4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006
+504350476703505550505048505A5056506C50785080509A508550B450B20000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102
+511651155114511A5121513A5137513C513B513F51405152514C515451627AF8
+5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2
+51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED
+51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C
+525E5254526A527452695273527F527D528D529452925271528852918FA80000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5
+52F852F9530653087538530D5310530F5315531A5323532F5331533353385340
+534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6
+53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D
+5440542C542D543C542E54365429541D544E548F5475548E545F547154775470
+5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2
+553955405563554C552E555C55455556555755385533555D5599558054AF558A
+559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC
+55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638
+566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2
+56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005708570B570D57135718571655C7571C572657375738574E573B5740574F
+576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2
+57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879
+588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5
+58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C
+592D59325938593E7AD259555950594E595A5958596259605967596C59690000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F
+5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2
+5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E
+5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80
+5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6
+5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6
+5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C
+5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87
+5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB
+5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54
+5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8
+5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F
+5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E
+5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060
+601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F
+604A6046604D6063604360646042606C606B60596081608D60E76083609A0000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6
+60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E
+6147613E61286127614A613F613C612C6134613D614261446173617761586159
+615A616B6174616F61656171615F615D6153617561996196618761AC6194619A
+618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6
+61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000621E6221622A622E6230623262336241624E625E6263625B62606268627C
+62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4
+62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5
+6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B
+636963BE63E963C063C663E363C963D263F663C4641664346406641364266436
+651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF
+652C64F664F464F264FA650064FD6518651C650565246523652B653465356537
+65366538754B654865566555654D6558655E655D65726578658265838B8A659B
+659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A
+660365FB6773663566366634661C664F664466496641665E665D666466676668
+665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726
+67279738672E673F67366741673867376746675E676067596763676467896770
+67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4
+67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E
+68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874
+68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A
+6923692168C669796977695C6978696B6954697E696E69396974693D69596930
+6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD
+69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9
+69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72
+6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB
+6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50
+6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4
+6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF
+9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B
+6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12
+6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7
+6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D
+6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24
+6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F
+6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58
+6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8
+6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F
+7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD
+70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184
+719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246
+724B72587274727E7282728172877292729672A272A772B972B272C372C672C4
+72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329
+7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE
+73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459
+7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E
+750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564
+7567756B756D75787576758675877574758A758975827594759A759D75A575A3
+75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF
+75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634
+7630763B764776487646765C76587661766276687669766A7667766C76700000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000767276767678767C768076837688768B768E769676937699769A76B076B4
+76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707
+770477297724771E77257726771B773777387747775A7768776B775B7765777F
+777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD
+77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C
+789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078E778DA78FD78F47907791279117919792C792B794079607957795F795A
+79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7
+79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57
+7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0
+7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2
+7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D
+7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6
+7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23
+7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56
+7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9
+7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72
+7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD
+7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05
+7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37
+7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D
+8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78
+7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6
+7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B
+801280188019801C80218028803F803B804A804680528058805A805F80628068
+80738072807080768079807D807F808480868085809B8093809A80AD519080AC
+80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000968B8146813E8153815180FC8171816E81658166817481838188818A8180
+818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA
+81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205
+8207820A820D821082168229822B82388233824082598258825D825A825F8264
+82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1
+82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000833583348316833283318340833983508345832F832B831783188385839A
+83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4
+841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD
+8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C
+846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6
+84A1852184FF84F485178518852C851F8515851484FC85408563855885480000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587
+859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613
+860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3
+86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC
+86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F
+8737873B87258729871A8760875F8778874C874E877487578768876E87590000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4
+87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816
+8815882288218831883688398827883B8844884288528859885E8862886B8881
+887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF
+88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A
+89138943891E8925892A892B89418944893B89368938894C891D8960895E0000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000089668964896D896A896F89748977897E89838988898A8993899889A189A9
+89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16
+8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85
+8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7
+8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20
+8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41
+8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E
+8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA
+8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67
+8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB
+8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81
+8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE
+8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C
+8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C
+8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4
+90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000904F905090519052900E9049903E90569058905E9068906F907696A89072
+9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102
+9112911991329130914A9156915891639165916991739172918B9189918291A2
+91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC
+91F591F6921E91FF9214922C92159211925E925792459249926492489295923F
+924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD
+939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403
+940794109436942B94359421943A944194529444945B94609462945E946A9229
+947094759477947D945A947C947E9481947F95829587958A9594959695989599
+95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6
+95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4
+96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713
+970E9711970F971697199724972A97309739973D973E97449746974897429749
+975C976097649766976852D2976B977197799785977C9781977A9786978B978F
+9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF
+97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912
+991499189921991D991E99249920992C992E993D993E9942994999459950994B
+99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED
+99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43
+9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0
+9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32
+9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8
+9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1
+9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21
+9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB
+9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9
+9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD
+9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9
+9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF
+9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52
+9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000582F69C79059746451DC7199000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/euc-kr.enc b/ext/Encode/Encode/euc-kr.enc
new file mode 100644 (file)
index 0000000..5e9bb93
--- /dev/null
@@ -0,0 +1,1533 @@
+# Encoding file: euc-kr, multi-byte
+M
+003F 0 90
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300200B72025202600A8300300AD20152225FF3C223C20182019
+201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7
+00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640
+222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D
+221D2235222B222C2208220B2286228722822283222A222922272228FFE20000
+A2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF
+02D0222E2211220F00A42109203025C125C025B725B626642660266126652667
+2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E
+261C261E00B62020202121952197219921962198266D2669266A266C327F321C
+211633C7212233C233D821210000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+A4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000313131323133313431353136313731383139313A313B313C313D313E313F
+3140314131423143314431453146314731483149314A314B314C314D314E314F
+3150315131523153315431553156315731583159315A315B315C315D315E315F
+3160316131623163316431653166316731683169316A316B316C316D316E316F
+3170317131723173317431753176317731783179317A317B317C317D317E317F
+3180318131823183318431853186318731883189318A318B318C318D318E0000
+A5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000217021712172217321742175217621772178217900000000000000000000
+2160216121622163216421652166216721682169000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+A6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025002502250C251025182514251C252C25242534253C25012503250F2513
+251B251725232533252B253B254B2520252F25282537253F251D253025252538
+254225122511251A251925162515250E250D251E251F25212522252625272529
+252A252D252E25312532253525362539253A253D253E25402541254325442545
+2546254725482549254A00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+A7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00003395339633972113339833C433A333A433A533A63399339A339B339C339D
+339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0
+33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB
+33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6
+33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6
+0000000000000000000000000000000000000000000000000000000000000000
+A8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A
+00003260326132623263326432653266326732683269326A326B326C326D326E
+326F3270327132723273327432753276327732783279327A327B24D024D124D2
+24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2
+24E324E424E524E624E724E824E9246024612462246324642465246624672468
+2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000
+A9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000E6011100F001270131013301380140014200F8015300DF00FE0167014B
+01493200320132023203320432053206320732083209320A320B320C320D320E
+320F3210321132123213321432153216321732183219321A321B249C249D249E
+249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE
+24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C
+247D247E247F24802481248200B900B200B32074207F20812082208320840000
+AA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+AB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+AC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+B0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17
+AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40
+AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85
+AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC
+ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4
+ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000
+B1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44
+AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B
+AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4
+ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B
+AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D
+AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000
+B2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF
+AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C
+AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64
+AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9
+AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010
+B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000
+B3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0
+B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4
+B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112
+B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139
+B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182
+B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000
+B4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215
+B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289
+B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8
+B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED
+B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310
+B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000
+B5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390
+B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9
+B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451
+B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9
+B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8
+B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000
+B6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561
+B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4
+B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664
+B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728
+B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770
+B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000
+B7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC
+B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B
+B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D
+B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3
+B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904
+B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000
+B8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD
+B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9
+B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00
+BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55
+BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C
+BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000
+B9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B
+BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88
+BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF
+BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C
+BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44
+BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000
+BA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0
+BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07
+BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81
+BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4
+BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D
+BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000
+BB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F
+BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01
+BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0
+BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090
+C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC
+C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000
+BC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E
+C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140
+C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174
+C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC
+C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD
+C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000
+BD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274
+C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4
+C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9
+C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329
+C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9
+C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000
+BE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8
+C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529
+C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554
+C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C
+C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5
+C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000
+BF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7
+C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C
+C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644
+C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680
+C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8
+C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000
+C0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720
+C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F
+C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C
+C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798
+C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1
+C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000
+C1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C
+C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886
+C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5
+C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911
+C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989
+C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000
+C2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1
+C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54
+CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF
+CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49
+CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D
+CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000
+C3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66
+CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC
+CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19
+CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94
+CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9
+CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000
+C4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84
+CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4
+CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13
+CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65
+CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4
+CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000
+C5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081
+D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3
+D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134
+D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168
+D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8
+D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000
+C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9
+D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8
+D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325
+D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C
+D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4
+D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000
+C7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482
+D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB
+D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558
+D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588
+D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC
+D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000
+C8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658
+D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8
+D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0
+D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735
+D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765
+D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000
+CA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF
+6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374
+5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79
+61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB
+95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F
+61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000
+CB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177
+6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB
+4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB
+F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E
+64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA
+61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000
+CC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1
+96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50
+7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F
+577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F
+74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015
+93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000
+CD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4
+53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD
+75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903
+8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11
+660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5
+6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000
+CE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98
+5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D
+62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366
+639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4
+50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0
+854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000
+CF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9
+69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC
+8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C
+570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F
+5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737
+53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000
+D0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73
+903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975
+969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949
+F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B
+53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668
+573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000
+D1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482
+74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C
+8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE
+685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912
+F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E
+F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000
+D2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948
+67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974
+5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B
+F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947
+8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10
+F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000
+D3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E
+7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1
+6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D
+5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D
+5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200
+52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000
+D4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3
+8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4
+7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC
+51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C
+6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D
+5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000
+D5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82
+53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C
+85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D
+5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2
+8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD
+9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000
+D6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9
+65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE
+8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4
+6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F
+7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262
+78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000
+D7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4
+964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D
+622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC
+51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C
+728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9
+541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000
+D8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C
+83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C
+8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9
+671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF
+71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF
+840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000
+D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298
+9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F
+72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46
+9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7
+82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D
+7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000
+DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C
+5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6
+610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A
+62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9
+99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4
+76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000
+DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E
+65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17
+90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA
+88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61
+6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5
+6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000
+DC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08
+4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920
+9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C
+8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B
+99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC
+8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000
+DD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150
+8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9
+9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89
+7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C
+4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4
+6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000
+DE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C
+658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D
+4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11
+5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7
+6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7
+88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000
+DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA
+715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7
+50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58
+723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD
+55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90
+60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673
+67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247
+657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239
+861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C
+859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89
+71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC
+562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4
+71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061
+90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D
+84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E
+9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407
+74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA
+88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996
+9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87
+5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C
+834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F
+66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD
+662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A
+57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38
+4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA
+85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E
+5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3
+5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F
+6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C
+83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3
+5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE
+5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059
+63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A
+F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD
+9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA
+513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987
+F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5
+582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93
+6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996
+7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F
+71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71
+F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD
+745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3
+F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6
+88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433
+55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465
+761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6
+7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897
+7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03
+6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5
+F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E
+6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C
+6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076
+512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991
+79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED
+6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3
+5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45
+9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09
+617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB
+9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108
+610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98
+8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089
+80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8
+F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1
+4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A
+51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0
+F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351
+F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC
+8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A
+8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038
+93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C
+606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE
+8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71
+68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB
+58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350
+748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000
+EE
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1
+8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E
+6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019
+90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D
+7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168
+5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000
+EF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F
+92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360
+5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075
+544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968
+6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B
+7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000
+F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C
+81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632
+5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5
+722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54
+8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352
+62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000
+F1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD
+80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D
+70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E
+9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC
+710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B
+6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000
+F2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A
+6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE
+907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84
+6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897
+8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6
+75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000
+F3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB
+7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8
+74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E
+50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0
+5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC
+50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000
+F4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC
+7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B
+85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F
+8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377
+7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243
+66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000
+F5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549
+8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2
+585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8
+690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318
+939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010
+6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000
+F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2
+50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE
+75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5
+98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4
+7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD
+502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000
+F7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708
+803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86
+6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F
+8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957
+59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E
+722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000
+F8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D
+5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6
+576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48
+5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832
+80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206
+FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000
+F9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339
+5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8
+66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068
+608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B
+54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4
+965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000
+FA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9
+89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE
+73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA
+9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729
+774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0
+5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000
+FB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3
+99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D
+5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0
+7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A
+93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4
+5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000
+FC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38
+559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25
+6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1
+6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB
+5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8
+8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000
+FD
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166
+73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A
+8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566
+866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79
+7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC
+5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000
diff --git a/ext/Encode/Encode/gb12345.enc b/ext/Encode/Encode/gb12345.enc
new file mode 100644 (file)
index 0000000..3f3f4d2
--- /dev/null
@@ -0,0 +1,1414 @@
+# Encoding file: gb12345, double-byte
+D
+233F 0 83
+21
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300230FB02C902C700A8300330052015FF5E2225202620182019
+201C201D3014301530083009300A300B300C300D300E300F3016301730103011
+00B100D700F72236222722282211220F222A222922082237221A22A522252220
+23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235
+22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605
+25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+22
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000024882489248A248B248C248D248E248F2490249124922493249424952496
+249724982499249A249B247424752476247724782479247A247B247C247D247E
+247F248024812482248324842485248624872460246124622463246424652466
+2467246824690000000032203221322232233224322532263227322832290000
+00002160216121622163216421652166216721682169216A216B000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+23
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+24
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+25
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+26
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+28
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2
+00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000
+0000000000000000000031053106310731083109310A310B310C310D310E310F
+3110311131123113311431153116311731183119311A311B311C311D311E311F
+3120312131223123312431253126312731283129000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+29
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000002500250125022503250425052506250725082509250A250B
+250C250D250E250F2510251125122513251425152516251725182519251A251B
+251C251D251E251F2520252125222523252425252526252725282529252A252B
+252C252D252E252F2530253125322533253425352536253725382539253A253B
+253C253D253E253F2540254125422543254425452546254725482549254A254B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000554A963F57C3632854CE550954C0769A764C85F977EE827E7919611B9698
+978D6C285B894FFA630966975CB880FA68489AAF660276CE51F9655671AC7FF1
+895650B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB
+9776628A801958E997387F777238767D67CF767E64FA4F70655762DC7A176591
+73ED642C6273822C9812677F7248626E62CC4F3474E3534A8FA67D4690A65E6B
+6886699C81807D8168D278C5868C938A508D8B1782DE80DE5305891252650000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+31
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000858496F94FDD582198FD5BF662B1583166B48C799B917206676F789160B2
+535153178F2980CC8C9D92C7500D72FD5099618A711988AB595482EF672C7B28
+5D297DB3752D6CF58E668FF8903C9F3B6BD491197B465F7C78A784D6853D7562
+65836BD65E635E8775F99589655D5F0A5FC58F9F58C181C2907F965B97AD908A
+7DE88CB662414FBF8B8A535E8FA88FAF8FAE904D6A195F6A819888689C49618B
+522B765F5F6C658C70156FF18CD364EF517551B067C44E1979C9990570B30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+32
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075C55E7673BB83E064AD64A592626CE2535A52C3640F92517B944F2F5E1B
+82368116818A6E246CCA99C16355535C54FA88DC57E04E0D5E036B657C3F90E8
+601664E6731C88C16750624D8CA1776C8E2991C75F6983DC8521991053C38836
+6B98615A615871E684BC825950096EC485CF64CD7CD969FD66F9834953A07B56
+5074518C6E2C5C648E6D63D253C9832C833667E578B4643D5BDF5C945DEE8A6B
+62C667F48C7A6519647B87EC995E8B927E8F93DF752395E1986B660C73160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+33
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000583456175E389577511F81785EE0655E66A2553150218D8562849214671D
+56326F6E5DE2543570928ECA626F64A463A35FB96F8890F481E38FB058756668
+5FF16C8996738D81896F64917A3157CE6A59621054484E587A0B61F26F848AA0
+627F901E9A0179E4540375F4630153196C6090725F1B99B3803B9F524F885C3A
+8D647FC565A571BE5145885D87F25D075BF562BD916C75878E8A7A2061017C4C
+4EC77DA27785919C81ED521D51FA6A7153A88E8792E496DB6EC19664695A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+34
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000790E513277D7641089F8865563E35DDD7A7F693D50B3823955984E327621
+7A975E625E8A95D652755439708A6376931857826625693F918755076DF37D14
+882262337DBD75B5832878C196CC8FAD614874F78A5E6B64523A8CDC6B218070
+847156F153065F9E53E251D17C97918B7C074FC38EA57BE17AC464675D1450AC
+810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B932F642D9054
+7B5476296253592754466B7950A362345E366B864EE38CB8888B5F85902E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006020803D64D44E3955AE913264A381BD65E66C2E4F46619A6DE18A955F48
+86CB757664CB9EE885696A94520064178E4850125CF679B15C0E52307A3B60BC
+905376D75FB75F9776848E6C71C8767B7B4977AA51F3912758244F4E6EF48FEA
+65757B1B72C46ECC7FDF5AE162B55E95573084827B2C5E1D5F1F905E7DE0985B
+63826EC778989EDE5178975B588A96FB4F4375385E9760E659606FB16BBF7889
+53FC96D551CB52016389540A91E38ABF8DCC7239789F87768FED8ADC758A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+36
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E0176EF53EE91D898029F0E93205B9A8A024E22677151AC846361C252D5
+68DF4F97606B51CD6D1E515C62969B2596618C46901775D890FD77636BD272A2
+73688B80583577798CED675C934D809A5EA66E2159927AEF77ED935B6BB565B7
+7DDE58065151968A5C0D58A956788E726566981356E4920D76FE9041638754C6
+591A596A579B8EB267358DFA8235524160F058AE86FE5CE89D5D4FC4984D8A1B
+5A2560E15384627C904F910299136069800C51528033723E990C6D314E8C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+37
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008CB3767C7F707B4F4F104E4F95A56CD573D085E95E06756A7FFB6A0A792C
+91E97E4151E1716953CD8FD47BC48CA972AF98EF6CDB574A82B365B980AA623F
+963259A84EFF8A2A7D21653E83F2975E556198DB80A5532A8AB9542080BA5EE2
+6CB88CBB82AC915A54296C1B52067D1B58B3711A6C7E7C89596E4EFD5FFF61A4
+7CDE8C505C01695387025CF092D298A8760B70FD902299AE7E2B8AF759499CF3
+4F5B5426592B6577819A5B75627662C28F3B5E456C1F7B264F0F4FD8670D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+38
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D6E6DAA798F88B15F17752B64AB8F144FEF91DC65A7812F81515E9C8150
+8D74526F89868CE65FA950854ED8961C723681798CA05BCC8A0396445A667E1B
+54905676560E8A7265396982922384CB6E895E797518674667D17AFF809D8D95
+611F79C665628D1B5CA1525B92FC7F38809B7DB15D176E2F67607BD9768B9AD8
+818F7F947CD5641E93AC7A3F544A54E56B4C64F162089D3F80F3759952729769
+845B683C86E495A39694927B500B54047D6668398DDF801566F45E9A7FB90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+39
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000057C2803F68975DE5653B529F606D9F944F9B8EAC516C5BAB5F13978F6C5E
+62F18CA25171920E52FE6E9D82DF72D757A269CB8CFC591F8F9C83C754957B8D
+4F306CBD5B6459D19F1353E488319AA88C3780A16545986756FA96C7522E74DC
+526E5BE1630289024E5662D0602A68FA95DC5B9851A089C07BA199287F506163
+704C8CAB51495EE3901B7470898F572D78456B789F9C95A88ECC9B3C8A6D7678
+68426AC38DEA8CB4528A8F256EDA68CD934B90ED570B679C88F9904E54C80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009AB85B696D776C264EA55BB399ED916361A890AF97D3542B6DB55BD251FD
+558A7F557FF064BC634D65F161BE608D710A6C576F22592F676D822A58D5568E
+8C6A6BEB90DD597D8017865F6D695475559D837783CF683879BE548C4F555408
+76D28C8995A16CB36DB88D6B89109DB48CC0563F9ED175D55F8872E0606854FC
+4EA86A2A886160528F5F54C470D886799D3B6D2A5B8F5F187D0555894FAF7334
+543C539A50195F8C547C4E4E5FFD745A58FA846B80E1877472D07CCA6E560000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F27864E552C8B774E926EEC623782B1562983EF733E6ED1756B52835316
+8A7169D05F8A61F76DEE58DE6B6174B0685390847DE963DB60A3559A76138C62
+71656E195BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C
+604D8B0A707063EE8F1D5FBD606286D456DE6BC160946167534960E066668CC4
+7A62670371F4532F8AF18AA87E6A8477660F5A5A9B426E3E6DF78C416D3B4F19
+706B7372621660D1970D8CA8798D64CA573E57FA6A5F75787A3D7A4D7B950000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000808C99518FF96FC08B4F9DC459EC7E3E7DDD5409697568D88F2F7C4D96C6
+53CA602575BE6C7253735AC97D1A64E05E7E810A5DF1858A628051805B634F0E
+796D529160B86FDF5BC45BC28A088A1865E25FCC969B59937E7C7D00560967B7
+593E4F735BB652A083A298308CC87532924050477A3C50F967B699D55AC16BB2
+76E358055C167B8B9593714E517C80A9827159787DD87E6D6AA267EC78B19E7C
+63C064BF7C215109526A51CF85A66ABB94528E108CE4898B93757BAD4EF60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000050658266528D991E6F386FFA6F975EFA50F559DC5C076F3F6C5F75868523
+69F3596C8B1B532091AC964D854969127901712681A04EA490CA6F869A555B0C
+56BC652A927877EF50E5811A72E189D299037E737D5E527F655991758F4E8F03
+53EB7A9663ED63A5768679F88857968E622A52AB7BC0685467706377776B7AED
+6F547D5089E359D0621285C982A5754C501F4ECB75A58AA15C4A5DFE7B4B65A4
+91D14ECA6D25895F7DCA932650C58B3990329773664979818FD171FC6D780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000076E152C1834651628396775B66769BE84EAC9A5A7CBE7CB37D934E958B66
+666F9838975C5883656C93E15F9175D997567ADF7AF651C870AF7A9863EA7A76
+7CFE739697ED4E4570784E5D915253A96551820A81FC8205548E5C31759A97A0
+62D872D975BD5C4599D283CA5C40548077E982096CAE805A62D264DA5DE85177
+8DDD8E1E92F84FF153E561FC70AC528763509D515A1F5026773753777D796485
+652B628963985014723589BA51B38A237D76574783CC921E8ECD541B5CFB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004FCA7AE36D5A90E199FF55805496536154AF958B63E9697751F16168520A
+582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760
+577782DB67EF68F578D5984679D16BBB54B353EF6E34514B523B5BA28AB280AF
+554358BE61C75751542D7A7A60505B5463A7647353E362635BC767AF54ED7A9F
+82E691775EAB89328A8757AE630E8DE880EF584A7B7751085FEB5BEC6B3E5321
+7B5072C268467926773666E051B5866776D45DCB7ABA8475594E9B4150800000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+40
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000994B61276F7057646606634656F062EC64F45ED395CA578362C95587881F
+81D88FA35566840A4F868CF485CD5A6A6B0465147C4395CC862D703E8B95652C
+89BD61F67E9C721B6FEB7405699472FC5ECA90CE67176D6A648852DE72628001
+4F6C59E5916A70D96F8752D26A0296F79433857E78CA7D2F512158D864C2808B
+985E6CEA68F1695E51B7539868A872819ECE7C6C72F896E270557406674E88CF
+9BC979AE83898354540F68179E9753B252F5792B6B77522950884F8B4FD00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+41
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075E27ACB7C92701D96B8529B748354E95006806F84EE9023942E5EC96190
+6F237C3E658281C993C8620071497DF47CE751C968817CB1826F51698F1B91CF
+667E4EAE8AD264A9804A50DA764271CE5BE5907C6F664E86648294105ED66599
+521788C270C852A373757433679778F7971681E891309C576DCB51DB8CC3541D
+62CE73B283F196F69F6192344F367F9A51CC974896755DBA981853E64EE46E9C
+740969B4786B993E7559528976246D4167F3516D9F8D807E56A87C607ABF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+42
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000968658DF650F96B46A135A41645F7C0D6F0F964B860676E798715EEC7210
+64C46EF7865C9B6F9E93788C97328DEF8CC29E7F6F5E798493329678622E9A62
+541592C14FA365C55C655C627E37616E6C2F5F8B73876FFE7DD15DD265235B7F
+706453754E8263A0756563848F2A502B4F966DEA7DB88AD6863F87BA7F85908F
+947C7C6E9A3E88F8843D6D1B99F17D615ABD9EBB746A78BC879E99AC99E1561B
+55CE57CB8CB79EA58CE390818109779E9945883B6EFF851366FC61626F2B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+43
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B3E8292832B76F26C135FD983BD732B830593286BDB77DB925A536F8302
+51925E3D8C8C8CBF9EBD73AB679A68859176970971646CA177095A9293826BCF
+7F8E66275BD059B95A9A958060B65011840C84996AAC76DF9333731B59225B5F
+772F919A97617CDC8FF78B0E5F4C7C7379D889936CCC871C5BC65E4268C97720
+7DBF5195514D52C95A297DEC976282D763CF778485D079D26E3A5EDF59998511
+6EC56C1162BF76BF654F61AB95A9660E879F9CF49298540D547D8B2C64780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE
+964C8B00725F67D062C77261755D59C66BCD589366AE5E5552DF6155672876EE
+776672677A4662FF54EA5450920990A35A1C7D0D6C164E435976801059485357
+753796E356CA6493816660F19B276DD65462991251855AE980FD59AE9713502A
+6CE55C3C64EC4F60533F81A990066EBA852B62C85E7478BE6506637B5FF55A18
+91C09CE55C3F634F80765B7D5699947793B36D8560A86AB8737051DD5BE70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+45
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064F06FD8725B626D92157D1081BF6FC38FB25F04597452AA601259736696
+86507627632A61E67CEF8AFE54E66B509DD76BC685D5561450766F1A556A8DB4
+722C5E156015743662CD6392724C5F986E436D3E65006F5876E478D076FC7554
+522453DB4E539F9065C1802A80D6629B5486522870AE888D8DD16CE1547880DA
+57F988F48CE0966A914D4F696C9B567476C6783062A870F96F8E5F6D84EC68DA
+787C7BF781A8670B9D6C636778B0576F78129739627962AB528874356BD70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+46
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A1998C46F02
+74E27968648777A562FC983B8CA754C180584E52576A860B840D5E73619174F6
+8A555C4F57616F5198175A4678349B448FEB7C95525664B292EA50D583868461
+83E984B257D46A385703666E6D668B5C66DD7011671F6B3A68F2621A59BB4E03
+51C46F0667D26C8F517668CB59476B6775665D0E81CD9F4A65D7794879419A0E
+8D778C484E5E4F0155535951780C56686C238FC468C46C7D6CE38A1663900000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+47
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060706D3D727D626691FA925B534390777C3D4EDF8B194E7E9ED493229257
+524D6F5B90636DFA8B7458795D4C6B206B4969CD55C681547F8C58BB85945F3A
+64366A47936C657260846A4B77A755AC50D15DE7979864AC7FF95CED4FCF7AC5
+520783044E14602F7ACA6B3D4FB589AA79E6743452E482B964D279BD5BE26C81
+97528F156C2B50BE537F6E0564CE66746C3060C598038ACB617674CA7AAE79CB
+4E1890B174036C4256DA914B6CC58DA8534086C666F28EC05C489A456E200000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053D65A369F728DA353BB570898746B0A919B6CC9516875CA62F372AC5238
+52F87F3A7094763853749D7269B778BA96C088D97FA4713671C3518967D374E4
+58E4651856B78B93995264FE7E5E60F971B158EC4EC14EBA5FCD97CC4EFB8A8D
+5203598A7D0962544ECD65E5620E833884C969AE878D71946EB65BB97D685197
+63C967D480898339881551125B7A59828FB14E736C5D516589258EDF962E854A
+745E92ED958F6F6482E55F316492705185A9816E9C13585E8CFD4E0953C10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+49
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000050986563685155D355AA64149A3763835AC2745F82726F8068EE50E7838E
+78026BBA52396C997D1750BB5565715E7BE966EC73CA82EB67495C715220717D
+886B9583965D64C58D0D81B355846C5562477E55589250B755468CDE664C4E0A
+5C1A88F368A2634E7A0D71D2828D52FA97F65C1154E890B57D3959628CD286C7
+820C63688D66651D5C0461FE6D89793E8A2D78377533547B4F388EAB6DF15A20
+7D33795E6C885BE95B38751A814E614E6EF28072751F7525727253477E690000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000770176DB526952DD80565E2B5931734565BD6FD58A695C388671534177F3
+62FE66424EC098DF87555BE68B5853F277E24F7F5C4E99DB59CB5F0F793A58EB
+4E1667FF4E8B62ED8A93901D52E2662F55DC566C90694ED54F8D91CB98FE6C0F
+5E0260435BA489968A666536624B99965B8858FD6388552E53D776267378852C
+6A1E68B36B8A62928F3853D482126DD1758F66F88D165B70719F85AF669166D9
+7F7287009ECD9F205C6C88538FF06A39675F620D7AEA58855EB665786F310000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060555237800D6454887075295E25681362F4971C96D9723D8AB06C347761
+7A0E542E77AC9806821C8AAC78A96714720D65AF64955636601D79C153F87D72
+6B7B80865BFA55E356DB4F3A4F3C98FC5DF39B068073616B980C90015B8B8A1F
+8AA6641C825864FB55FD860791654FD77D20901F7C9F50F358516EAF5BBF8A34
+80859178849C7B9796D6968B96A87D8F9AD3788E6B727A57904296A7795F5B6B
+640D7B0B84D168AD55067E2E74637D2293966240584C4ED65B83597958540000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000737A64BB8E4B8E0F80CE82D462AC81FA6CF0915E592A614B6C70574D6524
+8CAA7671705858C76A8075F06F6D8B5A8AC757666BEF889278B363A2560670AD
+6E6F5858642A580268E0819B55107CD650188EBA6DCC8D9F71D9638F6FE46ED4
+7E278404684390036DD896768A0E5957727985E49A3075BC8B0468AF52548E22
+92BB63D0984C8E44557C9AD466FF568F60D56D9552435C4959296DFB586B7530
+751C606C821481466311689D8FE2773A8DF38CBC94355E165EF3807D70F40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C92855F647AE5
+687663457B527D7175DB50776295982D900F51F879C37A8157165F9290145857
+5C60571F541051546E4D571863A8983D817F8715892A9000541E5C6F81C062D6
+625881319D15964099B199DD6A6259A562D3553E631654C786D97AAA5A0374E6
+896A6B6A59168C4C5F4E706373A998114E3870F75B8C7897633D665A769660CB
+5B9B5A49842C81556C6A738B4EA167897DB25F8065FA671B5FD859845A010000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005DCD5FAE537197CB90556845570D552F60DF72326FF07DAD8466840E59D4
+504950DE5C3E7DEF672A851A5473754F80C355829B4F4F4D6E2D8B025C096170
+885B761F6E29868A6587805E7D0B543B7A697D0A554F55E17FC174EE64BE8778
+6E267AA9621165A1536763E16C835DEB55DA93A270CF6C618AA35C4B7121856A
+68A7543E54346BCB6B664E9463425348821E4F0D4FAE5862620A972766647269
+52FF52D9609F8AA4661471996790897F785277FD6670563B5438932B72A70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8489725E2D
+7FD25AB3559C92916D177CFB969962327D30778E87665323971E8F4466875CFD
+4FE072F94E0B53A6590F56876380934151484ED99BAE7E9654B88CE2929C8237
+95916D8E5F265ACC986F96AA73FE737B7E23817A99217FA161B2967796507DAB
+76F853A2947299997BB189446E5891097FD479658A7360F397FF4EAB98055DF7
+6A6150CF54118C61856D785D9704524A54EE56C292B76D885BB56DC666C90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C0F5B5D68218096562F7B11654869544E9B6B47874E978B5354633E643A
+90AA659C81058AE75BEB68B0537887F961C86CC470098B1D5C5185AA82AF92C5
+6B238F9B65B05FFB5FC34FE191C1661F8165732960FA82085211578B5F6290A2
+884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E
+673D55C592B979C088967D89589F620C9700865A561898085F908A3184C49157
+53D965ED5E8F755C60647D6E5A7F7DD27E8C8ED255A75BA361F865CB73840000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009078766C77297D629774859B5B787A7496EA884052DB718F5FAA65EC8A62
+5C0B99B45DE16B896C5B8A138A0A905C8FC558D362BC9D099D2854404E2B82BD
+7259869C5D1688596DAF96C5555E4E9E8A1D710954BD95B970DF6DF99E7D56B4
+781487125CA95EF68A00985495BB708E6CBF594463A9773C884D6F1482775830
+71D553AD786F96C155015F6671305BB48AFA9A576B83592E9D2679E7694A63DA
+4F6F760D7F8A6D0B967D6C274EF07662990A6A236F3E90808170599674760000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+52
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006447582F90657A918B2159DA54AC820085E5898180006930564E8036723A
+91CE51B64E5F98016396696D844966F3814B591C6DB24E0058F991AB63D692A5
+4F9D4F0A886398245937907A79FB510080F075916C825B9C59E85F5D690587FB
+501A5DF24E5977E34EE585DD6291661390915C7951045F7981C69038808475AB
+4EA688D4610F6BC561B67FA976CA6EA28A638B708ABC8B6F5F027FFC7FCC7E79
+8335852D56E06BB797F3967059FB541F92806DEB5BC598F25C395F1596B10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000537082F16AFB5B309DF961C97E93746987A271DF719288058FCE8D0F76C8
+5F717A4E786C662055B264C150AD81C376705EB896CD8E3486F9548F6CF36D8C
+6C38607F52C775285E7D512A60A061825C24753190F5923E73366CB96E389149
+670953CB53F34F5191C98A9853C85E7C8FC26DE44E8E76C26986865E611A8F3F
+99184FDE903E9B5A61096E1D6F0196854E885A3196E882075DBC79B95B878A9E
+7FBD738957DF828B9B315401904755BB5CEA5FA161086B32734480B28B7D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D745BD388D598108C6B99AD9D1B6DF551A4514357A38881539F63F48F45
+571254E15713733F6E907DE3906082D198586028966266F07D048D8A8E8D9470
+5CB37CA4670860A695B2801896F29116530096955141904B85F49196668897F5
+5B55531D783896DC683D54C9707E5BB08F09518D572854B1652266AB8D0A8D1C
+81DF846C906D7CDF947F85FB68D765E96FA186A48E81566A902076827AC871E5
+8CAC64C752476FA48CCA600E589E618E66FE8D08624E55B36E23672D8ECB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+55
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000935895987728680569A8548B4E4D70B88A5064589F4B5B857A8450B55BE8
+77BB6C088A797C986CBE76DE65AC8F3E5D845C55863868E7536062307AD96E5B
+7DBB6A1F7AE05F706F335F35638C6F3267564E085E338CEC4ED781397634969C
+62DB662D627E6CBC8D9971677F695146808753EC906E629854F287C48F4D8005
+937A851790196D5973CD659F771F7504782781FB8C9E91DD5075679575B98A3A
+9707632F93AE966384B86399775C5F817319722D6014657462EF6B63653F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E407665912D8B49829D679D652F5431871877E580A281026C414E4B7E54
+807776F4690D6B9657F7503C4F84574063076B628DBE887965E87D195FD7646F
+64F281F381F47F6E5E5F5CD95236667A79E97A1A8CEA709975D46EEF6CBB7A92
+4E2D76C55FE0941888777D427A2E816B91CD4EF28846821F54685DDE6D328B05
+7CA58EF880985E1A549276BA5B99665D9A5F73E0682A86DB6731732A8AF88A85
+90107AF971ED716E62C477DA56D14E3B845767F152A986C08CAF94447BC90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F4F6CE8795D99D06293722A62FD5C0878DA8F4964B08CFA7BC66A01838A
+88DD599D649E58EF72C0690E93108FFD8D05589C7DB48AC46E96634962D95353
+684C74228301914C55447740707C6FC1517954A88CC759FF6ECB6DC45B5C7D2B
+4ED47C7D6ED35B5081EA6F2C5B579B0368D58E2A5B977D9C7E3D7E3191128D70
+594F63CD79DF8DB3535265CF79568A5B963B7D44947D7E825634918967007F6A
+5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+58
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F
+53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C
+4E694E9382885B5B55C7560F4EC45399539D53B453A553AE97688D0B531A53F5
+532D5331533E8CFE5366536352025208520E52445233528C5274524C525E5261
+525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB
+4EDE50B44EF34F224F644EF5500050964F094F474F5E4F6765384F5A4F5D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B51154F7C5102
+4F945114513C51374FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F
+502E502D4FFE501C500C5025502850E8504350555048504E506C50C2513B5110
+513A50BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F5850C94FCE9FA0
+6C467CF4516E5DFD9ECC999856C5591452F9530D8A0753109CEC591951554EA0
+51564EB3886E88A4893B81E088D279805B3488037FB851AB51B151BD51BC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051C7519651A251A58A018A108A0C8A158B338A4E8A258A418A368A468A54
+8A588A528A868A848A7F8A708A7C8A758A6C8A6E8ACD8AE28A618A9A8AA58A91
+8A928ACF8AD18AC98ADB8AD78AC28AB68AF68AEB8B148B018AE48AED8AFC8AF3
+8AE68AEE8ADE8B288B9C8B168B1A8B108B2B8B2D8B568B598B4E8B9E8B6B8B96
+5369537A961D962296219631962A963D963C964296589654965F9689966C9672
+96749688968D969796B09097909B913A9099911490A190B490B390B691340000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090B890B090DF90C590BE913690C490C79106914890E290DC90D790DB90EB
+90EF90FE91049122911E91239131912F91399143914682BB595052F152AC52AD
+52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DF0
+574C580A57A1587E58BC58C558D15729572C572A573358D9572E572F58E2573B
+5742576958E0576B58DA577C577B5768576D5776577357E157A4578C584F57CF
+57A75816579357A057D55852581D586457D257B857F457EF57F857E457DD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880
+99A89F1961FF8279827D827F828F828A82A88284828E8291858C829982AB8553
+82BE82B085F682CA82E3829882B782AE83A7840784EF82A982B482A182AA829F
+82C482E782A482E1830982F782E48622830782DC82F482D282D8830C82FB82D3
+8526831A8306584B716282E082D5831C8351855884FD83088392833C83348331
+839B854E832F834F8347834385888340831785BA832D833A833372966ECE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008541831B85CE855284C08452846483B083788494843583A083AA8393839C
+8385837C859F83A9837D8555837B8398839E83A89DAF849383C1840183E583D8
+58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9
+83EA83C583C07E0883F083E1845C8451845A8459847385468488847A85628478
+843C844684698476851E848E8431846D84C184CD84D09A4084BD84D384CA84BF
+84BA863A84A184B984B4849793A38577850C750D853884F0861E851F85FA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008556853B84FF84FC8559854885688564855E857A77A285438604857B85A4
+85A88587858F857985EA859C858585B985B785B0861A85C185DC85FF86278605
+86298616863C5EFE5F08593C596980375955595A5958530F5C225C255C2C5C37
+624C636B647662BB62CA62DA62D762EE649F62F66339634B634363AD63F66371
+637A638E6451636D63AC638A636963AE645C63F263F863E064B363C463DE63CE
+645263C663BE65046441640B641B6420640C64266421645E6516646D64960000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647A64F764FC6499651B64C064D064D764E464E265096525652E5F0B5FD2
+75195F11535F53F1563053E953E853FB541254165406544B563856C8545456A6
+54435421550454BC5423543254825494547754715464549A5680548454765466
+565D54D054AD54C254B4566054A754A6563555F6547254A3566654BB54BF54CC
+567254DA568C54A954AA54A4566554CF54DE561C54E7562E54FD551454F355E9
+5523550F55115527552A5616558F55B5554956C055415555553F5550553C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005537555655755576557755335530555C558B55D2558355B155B955885581
+559F557E55D65591557B55DF560D56B35594559955EA55F755C9561F55D156C1
+55EC55D455E655DD55C455EF55E555F2566F55CC55CD55E855F555E48F61561E
+5608560C560156B6562355FE56005627562D565856395657562C564D56625659
+5695564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1
+570756EB56F956FF5704570A5709571C5E435E195E145E115E6C5E585E570000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905D875C885CF45C995C91
+5D505C9C5CB55CA25D2C5CAC5CAB5CB15CA35CC15CB75DA75CD25DA05CCB5D22
+5D975D0D5D275D265D2E5D245D1E5D065D1B5DB85D3E5D345D3D5D6C5D5B5D6F
+5D815D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DD45F735F775F825F87
+5F89540E5FA05F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B473777341
+72C372C172CE72CD72D272E8736A72E9733B72F472F7730172F3736B72FA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072FB731773137380730A731E731D737C732273397325732C733873317350
+734D73577360736C736F737E821B592598E75924590298E0993398E9993C98EA
+98EB98ED98F4990999114F59991B9937993F994399489949994A994C99625E80
+5EE15E8B5E965EA55EA05EB95EB55EBE5EB38CE15ED25ED15EDB5EE85EEA81BA
+5FC45FC95FD661FA61AE5FEE616A5FE15FE4613E60B561345FEA5FED5FF86019
+60356026601B600F600D6029602B600A61CC6021615F61E860FB613760420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000606A60F26096609A6173609D60836092608C609B611C60BB60B160DD60D8
+60C660DA60B4612061926115612360F46100610E612B614A617561AC619461A7
+61B761D461F55FDD96B39582958695C8958E9594958C95E595AD95AB9B2E95AC
+95BE95B69B2995BF95BD95BC95C395CB95D495D095D595DE4E2C723F62156C35
+6C546C5C6C4A70436C856C906C946C8C6C686C696C746C766C866F596CD06CD4
+6CAD702770186CF16CD76CB26CE06CD66FFC6CEB6CEE6CB16CD36CEF6D870000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D396D276D0C6D796E5E6D076D046D196D0E6D2B6FAE6D2E6D356D1A700F
+6EF86F6F6D336D916D6F6DF66F7F6D5E6D936D946D5C6D606D7C6D636E1A6DC7
+6DC56DDE70066DBF6DE06FA06DE66DDD6DD9700B6DAB6E0C6DAE6E2B6E6E6E4E
+6E6B6EB26E5F6E866E536E546E326E256E4470676EB16E9870446F2D70056EA5
+6EA76EBD6EBB6EB76F776EB46ECF6E8F6EC26E9F6F627020701F6F246F156EF9
+6F2F6F3670326F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A70280000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035
+705D705E5B805B845B955B935BA55BB8752F9A2B64345BE45BEE89305BF08E47
+8B078FB68FD38FD58FE58FEE8FE490878FE690158FE890059004900B90909011
+900D9016902190359036902D902F9044905190529050906890589062905B66B9
+9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63
+5C687FBC5F335F295F2D82745F3C9B3B5C6E59815983598D5AF55AD759A30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000599759CA5B00599E59A459D259B259AF59D759BE5A6D5B0859DD5B4C59E3
+59D859F95A0C5A095AA75AFB5A115A235A135A405A675A4A5A555A3C5A625B0B
+80EC5AAA5A9B5A775A7A5ABE5AEB5AB25B215B2A5AB85AE05AE35B195AD65AE6
+5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62
+99D499DF99D99A369A5B99D199D89A4D9A4A99E29A6A9A0F9A0D9A059A429A2D
+9A169A419A2E9A389A439A449A4F9A659A647CF97D067D027D077D087E8A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D1C7D157D137D3A7D327D317E107D3C7D407D3F7D5D7D4E7D737D867D83
+7D887DBE7DBA7DCB7DD47DC47D9E7DAC7DB97DA37DB07DC77DD97DD77DF97DF2
+7E627DE67DF67DF17E0B7DE17E097E1D7E1F7E1E7E2D7E0A7E117E7D7E397E35
+7E327E467E457E887E5A7E527E6E7E7E7E707E6F7E985E7A757F5DDB753E9095
+738E74A3744B73A2739F73CF73C274CF73B773B373C073C973C873E573D9980A
+740A73E973E773DE74BD743F7489742A745B7426742574287430742E742C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000741B741A7441745C74577455745974A6746D747E749C74D4748074817487
+748B749E74A874A9749074A774DA74BA97D997DE97DC674C6753675E674869AA
+6AEA6787676A677367986898677568D66A05689F678B6777677C67F06ADB67D8
+6AF367E967B06AE867D967B567DA67B367DD680067C367B867E26ADF67C16A89
+68326833690F6A48684E6968684469BF6883681D68556A3A68416A9C68406B12
+684A6849682968B5688F687468776893686B6B1E696E68FC6ADD69E768F90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B0F68F0690B6901695768E369106971693969606942695D6B16696B6980
+69986978693469CC6AEC6ADA69CE6AF8696669636979699B69A769BB69AB69AD
+69D469B169C169CA6AB369956AE7698D69FF6AA369ED6A176A186A6569F26A44
+6A3E6AA06A506A5B6A356A8E6AD36A3D6A286A586ADE6A916A906AA96A976AAB
+733773526B816B826BA46B846B9E6BAE6B8D6BAB6B9B6BAF6BAA8ED48EDB8EF2
+8EFB8F648EF98EFC8EEB8EE48F628EFA8EFE8F0A8F078F058F128F268F1E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008F1F8F1C8F338F468F548ECE62146227621B621F62226221622562246229
+81E7750C74F474FF750F75117513653465EE65EF65F0660A66C7677266036615
+6600708566F7661D66346631663666358006665F66C46641664F668966616657
+66776684668C66D6669D66BE66DB66DC66E666E98CC18CB08CBA8CBD8D048CB2
+8CC58D108CD18CDA8CD58CEB8CE78CFB899889AC89A189BF89A689AF89B289B7
+726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000643F64D880046BEA6BF36BFD6BFF6BF96C056C0C6C066C0D6C156C186C19
+6C1A6C216C2C6C246C2A6C3265356555656B725872527256723086625216809F
+809C809380BC670A80BD80B180AB80AD80B480B76727815680E981DA80DB80C2
+80C480D980CD80D7671080DD811B80F180F480ED81BE810E80F280FC67158112
+8C5A8161811E812C811881328148814C815381748159815A817181608169817C
+817D816D8167584D5AB58188818281CF6ED581A381AA81CC672681CA81BB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081C181A66B5F6B376B396B436B466B5998AE98AF98B698BC98C698C86BB3
+5F408F4289F365909F4F659565BC65C665C465C365CC65CE65D265D6716C7152
+7096719770BB70C070B770AB70B171C170CA7110711371DC712F71317173715C
+716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D
+7228706C71FE716671B9623E623D624362486249793B794079467949795B795C
+7953795A79B079577960798E7967797A79AA798A799A79A779B35FD15FD00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000061DF605D605A606760416059606361646106610D615D61A9619D61CB61E3
+62078080807F6C936FA96DFC78EF77F878AD780978687818781165AB782D78B8
+781D7839792A7931781F783C7825782C78237829784E786D786478FD78267850
+7847784C786A78E77893789A788778E378A178A378B278B978A578D478D978C9
+78EC78F2790578F479137924791E79349F959EF99EFB9EFC76F17704779876F9
+77077708771A77227719772D772677357738775E77BC77477743775A77680000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540
+754E754B7548755B7572757975837F587F617F5F8A487F687F867F717F797F88
+7F7E76CD76E5883291D291D391D491D991D791D591F791E791E4934691F591F9
+9208922692459211921092019227920492259200923A9266923792339255923D
+9238925E926C926D923F9460923092499248924D922E9239943892AC92A0927A
+92AA92EE92CF940392E3943A92B192A693A7929692CC92A993F59293927F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093A9929A931A92AB9283940B92A892A39412933892F193D792E592F092EF
+92E892BC92DD92F69426942792C392DF92E6931293069369931B934093019315
+932E934393079308931F93199365934793769354936493AA9370938493E493D8
+9428938793CC939893B893BF93A693B093B5944C93E293DC93DD93CD93DE93C3
+93C793D19414941D93F794659413946D9420947993F99419944A9432943F9454
+9463937E77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+70
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A397A377A619ECF99A57A707688768E7693769976A474DE74E0752C9CE9
+9CF69D079D069D239D879E159D1D9D1F9DE59D2F9DD99D309D429E1E9D539E1D
+9D609D529DF39D5C9D619D939D6A9D6F9D899D989D9A9DC09DA59DA99DC29DBC
+9E1A9DD39DDA9DEF9DE69DF29DF89E0C9DFA9E1B7592759476647658759D7667
+75A375B375B475B875C475B175B075C375C2760275CD75E3764675E675E47647
+75E7760375F175FC75FF761076007649760C761E760A7625763B761576190000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+71
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000761B763C762276207640762D7630766D76357643766E7633764D76697654
+765C76567672766F7FCA7AE67A787A797A807A867A887A957AC77AA07AAC7AA8
+7AB67AB3886488698872887D887F888288A2896088B788BC88C9893388CE895D
+894788F1891A88FC88E888FE88F08921891989138938890A8964892B89368941
+8966897B758B80E576B876B477DC801280148016801C8020802E80258026802C
+802980288031800B803580438046807980528075807189839807980E980F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009821981C6F4198269837984E98539873986298599865986C9870864D8654
+866C87E38806867A867C867B86A8868D868B8706869D86A786A386AA869386A9
+86B686C486B5882386B086BA86B186AF86C987F686B486E986FA87EF86ED8784
+86D0871386DE881086DF86D886D18703870786F88708870A870D87098723873B
+871E8725872E871A873E87C88734873187298737873F87828722877D8811877B
+87608770874C876E878B8753876387BB876487598765879387AF87CE87D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1
+87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F4C
+7F447F4582107AFA7AFD7B087BE47B047B677B0A7B2B7B0F7B477B387B2A7B19
+7B2E7B317B207B257B247B337C697B1E7B587BF37B457B757B4C7B8F7B607B6E
+7B7B7B627B727B717B907C007BCB7BB87BAC7B9D7C5C7B857C1E7B9C7BA27C2B
+7BB47C237BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C6A7C0B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007C1F7C2A7C267C387C5F7C4081FE82018202820481EC8844822182228264
+822D822F8228822B8238826B82338234823E82448249824B824F825A825F8268
+887E88CA888888D888DF895E7F9D7FA57FA77FAF7FB07FB27C7C65497C917CF2
+7CF67C9E7CA27CB27CBC7CBD7CDD7CC77CCC7CCD7CC87CC57CD77CE8826E66A8
+7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87E367DA67DAE7E477E9B9EA9
+9EB48D738D848D948D918DB28D678D6D8C478C49914A9150914E914F91640000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+75
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009162916191709169916F91C591C3917291749179918C91859190918D9191
+91A291A391AA91AD91AE91AF91B591B491BA8C559E7A8E898DEB8E058E598E69
+8DB58DBF8DBC8DBA8E4C8DD68DD78DDA8E928DCE8DCF8DDB8DC68DEC8E7A8E55
+8DE38E9A8E8B8DE48E098DFD8E148E1D8E1F8E938E2E8E238E918E3A8E408E39
+8E358E3D8E318E498E418E428EA18E638E4A8E708E768E7C8E6F8E748E858EAA
+8E948E908EA68E9E8C788C828C8A8C858C988C94659B89D689F489DA89DC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+76
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000089E589EB89F68A3E8B26975A96E9974296EF9706973D9708970F970E972A
+97449730973E9F549F5F9F599F609F5C9F669F6C9F6A9F779EFD9EFF9F0996B9
+96BC96BD96CE96D277BF8B8E928E947E92C893E8936A93CA938F943E946B9B77
+9B749B819B839B8E9C787A4C9B929C5F9B909BAD9B9A9BAA9B9E9C6D9BAB9B9D
+9C589BC19C7A9C319C399C239C379BC09BCA9BC79BFD9BD69BEA9BEB9BE19BE4
+9BE79BDD9BE29BF09BDB9BF49BD49C5D9C089C109C0D9C129C099BFF9C200000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009C329C2D9C289C259C299C339C3E9C489C3B9C359C459C569C549C529C67
+977C978597C397BD979497C997AB97A397B297B49AB19AB09AB79DBB9AB69ABA
+9ABC9AC19AC09ACF9AC29AD69AD59AD19B459B439B589B4E9B489B4D9B519957
+995C992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B229B1F
+9B234E489EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0
+9EDF9EE29EF79EE79EE59EF29EEF9F229F2C9F2F9F399F379F3D9F3E9F440000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+78
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000896C95C693365F4685147E94538251B24E119F635679515A6DC09F156597
+56419AEE83034E3089075E727A4098B35E7F95A49B0D52128FF45F597A6B98E2
+51E050A24EF7835085915118636E6372524B5938774F8721814A7E8D91CC66C6
+5E1877AD9E7556C99EF46FDB61DE77C770309EB5884A95E282F951ED62514EC6
+673497C67C647E3497A69EAF786E820D672F677E56CC53F098B16AAF7F4E6D82
+7CF04E074FC27E6B9E7956AE9B1A846F53F690C179A67C72613F4E919AD20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+79
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075C796BB53EA7DFB88FD79CD78437B5151C6000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/gb1988.enc b/ext/Encode/Encode/gb1988.enc
new file mode 100644 (file)
index 0000000..298732c
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: gb1988, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+002000210022002300A500250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D203E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/gb2312.enc b/ext/Encode/Encode/gb2312.enc
new file mode 100644 (file)
index 0000000..813d7a6
--- /dev/null
@@ -0,0 +1,1380 @@
+# Encoding file: gb2312, double-byte
+D
+233F 0 81
+21
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300230FB02C902C700A8300330052015FF5E2225202620182019
+201C201D3014301530083009300A300B300C300D300E300F3016301730103011
+00B100D700F72236222722282211220F222A222922082237221A22A522252220
+23122299222B222E2261224C2248223D221D2260226E226F22642265221E2235
+22342642264000B0203220332103FF0400A4FFE0FFE1203000A7211626062605
+25CB25CF25CE25C725C625A125A025B325B2203B219221902191219330130000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+22
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000024882489248A248B248C248D248E248F2490249124922493249424952496
+249724982499249A249B247424752476247724782479247A247B247C247D247E
+247F248024812482248324842485248624872460246124622463246424652466
+2467246824690000000032203221322232233224322532263227322832290000
+00002160216121622163216421652166216721682169216A216B000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+23
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FFE5FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFF3CFF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+24
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+25
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+26
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+28
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000010100E101CE00E0011300E9011B00E8012B00ED01D000EC014D00F301D2
+00F2016B00FA01D400F901D601D801DA01DC00FC00EA00000000000000000000
+0000000000000000000031053106310731083109310A310B310C310D310E310F
+3110311131123113311431153116311731183119311A311B311C311D311E311F
+3120312131223123312431253126312731283129000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+29
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000002500250125022503250425052506250725082509250A250B
+250C250D250E250F2510251125122513251425152516251725182519251A251B
+251C251D251E251F2520252125222523252425252526252725282529252A252B
+252C252D252E252F2530253125322533253425352536253725382539253A253B
+253C253D253E253F2540254125422543254425452546254725482549254A254B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000554A963F57C3632854CE550954C07691764C853C77EE827E788D72319698
+978D6C285B894FFA630966975CB880FA684880AE660276CE51F9655671AC7FF1
+888450B2596561CA6FB382AD634C625253ED54277B06516B75A45DF462D48DCB
+9776628A8019575D97387F627238767D67CF767E64464F708D2562DC7A176591
+73ED642C6273822C9881677F7248626E62CC4F3474E3534A529E7ECA90A65E2E
+6886699C81807ED168D278C5868C9551508D8C2482DE80DE5305891252650000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+31
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000858496F94FDD582199715B9D62B162A566B48C799C8D7206676F789160B2
+535153178F8880CC8D1D94A1500D72C8590760EB711988AB595482EF672C7B28
+5D297EF7752D6CF58E668FF8903C9F3B6BD491197B145F7C78A784D6853D6BD5
+6BD96BD65E015E8775F995ED655D5F0A5FC58F9F58C181C2907F965B97AD8FB9
+7F168D2C62414FBF53D8535E8FA88FA98FAB904D68075F6A819888689CD6618B
+522B762A5F6C658C6FD26EE85BBE6448517551B067C44E1979C9997C70B30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+32
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075C55E7673BB83E064AD62E894B56CE2535A52C3640F94C27B944F2F5E1B
+82368116818A6E246CCA9A736355535C54FA886557E04E0D5E036B657C3F90E8
+601664E6731C88C16750624D8D22776C8E2991C75F6983DC8521991053C28695
+6B8B60ED60E8707F82CD82314ED36CA785CF64CD7CD969FD66F9834953957B56
+4FA7518C6D4B5C428E6D63D253C9832C833667E578B4643D5BDF5C945DEE8BE7
+62C667F48C7A640063BA8749998B8C177F2094F24EA7961098A4660C73160000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+33
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000573A5C1D5E38957F507F80A05382655E7545553150218D856284949E671D
+56326F6E5DE2543570928F66626F64A463A35F7B6F8890F481E38FB05C186668
+5FF16C8996488D81886C649179F057CE6A59621054484E587A0B60E96F848BDA
+627F901E9A8B79E4540375F4630153196C608FDF5F1B9A70803B9F7F4F885C3A
+8D647FC565A570BD514551B2866B5D075BA062BD916C75748E0C7A2061017B79
+4EC77EF877854E1181ED521D51FA6A7153A88E87950496CF6EC19664695A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+34
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000784050A877D7641089E6590463E35DDD7A7F693D4F20823955984E3275AE
+7A975E625E8A95EF521B5439708A6376952457826625693F918755076DF37EAF
+882262337EF075B5832878C196CC8F9E614874F78BCD6B64523A8D506B21806A
+847156F153064ECE4E1B51D17C97918B7C074FC38E7F7BE17A9C64675D1450AC
+810676017CB96DEC7FE067515B585BF878CB64AE641363AA632B9519642D8FBE
+7B5476296253592754466B7950A362345E266B864EE38D37888B5F85902E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006020803D62C54E39535590F863B880C665E66C2E4F4660EE6DE18BDE5F39
+86CB5F536321515A83616863520063638E4850125C9B79775BFC52307A3B60BC
+905376D75FB75F9776848E6C706F767B7B4977AA51F3909358244F4E6EF48FEA
+654C7B1B72C46DA47FDF5AE162B55E95573084827B2C5E1D5F1F90127F1498A0
+63826EC7789870B95178975B57AB75354F4375385E9760E659606DC06BBF7889
+53FC96D551CB52016389540A94938C038DCC7239789F87768FED8C0D53E00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+36
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E0176EF53EE948998769F0E952D5B9A8BA24E224E1C51AC846361C252A8
+680B4F97606B51BB6D1E515C6296659796618C46901775D890FD77636BD2728A
+72EC8BFB583577798D4C675C9540809A5EA66E2159927AEF77ED953B6BB565AD
+7F0E58065151961F5BF958A954288E726566987F56E4949D76FE9041638754C6
+591A593A579B8EB267358DFA8235524160F0581586FE5CE89E454FC4989D8BB9
+5A2560765384627C904F9102997F6069800C513F80335C1499756D314E8C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+37
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008D3053D17F5A7B4F4F104E4F96006CD573D085E95E06756A7FFB6A0A77FE
+94927E4151E170E653CD8FD483038D2972AF996D6CDB574A82B365B980AA623F
+963259A84EFF8BBF7EBA653E83F2975E556198DE80A5532A8BFD542080BA5E9F
+6CB88D3982AC915A54296C1B52067EB7575F711A6C7E7C89594B4EFD5FFF6124
+7CAA4E305C0167AB87025CF0950B98CE75AF70FD902251AF7F1D8BBD594951E4
+4F5B5426592B657780A45B75627662C28F905E456C1F7B264F0F4FD8670D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+38
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D6E6DAA798F88B15F17752B629A8F854FEF91DC65A7812F81515E9C8150
+8D74526F89868D4B590D50854ED8961C723681798D1F5BCC8BA3964459877F1A
+54905676560E8BE565396982949976D66E895E727518674667D17AFF809D8D76
+611F79C665628D635188521A94A27F38809B7EB25C976E2F67607BD9768B9AD8
+818F7F947CD5641E95507A3F544A54E56B4C640162089E3D80F3759952729769
+845B683C86E49601969494EC4E2A54047ED968398DDF801566F45E9A7FB90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+39
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000057C2803F68975DE5653B529F606D9F9A4F9B8EAC516C5BAB5F135DE96C5E
+62F18D21517194A952FE6C9F82DF72D757A267848D2D591F8F9C83C754957B8D
+4F306CBD5B6459D19F1353E486CA9AA88C3780A16545987E56FA96C7522E74DC
+52505BE1630289024E5662D0602A68FA51735B9851A089C27BA199867F5060EF
+704C8D2F51495E7F901B747089C4572D78455F529F9F95FA8F689B3C8BE17678
+684267DC8DEA8D35523D8F8A6EDA68CD950590ED56FD679C88F98FC754C80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009AB85B696D776C264EA55BB39A87916361A890AF97E9542B6DB55BD251FD
+558A7F557FF064BC634D65F161BE608D710A6C576C49592F676D822A58D5568E
+8C6A6BEB90DD597D801753F76D695475559D837783CF683879BE548C4F555408
+76D28C8996026CB36DB88D6B89109E648D3A563F9ED175D55F8872E0606854FC
+4EA86A2A886160528F7054C470D886799E3F6D2A5B8F5F187EA255894FAF7334
+543C539A5019540E547C4E4E5FFD745A58F6846B80E1877472D07CCA6E560000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F27864E552C62A44E926CAA623782B154D7534E733E6ED1753B52125316
+8BDD69D05F8A60006DEE574F6B2273AF68538FD87F13636260A3552475EA8C62
+71156DA35BA65E7B8352614C9EC478FA87577C27768751F060F6714C66435E4C
+604D8C0E707063258F895FBD606286D456DE6BC160946167534960E066668D3F
+79FD4F1A70E96C478BB38BF27ED88364660F5A5A9B426D516DF78C416D3B4F19
+706B83B7621660D1970D8D27797851FB573E57FA673A75787A3D79EF7B950000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000808C99658FF96FC08BA59E2159EC7EE97F095409678168D88F917C4D96C6
+53CA602575BE6C7253735AC97EA7632451E0810A5DF184DF628051805B634F0E
+796D524260B86D4E5BC45BC28BA18BB065E25FCC964559937EE77EAA560967B7
+59394F735BB652A0835A988A8D3E753294BE50477A3C4EF767B69A7E5AC16B7C
+76D1575A5C167B3A95F4714E517C80A9827059787F04832768C067EC78B17877
+62E363617B804FED526A51CF835069DB92748DF58D3189C1952E7BAD4EF60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000506582305251996F6E106E856DA75EFA50F559DC5C066D466C5F7586848B
+686859568BB253209171964D854969127901712680F64EA490CA6D479A845A07
+56BC640594F077EB4FA5811A72E189D2997A7F347EDE527F655991758F7F8F83
+53EB7A9663ED63A5768679F888579636622A52AB8282685467706377776B7AED
+6D017ED389E359D0621285C982A5754C501F4ECB75A58BEB5C4A5DFE7B4B65A4
+91D14ECA6D25895F7D2795264EC58C288FDB9773664B79818FD170EC6D780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C3D52B283465162830E775B66769CB84EAC60CA7CBE7CB37ECF4E958B66
+666F988897595883656C955C5F8475C997567ADF7ADE51C070AF7A9863EA7A76
+7EA0739697ED4E4570784E5D915253A9655165E781FC8205548E5C31759A97A0
+62D872D975BD5C459A7983CA5C40548077E94E3E6CAE805A62D2636E5DE85177
+8DDD8E1E952F4FF153E560E770AC526763509E435A1F5026773753777EE26485
+652B628963985014723589C951B38BC07EDD574783CC94A7519B541B5CFB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004FCA7AE36D5A90E19A8F55805496536154AF5F0063E9697751EF6168520A
+582A52D8574E780D770B5EB761777CE0625B62974EA27095800362F770E49760
+577782DB67EF68F578D5989779D158F354B353EF6E34514B523B5BA28BFE80AF
+554357A660735751542D7A7A60505B5463A762A053E362635BC767AF54ED7A9F
+82E691775E9388E4593857AE630E8DE880EF57577B774FA95FEB5BBD6B3E5321
+7B5072C2684677FF773665F751B54E8F76D45CBF7AA58475594E9B4150800000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+40
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000998861276E8357646606634656F062EC62695ED39614578362C955878721
+814A8FA3556683B167658D5684DD5A6A680F62E67BEE961151706F9C8C3063FD
+89C861D27F0670C26EE57405699472FC5ECA90CE67176D6A635E52B372628001
+4F6C59E5916A70D96D9D52D24E5096F7956D857E78CA7D2F5121579264C2808B
+7C7B6CEA68F1695E51B7539868A872819ECE7BF172F879BB6F137406674E91CC
+9CA4793C83898354540F68174E3D538952B1783E5386522950884F8B4FD00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+41
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075E27ACB7C926CA596B6529B748354E94FE9805483B28FDE95705EC9601C
+6D9F5E18655B813894FE604B70BC7EC37CAE51C968817CB1826F4E248F8691CF
+667E4EAE8C0564A9804A50DA759771CE5BE58FBD6F664E86648295635ED66599
+521788C270C852A3730E7433679778F797164E3490BB9CDE6DCB51DB8D41541D
+62CE73B283F196F69F8494C34F367F9A51CC707596755CAD988653E64EE46E9C
+740969B4786B998F7559521876246D4167F3516D9F99804B54997B3C7ABF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+42
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009686578462E29647697C5A0464027BD36F0F964B82A6536298855E907089
+63B35364864F9C819E93788C97328DEF8D429E7F6F5E79845F559646622E9A74
+541594DD4FA365C55C655C617F1586516C2F5F8B73876EE47EFF5CE6631B5B6A
+6EE653754E7163A0756562A18F6E4F264ED16CA67EB68BBA841D87BA7F57903B
+95237BA99AA188F8843D6D1B9A867EDC59889EBB739B780186829A6C9A82561B
+541757CB4E709EA653568FC881097792999286EE6EE1851366FC61626F2B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+43
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008C298292832B76F26C135FD983BD732B8305951A6BDB77DB94C6536F8302
+51925E3D8C8C8D384E4873AB679A68859176970971646CA177095A9295416BCF
+7F8E66275BD059B95A9A95E895F74EEC840C84996AAC76DF9530731B68A65B5F
+772F919A97617CDC8FF78C1C5F257C7379D889C56CCC871C5BC65E4268C97720
+7EF55195514D52C95A297F05976282D763CF778485D079D26E3A5E9959998511
+706D6C1162BF76BF654F60AF95FD660E879F9E2394ED540D547D8C2C64780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647986116A21819C78E864699B5462B9672B83AB58A89ED86CAB6F205BDE
+964C8C0B725F67D062C772614EA959C66BCD589366AE5E5552DF6155672876EE
+776672677A4662FF54EA545094A090A35A1C7EB36C164E435976801059485357
+753796BE56CA63208111607C95F96DD65462998151855AE980FD59AE9713502A
+6CE55C3C62DF4F60533F817B90066EBA852B62C85E7478BE64B5637B5FF55A18
+917F9E1F5C3F634F80425B7D556E954A954D6D8560A867E072DE51DD5B810000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+45
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062E76CDE725B626D94AE7EBD81136D53519C5F04597452AA601259736696
+8650759F632A61E67CEF8BFA54E66B279E256BB485D5545550766CA4556A8DB4
+722C5E156015743662CD6392724C5F986E436D3E65006F5876D878D076FC7554
+522453DB4E535E9E65C1802A80D6629B5486522870AE888D8DD16CE1547880DA
+57F988F48D54966A914D4F696C9B55B776C6783062A870F96F8E5F6D84EC68DA
+787C7BF781A8670B9E4F636778B0576F78129739627962AB528874356BD70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+46
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005564813E75B276AE533975DE50FB5C418B6C7BC7504F72479A9798D86F02
+74E27968648777A562FC98918D2B54C180584E52576A82F9840D5E7351ED74F6
+8BC45C4F57616CFC98875A4678349B448FEB7C955256625194FA4EC683868461
+83E984B257D467345703666E6D668C3166DD7011671F6B3A6816621A59BB4E03
+51C46F0667D26C8F517668CB59476B6775665D0E81109F5065D7794879419A91
+8D775C824E5E4F01542F5951780C56686C148FC45F036C7D6CE38BAB63900000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+47
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060706D3D72756266948E94C553438FC17B7E4EDF8C264E7E9ED494B194B3
+524D6F5C90636D458C3458115D4C6B206B4967AA545B81547F8C589985375F3A
+62A26A47953965726084686577A74E544FA85DE7979864AC7FD85CED4FCF7A8D
+520783044E14602F7A8394A64FB54EB279E6743452E482B964D279BD5BDD6C81
+97528F7B6C22503E537F6E0564CE66746C3060C598778BF75E86743C7A7779CB
+4E1890B174036C4256DA914B6CC58D8B533A86C666F28EAF5C489A716E200000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053D65A369F8B8DA353BB570898A76743919B6CC9516875CA62F372AC5238
+529D7F3A7094763853749E4A69B7786E96C088D97FA4713671C3518967D374E4
+58E4651856B78BA9997662707ED560F970ED58EC4EC14EBA5FCD97E74EFB8BA4
+5203598A7EAB62544ECD65E5620E833884C98363878D71946EB65BB97ED25197
+63C967D480898339881551125B7A59828FB14E736C5D516589258F6F962E854A
+745E951095F06DA682E55F3164926D128428816E9CC3585E8D5B4E0953C10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+49
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F1E6563685155D34E2764149A9A626B5AC2745F82726DA968EE50E7838E
+7802674052396C997EB150BB5565715E7B5B665273CA82EB67495C715220717D
+886B95EA965564C58D6181B355846C5562477F2E58924F2455468D4F664C4E0A
+5C1A88F368A2634E7A0D70E7828D52FA97F65C1154E890B57ECD59628D4A86C7
+820C820D8D6664445C0461516D89793E8BBE78377533547B4F388EAB6DF15A20
+7EC5795E6C885BA15A76751A80BE614E6E1758F0751F7525727253477EF30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000770176DB526980DC57235E08593172EE65BD6E7F8BD75C388671534177F3
+62FE65F64EC098DF86805B9E8BC653F277E24F7F5C4E9A7659CB5F0F793A58EB
+4E1667FF4E8B62ED8A93901D52BF662F55DC566C90024ED54F8D91CA99706C0F
+5E0260435BA489C68BD56536624B99965B885BFF6388552E53D77626517D852C
+67A268B36B8A62928F9353D482126DD1758F4E668D4E5B70719F85AF669166D9
+7F7287009ECD9F205C5E672F8FF06811675F620D7AD658855EB665706F310000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060555237800D6454887075295E05681362F4971C53CC723D8C016C347761
+7A0E542E77AC987A821C8BF47855671470C165AF64955636601D79C153F84E1D
+6B7B80865BFA55E356DB4F3A4F3C99725DF3677E80386002988290015B8B8BBC
+8BF5641C825864DE55FD82CF91654FD77D20901F7C9F50F358516EAF5BBF8BC9
+80839178849C7B97867D968B968F7EE59AD3788E5C817A57904296A7795F5B59
+635F7B0B84D168AD55067F2974107D2295016240584C4ED65B83597958540000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000736D631E8E4B8E0F80CE82D462AC53F06CF0915E592A60016C70574D644A
+8D2A762B6EE9575B6A8075F06F6D8C2D8C0857666BEF889278B363A253F970AD
+6C645858642A580268E0819B55107CD650188EBA6DCC8D9F70EB638F6D9B6ED4
+7EE68404684390036DD896768BA85957727985E4817E75BC8A8A68AF52548E22
+951163D098988E44557C4F5366FF568F60D56D9552435C4959296DFB586B7530
+751C606C82148146631167618FE2773A8DF38D3494C15E165385542C70C30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C405EF7505C4EAD5EAD633A8247901A6850916E77B3540C94DC5F647AE5
+687663457B527EDF75DB507762955934900F51F879C37A8156FE5F9290146D82
+5C60571F541051546E4D56E263A89893817F8715892A9000541E5C6F81C062D6
+625881319E3596409A6E9A7C692D59A562D3553E631654C786D96D3C5A0374E6
+889C6B6A59168C4C5F2F6E7E73A9987D4E3870F75B8C7897633D665A769660CB
+5B9B5A494E0781556C6A738B4EA167897F515F8065FA671B5FD859845A010000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005DCD5FAE537197E68FDD684556F4552F60DF4E3A6F4D7EF482C7840E59D4
+4F1F4F2A5C3E7EAC672A851A5473754F80C355829B4F4F4D6E2D8C135C096170
+536B761F6E29868A658795FB7EB9543B7A337D0A95EE55E17FC174EE631D8717
+6DA17A9D621165A1536763E16C835DEB545C94A84E4C6C618BEC5C4B65E0829C
+68A7543E54346BCB6B664E9463425348821E4F0D4FAE575E620A96FE66647269
+52FF52A1609F8BEF661471996790897F785277FD6670563B54389521727A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A00606F5E0C6089819D591560DC718470EF6EAA6C5072806A8488AD5E2D
+4E605AB3559C94E36D177CFB9699620F7EC6778E867E5323971E8F9666875CE1
+4FA072ED4E0B53A6590F54136380952851484ED99C9C7EA454B88D2488548237
+95F26D8E5F265ACC663E966973B0732E53BF817A99857FA15BAA967796507EBF
+76F853A2957699997BB189446E584E617FD479658BE660F354CD4EAB98795DF7
+6A6150CF54118C618427785D9704524A54EE56A395006D885BB56DC666530000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C0F5B5D6821809655787B11654869544E9B6B47874E978B534F631F643A
+90AA659C80C18C10519968B0537887F961C86CC46CFB8C225C5185AA82AF950C
+6B238F9B65B05FFB5FC34FE18845661F8165732960FA51745211578B5F6290A2
+884C91925E78674F602759D3514451F680F853086C7996C4718A4F114FEE7F9E
+673D55C5950879C088967EE3589F620C9700865A5618987B5F908BB884C49157
+53D965ED5E8F755C60647D6E5A7F7EEA7EED8F6955A75BA360AC65CB73840000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009009766377297EDA9774859B5B667A7496EA884052CB718F5FAA65EC8BE2
+5BFB9A6F5DE16B896C5B8BAD8BAF900A8FC5538B62BC9E269E2D54404E2B82BD
+7259869C5D1688596DAF96C554D14E9A8BB6710954BD960970DF6DF976D04E25
+781487125CA95EF68A00989C960E708E6CBF594463A9773C884D6F1482735830
+71D5538C781A96C155015F6671305BB48C1A9A8C6B83592E9E2F79E76768626C
+4F6F75A17F8A6D0B96336C274EF075D2517B68376F3E90808170599674760000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+52
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064475C2790657A918C2359DA54AC8200836F898180006930564E80367237
+91CE51B64E5F987563964E1A53F666F3814B591C6DB24E0058F9533B63D694F1
+4F9D4F0A886398905937905779FB4EEA80F075916C825B9C59E85F5D69058681
+501A5DF24E5977E34EE5827A6291661390915C794EBF5F7981C69038808475AB
+4EA688D4610F6BC55FC64E4976CA6EA28BE38BAE8C0A8BD15F027FFC7FCC7ECE
+8335836B56E06BB797F3963459FB541F94F66DEB5BC5996E5C395F1596900000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000537082F16A315A749E705E947F2883B984248425836787478FCE8D6276C8
+5F719896786C662054DF62E54F6381C375C85EB896CD8E0A86F9548F6CF36D8C
+6C38607F52C775285E7D4F1860A05FE75C24753190AE94C072B96CB96E389149
+670953CB53F34F5191C98BF153C85E7C8FC26DE44E8E76C26986865E611A8206
+4F594FDE903E9C7C61096E1D6E1496854E885A3196E84E0E5C7F79B95B878BED
+7FBD738957DF828B90C15401904755BB5CEA5FA161086B3272F180B28A890000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D745BD388D598848C6B9A6D9E336E0A51A4514357A38881539F63F48F95
+56ED54585706733F6E907F188FDC82D1613F6028966266F07EA68D8A8DC394A5
+5CB37CA4670860A6960580184E9190E75300966851418FD08574915D665597F5
+5B55531D78386742683D54C9707E5BB08F7D518D572854B1651266828D5E8D43
+810F846C906D7CDF51FF85FB67A365E96FA186A48E81566A90207682707671E5
+8D2362E952196CFD8D3C600E589E618E66FE8D60624E55B36E23672D8F670000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+55
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094E195F87728680569A8548B4E4D70B88BC86458658B5B857A84503A5BE8
+77BB6BE18A797C986CBE76CF65A98F975D2D5C5586386808536062187AD96E5B
+7EFD6A1F7AE05F706F335F20638C6DA867564E085E108D264ED780C07634969C
+62DB662D627E6CBC8D7571677F695146808753EC906E629854F286F08F998005
+951785178FD96D5973CD659F771F7504782781FB8D1E94884FA6679575B98BCA
+9707632F9547963584B8632377415F8172F04E896014657462EF6B63653F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E2775C790D18BC1829D679D652F5431871877E580A281026C414E4B7EC7
+804C76F4690D6B966267503C4F84574063076B628DBE53EA65E87EB85FD7631A
+63B781F381F47F6E5E1C5CD95236667A79E97A1A8D28709975D46EDE6CBB7A92
+4E2D76C55FE0949F88777EC879CD80BF91CD4EF24F17821F54685DDE6D328BCC
+7CA58F7480985E1A549276B15B99663C9AA473E0682A86DB6731732A8BF88BDB
+90107AF970DB716E62C477A956314E3B845767F152A986C08D2E94F87B510000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F4F6CE8795D9A7B6293722A62FD4E1378168F6C64B08D5A7BC668695E84
+88C55986649E58EE72B6690E95258FFD8D5857607F008C0651C6634962D95353
+684C74228301914C55447740707C6D4A517954A88D4459FF6ECB6DC45B5C7D2B
+4ED47C7D6ED35B5081EA6E0D5B579B0368D58E2A5B977EFC603B7EB590B98D70
+594F63CD79DF8DB3535265CF79568BC5963B7EC494BB7E825634918967007F6A
+5C0A907566285DE64F5067DE505A4F5C57505EA7000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+58
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E8D4E0C51404E105EFF53454E154E984E1E9B325B6C56694E2879BA4E3F
+53154E47592D723B536E6C1056DF80E499976BD3777E9F174E364E9F9F104E5C
+4E694E9382885B5B556C560F4EC4538D539D53A353A553AE97658D5D531A53F5
+5326532E533E8D5C5366536352025208520E522D5233523F5240524C525E5261
+525C84AF527D528252815290529351827F544EBB4EC34EC94EC24EE84EE14EEB
+4EDE4F1B4EF34F224F644EF54F254F274F094F2B4F5E4F6765384F5A4F5D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F5F4F574F324F3D4F764F744F914F894F834F8F4F7E4F7B4FAA4F7C4FAC
+4F944FE64FE84FEA4FC54FDA4FE34FDC4FD14FDF4FF85029504C4FF3502C500F
+502E502D4FFE501C500C50255028507E504350555048504E506C507B50A550A7
+50A950BA50D6510650ED50EC50E650EE5107510B4EDD6C3D4F584F654FCE9FA0
+6C467C74516E5DFD9EC999985181591452F9530D8A07531051EB591951554EA0
+51564EB3886E88A44EB5811488D279805B3488037FB851AB51B151BD51BC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051C7519651A251A58BA08BA68BA78BAA8BB48BB58BB78BC28BC38BCB8BCF
+8BCE8BD28BD38BD48BD68BD88BD98BDC8BDF8BE08BE48BE88BE98BEE8BF08BF3
+8BF68BF98BFC8BFF8C008C028C048C078C0C8C0F8C118C128C148C158C168C19
+8C1B8C188C1D8C1F8C208C218C258C278C2A8C2B8C2E8C2F8C328C338C358C36
+5369537A961D962296219631962A963D963C964296499654965F9667966C9672
+96749688968D969796B09097909B909D909990AC90A190B490B390B690BA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090B890B090CF90C590BE90D090C490C790D390E690E290DC90D790DB90EB
+90EF90FE91049122911E91239131912F913991439146520D594252A252AC52AD
+52BE54FF52D052D652F053DF71EE77CD5EF451F551FC9B2F53B65F01755A5DEF
+574C57A957A1587E58BC58C558D15729572C572A57335739572E572F575C573B
+574257695785576B5786577C577B5768576D5776577357AD57A4578C57B257CF
+57A757B4579357A057D557D857DA57D957D257B857F457EF57F857E457DD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000580B580D57FD57ED5800581E5819584458205865586C58815889589A5880
+99A89F1961FF8279827D827F828F828A82A88284828E82918297829982AB82B8
+82BE82B082C882CA82E3829882B782AE82CB82CC82C182A982B482A182AA829F
+82C482CE82A482E1830982F782E4830F830782DC82F482D282D8830C82FB82D3
+8311831A83068314831582E082D5831C8351835B835C83088392833C83348331
+839B835E832F834F83478343835F834083178360832D833A8333836683650000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008368831B8369836C836A836D836E83B0837883B383B483A083AA8393839C
+8385837C83B683A9837D83B8837B8398839E83A883BA83BC83C1840183E583D8
+58078418840B83DD83FD83D6841C84388411840683D483DF840F840383F883F9
+83EA83C583C0842683F083E1845C8451845A8459847384878488847A84898478
+843C844684698476848C848E8431846D84C184CD84D084E684BD84D384CA84BF
+84BA84E084A184B984B4849784E584E3850C750D853884F08539851F853A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008556853B84FF84FC8559854885688564855E857A77A285438572857B85A4
+85A88587858F857985AE859C858585B985B785B085D385C185DC85FF86278605
+86298616863C5EFE5F08593C594180375955595A5958530F5C225C255C2C5C34
+624C626A629F62BB62CA62DA62D762EE632262F66339634B634363AD63F66371
+637A638E63B4636D63AC638A636963AE63BC63F263F863E063FF63C463DE63CE
+645263C663BE64456441640B641B6420640C64266421645E6484646D64960000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000647A64B764B8649964BA64C064D064D764E464E265096525652E5F0B5FD2
+75195F11535F53F153FD53E953E853FB541254165406544B5452545354545456
+54435421545754595423543254825494547754715464549A549B548454765466
+549D54D054AD54C254B454D254A754A654D354D4547254A354D554BB54BF54CC
+54D954DA54DC54A954AA54A454DD54CF54DE551B54E7552054FD551454F35522
+5523550F55115527552A5567558F55B55549556D55415555553F5550553C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005537555655755576557755335530555C558B55D2558355B155B955885581
+559F557E55D65591557B55DF55BD55BE5594559955EA55F755C9561F55D155EB
+55EC55D455E655DD55C455EF55E555F255F355CC55CD55E855F555E48F94561E
+5608560C56015624562355FE56005627562D565856395657562C564D56625659
+565C564C5654568656645671566B567B567C5685569356AF56D456D756DD56E1
+56F556EB56F956FF5704570A5709571C5E0F5E195E145E115E315E3B5E3C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E375E445E545E5B5E5E5E615C8C5C7A5C8D5C905C965C885C985C995C91
+5C9A5C9C5CB55CA25CBD5CAC5CAB5CB15CA35CC15CB75CC45CD25CE45CCB5CE5
+5D025D035D275D265D2E5D245D1E5D065D1B5D585D3E5D345D3D5D6C5D5B5D6F
+5D5D5D6B5D4B5D4A5D695D745D825D995D9D8C735DB75DC55F735F775F825F87
+5F895F8C5F955F995F9C5FA85FAD5FB55FBC88625F6172AD72B072B472B772B8
+72C372C172CE72CD72D272E872EF72E972F272F472F7730172F3730372FA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072FB731773137321730A731E731D7315732273397325732C733873317350
+734D73577360736C736F737E821B592598E7592459029963996799689969996A
+996B996C99749977997D998099849987998A998D999099919993999499955E80
+5E915E8B5E965EA55EA05EB95EB55EBE5EB38D535ED25ED15EDB5EE85EEA81BA
+5FC45FC95FD65FCF60035FEE60045FE15FE45FFE600560065FEA5FED5FF86019
+60356026601B600F600D6029602B600A603F602160786079607B607A60420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000606A607D6096609A60AD609D60836092608C609B60EC60BB60B160DD60D8
+60C660DA60B4612061266115612360F46100610E612B614A617561AC619461A7
+61B761D461F55FDD96B395E995EB95F195F395F595F695FC95FE960396049606
+9608960A960B960C960D960F96129615961696179619961A4E2C723F62156C35
+6C546C5C6C4A6CA36C856C906C946C8C6C686C696C746C766C866CA96CD06CD4
+6CAD6CF76CF86CF16CD76CB26CE06CD66CFA6CEB6CEE6CB16CD36CEF6CFE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006D396D276D0C6D436D486D076D046D196D0E6D2B6D4D6D2E6D356D1A6D4F
+6D526D546D336D916D6F6D9E6DA06D5E6D936D946D5C6D606D7C6D636E1A6DC7
+6DC56DDE6E0E6DBF6DE06E116DE66DDD6DD96E166DAB6E0C6DAE6E2B6E6E6E4E
+6E6B6EB26E5F6E866E536E546E326E256E446EDF6EB16E986EE06F2D6EE26EA5
+6EA76EBD6EBB6EB76ED76EB46ECF6E8F6EC26E9F6F626F466F476F246F156EF9
+6F2F6F366F4B6F746F2A6F096F296F896F8D6F8C6F786F726F7C6F7A6FD10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FC96FA76FB96FB66FC26FE16FEE6FDE6FE06FEF701A7023701B70397035
+704F705E5B805B845B955B935BA55BB8752F9A9E64345BE45BEE89305BF08E47
+8B078FB68FD38FD58FE58FEE8FE48FE98FE68FF38FE890059004900B90269011
+900D9016902190359036902D902F9044905190529050906890589062905B66B9
+9074907D908290889083908B5F505F575F565F585C3B54AB5C505C595B715C63
+5C667FBC5F2A5F295F2D82745F3C9B3B5C6E59815983598D59A959AA59A30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000599759CA59AB599E59A459D259B259AF59D759BE5A055A0659DD5A0859E3
+59D859F95A0C5A095A325A345A115A235A135A405A675A4A5A555A3C5A625A75
+80EC5AAA5A9B5A775A7A5ABE5AEB5AB25AD25AD45AB85AE05AE35AF15AD65AE6
+5AD85ADC5B095B175B165B325B375B405C155C1C5B5A5B655B735B515B535B62
+9A759A779A789A7A9A7F9A7D9A809A819A859A889A8A9A909A929A939A969A98
+9A9B9A9C9A9D9A9F9AA09AA29AA39AA59AA77E9F7EA17EA37EA57EA87EA90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007EAD7EB07EBE7EC07EC17EC27EC97ECB7ECC7ED07ED47ED77EDB7EE07EE1
+7EE87EEB7EEE7EEF7EF17EF27F0D7EF67EFA7EFB7EFE7F017F027F037F077F08
+7F0B7F0C7F0F7F117F127F177F197F1C7F1B7F1F7F217F227F237F247F257F26
+7F277F2A7F2B7F2C7F2D7F2F7F307F317F327F337F355E7A757F5DDB753E9095
+738E739173AE73A2739F73CF73C273D173B773B373C073C973C873E573D9987C
+740A73E973E773DE73BA73F2740F742A745B7426742574287430742E742C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000741B741A7441745C7457745574597477746D747E749C748E748074817487
+748B749E74A874A9749074A774D274BA97EA97EB97EC674C6753675E67486769
+67A56787676A6773679867A7677567A8679E67AD678B6777677C67F0680967D8
+680A67E967B0680C67D967B567DA67B367DD680067C367B867E2680E67C167FD
+6832683368606861684E6862684468646883681D68556866684168676840683E
+684A6849682968B5688F687468776893686B68C2696E68FC691F692068F90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000692468F0690B6901695768E369106971693969606942695D6984696B6980
+69986978693469CC6987698869CE6989696669636979699B69A769BB69AB69AD
+69D469B169C169CA69DF699569E0698D69FF6A2F69ED6A176A186A6569F26A44
+6A3E6AA06A506A5B6A356A8E6A796A3D6A286A586A7C6A916A906AA96A976AAB
+733773526B816B826B876B846B926B936B8D6B9A6B9B6BA16BAA8F6B8F6D8F71
+8F728F738F758F768F788F778F798F7A8F7C8F7E8F818F828F848F878F8B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008F8D8F8E8F8F8F988F9A8ECE620B6217621B621F6222622162256224622C
+81E774EF74F474FF750F75117513653465EE65EF65F0660A6619677266036615
+6600708566F7661D66346631663666358006665F66546641664F665666616657
+66776684668C66A7669D66BE66DB66DC66E666E98D328D338D368D3B8D3D8D40
+8D458D468D488D498D478D4D8D558D5989C789CA89CB89CC89CE89CF89D089D1
+726E729F725D7266726F727E727F7284728B728D728F72926308633263B00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000643F64D880046BEA6BF36BFD6BF56BF96C056C076C066C0D6C156C186C19
+6C1A6C216C296C246C2A6C3265356555656B724D72527256723086625216809F
+809C809380BC670A80BD80B180AB80AD80B480B780E780E880E980EA80DB80C2
+80C480D980CD80D7671080DD80EB80F180F480ED810D810E80F280FC67158112
+8C5A8136811E812C811881328148814C815381748159815A817181608169817C
+817D816D8167584D5AB58188818281916ED581A381AA81CC672681CA81BB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081C181A66B246B376B396B436B466B5998D198D298D398D598D998DA6BB3
+5F406BC289F365909F51659365BC65C665C465C365CC65CE65D265D67080709C
+7096709D70BB70C070B770AB70B170E870CA711071137116712F71317173715C
+716871457172714A7178717A719871B371B571A871A071E071D471E771F9721D
+7228706C7118716671B9623E623D624362486249793B794079467949795B795C
+7953795A796279577960796F7967797A7985798A799A79A779B35FD15FD00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000603C605D605A606760416059606360AB6106610D615D61A9619D61CB61D1
+62068080807F6C936CF66DFC77F677F87800780978177818781165AB782D781C
+781D7839783A783B781F783C7825782C78237829784E786D7856785778267850
+7847784C786A789B7893789A7887789C78A178A378B278B978A578D478D978C9
+78EC78F2790578F479137924791E79349F9B9EF99EFB9EFC76F17704770D76F9
+77077708771A77227719772D7726773577387750775177477743775A77680000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077627765777F778D777D7780778C7791779F77A077B077B577BD753A7540
+754E754B7548755B7572757975837F587F617F5F8A487F687F747F717F797F81
+7F7E76CD76E58832948594869487948B948A948C948D948F9490949494979495
+949A949B949C94A394A494AB94AA94AD94AC94AF94B094B294B494B694B794B8
+94B994BA94BC94BD94BF94C494C894C994CA94CB94CC94CD94CE94D094D194D2
+94D594D694D794D994D894DB94DE94DF94E094E294E494E594E794E894EA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094E994EB94EE94EF94F394F494F594F794F994FC94FD94FF950395029506
+95079509950A950D950E950F951295139514951595169518951B951D951E951F
+9522952A952B9529952C953195329534953695379538953C953E953F95429535
+9544954595469549954C954E954F9552955395549556955795589559955B955E
+955F955D95619562956495659566956795689569956A956B956C956F95719572
+9573953A77E777EC96C979D579ED79E379EB7A065D477A037A027A1E7A140000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+70
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A397A377A519ECF99A57A707688768E7693769976A474DE74E0752C9E20
+9E229E289E299E2A9E2B9E2C9E329E319E369E389E379E399E3A9E3E9E419E42
+9E449E469E479E489E499E4B9E4C9E4E9E519E559E579E5A9E5B9E5C9E5E9E63
+9E669E679E689E699E6A9E6B9E6C9E719E6D9E7375927594759675A0759D75AC
+75A375B375B475B875C475B175B075C375C275D675CD75E375E875E675E475EB
+75E7760375F175FC75FF761076007605760C7617760A76257618761576190000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+71
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000761B763C762276207640762D7630763F76357643763E7633764D765E7654
+765C7656766B766F7FCA7AE67A787A797A807A867A887A957AA67AA07AAC7AA8
+7AAD7AB3886488698872887D887F888288A288C688B788BC88C988E288CE88E3
+88E588F1891A88FC88E888FE88F0892189198913891B890A8934892B89368941
+8966897B758B80E576B276B477DC801280148016801C80208022802580268027
+802980288031800B803580438046804D80528069807189839878988098830000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009889988C988D988F9894989A989B989E989F98A198A298A598A6864D8654
+866C866E867F867A867C867B86A8868D868B86AC869D86A786A386AA869386A9
+86B686C486B586CE86B086BA86B186AF86C986CF86B486E986F186F286ED86F3
+86D0871386DE86F486DF86D886D18703870786F88708870A870D87098723873B
+871E8725872E871A873E87488734873187298737873F87828722877D877E877B
+87608770874C876E878B87538763877C876487598765879387AF87A887D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000087C68788878587AD8797878387AB87E587AC87B587B387CB87D387BD87D1
+87C087CA87DB87EA87E087EE8816881387FE880A881B88218839883C7F367F42
+7F447F4582107AFA7AFD7B087B037B047B157B0A7B2B7B0F7B477B387B2A7B19
+7B2E7B317B207B257B247B337B3E7B1E7B587B5A7B457B757B4C7B5D7B607B6E
+7B7B7B627B727B717B907BA67BA77BB87BAC7B9D7BA87B857BAA7B9C7BA27BAB
+7BB47BD17BC17BCC7BDD7BDA7BE57BE67BEA7C0C7BFE7BFC7C0F7C167C0B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007C1F7C2A7C267C387C417C4081FE82018202820481EC8844822182228223
+822D822F8228822B8238823B82338234823E82448249824B824F825A825F8268
+887E8885888888D888DF895E7F9D7F9F7FA77FAF7FB07FB27C7C65497C917C9D
+7C9C7C9E7CA27CB27CBC7CBD7CC17CC77CCC7CCD7CC87CC57CD77CE8826E66A8
+7FBF7FCE7FD57FE57FE17FE67FE97FEE7FF37CF87D777DA67DAE7E477E9B9EB8
+9EB48D738D848D948D918DB18D678D6D8C478C49914A9150914E914F91640000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+75
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009162916191709169916F917D917E917291749179918C91859190918D9191
+91A291A391AA91AD91AE91AF91B591B491BA8C559E7E8DB88DEB8E058E598E69
+8DB58DBF8DBC8DBA8DC48DD68DD78DDA8DDE8DCE8DCF8DDB8DC68DEC8DF78DF8
+8DE38DF98DFB8DE48E098DFD8E148E1D8E1F8E2C8E2E8E238E2F8E3A8E408E39
+8E358E3D8E318E498E418E428E518E528E4A8E708E768E7C8E6F8E748E858E8F
+8E948E908E9C8E9E8C788C828C8A8C858C988C94659B89D689DE89DA89DC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+76
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000089E589EB89EF8A3E8B26975396E996F396EF970697019708970F970E972A
+972D9730973E9F809F839F859F869F879F889F899F8A9F8C9EFE9F0B9F0D96B9
+96BC96BD96CE96D277BF96E0928E92AE92C8933E936A93CA938F943E946B9C7F
+9C829C859C869C879C887A239C8B9C8E9C909C919C929C949C959C9A9C9B9C9E
+9C9F9CA09CA19CA29CA39CA59CA69CA79CA89CA99CAB9CAD9CAE9CB09CB19CB2
+9CB39CB49CB59CB69CB79CBA9CBB9CBC9CBD9CC49CC59CC69CC79CCA9CCB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009CCC9CCD9CCE9CCF9CD09CD39CD49CD59CD79CD89CD99CDC9CDD9CDF9CE2
+977C978597919792979497AF97AB97A397B297B49AB19AB09AB79E589AB69ABA
+9ABC9AC19AC09AC59AC29ACB9ACC9AD19B459B439B479B499B489B4D9B5198E8
+990D992E995599549ADF9AE19AE69AEF9AEB9AFB9AED9AF99B089B0F9B139B1F
+9B239EBD9EBE7E3B9E829E879E889E8B9E9293D69E9D9E9F9EDB9EDC9EDD9EE0
+9EDF9EE29EE99EE79EE59EEA9EEF9F229F2C9F2F9F399F379F3D9F3E9F440000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/iso2022-jp.enc b/ext/Encode/Encode/iso2022-jp.enc
new file mode 100644 (file)
index 0000000..a4e455f
--- /dev/null
@@ -0,0 +1,12 @@
+# Encoding file: iso2022-jp, escape-driven
+E
+name           iso2022-jp
+init           {}
+final          {}
+iso8859-1      \x1b(B
+jis0201                \x1b(J
+jis0208                \x1b$@
+jis0208                \x1b$B
+jis0212                \x1b$(D
+gb2312         \x1b$A
+ksc5601                \x1b$(C
diff --git a/ext/Encode/Encode/iso2022-kr.enc b/ext/Encode/Encode/iso2022-kr.enc
new file mode 100644 (file)
index 0000000..d20ce2b
--- /dev/null
@@ -0,0 +1,7 @@
+# Encoding file: iso2022-kr, escape-driven
+E
+name           iso2022-kr
+init           \x1b$)C
+final          {}
+iso8859-1      \x0f
+ksc5601                \x0e
diff --git a/ext/Encode/Encode/iso2022.enc b/ext/Encode/Encode/iso2022.enc
new file mode 100644 (file)
index 0000000..ae7cde1
--- /dev/null
@@ -0,0 +1,16 @@
+# Encoding file: iso2022, escape-driven
+E
+name           iso2022
+init           {}
+final          {}
+iso8859-1      \x1b(B
+jis0201                \x1b(J
+gb1988         \x1b(T
+jis0208                \x1b$@
+jis0208                \x1b$B
+jis0212                \x1b$(D
+gb2312         \x1b$A
+ksc5601                \x1b$(C
+jis0208                \x1b&@\x1b$B
+
+
diff --git a/ext/Encode/Encode/iso8859-1.enc b/ext/Encode/Encode/iso8859-1.enc
new file mode 100644 (file)
index 0000000..045d8fa
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-1, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
+00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
+00D000D100D200D300D400D500D600D700D800D900DA00DB00DC00DD00DE00DF
+00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
+00F000F100F200F300F400F500F600F700F800F900FA00FB00FC00FD00FE00FF
diff --git a/ext/Encode/Encode/iso8859-2.enc b/ext/Encode/Encode/iso8859-2.enc
new file mode 100644 (file)
index 0000000..16faab6
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-2, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A0010402D8014100A4013D015A00A700A80160015E0164017900AD017D017B
+00B0010502DB014200B4013E015B02C700B80161015F0165017A02DD017E017C
+015400C100C2010200C40139010600C7010C00C9011800CB011A00CD00CE010E
+01100143014700D300D4015000D600D70158016E00DA017000DC00DD016200DF
+015500E100E2010300E4013A010700E7010D00E9011900EB011B00ED00EE010F
+01110144014800F300F4015100F600F70159016F00FA017100FC00FD016302D9
diff --git a/ext/Encode/Encode/iso8859-3.enc b/ext/Encode/Encode/iso8859-3.enc
new file mode 100644 (file)
index 0000000..c914bce
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-3, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A0012602D800A300A40000012400A700A80130015E011E013400AD0000017B
+00B0012700B200B300B400B5012500B700B80131015F011F013500BD0000017C
+00C000C100C2000000C4010A010800C700C800C900CA00CB00CC00CD00CE00CF
+000000D100D200D300D4012000D600D7011C00D900DA00DB00DC016C015C00DF
+00E000E100E2000000E4010B010900E700E800E900EA00EB00EC00ED00EE00EF
+000000F100F200F300F4012100F600F7011D00F900FA00FB00FC016D015D02D9
diff --git a/ext/Encode/Encode/iso8859-4.enc b/ext/Encode/Encode/iso8859-4.enc
new file mode 100644 (file)
index 0000000..ef5c5a9
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-4, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A001040138015600A40128013B00A700A8016001120122016600AD017D00AF
+00B0010502DB015700B40129013C02C700B80161011301230167014A017E014B
+010000C100C200C300C400C500C6012E010C00C9011800CB011600CD00CE012A
+01100145014C013600D400D500D600D700D8017200DA00DB00DC0168016A00DF
+010100E100E200E300E400E500E6012F010D00E9011900EB011700ED00EE012B
+01110146014D013700F400F500F600F700F8017300FA00FB00FC0169016B02D9
diff --git a/ext/Encode/Encode/iso8859-5.enc b/ext/Encode/Encode/iso8859-5.enc
new file mode 100644 (file)
index 0000000..bf4ee82
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-5, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A0040104020403040404050406040704080409040A040B040C00AD040E040F
+0410041104120413041404150416041704180419041A041B041C041D041E041F
+0420042104220423042404250426042704280429042A042B042C042D042E042F
+0430043104320433043404350436043704380439043A043B043C043D043E043F
+0440044104420443044404450446044704480449044A044B044C044D044E044F
+2116045104520453045404550456045704580459045A045B045C00A7045E045F
diff --git a/ext/Encode/Encode/iso8859-6.enc b/ext/Encode/Encode/iso8859-6.enc
new file mode 100644 (file)
index 0000000..6510af7
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-6, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0660066106620663066406650666066706680669003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A000000000000000A40000000000000000000000000000060C00AD00000000
+00000000000000000000000000000000000000000000061B000000000000061F
+0000062106220623062406250626062706280629062A062B062C062D062E062F
+0630063106320633063406350636063706380639063A00000000000000000000
+0640064106420643064406450646064706480649064A064B064C064D064E064F
+0650065106520000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/iso8859-7.enc b/ext/Encode/Encode/iso8859-7.enc
new file mode 100644 (file)
index 0000000..2cb69a2
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-7, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A002BD02BC00A30000000000A600A700A800A9000000AB00AC00AD00002015
+00B000B100B200B303840385038600B703880389038A00BB038C00BD038E038F
+0390039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A1000003A303A403A503A603A703A803A903AA03AB03AC03AD03AE03AF
+03B003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C203C303C403C503C603C703C803C903CA03CB03CC03CD03CE0000
diff --git a/ext/Encode/Encode/iso8859-8.enc b/ext/Encode/Encode/iso8859-8.enc
new file mode 100644 (file)
index 0000000..6b424d5
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-8, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A0000000A200A300A400A500A600A700A800A900D700AB00AC00AD00AE203E
+00B000B100B200B300B400B500B600B700B800B900F700BB00BC00BD00BE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000002017
+05D005D105D205D305D405D505D605D705D805D905DA05DB05DC05DD05DE05DF
+05E005E105E205E305E405E505E605E705E805E905EA00000000000000000000
diff --git a/ext/Encode/Encode/iso8859-9.enc b/ext/Encode/Encode/iso8859-9.enc
new file mode 100644 (file)
index 0000000..6eed3f1
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: iso8859-9, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+00A000A100A200A300A400A500A600A700A800A900AA00AB00AC00AD00AE00AF
+00B000B100B200B300B400B500B600B700B800B900BA00BB00BC00BD00BE00BF
+00C000C100C200C300C400C500C600C700C800C900CA00CB00CC00CD00CE00CF
+011E00D100D200D300D400D500D600D700D800D900DA00DB00DC0130015E00DF
+00E000E100E200E300E400E500E600E700E800E900EA00EB00EC00ED00EE00EF
+011F00F100F200F300F400F500F600F700F800F900FA00FB00FC0131015F00FF
diff --git a/ext/Encode/Encode/jis0201.enc b/ext/Encode/Encode/jis0201.enc
new file mode 100644 (file)
index 0000000..64f423f
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: jis0201, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D203E007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/jis0208.enc b/ext/Encode/Encode/jis0208.enc
new file mode 100644 (file)
index 0000000..7102e88
--- /dev/null
@@ -0,0 +1,1312 @@
+# Encoding file: jis0208, double-byte
+D
+2129 0 77
+21
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8
+FF3EFFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0F
+FF3C301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3D
+FF5BFF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D7
+00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5
+FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+22
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025C625A125A025B325B225BD25BC203B3012219221902191219330130000
+00000000000000000000000000000000000000002208220B2286228722822283
+222A2229000000000000000000000000000000002227222800AC21D221D42200
+220300000000000000000000000000000000000000000000222022A523122202
+220722612252226A226B221A223D221D2235222B222C00000000000000000000
+00000000212B2030266F266D266A2020202100B6000000000000000025EF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+23
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19000000000000000000000000
+0000FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A00000000000000000000
+0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+24
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+25
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+26
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+28
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025002502250C251025182514251C252C25242534253C25012503250F2513
+251B251725232533252B253B254B2520252F25282537253F251D253025252538
+2542000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E9C55165A03963F54C0611B632859F690228475831C7A5060AA63E16E25
+65ED846682A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E6216
+7C9F88B75B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2
+593759D45A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3
+840E88638B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA29038
+7A328328828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+31
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E11
+789381FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B
+96F2834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E
+983482F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD5186
+5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01
+827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+32
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062BC65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B5104
+5C4B61B681C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F55
+4F3D4FA14F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3
+706B73C2798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA8
+8FE6904E971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D5
+4ECB4F1A89E356DE584A58CA5EFB5FEB602A6094606261D0621262D065390000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+33
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE
+591654B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D9
+57A367FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B
+899A89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B
+6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39
+53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584310000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+34
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007CA5520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E6
+5B8C5B985BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B53
+6C576F226F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266
+839E89B38ACC8CAB908494519593959195A2966597D3992882184E38542B5CB8
+5DCC73A9764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C5668
+57FA59475B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D77
+8ECC8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A07591
+79477FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A7078276775
+9ECD53745BA2811A865090064E184E454EC74F1153CA54385BAE5F1360256551
+673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45
+5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+36
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F9B4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F37
+5F4A602F6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F7
+93E197FF99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C5
+52E457475DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F
+8B398FD191D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C8
+99D25177611A865E55B07A7A50765BD3904796854E326ADB91E75C515C480000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+37
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000063987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B
+85AB8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B
+59515F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB
+7D4C7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE8
+5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6
+503950265065517C5238526355A7570F58055ACC5EFA61B261F862F363720000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+38
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000691C6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED29063
+9375967A98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D438237
+8A008AFA96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF
+6E5672D07CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E92
+4F0D53485449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B779190
+4E5E9BC94EA44F7C4FAF501950165149516C529F52B952FE539A53E354110000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+39
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB7
+5F186052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A
+6D696E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B1
+8154818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D
+980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B
+544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B6498034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D5
+7D3A826E9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A509396
+88DF57505EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D
+6B736E08707D91C7728078157826796D658E7D3083DC88C18F09969B52645728
+67507F6A8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A
+548B643E6628671467F57A847B567D22932F685C9BAD7B395319518A52370000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF6652
+4E09509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB
+9178991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB
+59C959FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B62
+6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C
+8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B216ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F
+5F0F8B589D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F06
+75BE8CEA5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66
+659C716E793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235
+914C91C8932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E
+816B8DA391529996511253D7546A5BFF63886A397DAC970056DA53CE54680000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F8490
+884689728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E
+67D46C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F
+51FA88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF3
+6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2
+7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000052DD5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C11
+5C1A5E845E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A2
+6A1F6A356CBC6D886E096E58713C7126716775C77701785D7901796579F07AE0
+7B117CA77D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A4
+9266937E9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E38
+60C564FE676167566D4472B675737A6384B88B7291B89320563157F498FE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000062ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB5
+55075A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F
+795E79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC15203
+587558EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A8
+9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F
+745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+40
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F84647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F
+6574661F667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA0
+8A938ACB901D91929752975965897A0E810696BB5E2D60DC621A65A566146790
+77F37A4D7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D
+7A837BC08AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226
+624764B0681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+41
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE
+524D55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A
+72D9758F758E790E795679DF7C977D207D4486078A34963B90619F2050E75275
+53CC53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB
+64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061
+83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+42
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000081D385358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD7
+5C5E8CCA65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A
+592A6C708A51553E581559A560F0625367C182356955964099C49A284F535806
+5BFE80105CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB8
+9000902E968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD702753535544
+5B856258629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+43
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB0
+4E3953585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D
+80C686CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E55730
+5F1B6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C4
+901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877
+8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005E165E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A
+80748139817887768ABF8ADC8D858DF3929A957798029CE552C5635776F46715
+6C8873CD8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B4
+69FB4F436F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A
+91E39DB44EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F
+608C62B5633A63D068AF6C407887798E7A0B7DE082478A028AE68E4490130000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+45
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F2
+5FB964A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B
+70B94F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21
+767B83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC
+51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF
+76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152300000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+46
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008463856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD
+52D5540C58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F
+5F975FB36D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A
+9CF682EB5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D
+594890A351854E4D51EA85998B0E7058637A934B696299B47E04757753576960
+8EDF96E36C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E7351650000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+47
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000059825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E74
+5FF5637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF
+8FB2899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC
+4FF35EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A926885
+6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD
+67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051FD7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A
+91979AEA4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD
+53DB5E06642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC4
+91C67169981298EF633D6669756A76E478D0854386EE532A5351542659835E87
+5F7C60B26249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB
+8AB98CBB907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+49
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C
+686759EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C79
+5EDF63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA7
+8CD3983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C601662766577
+65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB
+6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000798F8179890789866DF55F1762556CB84ECF72699B925206543B567458B3
+61A4626E711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E73
+5F0A67C44E26853D9589965B7C73980150FB58C1765678A7522577A585117B86
+504F590972477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA
+570363556B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E95023
+4FF853055446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D2
+98FD9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D0
+68D251927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A8
+64B26734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C6
+646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE
+9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E800000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F2B85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A1481085999
+7C8D6C11772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D
+660E76DF8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A21
+830259845B5F6BDB731B76F27DB280178499513267289ED976EE676252FF9905
+5C24623B7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F25
+77E253845F797D0485AC8A338E8D975667F385AE9453610961086CB976520000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E67
+6D8C733673377531795088D58A98904A909190F596C4878D59154E884F594E0E
+8A898F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB6
+719475287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B32
+6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A
+4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A8740674830000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075E288CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C
+74097559786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC
+5BEE659968816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B
+7DD1502B539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F
+985E4EE44F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E97
+9F6266A66B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000084EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717
+697C69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B9332
+8AD6502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C18568
+69006E7E78978155000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F0C4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A
+82125F0D4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED7
+4EDE4EED4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B
+4F694F704F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE4
+4FE5501A50285014502A502550054F1C4FF650215029502C4FFE4FEF50115006
+504350476703505550505048505A5056506C50785080509A508550B450B20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000050C950CA50B350C250D650DE50E550ED50E350EE50F950F5510951015102
+511651155114511A5121513A5137513C513B513F51405152514C515451627AF8
+5169516A516E5180518256D8518C5189518F519151935195519651A451A651A2
+51A951AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED
+51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C
+525E5254526A527452695273527F527D528D529452925271528852918FA80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+52
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008FA752AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F5
+52F852F9530653087538530D5310530F5315531A5323532F5331533353385340
+534653454E175349534D51D6535E5369536E5918537B53775382539653A053A6
+53A553AE53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D
+5440542C542D543C542E54365429541D544E548F5475548E545F547154775470
+5492547B5480547654845490548654C754A254B854A554AC54C454C854A80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E2
+553955405563554C552E555C55455556555755385533555D5599558054AF558A
+559F557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC
+55E455D4561455F7561655FE55FD561B55F9564E565071DF5634563656325638
+566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2
+56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457090000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005708570B570D57135718571655C7571C572657375738574E573B5740574F
+576957C057885761577F5789579357A057B357A457AA57B057C357C657D457D2
+57D3580A57D657E3580B5819581D587258215862584B58706BC05852583D5879
+588558B9589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E5
+58DC58E458DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C
+592D59325938593E7AD259555950594E595A5958596259605967596C59690000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+55
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000059785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F
+5A115A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC2
+5ABD5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E
+5B435B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B80
+5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6
+5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C530000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C505C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB6
+5CBC5CB75CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C
+5D1F5D1B5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D87
+5D845D825DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB
+5DEB5DF25DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E54
+5E5F5E625E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF8
+5EFE5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F
+5F515F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E
+5F995F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF60216060
+601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F
+604A6046604D6063604360646042606C606B60596081608D60E76083609A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+58
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006084609B60966097609260A7608B60E160B860E060D360B45FF060BD60C6
+60B560D8614D6115610660F660F7610060F460FA6103612160FB60F1610D610E
+6147613E61286127614A613F613C612C6134613D614261446173617761586159
+615A616B6174616F61656171615F615D6153617561996196618761AC6194619A
+618A619161AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E6
+61E361F661FA61F461FF61FD61FC61FE620062086209620D620C6214621B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000621E6221622A622E6230623262336241624E625E6263625B62606268627C
+62826289627E62926293629662D46283629462D762D162BB62CF62FF62C664D4
+62C862DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F5
+6350633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B
+636963BE63E963C063C663E363C963D263F663C4641664346406641364266436
+651D64176428640F6467646F6476644E652A6495649364A564A9648864BC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064DA64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF
+652C64F664F464F264FA650064FD6518651C650565246523652B653465356537
+65366538754B654865566555654D6558655E655D65726578658265838B8A659B
+659F65AB65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A
+660365FB6773663566366634661C664F664466496641665E665D666466676668
+665F6662667066836688668E668966846698669D66C166B966C966BE66BC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000066C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E6726
+67279738672E673F67366741673867376746675E676067596763676467896770
+67A9677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E4
+67DE67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E
+68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874
+68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068D468E768D569366912690468D768E3692568F968E068EF6928692A691A
+6923692168C669796977695C6978696B6954697E696E69396974693D69596930
+6961695E695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD
+69BB69C369A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F9
+69F269E76A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A72
+6A366A786A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB
+6B0586166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B50
+6B596B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA4
+6BAA6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF
+9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B
+6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006CBA6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D12
+6D0C6D636D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC7
+6DE66DB86DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D
+6E6E6E2E6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E24
+6EFF6E1D6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F
+6EA56EC26E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F58
+6F8E6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD8
+6FF16FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F
+7030703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD
+70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184
+719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000071F971FF720D7210721B7228722D722C72307232723B723C723F72407246
+724B72587274727E7282728172877292729672A272A772B972B272C372C672C4
+72CE72D272E272E072E172F972F7500F7317730A731C7316731D7334732F7329
+7325733E734E734F9ED87357736A7368737073787375737B737A73C873B373CE
+73BB73C073E573EE73DE74A27405746F742573F87432743A7455743F745F7459
+7441745C746974707463746A7476747E748B749E74A774CA74CF74D473F10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000074E074E374E774E974EE74F274F074F174F874F7750475037505750C750E
+750D75157513751E7526752C753C7544754D754A7549755B7546755A75697564
+7567756B756D75787576758675877574758A758975827594759A759D75A575A3
+75C275B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF
+75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634
+7630763B764776487646765C76587661766276687669766A7667766C76700000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000767276767678767C768076837688768B768E769676937699769A76B076B4
+76B876B976BA76C276CD76D676D276DE76E176E576E776EA862F76FB77087707
+770477297724771E77257726771B773777387747775A7768776B775B7765777F
+777E7779778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD
+77D777DA77DC77E377EE77FC780C781279267820792A7845788E78747886787C
+789A788C78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078E778DA78FD78F47907791279117919792C792B794079607957795F795A
+79557953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E7
+79EC79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A57
+7A497A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB0
+7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2
+7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B500000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007B7A7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D
+7B987B9F7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC6
+7BDD7BE97C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C23
+7C277C2A7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C56
+7C657C6C7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB9
+7CBD7CC07CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D060000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D72
+7D687D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD
+7DAB7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E05
+7E0A7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E37
+7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D
+8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007F457F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F78
+7F827F867F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB6
+7FB88B717FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B
+801280188019801C80218028803F803B804A804680528058805A805F80628068
+80738072807080768079807D807F808480868085809B8093809A80AD519080AC
+80DB80E580D980DD80C480DA80D6810980EF80F1811B81298123812F814B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000968B8146813E8153815180FC8171816E81658166817481838188818A8180
+818281A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA
+81C981CD81D181D981D881C881DA81DF81E081E781FA81FB81FE820182028205
+8207820A820D821082168229822B82388233824082598258825D825A825F8264
+82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1
+82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D90000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000833583348316833283318340833983508345832F832B831783188385839A
+83AA839F83A283968323838E8387838A837C83B58373837583A0838983A883F4
+841383EB83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD
+8438850683FB846D842A843C855A84848477846B84AD846E848284698446842C
+846F8479843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D6
+84A1852184FF84F485178518852C851F8515851484FC85408563855885480000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000085418602854B8555858085A485888591858A85A8856D8594859B85EA8587
+859C8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613
+860B85FE85FA86068622861A8630863F864D4E558654865F86678671869386A3
+86A986AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC
+86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F
+8737873B87258729871A8760875F8778874C874E877487578768876E87590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000087538763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C4
+87B387C787C687BB87EF87F287E0880F880D87FE87F687F7880E87D288118816
+8815882288218831883688398827883B8844884288528859885E8862886B8881
+887E889E8875887D88B5887288828897889288AE889988A2888D88A488B088BF
+88B188C388C488D488D888D988DD88F9890288FC88F488E888F28904890C890A
+89138943891E8925892A892B89418944893B89368938894C891D8960895E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000089668964896D896A896F89748977897E89838988898A8993899889A189A9
+89A689AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A16
+8A108A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A85
+8A828A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE7
+8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20
+8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B5F8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C41
+8C3F8C488C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E
+8C948C7C8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA
+8CFD8CFA8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D67
+8D6D8D718D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB
+8DDF8DE38DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E81
+8E878E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE
+8EC58EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C
+8F1F8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C
+8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4
+90058FF98FFA901190159021900D901E9016900B90279036903590398FF80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000904F905090519052900E9049903E90569058905E9068906F907696A89072
+9082907D90819080908A9089908F90A890AF90B190B590E290E4624890DB9102
+9112911991329130914A9156915891639165916991739172918B9189918291A2
+91AB91AF91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC
+91F591F6921E91FF9214922C92159211925E925792459249926492489295923F
+924B9250929C92969293929B925A92CF92B992B792E9930F92FA9344932E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093199322931A9323933A9335933B935C9360937C936E935693B093AC93AD
+939493B993D693D793E893E593D893C393DD93D093C893E4941A941494139403
+940794109436942B94359421943A944194529444945B94609462945E946A9229
+947094759477947D945A947C947E9481947F95829587958A9594959695989599
+95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6
+95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+70
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000965D965F96669672966C968D96989695969796AA96A796B196B296B096B4
+96B696B896B996CE96CB96C996CD894D96DC970D96D596F99704970697089713
+970E9711970F971697199724972A97309739973D973E97449746974897429749
+975C976097649766976852D2976B977197799785977C9781977A9786978B978F
+9790979C97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF
+97F697F5980F980C9838982498219837983D9846984F984B986B986F98700000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+71
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000098719874987398AA98AF98B198B698C498C398C698E998EB990399099912
+991499189921991D991E99249920992C992E993D993E9942994999459950994B
+99519952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED
+99EE99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A43
+9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0
+9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009AFB9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B32
+9B449B439B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA8
+9BB49BC09BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF1
+9BF09C159C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C21
+9C309C479C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB
+9D039D069D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D480000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA9
+9DB29DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD
+9E1A9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA9
+9EB89EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF
+9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52
+9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000582F69C79059746451DC7199000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/jis0212.enc b/ext/Encode/Encode/jis0212.enc
new file mode 100644 (file)
index 0000000..cddbbba
--- /dev/null
@@ -0,0 +1,1159 @@
+# Encoding file: jis0212, double-byte
+D
+2244 0 68
+22
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000002D8
+02C700B802D902DD00AF02DB02DA007E03840385000000000000000000000000
+0000000000A100A600BF00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000BA00AA00A900AE2122
+00A4211600000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+26
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000038603880389038A03AA0000038C0000038E03AB0000038F000000000000
+000003AC03AD03AE03AF03CA039003CC03C203CD03CB03B003CE000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000004020403040404050406040704080409040A040B040C040E040F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000004520453045404550456045704580459045A045B045C045E045F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+29
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000C60110000001260000013200000141013F0000014A00D8015200000166
+00DE000000000000000000000000000000000000000000000000000000000000
+000000E6011100F00127013101330138014201400149014B00F8015300DF0167
+00FE000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000C100C000C400C2010201CD0100010400C500C301060108010C00C7010A
+010E00C900C800CB00CA011A0116011201180000011C011E01220120012400CD
+00CC00CF00CE01CF0130012A012E0128013401360139013D013B014301470145
+00D100D300D200D600D401D10150014C00D5015401580156015A015C0160015E
+0164016200DA00D900DC00DB016C01D30170016A0172016E016801D701DB01D9
+01D5017400DD017801760179017D017B00000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000E100E000E400E2010301CE0101010500E500E301070109010D00E7010B
+010F00E900E800EB00EA011B01170113011901F5011D011F00000121012500ED
+00EC00EF00EE01D00000012B012F012901350137013A013E013C014401480146
+00F100F300F200F600F401D20151014D00F5015501590157015B015D0161015F
+0165016300FA00F900FC00FB016D01D40171016B0173016F016901D801DC01DA
+01D6017500FD00FF0177017A017E017C00000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E024E044E054E0C4E124E1F4E234E244E284E2B4E2E4E2F4E304E354E40
+4E414E444E474E514E5A4E5C4E634E684E694E744E754E794E7F4E8D4E964E97
+4E9D4EAF4EB94EC34ED04EDA4EDB4EE04EE14EE24EE84EEF4EF14EF34EF54EFD
+4EFE4EFF4F004F024F034F084F0B4F0C4F124F154F164F174F194F2E4F314F60
+4F334F354F374F394F3B4F3E4F404F424F484F494F4B4F4C4F524F544F564F58
+4F5F4F634F6A4F6C4F6E4F714F774F784F794F7A4F7D4F7E4F814F824F840000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+31
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F854F894F8A4F8C4F8E4F904F924F934F944F974F994F9A4F9E4F9F4FB2
+4FB74FB94FBB4FBC4FBD4FBE4FC04FC14FC54FC64FC84FC94FCB4FCC4FCD4FCF
+4FD24FDC4FE04FE24FF04FF24FFC4FFD4FFF5000500150045007500A500C500E
+5010501350175018501B501C501D501E50225027502E50305032503350355040
+5041504250455046504A504C504E50515052505350575059505F506050625063
+50665067506A506D50705071503B5081508350845086508A508E508F50900000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+32
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005092509350945096509B509C509E509F50A050A150A250AA50AF50B050B9
+50BA50BD50C050C350C450C750CC50CE50D050D350D450D850DC50DD50DF50E2
+50E450E650E850E950EF50F150F650FA50FE5103510651075108510B510C510D
+510E50F2511051175119511B511C511D511E512351275128512C512D512F5131
+513351345135513851395142514A514F5153515551575158515F51645166517E
+51835184518B518E5198519D51A151A351AD51B851BA51BC51BE51BF51C20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+33
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000051C851CF51D151D251D351D551D851DE51E251E551EE51F251F351F451F7
+5201520252055212521352155216521852225228523152325235523C52455249
+525552575258525A525C525F526052615266526E527752785279528052825285
+528A528C52935295529652975298529A529C52A452A552A652A752AF52B052B6
+52B752B852BA52BB52BD52C052C452C652C852CC52CF52D152D452D652DB52DC
+52E152E552E852E952EA52EC52F052F152F452F652F753005303530A530B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+34
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000530C531153135318531B531C531E531F5325532753285329532B532C532D
+533053325335533C533D533E5342534C534B5359535B536153635365536C536D
+53725379537E538353875388538E539353945399539D53A153A453AA53AB53AF
+53B253B453B553B753B853BA53BD53C053C553CF53D253D353D553DA53DD53DE
+53E053E653E753F554025413541A542154275428542A542F5431543454355443
+54445447544D544F545E54625464546654675469546B546D546E5474547F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054815483548554885489548D549154955496549C549F54A154A654A754A9
+54AA54AD54AE54B154B754B954BA54BB54BF54C654CA54CD54CE54E054EA54EC
+54EF54F654FC54FE54FF55005501550555085509550C550D550E5515552A552B
+553255355536553B553C553D554155475549554A554D555055515558555A555B
+555E5560556155645566557F5581558255865588558E558F5591559255935594
+559755A355A455AD55B255BF55C155C355C655C955CB55CC55CE55D155D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+36
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000055D355D755D855DB55DE55E255E955F655FF56055608560A560D560E560F
+5610561156125619562C56305633563556375639563B563C563D563F56405641
+5643564456465649564B564D564F5654565E566056615662566356665669566D
+566F567156725675568456855688568B568C56955699569A569D569E569F56A6
+56A756A856A956AB56AC56AD56B156B356B756BE56C556C956CA56CB56CF56D0
+56CC56CD56D956DC56DD56DF56E156E456E556E656E756E856F156EB56ED0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+37
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000056F656F7570157025707570A570C57115715571A571B571D572057225723
+572457255729572A572C572E572F57335734573D573E573F57455746574C574D
+57525762576557675768576B576D576E576F5770577157735774577557775779
+577A577B577C577E57815783578C579457975799579A579C579D579E579F57A1
+579557A757A857A957AC57B857BD57C757C857CC57CF57D557DD57DE57E457E6
+57E757E957ED57F057F557F657F857FD57FE57FF580358045808580957E10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+38
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000580C580D581B581E581F582058265827582D58325839583F5849584C584D
+584F58505855585F58615864586758685878587C587F58805881588758885889
+588A588C588D588F589058945896589D58A058A158A258A658A958B158B258C4
+58BC58C258C858CD58CE58D058D258D458D658DA58DD58E158E258E958F35905
+5906590B590C5912591359148641591D5921592359245928592F593059335935
+5936593F59435946595259535959595B595D595E595F59615963596B596D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+39
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000596F5972597559765979597B597C598B598C598E599259955997599F59A4
+59A759AD59AE59AF59B059B359B759BA59BC59C159C359C459C859CA59CD59D2
+59DD59DE59DF59E359E459E759EE59EF59F159F259F459F75A005A045A0C5A0D
+5A0E5A125A135A1E5A235A245A275A285A2A5A2D5A305A445A455A475A485A4C
+5A505A555A5E5A635A655A675A6D5A775A7A5A7B5A7E5A8B5A905A935A965A99
+5A9C5A9E5A9F5AA05AA25AA75AAC5AB15AB25AB35AB55AB85ABA5ABB5ABF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005AC45AC65AC85ACF5ADA5ADC5AE05AE55AEA5AEE5AF55AF65AFD5B005B01
+5B085B175B345B195B1B5B1D5B215B255B2D5B385B415B4B5B4C5B525B565B5E
+5B685B6E5B6F5B7C5B7D5B7E5B7F5B815B845B865B8A5B8E5B905B915B935B94
+5B965BA85BA95BAC5BAD5BAF5BB15BB25BB75BBA5BBC5BC05BC15BCD5BCF5BD6
+5BD75BD85BD95BDA5BE05BEF5BF15BF45BFD5C0C5C175C1E5C1F5C235C265C29
+5C2B5C2C5C2E5C305C325C355C365C595C5A5C5C5C625C635C675C685C690000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005C6D5C705C745C755C7A5C7B5C7C5C7D5C875C885C8A5C8F5C925C9D5C9F
+5CA05CA25CA35CA65CAA5CB25CB45CB55CBA5CC95CCB5CD25CDD5CD75CEE5CF1
+5CF25CF45D015D065D0D5D125D2B5D235D245D265D275D315D345D395D3D5D3F
+5D425D435D465D485D555D515D595D4A5D5F5D605D615D625D645D6A5D6D5D70
+5D795D7A5D7E5D7F5D815D835D885D8A5D925D935D945D955D995D9B5D9F5DA0
+5DA75DAB5DB05DB45DB85DB95DC35DC75DCB5DD05DCE5DD85DD95DE05DE40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005DE95DF85DF95E005E075E0D5E125E145E155E185E1F5E205E2E5E285E32
+5E355E3E5E4B5E505E495E515E565E585E5B5E5C5E5E5E685E6A5E6B5E6C5E6D
+5E6E5E705E805E8B5E8E5EA25EA45EA55EA85EAA5EAC5EB15EB35EBD5EBE5EBF
+5EC65ECC5ECB5ECE5ED15ED25ED45ED55EDC5EDE5EE55EEB5F025F065F075F08
+5F0E5F195F1C5F1D5F215F225F235F245F285F2B5F2C5F2E5F305F345F365F3B
+5F3D5F3F5F405F445F455F475F4D5F505F545F585F5B5F605F635F645F670000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F6F5F725F745F755F785F7A5F7D5F7E5F895F8D5F8F5F965F9C5F9D5FA2
+5FA75FAB5FA45FAC5FAF5FB05FB15FB85FC45FC75FC85FC95FCB5FD05FD15FD2
+5FD35FD45FDE5FE15FE25FE85FE95FEA5FEC5FED5FEE5FEF5FF25FF35FF65FFA
+5FFC6007600A600D6013601460176018601A601F6024602D6033603560406047
+60486049604C6051605460566057605D606160676071607E607F608260866088
+608A608E6091609360956098609D609E60A260A460A560A860B060B160B70000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000060BB60BE60C260C460C860C960CA60CB60CE60CF60D460D560D960DB60DD
+60DE60E260E560F260F560F860FC60FD61026107610A610C6110611161126113
+6114611661176119611C611E6122612A612B6130613161356136613761396141
+614561466149615E6160616C61726178617B617C617F6180618161836184618B
+618D6192619361976198619C619D619F61A061A561A861AA61AD61B861B961BC
+61C061C161C261CE61CF61D561DC61DD61DE61DF61E161E261E761E961E50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000061EC61ED61EF620162036204620762136215621C62206222622362276229
+622B6239623D6242624362446246624C62506251625262546256625A625C6264
+626D626F6273627A627D628D628E628F629062A662A862B362B662B762BA62BE
+62BF62C462CE62D562D662DA62EA62F262F462FC62FD63036304630A630B630D
+63106313631663186329632A632D633563366339633C63416342634363446346
+634A634B634E6352635363546358635B63656366636C636D6371637463750000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+40
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006378637C637D637F638263846387638A6390639463956399639A639E63A4
+63A663AD63AE63AF63BD63C163C563C863CE63D163D363D463D563DC63E063E5
+63EA63EC63F263F363F563F863F96409640A6410641264146418641E64206422
+642464256429642A642F64306435643D643F644B644F6451645264536454645A
+645B645C645D645F646064616463646D64736474647B647D64856487648F6490
+649164986499649B649D649F64A164A364A664A864AC64B364BD64BE64BF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+41
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000064C464C964CA64CB64CC64CE64D064D164D564D764E464E564E964EA64ED
+64F064F564F764FB64FF6501650465086509650A650F6513651465166519651B
+651E651F652265266529652E6531653A653C653D654365476549655065526554
+655F65606567656B657A657D65816585658A659265956598659D65A065A365A6
+65AE65B265B365B465BF65C265C865C965CE65D065D465D665D865DF65F065F2
+65F465F565F965FE65FF6600660466086609660D6611661266156616661D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+42
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000661E662166226623662466266629662A662B662C662E6630663166336639
+6637664066456646664A664C6651664E665766586659665B665C6660666166FB
+666A666B666C667E66736675667F667766786679667B6680667C668B668C668D
+669066926699669A669B669C669F66A066A466AD66B166B266B566BB66BF66C0
+66C266C366C866CC66CE66CF66D466DB66DF66E866EB66EC66EE66FA67056707
+670E67136719671C672067226733673E674567476748674C67546755675D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+43
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006766676C676E67746776677B67816784678E678F67916793679667986799
+679B67B067B167B267B567BB67BC67BD67F967C067C267C367C567C867C967D2
+67D767D967DC67E167E667F067F267F667F7685268146819681D681F68286827
+682C682D682F683068316833683B683F68446845684A684C685568576858685B
+686B686E686F68706871687268756879687A687B687C68826884688668886896
+6898689A689C68A168A368A568A968AA68AE68B268BB68C568C868CC68CF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068D068D168D368D668D968DC68DD68E568E868EA68EB68EC68ED68F068F1
+68F568F668FB68FC68FD69066909690A69106911691369166917693169336935
+6938693B694269456949694E6957695B696369646965696669686969696C6970
+69716972697A697B697F6980698D69926996699869A169A569A669A869AB69AD
+69AF69B769B869BA69BC69C569C869D169D669D769E269E569EE69EF69F169F3
+69F569FE6A006A016A036A0F6A116A156A1A6A1D6A206A246A286A306A320000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+45
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006A346A376A3B6A3E6A3F6A456A466A496A4A6A4E6A506A516A526A556A56
+6A5B6A646A676A6A6A716A736A7E6A816A836A866A876A896A8B6A916A9B6A9D
+6A9E6A9F6AA56AAB6AAF6AB06AB16AB46ABD6ABE6ABF6AC66AC96AC86ACC6AD0
+6AD46AD56AD66ADC6ADD6AE46AE76AEC6AF06AF16AF26AFC6AFD6B026B036B06
+6B076B096B0F6B106B116B176B1B6B1E6B246B286B2B6B2C6B2F6B356B366B3B
+6B3F6B466B4A6B4D6B526B566B586B5D6B606B676B6B6B6E6B706B756B7D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+46
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006B7E6B826B856B976B9B6B9F6BA06BA26BA36BA86BA96BAC6BAD6BAE6BB0
+6BB86BB96BBD6BBE6BC36BC46BC96BCC6BD66BDA6BE16BE36BE66BE76BEE6BF1
+6BF76BF96BFF6C026C046C056C096C0D6C0E6C106C126C196C1F6C266C276C28
+6C2C6C2E6C336C356C366C3A6C3B6C3F6C4A6C4B6C4D6C4F6C526C546C596C5B
+6C5C6C6B6C6D6C6F6C746C766C786C796C7B6C856C866C876C896C946C956C97
+6C986C9C6C9F6CB06CB26CB46CC26CC66CCD6CCF6CD06CD16CD26CD46CD60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+47
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006CDA6CDC6CE06CE76CE96CEB6CEC6CEE6CF26CF46D046D076D0A6D0E6D0F
+6D116D136D1A6D266D276D286C676D2E6D2F6D316D396D3C6D3F6D576D5E6D5F
+6D616D656D676D6F6D706D7C6D826D876D916D926D946D966D976D986DAA6DAC
+6DB46DB76DB96DBD6DBF6DC46DC86DCA6DCE6DCF6DD66DDB6DDD6DDF6DE06DE2
+6DE56DE96DEF6DF06DF46DF66DFC6E006E046E1E6E226E276E326E366E396E3B
+6E3C6E446E456E486E496E4B6E4F6E516E526E536E546E576E5C6E5D6E5E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006E626E636E686E736E7B6E7D6E8D6E936E996EA06EA76EAD6EAE6EB16EB3
+6EBB6EBF6EC06EC16EC36EC76EC86ECA6ECD6ECE6ECF6EEB6EED6EEE6EF96EFB
+6EFD6F046F086F0A6F0C6F0D6F166F186F1A6F1B6F266F296F2A6F2F6F306F33
+6F366F3B6F3C6F2D6F4F6F516F526F536F576F596F5A6F5D6F5E6F616F626F68
+6F6C6F7D6F7E6F836F876F886F8B6F8C6F8D6F906F926F936F946F966F9A6F9F
+6FA06FA56FA66FA76FA86FAE6FAF6FB06FB56FB66FBC6FC56FC76FC86FCA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+49
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FDA6FDE6FE86FE96FF06FF56FF96FFC6FFD7000700570067007700D7017
+70207023702F703470377039703C7043704470487049704A704B70547055705D
+705E704E70647065706C706E70757076707E7081708570867094709570967097
+7098709B70A470AB70B070B170B470B770CA70D170D370D470D570D670D870DC
+70E470FA71037104710571067107710B710C710F711E7120712B712D712F7130
+713171387141714571467147714A714B715071527157715A715C715E71600000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000071687179718071857187718C7192719A719B71A071A271AF71B071B271B3
+71BA71BF71C071C171C471CB71CC71D371D671D971DA71DC71F871FE72007207
+7208720972137217721A721D721F7224722B722F723472387239724172427243
+7245724E724F7250725372557256725A725C725E726072637268726B726E726F
+727172777278727B727C727F72847289728D728E7293729B72A872AD72AE72B1
+72B472BE72C172C772C972CC72D572D672D872DF72E572F372F472FA72FB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000072FE7302730473057307730B730D7312731373187319731E732273247327
+7328732C733173327335733A733B733D7343734D7350735273567358735D735E
+735F7360736673677369736B736C736E736F737173777379737C738073817383
+73857386738E73907393739573977398739C739E739F73A073A273A573A673AA
+73AB73AD73B573B773B973BC73BD73BF73C573C673C973CB73CC73CF73D273D3
+73D673D973DD73E173E373E673E773E973F473F573F773F973FA73FB73FD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000073FF7400740174047407740A7411741A741B7424742674287429742A742B
+742C742D742E742F74307431743974407443744474467447744B744D74517452
+7457745D7462746674677468746B746D746E7471747274807481748574867487
+7489748F74907491749274987499749A749C749F74A074A174A374A674A874A9
+74AA74AB74AE74AF74B174B274B574B974BB74BF74C874C974CC74D074D374D8
+74DA74DB74DE74DF74E474E874EA74EB74EF74F474FA74FB74FC74FF75060000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000075127516751775207521752475277529752A752F75367539753D753E753F
+7540754375477548754E755075527557755E755F7561756F75717579757A757B
+757C757D757E7581758575907592759375957599759C75A275A475B475BA75BF
+75C075C175C475C675CC75CE75CF75D775DC75DF75E075E175E475E775EC75EE
+75EF75F175F9760076027603760476077608760A760C760F7612761376157616
+7619761B761C761D761E7623762576267629762D763276337635763876390000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000763A763C764A764076417643764476457649764B76557659765F76647665
+766D766E766F7671767476817685768C768D7695769B769C769D769F76A076A2
+76A376A476A576A676A776A876AA76AD76BD76C176C576C976CB76CC76CE76D4
+76D976E076E676E876EC76F076F176F676F976FC77007706770A770E77127714
+771577177719771A771C77227728772D772E772F7734773577367739773D773E
+774277457746774A774D774E774F775277567757775C775E775F776077620000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077647767776A776C7770777277737774777A777D77807784778C778D7794
+77957796779A779F77A277A777AA77AE77AF77B177B577BE77C377C977D177D2
+77D577D977DE77DF77E077E477E677EA77EC77F077F177F477F877FB78057806
+7809780D780E7811781D782178227823782D782E783078357837784378447847
+7848784C784E7852785C785E78607861786378647868786A786E787A787E788A
+788F7894789878A1789D789E789F78A478A878AC78AD78B078B178B278B30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078BB78BD78BF78C778C878C978CC78CE78D278D378D578D678E478DB78DF
+78E078E178E678EA78F278F3790078F678F778FA78FB78FF7906790C7910791A
+791C791E791F7920792579277929792D793179347935793B793D793F79447945
+7946794A794B794F795179547958795B795C79677969796B79727979797B797C
+797E798B798C799179937994799579967998799B799C79A179A879A979AB79AF
+79B179B479B879BB79C279C479C779C879CA79CF79D479D679DA79DD79DE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079E079E279E579EA79EB79ED79F179F879FC7A027A037A077A097A0A7A0C
+7A117A157A1B7A1E7A217A277A2B7A2D7A2F7A307A347A357A387A397A3A7A44
+7A457A477A487A4C7A557A567A597A5C7A5D7A5F7A607A657A677A6A7A6D7A75
+7A787A7E7A807A827A857A867A8A7A8B7A907A917A947A9E7AA07AA37AAC7AB3
+7AB57AB97ABB7ABC7AC67AC97ACC7ACE7AD17ADB7AE87AE97AEB7AEC7AF17AF4
+7AFB7AFD7AFE7B077B147B1F7B237B277B297B2A7B2B7B2D7B2E7B2F7B300000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+52
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007B317B347B3D7B3F7B407B417B477B4E7B557B607B647B667B697B6A7B6D
+7B6F7B727B737B777B847B897B8E7B907B917B967B9B7B9E7BA07BA57BAC7BAF
+7BB07BB27BB57BB67BBA7BBB7BBC7BBD7BC27BC57BC87BCA7BD47BD67BD77BD9
+7BDA7BDB7BE87BEA7BF27BF47BF57BF87BF97BFA7BFC7BFE7C017C027C037C04
+7C067C097C0B7C0C7C0E7C0F7C197C1B7C207C257C267C287C2C7C317C337C34
+7C367C397C3A7C467C4A7C557C517C527C537C597C5A7C5B7C5C7C5D7C5E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007C617C637C677C697C6D7C6E7C707C727C797C7C7C7D7C867C877C8F7C94
+7C9E7CA07CA67CB07CB67CB77CBA7CBB7CBC7CBF7CC47CC77CC87CC97CCD7CCF
+7CD37CD47CD57CD77CD97CDA7CDD7CE67CE97CEB7CF57D037D077D087D097D0F
+7D117D127D137D167D1D7D1E7D237D267D2A7D2D7D317D3C7D3D7D3E7D407D41
+7D477D487D4D7D517D537D577D597D5A7D5C7D5D7D657D677D6A7D707D787D7A
+7D7B7D7F7D817D827D837D857D867D887D8B7D8C7D8D7D917D967D977D9D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D9E7DA67DA77DAA7DB37DB67DB77DB97DC27DC37DC47DC57DC67DCC7DCD
+7DCE7DD77DD97E007DE27DE57DE67DEA7DEB7DED7DF17DF57DF67DF97DFA7E08
+7E107E117E157E177E1C7E1D7E207E277E287E2C7E2D7E2F7E337E367E3F7E44
+7E457E477E4E7E507E527E587E5F7E617E627E657E6B7E6E7E6F7E737E787E7E
+7E817E867E877E8A7E8D7E917E957E987E9A7E9D7E9E7F3C7F3B7F3D7F3E7F3F
+7F437F447F477F4F7F527F537F5B7F5C7F5D7F617F637F647F657F667F6D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+55
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007F717F7D7F7E7F7F7F807F8B7F8D7F8F7F907F917F967F977F9C7FA17FA2
+7FA67FAA7FAD7FB47FBC7FBF7FC07FC37FC87FCE7FCF7FDB7FDF7FE37FE57FE8
+7FEC7FEE7FEF7FF27FFA7FFD7FFE7FFF80078008800A800D800E800F80118013
+80148016801D801E801F802080248026802C802E80308034803580378039803A
+803C803E80408044806080648066806D8071807580818088808E809C809E80A6
+80A780AB80B880B980C880CD80CF80D280D480D580D780D880E080ED80EE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000080F080F280F380F680F980FA80FE8103810B811681178118811C811E8120
+81248127812C81308135813A813C81458147814A814C81528157816081618167
+81688169816D816F817781818190818481858186818B818E81968198819B819E
+81A281AE81B281B481BB81CB81C381C581CA81CE81CF81D581D781DB81DD81DE
+81E181E481EB81EC81F081F181F281F581F681F881F981FD81FF82008203820F
+821382148219821A821D82218222822882328234823A82438244824582460000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000824B824E824F82518256825C826082638267826D8274827B827D827F8280
+82818283828482878289828A828E8291829482968298829A829B82A082A182A3
+82A482A782A882A982AA82AE82B082B282B482B782BA82BC82BE82BF82C682D0
+82D582DA82E082E282E482E882EA82ED82EF82F682F782FD82FE830083018307
+8308830A830B8354831B831D831E831F83218322832C832D832E833083338337
+833A833C833D8342834383448347834D834E8351835583568357837083780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+58
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000837D837F8380838283848386838D83928394839583988399839B839C839D
+83A683A783A983AC83BE83BF83C083C783C983CF83D083D183D483DD835383E8
+83EA83F683F883F983FC84018406840A840F84118415841983AD842F84398445
+84478448844A844D844F84518452845684588459845A845C8460846484658467
+846A84708473847484768478847C847D84818485849284938495849E84A684A8
+84A984AA84AF84B184B484BA84BD84BE84C084C284C784C884CC84CF84D30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000084DC84E784EA84EF84F084F184F284F7853284FA84FB84FD850285038507
+850C850E8510851C851E85228523852485258527852A852B852F853385348536
+853F8546854F855085518552855385568559855C855D855E855F856085618562
+8564856B856F8579857A857B857D857F8581858585868589858B858C858F8593
+8598859D859F85A085A285A585A785B485B685B785B885BC85BD85BE85BF85C2
+85C785CA85CB85CE85AD85D885DA85DF85E085E685E885ED85F385F685FC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000085FF860086048605860D860E86108611861286188619861B861E86218627
+862986368638863A863C863D864086428646865286538656865786588659865D
+866086618662866386648669866C866F867586768677867A868D869186968698
+869A869C86A186A686A786A886AD86B186B386B486B586B786B886B986BF86C0
+86C186C386C586D186D286D586D786DA86DC86E086E386E586E7868886FA86FC
+86FD870487058707870B870E870F8710871387148719871E871F872187230000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008728872E872F873187328739873A873C873D873E874087438745874D8758
+875D876187648765876F87718772877B8783878487858786878787888789878B
+878C879087938795879787988799879E87A087A387A787AC87AD87AE87B187B5
+87BE87BF87C187C887C987CA87CE87D587D687D987DA87DC87DF87E287E387E4
+87EA87EB87ED87F187F387F887FA87FF8801880388068809880A880B88108819
+8812881388148818881A881B881C881E881F8828882D882E8830883288350000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000883A883C88418843884588488849884A884B884E8851885588568858885A
+885C885F88608864886988718879887B88808898889A889B889C889F88A088A8
+88AA88BA88BD88BE88C088CA88CB88CC88CD88CE88D188D288D388DB88DE88E7
+88EF88F088F188F588F789018906890D890E890F8915891689188919891A891C
+892089268927892889308931893289358939893A893E89408942894589468949
+894F89528957895A895B895C896189628963896B896E897089738975897A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000897B897C897D8989898D899089948995899B899C899F89A089A589B089B4
+89B589B689B789BC89D489D589D689D789D889E589E989EB89ED89F189F389F6
+89F989FD89FF8A048A058A078A0F8A118A128A148A158A1E8A208A228A248A26
+8A2B8A2C8A2F8A358A378A3D8A3E8A408A438A458A478A498A4D8A4E8A538A56
+8A578A588A5C8A5D8A618A658A678A758A768A778A798A7A8A7B8A7E8A7F8A80
+8A838A868A8B8A8F8A908A928A968A978A998A9F8AA78AA98AAE8AAF8AB30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008AB68AB78ABB8ABE8AC38AC68AC88AC98ACA8AD18AD38AD48AD58AD78ADD
+8ADF8AEC8AF08AF48AF58AF68AFC8AFF8B058B068B0B8B118B1C8B1E8B1F8B0A
+8B2D8B308B378B3C8B428B438B448B458B468B488B528B538B548B598B4D8B5E
+8B638B6D8B768B788B798B7C8B7E8B818B848B858B8B8B8D8B8F8B948B958B9C
+8B9E8B9F8C388C398C3D8C3E8C458C478C498C4B8C4F8C518C538C548C578C58
+8C5B8C5D8C598C638C648C668C688C698C6D8C738C758C768C7B8C7E8C860000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008C878C8B8C908C928C938C998C9B8C9C8CA48CB98CBA8CC58CC68CC98CCB
+8CCF8CD68CD58CD98CDD8CE18CE88CEC8CEF8CF08CF28CF58CF78CF88CFE8CFF
+8D018D038D098D128D178D1B8D658D698D6C8D6E8D7F8D828D848D888D8D8D90
+8D918D958D9E8D9F8DA08DA68DAB8DAC8DAF8DB28DB58DB78DB98DBB8DC08DC5
+8DC68DC78DC88DCA8DCE8DD18DD48DD58DD78DD98DE48DE58DE78DEC8DF08DBC
+8DF18DF28DF48DFD8E018E048E058E068E0B8E118E148E168E208E218E220000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E238E268E278E318E338E368E378E388E398E3D8E408E418E4B8E4D8E4E
+8E4F8E548E5B8E5C8E5D8E5E8E618E628E698E6C8E6D8E6F8E708E718E798E7A
+8E7B8E828E838E898E908E928E958E9A8E9B8E9D8E9E8EA28EA78EA98EAD8EAE
+8EB38EB58EBA8EBB8EC08EC18EC38EC48EC78ECF8ED18ED48EDC8EE88EEE8EF0
+8EF18EF78EF98EFA8EED8F008F028F078F088F0F8F108F168F178F188F1E8F20
+8F218F238F258F278F288F2C8F2D8F2E8F348F358F368F378F3A8F408F410000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008F438F478F4F8F518F528F538F548F558F588F5D8F5E8F658F9D8FA08FA1
+8FA48FA58FA68FB58FB68FB88FBE8FC08FC18FC68FCA8FCB8FCD8FD08FD28FD3
+8FD58FE08FE38FE48FE88FEE8FF18FF58FF68FFB8FFE900290049008900C9018
+901B90289029902F902A902C902D903390349037903F90439044904C905B905D
+906290669067906C90709074907990859088908B908C908E9090909590979098
+9099909B90A090A190A290A590B090B290B390B490B690BD90CC90BE90C30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000090C490C590C790C890D590D790D890D990DC90DD90DF90E590D290F690EB
+90EF90F090F490FE90FF91009104910591069108910D91109114911691179118
+911A911C911E912091259122912391279129912E912F91319134913691379139
+913A913C913D914391479148914F915391579159915A915B916191649167916D
+91749179917A917B9181918391859186918A918E91919193919491959198919E
+91A191A691A891AC91AD91AE91B091B191B291B391B691BB91BC91BD91BF0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000091C291C391C591D391D491D791D991DA91DE91E491E591E991EA91EC91ED
+91EE91EF91F091F191F791F991FB91FD9200920192049205920692079209920A
+920C92109212921392169218921C921D92239224922592269228922E922F9230
+92339235923692389239923A923C923E92409242924392469247924A924D924E
+924F925192589259925C925D926092619265926792689269926E926F92709275
+9276927792789279927B927C927D927F92889289928A928D928E929292970000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009299929F92A092A492A592A792A892AB92AF92B292B692B892BA92BB92BC
+92BD92BF92C092C192C292C392C592C692C792C892CB92CC92CD92CE92D092D3
+92D592D792D892D992DC92DD92DF92E092E192E392E592E792E892EC92EE92F0
+92F992FB92FF930093029308930D931193149315931C931D931E931F93219324
+932593279329932A933393349336933793479348934993509351935293559357
+9358935A935E9364936593679369936A936D936F937093719373937493760000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000937A937D937F9380938193829388938A938B938D938F939293959398939B
+939E93A193A393A493A693A893AB93B493B593B693BA93A993C193C493C593C6
+93C793C993CA93CB93CC93CD93D393D993DC93DE93DF93E293E693E793F993F7
+93F893FA93FB93FD94019402940494089409940D940E940F941594169417941F
+942E942F9431943294339434943B943F943D944394459448944A944C94559459
+945C945F946194639468946B946D946E946F9471947294849483957895790000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000957E95849588958C958D958E959D959E959F95A195A695A995AB95AC95B4
+95B695BA95BD95BF95C695C895C995CB95D095D195D295D395D995DA95DD95DE
+95DF95E095E495E6961D961E9622962496259626962C96319633963796389639
+963A963C963D9641965296549656965796589661966E9674967B967C967E967F
+9681968296839684968996919696969A969D969F96A496A596A696A996AE96AF
+96B396BA96CA96D25DB296D896DA96DD96DE96DF96E996EF96F196FA97020000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000970397059709971A971B971D97219722972397289731973397419743974A
+974E974F975597579758975A975B97639767976A976E9773977697779778977B
+977D977F978097899795979697979799979A979E979F97A297AC97AE97B197B2
+97B597B697B897B997BA97BC97BE97BF97C197C497C597C797C997CA97CC97CD
+97CE97D097D197D497D797D897D997DD97DE97E097DB97E197E497EF97F197F4
+97F797F897FA9807980A9819980D980E98149816981C981E9820982398260000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000982B982E982F98309832983398359825983E98449847984A985198529853
+985698579859985A9862986398659866986A986C98AB98AD98AE98B098B498B7
+98B898BA98BB98BF98C298C598C898CC98E198E398E598E698E798EA98F398F6
+9902990799089911991599169917991A991B991C991F992299269927992B9931
+99329933993499359939993A993B993C99409941994699479948994D994E9954
+99589959995B995C995E995F9960999B999D999F99A699B099B199B299B50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000099B999BA99BD99BF99C399C999D399D499D999DA99DC99DE99E799EA99EB
+99EC99F099F499F599F999FD99FE9A029A039A049A0B9A0C9A109A119A169A1E
+9A209A229A239A249A279A2D9A2E9A339A359A369A389A479A419A449A4A9A4B
+9A4C9A4E9A519A549A569A5D9AAA9AAC9AAE9AAF9AB29AB49AB59AB69AB99ABB
+9ABE9ABF9AC19AC39AC69AC89ACE9AD09AD29AD59AD69AD79ADB9ADC9AE09AE4
+9AE59AE79AE99AEC9AF29AF39AF59AF99AFA9AFD9AFF9B009B019B029B030000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B049B059B089B099B0B9B0C9B0D9B0E9B109B129B169B199B1B9B1C9B20
+9B269B2B9B2D9B339B349B359B379B399B3A9B3D9B489B4B9B4C9B559B569B57
+9B5B9B5E9B619B639B659B669B689B6A9B6B9B6C9B6D9B6E9B739B759B779B78
+9B799B7F9B809B849B859B869B879B899B8A9B8B9B8D9B8F9B909B949B9A9B9D
+9B9E9BA69BA79BA99BAC9BB09BB19BB29BB79BB89BBB9BBC9BBE9BBF9BC19BC7
+9BC89BCE9BD09BD79BD89BDD9BDF9BE59BE79BEA9BEB9BEF9BF39BF79BF80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009BF99BFA9BFD9BFF9C009C029C0B9C0F9C119C169C189C199C1A9C1C9C1E
+9C229C239C269C279C289C299C2A9C319C359C369C379C3D9C419C439C449C45
+9C499C4A9C4E9C4F9C509C539C549C569C589C5B9C5D9C5E9C5F9C639C699C6A
+9C5C9C6B9C689C6E9C709C729C759C779C7B9CE69CF29CF79CF99D0B9D029D11
+9D179D189D1C9D1D9D1E9D2F9D309D329D339D349D3A9D3C9D459D3D9D429D43
+9D479D4A9D539D549D5F9D639D629D659D699D6A9D6B9D709D769D779D7B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009D7C9D7E9D839D849D869D8A9D8D9D8E9D929D939D959D969D979D989DA1
+9DAA9DAC9DAE9DB19DB59DB99DBC9DBF9DC39DC79DC99DCA9DD49DD59DD69DD7
+9DDA9DDE9DDF9DE09DE59DE79DE99DEB9DEE9DF09DF39DF49DFE9E0A9E029E07
+9E0E9E109E119E129E159E169E199E1C9E1D9E7A9E7B9E7C9E809E829E839E84
+9E859E879E8E9E8F9E969E989E9B9E9E9EA49EA89EAC9EAE9EAF9EB09EB39EB4
+9EB59EC69EC89ECB9ED59EDF9EE49EE79EEC9EED9EEE9EF09EF19EF29EF50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009EF89EFF9F029F039F099F0F9F109F119F129F149F169F179F199F1A9F1B
+9F1F9F229F269F2A9F2B9F2F9F319F329F349F379F399F3A9F3C9F3D9F3F9F41
+9F439F449F459F469F479F539F559F569F579F589F5A9F5D9F5E9F689F699F6D
+9F6E9F6F9F709F719F739F759F7A9F7D9F8F9F909F919F929F949F969F979F9E
+9FA19FA29FA39FA5000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/koi8-r.enc b/ext/Encode/Encode/koi8-r.enc
new file mode 100644 (file)
index 0000000..49bf2ea
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: koi8-r, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+25002502250C251025142518251C2524252C2534253C258025842588258C2590
+259125922593232025A02219221A22482264226500A0232100B000B200B700F7
+25502551255204512553255425552556255725582559255A255B255C255D255E
+255F25602561040125622563256425652566256725682569256A256B256C00A9
+044E0430043104460434043504440433044504380439043A043B043C043D043E
+043F044F044004410442044304360432044C044B04370448044D04490447044A
+042E0410041104260414041504240413042504180419041A041B041C041D041E
+041F042F042004210422042304160412042C042B04170428042D04290427042A
diff --git a/ext/Encode/Encode/ksc5601.enc b/ext/Encode/Encode/ksc5601.enc
new file mode 100644 (file)
index 0000000..bec61d0
--- /dev/null
@@ -0,0 +1,1516 @@
+# Encoding file: ksc5601, double-byte
+D
+233F 0 89
+21
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030003001300200B72025202600A8300300AD20152225FF3C223C20182019
+201C201D3014301530083009300A300B300C300D300E300F3010301100B100D7
+00F7226022642265221E223400B0203220332103212BFFE0FFE1FFE526422640
+222022A52312220222072261225200A7203B2606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC219221902191219321943013226A226B221A223D
+221D2235222B222C2208220B2286228722822283222A222922272228FFE20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+22
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000021D221D42200220300B4FF5E02C702D802DD02DA02D900B802DB00A100BF
+02D0222E2211220F00A42109203025C125C025B725B626642660266126652667
+2663229925C825A325D025D1259225A425A525A825A725A625A92668260F260E
+261C261E00B62020202121952197219921962198266D2669266A266C327F321C
+211633C7212233C233D821210000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+23
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF01FF02FF03FF04FF05FF06FF07FF08FF09FF0AFF0BFF0CFF0DFF0EFF0F
+FF10FF11FF12FF13FF14FF15FF16FF17FF18FF19FF1AFF1BFF1CFF1DFF1EFF1F
+FF20FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2F
+FF30FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3AFF3BFFE6FF3DFF3EFF3F
+FF40FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5AFF5BFF5CFF5DFFE30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+24
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000313131323133313431353136313731383139313A313B313C313D313E313F
+3140314131423143314431453146314731483149314A314B314C314D314E314F
+3150315131523153315431553156315731583159315A315B315C315D315E315F
+3160316131623163316431653166316731683169316A316B316C316D316E316F
+3170317131723173317431753176317731783179317A317B317C317D317E317F
+3180318131823183318431853186318731883189318A318B318C318D318E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+25
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000217021712172217321742175217621772178217900000000000000000000
+2160216121622163216421652166216721682169000000000000000000000000
+0000039103920393039403950396039703980399039A039B039C039D039E039F
+03A003A103A303A403A503A603A703A803A90000000000000000000000000000
+000003B103B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF
+03C003C103C303C403C503C603C703C803C90000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+26
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000025002502250C251025182514251C252C25242534253C25012503250F2513
+251B251725232533252B253B254B2520252F25282537253F251D253025252538
+254225122511251A251925162515250E250D251E251F25212522252625272529
+252A252D252E25312532253525362539253A253D253E25402541254325442545
+2546254725482549254A00000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+27
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00003395339633972113339833C433A333A433A533A63399339A339B339C339D
+339E339F33A033A133A233CA338D338E338F33CF3388338933C833A733A833B0
+33B133B233B333B433B533B633B733B833B93380338133823383338433BA33BB
+33BC33BD33BE33BF33903391339233933394212633C033C1338A338B338C33D6
+33C533AD33AE33AF33DB33A933AA33AB33AC33DD33D033D333C333C933DC33C6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+28
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000C600D000AA0126000001320000013F014100D8015200BA00DE0166014A
+00003260326132623263326432653266326732683269326A326B326C326D326E
+326F3270327132723273327432753276327732783279327A327B24D024D124D2
+24D324D424D524D624D724D824D924DA24DB24DC24DD24DE24DF24E024E124E2
+24E324E424E524E624E724E824E9246024612462246324642465246624672468
+2469246A246B246C246D246E00BD2153215400BC00BE215B215C215D215E0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+29
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000E6011100F001270131013301380140014200F8015300DF00FE0167014B
+01493200320132023203320432053206320732083209320A320B320C320D320E
+320F3210321132123213321432153216321732183219321A321B249C249D249E
+249F24A024A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE
+24AF24B024B124B224B324B424B5247424752476247724782479247A247B247C
+247D247E247F24802481248200B900B200B32074207F20812082208320840000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000304130423043304430453046304730483049304A304B304C304D304E304F
+3050305130523053305430553056305730583059305A305B305C305D305E305F
+3060306130623063306430653066306730683069306A306B306C306D306E306F
+3070307130723073307430753076307730783079307A307B307C307D307E307F
+3080308130823083308430853086308730883089308A308B308C308D308E308F
+3090309130923093000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000030A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF
+30B030B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF
+30C030C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF
+30D030D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000004100411041204130414041504010416041704180419041A041B041C041D
+041E041F0420042104220423042404250426042704280429042A042B042C042D
+042E042F00000000000000000000000000000000000000000000000000000000
+000004300431043204330434043504510436043704380439043A043B043C043D
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AC00AC01AC04AC07AC08AC09AC0AAC10AC11AC12AC13AC14AC15AC16AC17
+AC19AC1AAC1BAC1CAC1DAC20AC24AC2CAC2DAC2FAC30AC31AC38AC39AC3CAC40
+AC4BAC4DAC54AC58AC5CAC70AC71AC74AC77AC78AC7AAC80AC81AC83AC84AC85
+AC86AC89AC8AAC8BAC8CAC90AC94AC9CAC9DAC9FACA0ACA1ACA8ACA9ACAAACAC
+ACAFACB0ACB8ACB9ACBBACBCACBDACC1ACC4ACC8ACCCACD5ACD7ACE0ACE1ACE4
+ACE7ACE8ACEAACECACEFACF0ACF1ACF3ACF5ACF6ACFCACFDAD00AD04AD060000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+31
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AD0CAD0DAD0FAD11AD18AD1CAD20AD29AD2CAD2DAD34AD35AD38AD3CAD44
+AD45AD47AD49AD50AD54AD58AD61AD63AD6CAD6DAD70AD73AD74AD75AD76AD7B
+AD7CAD7DAD7FAD81AD82AD88AD89AD8CAD90AD9CAD9DADA4ADB7ADC0ADC1ADC4
+ADC8ADD0ADD1ADD3ADDCADE0ADE4ADF8ADF9ADFCADFFAE00AE01AE08AE09AE0B
+AE0DAE14AE30AE31AE34AE37AE38AE3AAE40AE41AE43AE45AE46AE4AAE4CAE4D
+AE4EAE50AE54AE56AE5CAE5DAE5FAE60AE61AE65AE68AE69AE6CAE70AE780000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+32
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000AE79AE7BAE7CAE7DAE84AE85AE8CAEBCAEBDAEBEAEC0AEC4AECCAECDAECF
+AED0AED1AED8AED9AEDCAEE8AEEBAEEDAEF4AEF8AEFCAF07AF08AF0DAF10AF2C
+AF2DAF30AF32AF34AF3CAF3DAF3FAF41AF42AF43AF48AF49AF50AF5CAF5DAF64
+AF65AF79AF80AF84AF88AF90AF91AF95AF9CAFB8AFB9AFBCAFC0AFC7AFC8AFC9
+AFCBAFCDAFCEAFD4AFDCAFE8AFE9AFF0AFF1AFF4AFF8B000B001B004B00CB010
+B014B01CB01DB028B044B045B048B04AB04CB04EB053B054B055B057B0590000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+33
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B05DB07CB07DB080B084B08CB08DB08FB091B098B099B09AB09CB09FB0A0
+B0A1B0A2B0A8B0A9B0ABB0ACB0ADB0AEB0AFB0B1B0B3B0B4B0B5B0B8B0BCB0C4
+B0C5B0C7B0C8B0C9B0D0B0D1B0D4B0D8B0E0B0E5B108B109B10BB10CB110B112
+B113B118B119B11BB11CB11DB123B124B125B128B12CB134B135B137B138B139
+B140B141B144B148B150B151B154B155B158B15CB160B178B179B17CB180B182
+B188B189B18BB18DB192B193B194B198B19CB1A8B1CCB1D0B1D4B1DCB1DD0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+34
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B1DFB1E8B1E9B1ECB1F0B1F9B1FBB1FDB204B205B208B20BB20CB214B215
+B217B219B220B234B23CB258B25CB260B268B269B274B275B27CB284B285B289
+B290B291B294B298B299B29AB2A0B2A1B2A3B2A5B2A6B2AAB2ACB2B0B2B4B2C8
+B2C9B2CCB2D0B2D2B2D8B2D9B2DBB2DDB2E2B2E4B2E5B2E6B2E8B2EBB2ECB2ED
+B2EEB2EFB2F3B2F4B2F5B2F7B2F8B2F9B2FAB2FBB2FFB300B301B304B308B310
+B311B313B314B315B31CB354B355B356B358B35BB35CB35EB35FB364B3650000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+35
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B367B369B36BB36EB370B371B374B378B380B381B383B384B385B38CB390
+B394B3A0B3A1B3A8B3ACB3C4B3C5B3C8B3CBB3CCB3CEB3D0B3D4B3D5B3D7B3D9
+B3DBB3DDB3E0B3E4B3E8B3FCB410B418B41CB420B428B429B42BB434B450B451
+B454B458B460B461B463B465B46CB480B488B49DB4A4B4A8B4ACB4B5B4B7B4B9
+B4C0B4C4B4C8B4D0B4D5B4DCB4DDB4E0B4E3B4E4B4E6B4ECB4EDB4EFB4F1B4F8
+B514B515B518B51BB51CB524B525B527B528B529B52AB530B531B534B5380000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+36
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B540B541B543B544B545B54BB54CB54DB550B554B55CB55DB55FB560B561
+B5A0B5A1B5A4B5A8B5AAB5ABB5B0B5B1B5B3B5B4B5B5B5BBB5BCB5BDB5C0B5C4
+B5CCB5CDB5CFB5D0B5D1B5D8B5ECB610B611B614B618B625B62CB634B648B664
+B668B69CB69DB6A0B6A4B6ABB6ACB6B1B6D4B6F0B6F4B6F8B700B701B705B728
+B729B72CB72FB730B738B739B73BB744B748B74CB754B755B760B764B768B770
+B771B773B775B77CB77DB780B784B78CB78DB78FB790B791B792B796B7970000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+37
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B798B799B79CB7A0B7A8B7A9B7ABB7ACB7ADB7B4B7B5B7B8B7C7B7C9B7EC
+B7EDB7F0B7F4B7FCB7FDB7FFB800B801B807B808B809B80CB810B818B819B81B
+B81DB824B825B828B82CB834B835B837B838B839B840B844B851B853B85CB85D
+B860B864B86CB86DB86FB871B878B87CB88DB8A8B8B0B8B4B8B8B8C0B8C1B8C3
+B8C5B8CCB8D0B8D4B8DDB8DFB8E1B8E8B8E9B8ECB8F0B8F8B8F9B8FBB8FDB904
+B918B920B93CB93DB940B944B94CB94FB951B958B959B95CB960B968B9690000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+38
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000B96BB96DB974B975B978B97CB984B985B987B989B98AB98DB98EB9ACB9AD
+B9B0B9B4B9BCB9BDB9BFB9C1B9C8B9C9B9CCB9CEB9CFB9D0B9D1B9D2B9D8B9D9
+B9DBB9DDB9DEB9E1B9E3B9E4B9E5B9E8B9ECB9F4B9F5B9F7B9F8B9F9B9FABA00
+BA01BA08BA15BA38BA39BA3CBA40BA42BA48BA49BA4BBA4DBA4EBA53BA54BA55
+BA58BA5CBA64BA65BA67BA68BA69BA70BA71BA74BA78BA83BA84BA85BA87BA8C
+BAA8BAA9BAABBAACBAB0BAB2BAB8BAB9BABBBABDBAC4BAC8BAD8BAD9BAFC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+39
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BB00BB04BB0DBB0FBB11BB18BB1CBB20BB29BB2BBB34BB35BB36BB38BB3B
+BB3CBB3DBB3EBB44BB45BB47BB49BB4DBB4FBB50BB54BB58BB61BB63BB6CBB88
+BB8CBB90BBA4BBA8BBACBBB4BBB7BBC0BBC4BBC8BBD0BBD3BBF8BBF9BBFCBBFF
+BC00BC02BC08BC09BC0BBC0CBC0DBC0FBC11BC14BC15BC16BC17BC18BC1BBC1C
+BC1DBC1EBC1FBC24BC25BC27BC29BC2DBC30BC31BC34BC38BC40BC41BC43BC44
+BC45BC49BC4CBC4DBC50BC5DBC84BC85BC88BC8BBC8CBC8EBC94BC95BC970000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BC99BC9ABCA0BCA1BCA4BCA7BCA8BCB0BCB1BCB3BCB4BCB5BCBCBCBDBCC0
+BCC4BCCDBCCFBCD0BCD1BCD5BCD8BCDCBCF4BCF5BCF6BCF8BCFCBD04BD05BD07
+BD09BD10BD14BD24BD2CBD40BD48BD49BD4CBD50BD58BD59BD64BD68BD80BD81
+BD84BD87BD88BD89BD8ABD90BD91BD93BD95BD99BD9ABD9CBDA4BDB0BDB8BDD4
+BDD5BDD8BDDCBDE9BDF0BDF4BDF8BE00BE03BE05BE0CBE0DBE10BE14BE1CBE1D
+BE1FBE44BE45BE48BE4CBE4EBE54BE55BE57BE59BE5ABE5BBE60BE61BE640000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000BE68BE6ABE70BE71BE73BE74BE75BE7BBE7CBE7DBE80BE84BE8CBE8DBE8F
+BE90BE91BE98BE99BEA8BED0BED1BED4BED7BED8BEE0BEE3BEE4BEE5BEECBF01
+BF08BF09BF18BF19BF1BBF1CBF1DBF40BF41BF44BF48BF50BF51BF55BF94BFB0
+BFC5BFCCBFCDBFD0BFD4BFDCBFDFBFE1C03CC051C058C05CC060C068C069C090
+C091C094C098C0A0C0A1C0A3C0A5C0ACC0ADC0AFC0B0C0B3C0B4C0B5C0B6C0BC
+C0BDC0BFC0C0C0C1C0C5C0C8C0C9C0CCC0D0C0D8C0D9C0DBC0DCC0DDC0E40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C0E5C0E8C0ECC0F4C0F5C0F7C0F9C100C104C108C110C115C11CC11DC11E
+C11FC120C123C124C126C127C12CC12DC12FC130C131C136C138C139C13CC140
+C148C149C14BC14CC14DC154C155C158C15CC164C165C167C168C169C170C174
+C178C185C18CC18DC18EC190C194C196C19CC19DC19FC1A1C1A5C1A8C1A9C1AC
+C1B0C1BDC1C4C1C8C1CCC1D4C1D7C1D8C1E0C1E4C1E8C1F0C1F1C1F3C1FCC1FD
+C200C204C20CC20DC20FC211C218C219C21CC21FC220C228C229C22BC22D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C22FC231C232C234C248C250C251C254C258C260C265C26CC26DC270C274
+C27CC27DC27FC281C288C289C290C298C29BC29DC2A4C2A5C2A8C2ACC2ADC2B4
+C2B5C2B7C2B9C2DCC2DDC2E0C2E3C2E4C2EBC2ECC2EDC2EFC2F1C2F6C2F8C2F9
+C2FBC2FCC300C308C309C30CC30DC313C314C315C318C31CC324C325C328C329
+C345C368C369C36CC370C372C378C379C37CC37DC384C388C38CC3C0C3D8C3D9
+C3DCC3DFC3E0C3E2C3E8C3E9C3EDC3F4C3F5C3F8C408C410C424C42CC4300000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C434C43CC43DC448C464C465C468C46CC474C475C479C480C494C49CC4B8
+C4BCC4E9C4F0C4F1C4F4C4F8C4FAC4FFC500C501C50CC510C514C51CC528C529
+C52CC530C538C539C53BC53DC544C545C548C549C54AC54CC54DC54EC553C554
+C555C557C558C559C55DC55EC560C561C564C568C570C571C573C574C575C57C
+C57DC580C584C587C58CC58DC58FC591C595C597C598C59CC5A0C5A9C5B4C5B5
+C5B8C5B9C5BBC5BCC5BDC5BEC5C4C5C5C5C6C5C7C5C8C5C9C5CAC5CCC5CE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C5D0C5D1C5D4C5D8C5E0C5E1C5E3C5E5C5ECC5EDC5EEC5F0C5F4C5F6C5F7
+C5FCC5FDC5FEC5FFC600C601C605C606C607C608C60CC610C618C619C61BC61C
+C624C625C628C62CC62DC62EC630C633C634C635C637C639C63BC640C641C644
+C648C650C651C653C654C655C65CC65DC660C66CC66FC671C678C679C67CC680
+C688C689C68BC68DC694C695C698C69CC6A4C6A5C6A7C6A9C6B0C6B1C6B4C6B8
+C6B9C6BAC6C0C6C1C6C3C6C5C6CCC6CDC6D0C6D4C6DCC6DDC6E0C6E1C6E80000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+40
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C6E9C6ECC6F0C6F8C6F9C6FDC704C705C708C70CC714C715C717C719C720
+C721C724C728C730C731C733C735C737C73CC73DC740C744C74AC74CC74DC74F
+C751C752C753C754C755C756C757C758C75CC760C768C76BC774C775C778C77C
+C77DC77EC783C784C785C787C788C789C78AC78EC790C791C794C796C797C798
+C79AC7A0C7A1C7A3C7A4C7A5C7A6C7ACC7ADC7B0C7B4C7BCC7BDC7BFC7C0C7C1
+C7C8C7C9C7CCC7CEC7D0C7D8C7DDC7E4C7E8C7ECC800C801C804C808C80A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+41
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C810C811C813C815C816C81CC81DC820C824C82CC82DC82FC831C838C83C
+C840C848C849C84CC84DC854C870C871C874C878C87AC880C881C883C885C886
+C887C88BC88CC88DC894C89DC89FC8A1C8A8C8BCC8BDC8C4C8C8C8CCC8D4C8D5
+C8D7C8D9C8E0C8E1C8E4C8F5C8FCC8FDC900C904C905C906C90CC90DC90FC911
+C918C92CC934C950C951C954C958C960C961C963C96CC970C974C97CC988C989
+C98CC990C998C999C99BC99DC9C0C9C1C9C4C9C7C9C8C9CAC9D0C9D1C9D30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+42
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000C9D5C9D6C9D9C9DAC9DCC9DDC9E0C9E2C9E4C9E7C9ECC9EDC9EFC9F0C9F1
+C9F8C9F9C9FCCA00CA08CA09CA0BCA0CCA0DCA14CA18CA29CA4CCA4DCA50CA54
+CA5CCA5DCA5FCA60CA61CA68CA7DCA84CA98CABCCABDCAC0CAC4CACCCACDCACF
+CAD1CAD3CAD8CAD9CAE0CAECCAF4CB08CB10CB14CB18CB20CB21CB41CB48CB49
+CB4CCB50CB58CB59CB5DCB64CB78CB79CB9CCBB8CBD4CBE4CBE7CBE9CC0CCC0D
+CC10CC14CC1CCC1DCC21CC22CC27CC28CC29CC2CCC2ECC30CC38CC39CC3B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+43
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CC3CCC3DCC3ECC44CC45CC48CC4CCC54CC55CC57CC58CC59CC60CC64CC66
+CC68CC70CC75CC98CC99CC9CCCA0CCA8CCA9CCABCCACCCADCCB4CCB5CCB8CCBC
+CCC4CCC5CCC7CCC9CCD0CCD4CCE4CCECCCF0CD01CD08CD09CD0CCD10CD18CD19
+CD1BCD1DCD24CD28CD2CCD39CD5CCD60CD64CD6CCD6DCD6FCD71CD78CD88CD94
+CD95CD98CD9CCDA4CDA5CDA7CDA9CDB0CDC4CDCCCDD0CDE8CDECCDF0CDF8CDF9
+CDFBCDFDCE04CE08CE0CCE14CE19CE20CE21CE24CE28CE30CE31CE33CE350000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+44
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000CE58CE59CE5CCE5FCE60CE61CE68CE69CE6BCE6DCE74CE75CE78CE7CCE84
+CE85CE87CE89CE90CE91CE94CE98CEA0CEA1CEA3CEA4CEA5CEACCEADCEC1CEE4
+CEE5CEE8CEEBCEECCEF4CEF5CEF7CEF8CEF9CF00CF01CF04CF08CF10CF11CF13
+CF15CF1CCF20CF24CF2CCF2DCF2FCF30CF31CF38CF54CF55CF58CF5CCF64CF65
+CF67CF69CF70CF71CF74CF78CF80CF85CF8CCFA1CFA8CFB0CFC4CFE0CFE1CFE4
+CFE8CFF0CFF1CFF3CFF5CFFCD000D004D011D018D02DD034D035D038D03C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+45
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D044D045D047D049D050D054D058D060D06CD06DD070D074D07CD07DD081
+D0A4D0A5D0A8D0ACD0B4D0B5D0B7D0B9D0C0D0C1D0C4D0C8D0C9D0D0D0D1D0D3
+D0D4D0D5D0DCD0DDD0E0D0E4D0ECD0EDD0EFD0F0D0F1D0F8D10DD130D131D134
+D138D13AD140D141D143D144D145D14CD14DD150D154D15CD15DD15FD161D168
+D16CD17CD184D188D1A0D1A1D1A4D1A8D1B0D1B1D1B3D1B5D1BAD1BCD1C0D1D8
+D1F4D1F8D207D209D210D22CD22DD230D234D23CD23DD23FD241D248D25C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+46
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D264D280D281D284D288D290D291D295D29CD2A0D2A4D2ACD2B1D2B8D2B9
+D2BCD2BFD2C0D2C2D2C8D2C9D2CBD2D4D2D8D2DCD2E4D2E5D2F0D2F1D2F4D2F8
+D300D301D303D305D30CD30DD30ED310D314D316D31CD31DD31FD320D321D325
+D328D329D32CD330D338D339D33BD33CD33DD344D345D37CD37DD380D384D38C
+D38DD38FD390D391D398D399D39CD3A0D3A8D3A9D3ABD3ADD3B4D3B8D3BCD3C4
+D3C5D3C8D3C9D3D0D3D8D3E1D3E3D3ECD3EDD3F0D3F4D3FCD3FDD3FFD4010000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+47
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D408D41DD440D444D45CD460D464D46DD46FD478D479D47CD47FD480D482
+D488D489D48BD48DD494D4A9D4CCD4D0D4D4D4DCD4DFD4E8D4ECD4F0D4F8D4FB
+D4FDD504D508D50CD514D515D517D53CD53DD540D544D54CD54DD54FD551D558
+D559D55CD560D565D568D569D56BD56DD574D575D578D57CD584D585D587D588
+D589D590D5A5D5C8D5C9D5CCD5D0D5D2D5D8D5D9D5DBD5DDD5E4D5E5D5E8D5EC
+D5F4D5F5D5F7D5F9D600D601D604D608D610D611D613D614D615D61CD6200000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000D624D62DD638D639D63CD640D645D648D649D64BD64DD651D654D655D658
+D65CD667D669D670D671D674D683D685D68CD68DD690D694D69DD69FD6A1D6A8
+D6ACD6B0D6B9D6BBD6C4D6C5D6C8D6CCD6D1D6D4D6D7D6D9D6E0D6E4D6E8D6F0
+D6F5D6FCD6FDD700D704D711D718D719D71CD720D728D729D72BD72DD734D735
+D738D73CD744D747D749D750D751D754D756D757D758D759D760D761D763D765
+D769D76CD770D774D77CD77DD781D788D789D78CD790D798D799D79BD79D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004F3D4F73504750F952A053EF547554E556095AC15BB6668767B667B767EF
+6B4C73C275C27A3C82DB8304885788888A368CC88DCF8EFB8FE699D5523B5374
+5404606A61646BBC73CF811A89BA89D295A34F83520A58BE597859E65E725E79
+61C763C0674667EC687F6F97764E770B78F57A087AFF7C21809D826E82718AEB
+95934E6B559D66F76E3478A37AED845B8910874E97A852D8574E582A5D4C611F
+61BE6221656267D16A446E1B751875B376E377B07D3A90AF945194529F950000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000053235CAC753280DB92409598525B580859DC5CA15D175EB75F3A5F4A6177
+6C5F757A75867CE07D737DB17F8C81548221859189418B1B92FC964D9C474ECB
+4EF7500B51F1584F6137613E6168653969EA6F1175A5768676D67B8782A584CB
+F90093A7958B55805BA25751F9017CB37FB991B5502853BB5C455DE862D2636E
+64DA64E76E2070AC795B8DDD8E1EF902907D924592F84E7E4EF650655DFE5EFA
+61066957817186548E4793759A2B4E5E5091677068405109528D52926AA20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000077BC92109ED452AB602F8FF2504861A963ED64CA683C6A846FC0818889A1
+96945805727D72AC75047D797E6D80A9898B8B7490639D5162896C7A6F547D50
+7F3A8A23517C614A7B9D8B199257938C4EAC4FD3501E50BE510652C152CD537F
+577058835E9A5F91617661AC64CE656C666F66BB66F468976D87708570F1749F
+74A574CA75D9786C78EC7ADF7AF67D457D938015803F811B83968B668F159015
+93E1980398389A5A9BE84FC25553583A59515B635C4660B86212684268B00000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068E86EAA754C767878CE7A3D7CFB7E6B7E7C8A088AA18C3F968E9DC453E4
+53E9544A547156FA59D15B645C3B5EAB62F765376545657266A067AF69C16CBD
+75FC7690777E7A3F7F94800380A1818F82E682FD83F085C1883188B48AA5F903
+8F9C932E96C798679AD89F1354ED659B66F2688F7A408C379D6056F057645D11
+660668B168CD6EFE7428889E9BE46C68F9049AA84F9B516C5171529F5B545DE5
+6050606D62F163A7653B73D97A7A86A38CA2978F4E325BE16208679C74DC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000079D183D38A878AB28DE8904E934B98465ED369E885FF90EDF90551A05B98
+5BEC616368FA6B3E704C742F74D87BA17F5083C589C08CAB95DC9928522E605D
+62EC90024F8A5149532158D95EE366E06D38709A72C273D67B5080F1945B5366
+639B7F6B4E565080584A58DE602A612762D069D09B415B8F7D1880B18F5F4EA4
+50D154AC55AC5B0C5DA05DE7652A654E68216A4B72E1768E77EF7D5E7FF981A0
+854E86DF8F038F4E90CA99039A559BAB4E184E454E5D4EC74FF1517752FE0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+4F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000534053E353E5548E5614577557A25BC75D875ED061FC62D8655167B867E9
+69CB6B506BC66BEC6C426E9D707872D77396740377BF77E97A767D7F800981FC
+8205820A82DF88628B338CFC8EC0901190B1926492B699D29A459CE99DD79F9C
+570B5C4083CA97A097AB9EB4541B7A987FA488D98ECD90E158005C4863987A9F
+5BAE5F137A797AAE828E8EAC5026523852F85377570862F363726B0A6DC37737
+53A5735785688E7695D5673A6AC36F708A6D8ECC994BF90666776B788CB40000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00009B3CF90753EB572D594E63C669FB73EA78457ABA7AC57CFE8475898F8D73
+903595A852FB574775477B6083CC921EF9086A58514B524B5287621F68D86975
+969950C552A452E461C365A4683969FF747E7B4B82B983EB89B28B398FD19949
+F9094ECA599764D266116A8E7434798179BD82A9887E887F895FF90A93264F0B
+53CA602562716C727D1A7D664E98516277DC80AF4F014F0E5176518055DC5668
+573B57FA57FC5914594759935BC45C905D0E5DF15E7E5FCC628065D765E30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+51
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000671E671F675E68CB68C46A5F6B3A6C236C7D6C826DC773987426742A7482
+74A37578757F788178EF794179477948797A7B957D007DBA7F888006802D808C
+8A188B4F8C488D779321932498E299519A0E9A0F9A659E927DCA4F76540962EE
+685491D155AB513AF90BF90C5A1C61E6F90D62CF62FFF90EF90FF910F911F912
+F91390A3F914F915F916F917F9188AFEF919F91AF91BF91C6696F91D7156F91E
+F91F96E3F920634F637A5357F921678F69606E73F9227537F923F924F9250000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+52
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007D0DF926F927887256CA5A18F928F929F92AF92BF92C4E43F92D51675948
+67F08010F92E59735E74649A79CA5FF5606C62C8637B5BE75BD752AAF92F5974
+5F296012F930F931F9327459F933F934F935F936F937F93899D1F939F93AF93B
+F93CF93DF93EF93FF940F941F942F9436FC3F944F94581BF8FB260F1F946F947
+8166F948F9495C3FF94AF94BF94CF94DF94EF94FF950F9515AE98A25677B7D10
+F952F953F954F955F956F95780FDF958F9595C3C6CE5533F6EBA591A83360000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00004E394EB64F4655AE571858C75F5665B765E66A806BB56E4D77ED7AEF7C1E
+7DDE86CB88929132935B64BB6FBE737A75B890545556574D61BA64D466C76DE1
+6E5B6F6D6FB975F0804381BD854189838AC78B5A931F6C9375537B548E0F905D
+5510580258585E626207649E68E075767CD687B39EE84EE35788576E59275C0D
+5CB15E365F85623464E173B381FA888B8CB8968A9EDB5B855FB760B350125200
+52305716583558575C0E5C605CF65D8B5EA65F9260BC63116389641768430000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000068F96AC26DD86E216ED46FE471FE76DC777979B17A3B840489A98CED8DF3
+8E4890039014905390FD934D967697DC6BD27006725872A27368776379BF7BE4
+7E9B8B8058A960C7656665FD66BE6C8C711E71C98C5A98134E6D7A814EDD51AC
+51CD52D5540C61A76771685068DF6D1E6F7C75BC77B37AE580F484639285515C
+6597675C679375D87AC78373F95A8C469017982D5C6F81C0829A9041906F920D
+5F975D9D6A5971C8767B7B4985E48B0491279A30558761F6F95B76697F850000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+55
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000863F87BA88F8908FF95C6D1B70D973DE7D61843DF95D916A99F1F95E4E82
+53756B046B12703E721B862D9E1E524C8FA35D5064E5652C6B166FEB7C437E9C
+85CD896489BD62C981D8881F5ECA67176D6A72FC7405746F878290DE4F865D0D
+5FA0840A51B763A075654EAE5006516951C968816A117CAE7CB17CE7826F8AD2
+8F1B91CF4FB6513752F554425EEC616E623E65C56ADA6FFE792A85DC882395AD
+9A629A6A9E979ECE529B66C66B77701D792B8F6297426190620065236F230000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+56
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714974897DF4806F84EE8F269023934A51BD521752A36D0C70C888C25EC9
+65826BAE6FC27C3E73754EE44F3656F9F95F5CBA5DBA601C73B27B2D7F9A7FCE
+8046901E923496F6974898189F614F8B6FA779AE91B496B752DEF960648864C4
+6AD36F5E7018721076E780018606865C8DEF8F0597329B6F9DFA9E75788C797F
+7DA083C993049E7F9E938AD658DF5F046727702774CF7C60807E512170287262
+78CA8CC28CDA8CF496F74E8650DA5BEE5ED6659971CE764277AD804A84FC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+57
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000907C9B279F8D58D85A415C626A136DDA6F0F763B7D2F7E37851E893893E4
+964B528965D267F369B46D416E9C700F7409746075597624786B8B2C985E516D
+622E96784F96502B5D196DEA7DB88F2A5F8B61446817F961968652D2808B51DC
+51CC695E7A1C7DBE83F196754FDA52295398540F550E5C6560A7674E68A86D6C
+728172F874067483F96275E27C6C7F797FB8838988CF88E191CC91D096E29BC9
+541D6F7E71D0749885FA8EAA96A39C579E9F67976DCB743381E89716782C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+58
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007ACB7B207C926469746A75F278BC78E899AC9B549EBB5BDE5E556F20819C
+83AB90884E07534D5A295DD25F4E6162633D666966FC6EFF6F2B7063779E842C
+8513883B8F1399459C3B551C62B9672B6CAB8309896A977A4EA159845FD85FD9
+671B7DB27F548292832B83BD8F1E909957CB59B95A925BD06627679A68856BCF
+71647F758CB78CE390819B4581088C8A964C9A409EA55B5F6C13731B76F276DF
+840C51AA8993514D519552C968C96C94770477207DBF7DEC97629EB56EC50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000851151A5540D547D660E669D69276E9F76BF7791831784C2879F91699298
+9CF488824FAE519252DF59C65E3D61556478647966AE67D06A216BCD6BDB725F
+72617441773877DB801782BC83058B008B288C8C67286C90726776EE77667A46
+9DA96B7F6C92592267268499536F589359995EDF63CF663467736E3A732B7AD7
+82D7932852D95DEB61AE61CB620A62C764AB65E069596B666BCB712173F7755D
+7E46821E8302856A8AA38CBF97279D6158A89ED85011520E543B554F65870000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006C767D0A7D0B805E868A958096EF52FF6C95726954735A9A5C3E5D4B5F4C
+5FAE672A68B669636E3C6E4477097C737F8E85878B0E8FF797619EF45CB760B6
+610D61AB654F65FB65FC6C116CEF739F73C97DE195945BC6871C8B10525D535A
+62CD640F64B267346A386CCA73C0749E7B947C957E1B818A823685848FEB96F9
+99C14F34534A53CD53DB62CC642C6500659169C36CEE6F5873ED7554762276E4
+76FC78D078FB792C7D46822C87E08FD4981298EF52C362D464A56E246F510000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000767C8DCB91B192629AEE9B435023508D574A59A85C285E475F77623F653E
+65B965C16609678B699C6EC278C57D2180AA8180822B82B384A1868C8A2A8B17
+90A696329F90500D4FF3F96357F95F9862DC6392676F6E43711976C380CC80DA
+88F488F589198CE08F29914D966A4F2F4F705E1B67CF6822767D767E9B445E61
+6A0A716971D4756AF9647E41854385E998DC4F107B4F7F7095A551E15E0668B5
+6C3E6C4E6CDB72AF7BC483036CD5743A50FB528858C164D86A9774A776560000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000078A7861795E29739F965535E5F018B8A8FA88FAF908A522577A59C499F08
+4E19500251755C5B5E77661E663A67C468C570B3750175C579C97ADD8F279920
+9A084FDD582158315BF6666E6B656D116E7A6F7D73E4752B83E988DC89138B5C
+8F144F0F50D55310535C5B935FA9670D798F8179832F8514890789868F398F3B
+99A59C12672C4E764FF859495C015CEF5CF0636768D270FD71A2742B7E2B84EC
+8702902292D29CF34E0D4ED84FEF50855256526F5426549057E0592B5A660000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005B5A5B755BCC5E9CF9666276657765A76D6E6EA572367B267C3F7F368150
+8151819A8240829983A98A038CA08CE68CFB8D748DBA90E891DC961C964499D9
+9CE7531752065429567458B35954596E5FFF61A4626E66106C7E711A76C67C89
+7CDE7D1B82AC8CC196F0F9674F5B5F175F7F62C25D29670B68DA787C7E439D6C
+4E1550995315532A535159835A625E8760B2618A624962796590678769A76BD4
+6BD66BD76BD86CB8F968743575FA7812789179D579D87C837DCB7FE180A50000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000813E81C283F2871A88E88AB98B6C8CBB9119975E98DB9F3B56AC5B2A5F6C
+658C6AB36BAF6D5C6FF17015725D73AD8CA78CD3983B61916C3780589A014E4D
+4E8B4E9B4ED54F3A4F3C4F7F4FDF50FF53F253F8550655E356DB58EB59625A11
+5BEB5BFA5C045DF35E2B5F99601D6368659C65AF67F667FB68AD6B7B6C996CD7
+6E23700973457802793E7940796079C17BE97D177D728086820D838E84D186C7
+88DF8A508A5E8B1D8CDC8D668FAD90AA98FC99DF9E9D524AF9696714F96A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005098522A5C7165636C5573CA7523759D7B97849C917897304E7764926BBA
+715E85A94E09F96B674968EE6E17829F8518886B63F76F81921298AF4E0A50B7
+50CF511F554655AA56175B405C195CE05E385E8A5EA05EC260F368516A616E58
+723D724072C076F879657BB17FD488F389F48A738C618CDE971C585E74BD8CFD
+55C7F96C7A617D2282727272751F7525F96D7B19588558FB5DBC5E8F5EB65F90
+60556292637F654D669166D966F8681668F27280745E7B6E7D6E7DD67F720000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+60
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000080E5821285AF897F8A93901D92E49ECD9F205915596D5E2D60DC66146673
+67906C506DC56F5F77F378A984C691CB932B4ED950CA514855845B0B5BA36247
+657E65CB6E32717D74017444748774BF766C79AA7DDA7E557FA8817A81B38239
+861A87EC8A758DE3907892919425994D9BAE53685C5169546CC46D296E2B820C
+859B893B8A2D8AAA96EA9F67526166B96BB27E9687FE8D0D9583965D651D6D89
+71EEF96E57CE59D35BAC602760FA6210661F665F732973F976DB77017B6C0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+61
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008056807281658AA091924E1652E26B726D177A057B397D30F96F8CB053EC
+562F58515BB55C0F5C115DE2624063836414662D68B36CBC6D886EAF701F70A4
+71D27526758F758E76197B117BE07C2B7D207D39852C856D86078A34900D9061
+90B592B797F69A374FD75C6C675F6D917C9F7E8C8B168D16901F5B6B5DFD640D
+84C0905C98E173875B8B609A677E6DDE8A1F8AA69001980C5237F9707051788E
+9396887091D74FEE53D755FD56DA578258FD5AC25B885CAB5CC05E2561010000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000620D624B6388641C653665786A396B8A6C346D196F3171E772E973787407
+74B27626776179C07A577AEA7CB97D8F7DAC7E617F9E81298331849084DA85EA
+88968AB08B908F3890429083916C929692B9968B96A796A896D6970098089996
+9AD39B1A53D4587E59195B705BBF6DD16F5A719F742174B9808583FD5DE15F87
+5FAA604265EC6812696F6A536B896D356DF373E376FE77AC7B4D7D148123821C
+834084F485638A628AC49187931E980699B4620C88538FF092655D075D270000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005D69745F819D87686FD562FE7FD2893689724E1E4E5850E752DD5347627F
+66077E698805965E4F8D5319563659CB5AA45C385C4E5C4D5E025F11604365BD
+662F664267BE67F4731C77E2793A7FC5849484CD89968A668A698AE18C558C7A
+57F45BD45F0F606F62ED690D6B966E5C71847BD287558B588EFE98DF98FE4F38
+4F814FE1547B5A205BB8613C65B0666871FC7533795E7D33814E81E3839885AA
+85CE87038A0A8EAB8F9BF9718FC559315BA45BE660895BE95C0B5FC36C810000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+64
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9726DF1700B751A82AF8AF64EC05341F97396D96C0F4E9E4FC45152555E
+5A255CE86211725982BD83AA86FE88598A1D963F96C599139D099D5D580A5CB3
+5DBD5E4460E1611563E16A026E2591029354984E9C109F775B895CB86309664F
+6848773C96C1978D98549B9F65A18B018ECB95BC55355CA95DD65EB56697764C
+83F495C758D362BC72CE9D284EF0592E600F663B6B8379E79D26539354C057C3
+5D16611B66D66DAF788D827E969897445384627C63966DB27E0A814B984D0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006AFB7F4C9DAF9E1A4E5F503B51B6591C60F963F66930723A8036F97491CE
+5F31F975F9767D0482E5846F84BB85E58E8DF9774F6FF978F97958E45B436059
+63DA6518656D6698F97A694A6A236D0B7001716C75D2760D79B37A70F97B7F8A
+F97C8944F97D8B9391C0967DF97E990A57045FA165BC6F01760079A68A9E99AD
+9B5A9F6C510461B662916A8D81C6504358305F6671098A008AFA5B7C86164FFA
+513C56B4594463A96DF95DAA696D51864E884F59F97FF980F9815982F9820000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9836B5F6C5DF98474B57916F9858207824583398F3F8F5DF9869918F987
+F988F9894EA6F98A57DF5F796613F98BF98C75AB7E798B6FF98D90069A5B56A5
+582759F85A1F5BB4F98E5EF6F98FF9906350633BF991693D6C876CBF6D8E6D93
+6DF56F14F99270DF71367159F99371C371D5F994784F786FF9957B757DE3F996
+7E2FF997884D8EDFF998F999F99A925BF99B9CF6F99CF99DF99E60856D85F99F
+71B1F9A0F9A195B153ADF9A2F9A3F9A467D3F9A5708E71307430827682D20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+67
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9A695BB9AE59E7D66C4F9A771C18449F9A8F9A9584BF9AAF9AB5DB85F71
+F9AC6620668E697969AE6C386CF36E366F416FDA701B702F715071DF7370F9AD
+745BF9AE74D476C87A4E7E93F9AFF9B082F18A608FCEF9B19348F9B29719F9B3
+F9B44E42502AF9B5520853E166F36C6D6FCA730A777F7A6282AE85DD8602F9B6
+88D48A638B7D8C6BF9B792B3F9B8971398104E944F0D4FC950B25348543E5433
+55DA586258BA59675A1B5BE4609FF9B961CA655665FF666468A76C5A6FB30000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+68
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000070CF71AC73527B7D87088AA49C329F075C4B6C8373447389923A6EAB7465
+761F7A697E15860A514058C564C174EE751576707FC1909596CD99546E2674E6
+7AA97AAA81E586D987788A1B5A495B8C5B9B68A169006D6373A97413742C7897
+7DE97FEB81188155839E8C4C962E981166F05F8065FA67896C6A738B502D5A03
+6B6A77EE59165D6C5DCD7325754FF9BAF9BB50E551F9582F592D599659DA5BE5
+F9BCF9BD5DA262D76416649364FEF9BE66DCF9BF6A48F9C071FF7464F9C10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+69
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00007A887AAF7E477E5E80008170F9C287EF89818B209059F9C390809952617E
+6B326D747E1F89258FB14FD150AD519752C757C758895BB95EB8614269956D8C
+6E676EB6719474627528752C8073833884C98E0A939493DEF9C44E8E4F515076
+512A53C853CB53F35B875BD35C24611A618265F4725B7397744076C279507991
+79B97D067FBD828B85D5865E8FC2904790F591EA968596E896E952D65F6765ED
+6631682F715C7A3690C1980A4E91F9C56A526B9E6F907189801882B885530000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000904B969596F297FB851A9B314E90718A96C45143539F54E15713571257A3
+5A9B5AC45BC36028613F63F46C856D396E726E907230733F745782D188818F45
+9060F9C6966298589D1B67088D8A925E4F4D504950DE5371570D59D45A015C09
+617066906E2D7232744B7DEF80C3840E8466853F875F885B89188B02905597CB
+9B4F4E734F915112516AF9C7552F55A95B7A5BA55E7C5E7D5EBE60A060DF6108
+610963C465386709F9C867D467DAF9C9696169626CB96D27F9CA6E38F9CB0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006FE173367337F9CC745C7531F9CD7652F9CEF9CF7DAD81FE843888D58A98
+8ADB8AED8E308E42904A903E907A914991C9936EF9D0F9D15809F9D26BD38089
+80B2F9D3F9D45141596B5C39F9D5F9D66F6473A780E48D07F9D79217958FF9D8
+F9D9F9DAF9DB807F620E701C7D68878DF9DC57A0606961476BB78ABE928096B1
+4E59541F6DEB852D967097F398EE63D66CE3909151DD61C981BA9DF94F9D501A
+51005B9C610F61FF64EC69056BC5759177E37FA98264858F87FB88638ABC0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008B7091AB4E8C4EE54F0AF9DDF9DE593759E8F9DF5DF25F1B5F5B6021F9E0
+F9E1F9E2F9E3723E73E5F9E4757075CDF9E579FBF9E6800C8033808482E18351
+F9E7F9E88CBD8CB39087F9E9F9EA98F4990CF9EBF9EC703776CA7FCA7FCC7FFC
+8B1A4EBA4EC152035370F9ED54BD56E059FB5BC55F155FCD6E6EF9EEF9EF7D6A
+8335F9F086938A8DF9F1976D9777F9F2F9F34E004F5A4F7E58F965E56EA29038
+93B099B94EFB58EC598A59D96041F9F4F9F57A14F9F6834F8CC3516553440000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F9F7F9F8F9F94ECD52695B5582BF4ED4523A54A859C959FF5B505B575B5C
+606361486ECB7099716E738674F775B578C17D2B800581EA8328851785C98AEE
+8CC796CC4F5C52FA56BC65AB6628707C70B872357DBD828D914C96C09D725B71
+68E76B986F7A76DE5C9166AB6F5B7BB47C2A883696DC4E084ED75320583458BB
+58EF596C5C075E335E845F35638C66B267566A1F6AA36B0C6F3F7246F9FA7350
+748B7AE07CA7817881DF81E7838A846C8523859485CF88DD8D1391AC95770000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000969C518D54C957285BB0624D6750683D68936E3D6ED3707D7E2188C18CA1
+8F099F4B9F4E722D7B8F8ACD931A4F474F4E5132548059D05E9562B56775696E
+6A176CAE6E1A72D9732A75BD7BB87D3582E783F9845785F78A5B8CAF8E879019
+90B896CE9F5F52E3540A5AE15BC2645865756EF472C4F9FB76847A4D7B1B7C4D
+7E3E7FDF837B8B2B8CCA8D648DE18E5F8FEA8FF9906993D14F434F7A50B35168
+5178524D526A5861587C59605C085C555EDB609B623068136BBF6C086FB10000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000714E742075307538755176727B4C7B8B7BAD7BC67E8F8A6E8F3E8F49923F
+92939322942B96FB985A986B991E5207622A62986D5976647ACA7BC07D765360
+5CBE5E976F3870B97C9897119B8E9EDE63A5647A87764E014E954EAD505C5075
+544859C35B9A5E405EAD5EF75F8160C5633A653F657465CC6676667867FE6968
+6A896B636C406DC06DE86E1F6E5E701E70A1738E73FD753A775B7887798E7A0B
+7A7D7CBE7D8E82478A028AEA8C9E912D914A91D8926692CC9320970697560000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+70
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000975C98029F0E52365291557C58245E1D5F1F608C63D068AF6FDF796D7B2C
+81CD85BA88FD8AF88E44918D9664969B973D984C9F4A4FCE514651CB52A95632
+5F145F6B63AA64CD65E9664166FA66F9671D689D68D769FD6F156F6E716771E5
+722A74AA773A7956795A79DF7A207A957C977CDF7D447E70808785FB86A48A54
+8ABF8D998E819020906D91E3963B96D59CE565CF7C078DB393C35B585C0A5352
+62D9731D50275B975F9E60B0616B68D56DD9742E7A2E7D427D9C7E31816B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+71
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008E2A8E35937E94184F5057505DE65EA7632B7F6A4E3B4F4F4F8F505A59DD
+80C4546A546855FE594F5B995DDE5EDA665D673167F1682A6CE86D326E4A6F8D
+70B773E075877C4C7D027D2C7DA2821F86DB8A3B8A858D708E8A8F339031914E
+9152944499D07AF97CA54FCA510151C657C85BEF5CFB66596A3D6D5A6E966FEC
+710C756F7AE388229021907596CB99FF83014E2D4EF2884691CD537D6ADB696B
+6C41847A589E618E66FE62EF70DD751175C77E5284B88B498D084E4B53EA0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+72
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054AB573057405FD763016307646F652F65E8667A679D67B36B626C606C9A
+6F2C77E57825794979577D1980A2810281F3829D82B787188A8CF9FC8D048DBE
+907276F47A197A377E548077550755D45875632F64226649664B686D699B6B84
+6D256EB173CD746874A1755B75B976E1771E778B79E67E097E1D81FB852F8897
+8A3A8CD18EEB8FB0903293AD9663967397074F8453F159EA5AC95E19684E74C6
+75BE79E97A9281A386ED8CEA8DCC8FED659F6715F9FD57F76F577DDD8F2F0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+73
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000093F696C65FB561F26F844E144F98501F53C955DF5D6F5DEE6B216B6478CB
+7B9AF9FE8E498ECA906E6349643E77407A84932F947F9F6A64B06FAF71E674A8
+74DA7AC47C127E827CB27E988B9A8D0A947D9910994C52395BDF64E6672D7D2E
+50ED53C358796158615961FA65AC7AD98B928B9650095021527555315A3C5EE0
+5F706134655E660C663666A269CD6EC46F32731676217A938139825983D684BC
+50B557F05BC05BE85F6963A178267DB583DC852191C791F5518A67F57B560000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008CAC51C459BB60BD8655501CF9FF52545C3A617D621A62D364F265A56ECC
+7620810A8E60965F96BB4EDF5343559859295DDD64C56CC96DFA73947A7F821B
+85A68CE48E10907791E795E1962197C651F854F255865FB964A46F887DB48F1F
+8F4D943550C95C166CBE6DFB751B77BB7C3D7C648A798AC2581E59BE5E166377
+7252758A776B8ADC8CBC8F125EF366746DF8807D83C18ACB97519BD6FA005243
+66FF6D956EEF7DE08AE6902E905E9AD4521D527F54E86194628462DB68A20000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+75
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00006912695A6A3570927126785D7901790E79D27A0D8096827882D583498549
+8C828D859162918B91AE4FC356D171ED77D7870089F85BF85FD6675190A853E2
+585A5BF560A4618164607E3D80708525928364AE50AC5D146700589C62BD63A8
+690E69786A1E6E6B76BA79CB82BB84298ACF8DA88FFD9112914B919C93109318
+939A96DB9A369C0D4E11755C795D7AFA7B517BC97E2E84C48E598E748EF89010
+6625693F744351FA672E9EDC51455FE06C9687F2885D887760B481B584030000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+76
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00008D0553D6543956345A365C31708A7FE0805A810681ED8DA391899A5F9DF2
+50744EC453A060FB6E2C5C644F88502455E45CD95E5F606568946CBB6DC471BE
+75D475F476617A1A7A497DC77DFB7F6E81F486A98F1C96C999B39F52524752C5
+98ED89AA4E0367D26F064FB55BE267956C886D78741B782791DD937C87C479E4
+7A315FEB4ED654A4553E58AE59A560F0625362D6673669558235964099B199DD
+502C53535544577CFA016258FA0264E2666B67DD6FC16FEF742274388A170000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+77
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000094385451560657665F48619A6B4E705870AD7DBB8A95596A812B63A27708
+803D8CAA5854642D69BB5B955E116E6FFA038569514C53F0592A6020614B6B86
+6C706CF07B1E80CE82D48DC690B098B1FA0464C76FA464916504514E5410571F
+8A0E615F6876FA0575DB7B527D71901A580669CC817F892A9000983950785957
+59AC6295900F9B2A615D727995D657615A465DF4628A64AD64FA67776CE26D3E
+722C743678347F7782AD8DDB981752245742677F724874E38CA98FA692110000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+78
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000962A516B53ED634C4F695504609665576C9B6D7F724C72FD7A1789878C9D
+5F6D6F8E70F981A8610E4FBF504F624172477BC77DE87FE9904D97AD9A198CB6
+576A5E7367B0840D8A5554205B165E635EE25F0A658380BA853D9589965B4F48
+5305530D530F548654FA57035E036016629B62B16355FA066CE16D6675B17832
+80DE812F82DE846184B2888D8912900B92EA98FD9B915E4566B466DD70117206
+FA074FF5527D5F6A615367536A196F0274E2796888688C7998C798C49A430000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+79
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000054C17A1F69538AF78C4A98A899AE5F7C62AB75B276AE88AB907F96425339
+5F3C5FC56CCC73CC7562758B7B4682FE999D4E4F903C4E0B4F5553A6590F5EC8
+66306CB37455837787668CC09050971E9C1558D15B7886508B149DB45BD26068
+608D65F16C576F226FA3701A7F557FF095919592965097D352728F4451FD542B
+54B85563558A6ABB6DB57DD88266929C96779E79540854C876D286E495A495D4
+965C4EA24F0959EE5AE65DF760526297676D68416C866E2F7F38809B822A0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FA08FA0998054EA5505554B35793595A5B695BB361C869776D77702387F9
+89E38A728AE7908299ED9AB852BE683850165E78674F8347884C4EAB541156AE
+73E6911597FF9909995799995653589F865B8A3161B26AF6737B8ED26B4796AA
+9A57595572008D6B97694FD45CF45F2661F8665B6CEB70AB738473B973FE7729
+774D7D437D627E2382378852FA0A8CE29249986F5B517A74884098015ACC4FE0
+5354593E5CFD633E6D7972F98105810783A292CF98304EA851445211578B0000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00005F626CC26ECE7005705070AF719273E97469834A87A28861900890A293A3
+99A8516E5F5760E0616766B385598E4A91AF978B4E4E4E92547C58D558FA597D
+5CB55F2762366248660A66676BEB6D696DCF6E566EF86F946FE06FE9705D72D0
+7425745A74E07693795C7CCA7E1E80E182A6846B84BF864E865F87748B778C6A
+93AC9800986560D1621691775A5A660F6DF76E3E743F9B425FFD60DA7B0F54C4
+5F186C5E6CD36D2A70D87D0586798A0C9D3B5316548C5B056A3A706B75750000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000798D79BE82B183EF8A718B418CA89774FA0B64F4652B78BA78BB7A6B4E38
+559A59505BA65E7B60A363DB6B61666568536E19716574B07D0890849A699C25
+6D3B6ED1733E8C4195CA51F05E4C5FA8604D60F66130614C6643664469A56CC1
+6E5F6EC96F62714C749C76877BC17C27835287579051968D9EC3532F56DE5EFB
+5F8A6062609461F7666667036A9C6DEE6FAE7070736A7E6A81BE833486D48AA8
+8CC4528373725B966A6B940454EE56865B5D6548658566C9689F6D8D6DC60000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000723B80B491759A4D4FAF5019539A540E543C558955C55E3F5F8C673D7166
+73DD900552DB52F3586458CE7104718F71FB85B08A13668885A855A76684714A
+8431534955996BC15F595FBD63EE668971478AF18F1D9EBE4F11643A70CB7566
+866760648B4E9DF8514751F653086D3680F89ED166156B23709875D554035C79
+7D078A166B206B3D6B46543860706D3D7FD5820850D651DE559C566B56CD59EC
+5B095E0C619961986231665E66E6719971B971BA72A779A77A007FB28A700000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/macCentEuro.enc b/ext/Encode/Encode/macCentEuro.enc
new file mode 100644 (file)
index 0000000..dde616a
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macCentEuro, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C40100010100C9010400D600DC00E10105010C00E4010D0106010700E90179
+017A010E00ED010F01120113011600F3011700F400F600F500FA011A011B00FC
+202000B0011800A300A7202200B600DF00AE00A92122011900A822600123012E
+012F012A22642265012B0136220222110142013B013C013D013E0139013A0145
+0146014300AC221A01440147220600AB00BB202600A00148015000D50151014C
+20132014201C201D2018201900F725CA014D0154015501582039203A01590156
+01570160201A201E0161015A015B00C10164016500CD017D017E016A00D300D4
+016B016E00DA016F017001710172017300DD00FD0137017B0141017C012202C7
diff --git a/ext/Encode/Encode/macCroatian.enc b/ext/Encode/Encode/macCroatian.enc
new file mode 100644 (file)
index 0000000..132a74c
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macCroatian, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
+202000B000A200A300A7202200B600DF00AE0160212200B400A82260017D00D8
+221E00B122642265220600B522022211220F0161222B00AA00BA2126017E00F8
+00BF00A100AC221A01922248010600AB010C202600A000C000C300D501520153
+01102014201C201D2018201900F725CAF8FF00A9204400A42039203A00C600BB
+201300B7201A201E203000C2010700C1010D00C800CD00CE00CF00CC00D300D4
+011100D200DA00DB00D9013102C602DC00AF03C000CB02DA00B800CA00E602C7
diff --git a/ext/Encode/Encode/macCyrillic.enc b/ext/Encode/Encode/macCyrillic.enc
new file mode 100644 (file)
index 0000000..5590833
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macCyrillic, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0410041104120413041404150416041704180419041A041B041C041D041E041F
+0420042104220423042404250426042704280429042A042B042C042D042E042F
+202000B000A200A300A7202200B6040600AE00A9212204020452226004030453
+221E00B122642265045600B522020408040404540407045704090459040A045A
+0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455
+20132014201C201D2018201900F7201E040E045E040F045F211604010451044F
+0430043104320433043404350436043704380439043A043B043C043D043E043F
+0440044104420443044404450446044704480449044A044B044C044D044E00A4
diff --git a/ext/Encode/Encode/macDingbats.enc b/ext/Encode/Encode/macDingbats.enc
new file mode 100644 (file)
index 0000000..28449cd
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macDingbats, single-byte
+S
+003F 1 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+00202701270227032704260E2706270727082709261B261E270C270D270E270F
+2710271127122713271427152716271727182719271A271B271C271D271E271F
+2720272127222723272427252726272726052729272A272B272C272D272E272F
+2730273127322733273427352736273727382739273A273B273C273D273E273F
+2740274127422743274427452746274727482749274A274B25CF274D25A0274F
+27502751275225B225BC25C6275625D727582759275A275B275C275D275E007F
+F8D7F8D8F8D9F8DAF8DBF8DCF8DDF8DEF8DFF8E0F8E1F8E2F8E3F8E4008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+0000276127622763276427652766276726632666266526602460246124622463
+2464246524662467246824692776277727782779277A277B277C277D277E277F
+2780278127822783278427852786278727882789278A278B278C278D278E278F
+2790279127922793279421922194219527982799279A279B279C279D279E279F
+27A027A127A227A327A427A527A627A727A827A927AA27AB27AC27AD27AE27AF
+000027B127B227B327B427B527B627B727B827B927BA27BB27BC27BD27BE0000
diff --git a/ext/Encode/Encode/macGreek.enc b/ext/Encode/Encode/macGreek.enc
new file mode 100644 (file)
index 0000000..fbfa51f
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macGreek, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400B900B200C900B300D600DC038500E000E200E4038400A800E700E900E8
+00EA00EB00A3212200EE00EF202200BD203000F400F600A600AD00F900FB00FC
+2020039303940398039B039E03A000DF00AE00A903A303AA00A7226000B00387
+039100B12264226500A503920395039603970399039A039C03A603AB03A803A9
+03AC039D00AC039F03A1224803A400AB00BB202600A003A503A7038603880153
+20132015201C201D2018201900F70389038A038C038E03AD03AE03AF03CC038F
+03CD03B103B203C803B403B503C603B303B703B903BE03BA03BB03BC03BD03BF
+03C003CE03C103C303C403B803C903C203C703C503B603CA03CB039003B0F8A0
diff --git a/ext/Encode/Encode/macIceland.enc b/ext/Encode/Encode/macIceland.enc
new file mode 100644 (file)
index 0000000..e3fe9a9
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macIceland, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
+00DD00B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
+221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
+00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
+20132014201C201D2018201900F725CA00FF0178204400A400D000F000DE00FE
+00FD00B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
+F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7
diff --git a/ext/Encode/Encode/macJapan.enc b/ext/Encode/Encode/macJapan.enc
new file mode 100644 (file)
index 0000000..dba24bd
--- /dev/null
@@ -0,0 +1,785 @@
+# Encoding file: macJapan, multi-byte
+M
+003F 0 46
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00A0FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000A921222026
+81
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E
+203EFF3F30FD30FE309D309E30034EDD30053006300730FC20142010FF0FFF3C
+301C2016FF5C22EF202520182019201C201DFF08FF0930143015FF3BFF3DFF5B
+FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000
+00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5
+FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC203B301221922190219121933013000000000000
+000000000000000000000000000000002208220B2286228722822283222A2229
+000000000000000000000000000000002227222800AC21D221D4220022030000
+0000000000000000000000000000000000000000222022A52312220222072261
+2252226A226B221A223D221D2235222B222C0000000000000000000000000000
+212B2030266F266D266A2020202100B6000000000000000025EF000000000000
+82
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000FF10
+FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000
+FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30
+FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000
+0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041
+30423043304430453046304730483049304A304B304C304D304E304F30503051
+30523053305430553056305730583059305A305B305C305D305E305F30603061
+30623063306430653066306730683069306A306B306C306D306E306F30703071
+30723073307430753076307730783079307A307B307C307D307E307F30803081
+30823083308430853086308730883089308A308B308C308D308E308F30903091
+3092309300000000000000000000000000000000000000000000000000000000
+83
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0
+30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0
+30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0
+30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000391
+03920393039403950396039703980399039A039B039C039D039E039F03A003A1
+03A303A403A503A603A703A803A90000000000000000000000000000000003B1
+03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1
+03C303C403C503C603C703C803C9000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+04100411041204130414041504010416041704180419041A041B041C041D041E
+041F0420042104220423042404250426042704280429042A042B042C042D042E
+042F000000000000000000000000000000000000000000000000000000000000
+04300431043204330434043504510436043704380439043A043B043C043D0000
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000002500
+2502250C251025182514251C252C25242534253C25012503250F2513251B2517
+25232533252B253B254B2520252F25282537253F251D25302525253825420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+2460246124622463246424652466246724682469246A246B246C246D246E246F
+2470247124722473000000000000000000000000000000000000000024742475
+2476247724782479247A247B247C247D247E247F248024812482248324842485
+2486248700000000000000000000000000000000000000002776277727780000
+2779277A277B277C277D277E0000000000000000000000000000000000000000
+0000F8A124882489248A248B248C248D248E248F249000000000000000002160
+216121622163216421652166216721682169216A216BF8A2F8A3F8A400000000
+0000000000002170217121722173217421752176217721782179217A217BF8A5
+F8A6F8A700000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000249C249D249E249F24A0
+24A124A224A324A424A524A624A724A824A924AA24AB24AC24AD24AE24AF24B0
+24B124B224B324B424B500000000000000000000000000000000000000000000
+86
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+339C339F339D33A033A4F8A833A133A5339E33A2338EF8A9338F33C433963397
+F8AA339833B333B233B133B0210933D433CB3390338533863387F8AB00000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000211633CD2121F8AC2664
+2667266126622660266326652666000000000000000000000000000000000000
+0000000000003020260E30040000000000000000000000000000000000000000
+0000000000000000000000000000261E261C261D261F21C621C421C5F8AD21E8
+21E621E721E9F8AEF8AFF8B0F8B1000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+87
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+3230322A322B322C322D322E322F32403237324232433239323A3231323E3234
+3232323B323632333235323C323D323F32380000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000059275C0F32A432A532A632A732A832A93296329D3298329E63A732993349
+3322334D3314331633053333334E330333363318331533273351334A33393357
+330D334233233326333B332B00000000000000000000000000003300331E332A
+3331334700000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000337E337D337C337B0000000000000000000000000000
+0000000000000000000000000000000000000000337FF8B2F8B3000000000000
+88
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+222E221F22BF0000000000000000000000000000000000000000000000000000
+0000000000000000301DF8B40000000000000000000000000000000000000000
+000000000000000000000000000000003094000030F730F830F930FA00000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000004E9C
+55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466
+82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7
+5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4
+5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863
+8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328
+828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000
+89
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893
+81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2
+834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834
+82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000
+5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01
+827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC
+65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6
+81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1
+4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2
+798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E
+971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A
+89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000
+8A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916
+54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3
+67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A
+89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000
+6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39
+53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5
+520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98
+5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22
+6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3
+8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9
+764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947
+5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000
+8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC
+8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947
+7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD
+53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000
+673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45
+5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B
+4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F
+6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF
+99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747
+5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1
+91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177
+611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000
+8C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB
+8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951
+5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C
+7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000
+5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6
+503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C
+6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A
+98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA
+96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0
+7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348
+5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9
+4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000
+8D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18
+6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69
+6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154
+818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000
+980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B
+544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64
+98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E
+9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750
+5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08
+707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A
+8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E
+6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09
+509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178
+991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9
+59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000
+6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C
+8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21
+6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58
+9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA
+5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E
+793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8
+932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3
+91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000
+8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846
+89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4
+6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA
+88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000
+6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2
+7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD
+5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84
+5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35
+6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7
+7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E
+9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE
+676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000
+90
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507
+5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E
+79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875
+58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000
+9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F
+745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84
+647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F
+667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB
+901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D
+7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0
+8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0
+681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000
+91
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D
+55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9
+758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC
+53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000
+64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061
+83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3
+85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA
+65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70
+8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010
+5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E
+968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258
+629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000
+92
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39
+53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6
+86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B
+6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000
+901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877
+8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16
+5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139
+817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD
+8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43
+6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4
+4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5
+633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000
+93
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9
+64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9
+4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B
+83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000
+51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF
+76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463
+856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C
+58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3
+6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB
+5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3
+51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3
+6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000
+94
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5
+637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2
+899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3
+5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000
+6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD
+67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD
+7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA
+4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06
+642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169
+981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2
+6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB
+907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000
+95
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867
+59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF
+63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3
+983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000
+65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB
+6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F
+8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E
+711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4
+4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909
+72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355
+6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305
+5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000
+96
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD
+9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2
+51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2
+6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000
+646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE
+9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B
+85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11
+772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF
+8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984
+5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B
+7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384
+5F797D0485AC8A338E8D975667F385AE9453610961086CB97652000000000000
+97
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C
+733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89
+8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194
+75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000
+6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A
+4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2
+88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559
+786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599
+68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B
+539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4
+4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6
+6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000
+98
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C
+69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6
+502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900
+6E7E789781550000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000005F0C
+4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D
+4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED
+4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70
+4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A
+50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047
+6703505550505048505A5056506C50785080509A508550B450B2000000000000
+99
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116
+51155114511A5121513A5137513C513B513F51405152514C515451627AF85169
+516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9
+51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000
+51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C
+525E5254526A527452695273527F527D528D529452925271528852918FA88FA7
+52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9
+530653087538530D5310530F5315531A5323532F533153335338534053465345
+4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE
+53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C
+542D543C542E54365429541D544E548F5475548E545F5471547754705492547B
+5480547654845490548654C754A254B854A554AC54C454C854A8000000000000
+9A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539
+55405563554C552E555C55455556555755385533555D5599558054AF558A559F
+557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4
+55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000
+566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2
+56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708
+570B570D57135718571655C7571C572657375738574E573B5740574F576957C0
+57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A
+57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9
+589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4
+58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932
+5938593E7AD259555950594E595A5958596259605967596C5969000000000000
+9B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11
+5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD
+5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43
+5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000
+5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6
+5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50
+5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7
+5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B
+5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82
+5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2
+5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62
+5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000
+9C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE
+5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51
+5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99
+5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000
+601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F
+604A6046604D6063604360646042606C606B60596081608D60E76083609A6084
+609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8
+614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E
+61286127614A613F613C612C6134613D614261446173617761586159615A616B
+6174616F61656171615F615D6153617561996196618761AC6194619A618A6191
+61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6
+61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000
+9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+621E6221622A622E6230623262336241624E625E6263625B62606268627C6282
+6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8
+62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350
+633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000
+636963BE63E963C063C663E363C963D263F663C4641664346406641364266436
+651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA
+64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6
+64F464F264FA650064FD6518651C650565246523652B65346535653765366538
+754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB
+65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB
+6773663566366634661C664F664466496641665E665D666466676668665F6662
+667066836688668E668966846698669D66C166B966C966BE66BC000000000000
+9E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727
+9738672E673F67366741673867376746675E67606759676367646789677067A9
+677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE
+67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000
+68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874
+68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4
+68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921
+68C669796977695C6978696B6954697E696E69396974693D695969306961695E
+695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3
+69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7
+6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78
+6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000
+9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05
+86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59
+6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA
+6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000
+9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B
+6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA
+6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63
+6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8
+6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E
+6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D
+6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2
+6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E
+6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1
+6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030
+703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000
+70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184
+719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9
+71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258
+7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2
+72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E
+734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0
+73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C
+746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D
+75157513751E7526752C753C7544754D754A7549755B7546755A756975647567
+756B756D75787576758675877574758A758975827594759A759D75A575A375C2
+75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000
+75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634
+7630763B764776487646765C76587661766276687669766A7667766C76707672
+76767678767C768076837688768B768E769676937699769A76B076B476B876B9
+76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729
+7724771E77257726771B773777387747775A7768776B775B7765777F777E7779
+778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA
+77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C
+78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955
+7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC
+79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49
+7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000
+7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2
+7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A
+7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F
+7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9
+7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A
+7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C
+7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0
+7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68
+7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB
+7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A
+7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000
+7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D
+8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45
+7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86
+7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71
+7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018
+8019801C80218028803F803B804A804680528058805A805F8062806880738072
+807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5
+80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+968B8146813E8153815180FC8171816E81658166817481838188818A81808182
+81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9
+81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207
+820A820D821082168229822B82388233824082598258825D825A825F82640000
+82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1
+82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335
+83348316833283318340833983508345832F832B831783188385839A83AA839F
+83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB
+83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506
+83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479
+843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521
+84FF84F485178518852C851F8515851484FC8540856385588548000000000000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C
+8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B
+85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9
+86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000
+86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F
+8737873B87258729871A8760875F8778874C874E877487578768876E87598753
+8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7
+87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822
+88218831883688398827883B8844884288528859885E8862886B8881887E889E
+8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3
+88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943
+891E8925892A892B89418944893B89368938894C891D8960895E000000000000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89668964896D896A896F89748977897E89838988898A8993899889A189A989A6
+89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10
+8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82
+8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000
+8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20
+8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F
+8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48
+8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C
+8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA
+8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71
+8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3
+8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87
+8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5
+8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F
+8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000
+8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4
+90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F
+905090519052900E9049903E90569058905E9068906F907696A890729082907D
+90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119
+91329130914A9156915891639165916991739172918B9189918291A291AB91AF
+91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6
+921E91FF9214922C92159211925E925792459249926492489295923F924B9250
+929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394
+93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407
+94109436942B94359421943A944194529444945B94609462945E946A92299470
+94759477947D945A947C947E9481947F95829587958A95949596959895990000
+95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6
+95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D
+965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8
+96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711
+970F971697199724972A97309739973D973E97449746974897429749975C9760
+97649766976852D2976B977197799785977C9781977A9786978B978F9790979C
+97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5
+980F980C9838982498219837983D9846984F984B986B986F9870000000000000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914
+99189921991D991E99249920992C992E993D993E9942994999459950994B9951
+9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE
+99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000
+9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0
+9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB
+9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43
+9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0
+9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15
+9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47
+9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06
+9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2
+9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A
+9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8
+9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000
+9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52
+9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F
+69C79059746451DC719900000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+EB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F8B5F8B60000000000000000000000000000000000000000000000000000
+F8B7FE33000000000000000000000000000000000000F8B8FE31F8B900000000
+F8BAF8BBF8BCF8BDFE300000000000000000FE35FE36FE39FE3AF8BEF8BFFE37
+FE38FE3FFE40FE3DFE3EFE41FE42FE43FE44FE3BFE3C00000000000000000000
+0000F8C000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+EC
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000F8C1
+0000F8C20000F8C30000F8C40000F8C500000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F8C600000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000F8C70000F8C80000F8C9000000000000000000000000F8CA000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+ED
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+F8CB0000F8CC0000F8CD0000F8CE0000F8CF0000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000F8D00000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000F8D10000F8D20000F8D3000000000000000000000000F8D40000
+00000000000000000000F8D5F8D6000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/macRoman.enc b/ext/Encode/Encode/macRoman.enc
new file mode 100644 (file)
index 0000000..6cfd749
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macRoman, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
+202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
+221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
+00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
+20132014201C201D2018201900F725CA00FF0178204400A42039203AFB01FB02
+202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
+F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7
diff --git a/ext/Encode/Encode/macRomania.enc b/ext/Encode/Encode/macRomania.enc
new file mode 100644 (file)
index 0000000..ce41cf4
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macRomania, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
+202000B000A200A300A7202200B600DF00AE00A9212200B400A822600102015E
+221E00B12264226500A500B522022211220F03C0222B00AA00BA21260103015F
+00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
+20132014201C201D2018201900F725CA00FF0178204400A42039203A01620163
+202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
+F8FF00D200DA00DB00D9013102C602DC00AF02D802D902DA00B802DD02DB02C7
diff --git a/ext/Encode/Encode/macThai.enc b/ext/Encode/Encode/macThai.enc
new file mode 100644 (file)
index 0000000..7d9c8ad
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macThai, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00AB00BB2026F88CF88FF892F895F898F88BF88EF891F894F897201C201DF899
+FFFD2022F884F889F885F886F887F888F88AF88DF890F893F89620182019FFFD
+00A00E010E020E030E040E050E060E070E080E090E0A0E0B0E0C0E0D0E0E0E0F
+0E100E110E120E130E140E150E160E170E180E190E1A0E1B0E1C0E1D0E1E0E1F
+0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F
+0E300E310E320E330E340E350E360E370E380E390E3AFEFF200B201320140E3F
+0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D21220E4F
+0E500E510E520E530E540E550E560E570E580E5900AE00A9FFFDFFFDFFFDFFFD
diff --git a/ext/Encode/Encode/macTurkish.enc b/ext/Encode/Encode/macTurkish.enc
new file mode 100644 (file)
index 0000000..73e8687
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macTurkish, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+00C400C500C700C900D100D600DC00E100E000E200E400E300E500E700E900E8
+00EA00EB00ED00EC00EE00EF00F100F300F200F400F600F500FA00F900FB00FC
+202000B000A200A300A7202200B600DF00AE00A9212200B400A8226000C600D8
+221E00B12264226500A500B522022211220F03C0222B00AA00BA212600E600F8
+00BF00A100AC221A01922248220600AB00BB202600A000C000C300D501520153
+20132014201C201D2018201900F725CA00FF0178011E011F01300131015E015F
+202100B7201A201E203000C200CA00C100CB00C800CD00CE00CF00CC00D300D4
+F8FF00D200DA00DB00D9F8A002C602DC00AF02D802D902DA00B802DD02DB02C7
diff --git a/ext/Encode/Encode/macUkraine.enc b/ext/Encode/Encode/macUkraine.enc
new file mode 100644 (file)
index 0000000..643cc45
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: macUkraine, single-byte
+S
+003F 0 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0410041104120413041404150416041704180419041A041B041C041D041E041F
+0420042104220423042404250426042704280429042A042B042C042D042E042F
+202000B0049000A300A7202200B6040600AE00A9212204020452226004030453
+221E00B122642265045600B504910408040404540407045704090459040A045A
+0458040500AC221A01922248220600AB00BB202600A0040B045B040C045C0455
+20132014201C201D2018201900F7201E040E045E040F045F211604010451044F
+0430043104320433043404350436043704380439043A043B043C043D043E043F
+0440044104420443044404450446044704480449044A044B044C044D044E00A4
diff --git a/ext/Encode/Encode/shiftjis.enc b/ext/Encode/Encode/shiftjis.enc
new file mode 100644 (file)
index 0000000..c8d2504
--- /dev/null
@@ -0,0 +1,683 @@
+# Encoding file: shiftjis, multi-byte
+M
+003F 0 40
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002100220023002400250026002700280029002A002B002C002D002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+0040004100420043004400450046004700480049004A004B004C004D004E004F
+0050005100520053005400550056005700580059005A005B005C005D005E005F
+0060006100620063006400650066006700680069006A006B006C006D006E006F
+0070007100720073007400750076007700780079007A007B007C007D007E007F
+0080000000000000000000850086008700000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000FF61FF62FF63FF64FF65FF66FF67FF68FF69FF6AFF6BFF6CFF6DFF6EFF6F
+FF70FF71FF72FF73FF74FF75FF76FF77FF78FF79FF7AFF7BFF7CFF7DFF7EFF7F
+FF80FF81FF82FF83FF84FF85FF86FF87FF88FF89FF8AFF8BFF8CFF8DFF8EFF8F
+FF90FF91FF92FF93FF94FF95FF96FF97FF98FF99FF9AFF9BFF9CFF9DFF9EFF9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+81
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+300030013002FF0CFF0E30FBFF1AFF1BFF1FFF01309B309C00B4FF4000A8FF3E
+FFE3FF3F30FD30FE309D309E30034EDD30053006300730FC20152010FF0FFF3C
+301C2016FF5C2026202520182019201C201DFF08FF0930143015FF3BFF3DFF5B
+FF5D30083009300A300B300C300D300E300F30103011FF0B221200B100D70000
+00F7FF1D2260FF1CFF1E22662267221E22342642264000B0203220332103FFE5
+FF0400A200A3FF05FF03FF06FF0AFF2000A72606260525CB25CF25CE25C725C6
+25A125A025B325B225BD25BC203B301221922190219121933013000000000000
+000000000000000000000000000000002208220B2286228722822283222A2229
+000000000000000000000000000000002227222800AC21D221D4220022030000
+0000000000000000000000000000000000000000222022A52312220222072261
+2252226A226B221A223D221D2235222B222C0000000000000000000000000000
+212B2030266F266D266A2020202100B6000000000000000025EF000000000000
+82
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000FF10
+FF11FF12FF13FF14FF15FF16FF17FF18FF190000000000000000000000000000
+FF21FF22FF23FF24FF25FF26FF27FF28FF29FF2AFF2BFF2CFF2DFF2EFF2FFF30
+FF31FF32FF33FF34FF35FF36FF37FF38FF39FF3A000000000000000000000000
+0000FF41FF42FF43FF44FF45FF46FF47FF48FF49FF4AFF4BFF4CFF4DFF4EFF4F
+FF50FF51FF52FF53FF54FF55FF56FF57FF58FF59FF5A00000000000000003041
+30423043304430453046304730483049304A304B304C304D304E304F30503051
+30523053305430553056305730583059305A305B305C305D305E305F30603061
+30623063306430653066306730683069306A306B306C306D306E306F30703071
+30723073307430753076307730783079307A307B307C307D307E307F30803081
+30823083308430853086308730883089308A308B308C308D308E308F30903091
+3092309300000000000000000000000000000000000000000000000000000000
+83
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+30A130A230A330A430A530A630A730A830A930AA30AB30AC30AD30AE30AF30B0
+30B130B230B330B430B530B630B730B830B930BA30BB30BC30BD30BE30BF30C0
+30C130C230C330C430C530C630C730C830C930CA30CB30CC30CD30CE30CF30D0
+30D130D230D330D430D530D630D730D830D930DA30DB30DC30DD30DE30DF0000
+30E030E130E230E330E430E530E630E730E830E930EA30EB30EC30ED30EE30EF
+30F030F130F230F330F430F530F6000000000000000000000000000000000391
+03920393039403950396039703980399039A039B039C039D039E039F03A003A1
+03A303A403A503A603A703A803A90000000000000000000000000000000003B1
+03B203B303B403B503B603B703B803B903BA03BB03BC03BD03BE03BF03C003C1
+03C303C403C503C603C703C803C9000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+04100411041204130414041504010416041704180419041A041B041C041D041E
+041F0420042104220423042404250426042704280429042A042B042C042D042E
+042F000000000000000000000000000000000000000000000000000000000000
+04300431043204330434043504510436043704380439043A043B043C043D0000
+043E043F0440044104420443044404450446044704480449044A044B044C044D
+044E044F00000000000000000000000000000000000000000000000000002500
+2502250C251025182514251C252C25242534253C25012503250F2513251B2517
+25232533252B253B254B2520252F25282537253F251D25302525253825420000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+88
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000004E9C
+55165A03963F54C0611B632859F690228475831C7A5060AA63E16E2565ED8466
+82A69BF56893572765A162715B9B59D0867B98F47D627DBE9B8E62167C9F88B7
+5B895EB563096697684895C7978D674F4EE54F0A4F4D4F9D504956F2593759D4
+5A015C0960DF610F61706613690570BA754F757079FB7DAD7DEF80C3840E8863
+8B029055907A533B4E954EA557DF80B290C178EF4E0058F16EA290387A328328
+828B9C2F5141537054BD54E156E059FB5F1598F26DEB80E4852D000000000000
+89
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9662967096A097FB540B53F35B8770CF7FBD8FC296E8536F9D5C7ABA4E117893
+81FC6E26561855046B1D851A9C3B59E553A96D6674DC958F56424E91904B96F2
+834F990C53E155B65B305F71662066F368046C386CF36D29745B76C87A4E9834
+82F1885B8A6092ED6DB275AB76CA99C560A68B018D8A95B2698E53AD51860000
+5712583059445BB45EF6602863A963F46CBF6F14708E7114715971D5733F7E01
+827682D185979060925B9D1B586965BC6C5A752551F9592E59655F805FDC62BC
+65FA6A2A6B276BB4738B7FC189569D2C9D0E9EC45CA16C96837B51045C4B61B6
+81C6687672614E594FFA537860696E297A4F97F34E0B53164EEE4F554F3D4FA1
+4F7352A053EF5609590F5AC15BB65BE179D16687679C67B66B4C6CB3706B73C2
+798D79BE7A3C7B8782B182DB8304837783EF83D387668AB256298CA88FE6904E
+971E868A4FC45CE862117259753B81E582BD86FE8CC096C5991399D54ECB4F1A
+89E356DE584A58CA5EFB5FEB602A6094606261D0621262D06539000000000000
+8A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9B41666668B06D777070754C76867D7582A587F9958B968E8C9D51F152BE5916
+54B35BB35D16616869826DAF788D84CB88578A7293A79AB86D6C99A886D957A3
+67FF86CE920E5283568754045ED362E164B9683C68386BBB737278BA7A6B899A
+89D28D6B8F0390ED95A3969497695B665CB3697D984D984E639B7B206A2B0000
+6A7F68B69C0D6F5F5272559D607062EC6D3B6E076ED1845B89108F444E149C39
+53F6691B6A3A9784682A515C7AC384B291DC938C565B9D286822830584317CA5
+520882C574E64E7E4F8351A05BD2520A52D852E75DFB559A582A59E65B8C5B98
+5BDB5E725E7960A3611F616361BE63DB656267D1685368FA6B3E6B536C576F22
+6F976F4574B0751876E3770B7AFF7BA17C217DE97F367FF0809D8266839E89B3
+8ACC8CAB908494519593959195A2966597D3992882184E38542B5CB85DCC73A9
+764C773C5CA97FEB8D0B96C19811985498584F014F0E5371559C566857FA5947
+5B095BC45C905E0C5E7E5FCC63EE673A65D765E2671F68CB68C4000000000000
+8B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A5F5E306BC56C176C7D757F79485B637A007D005FBD898F8A188CB48D778ECC
+8F1D98E29A0E9B3C4E80507D510059935B9C622F628064EC6B3A72A075917947
+7FA987FB8ABC8B7063AC83CA97A05409540355AB68546A588A70782767759ECD
+53745BA2811A865090064E184E454EC74F1153CA54385BAE5F13602565510000
+673D6C426C726CE3707874037A767AAE7B087D1A7CFE7D6665E7725B53BB5C45
+5DE862D262E063196E20865A8A318DDD92F86F0179A69B5A4EA84EAB4EAC4F9B
+4FA050D151477AF6517151F653545321537F53EB55AC58835CE15F375F4A602F
+6050606D631F65596A4B6CC172C272ED77EF80F881058208854E90F793E197FF
+99579A5A4EF051DD5C2D6681696D5C4066F26975738968507C8150C552E45747
+5DFE932665A46B236B3D7434798179BD7B4B7DCA82B983CC887F895F8B398FD1
+91D1541F92804E5D503653E5533A72D7739677E982E68EAF99C699C899D25177
+611A865E55B07A7A50765BD3904796854E326ADB91E75C515C48000000000000
+8C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+63987A9F6C9397748F617AAA718A96887C8268177E706851936C52F2541B85AB
+8A137FA48ECD90E15366888879414FC250BE521151445553572D73EA578B5951
+5F625F8460756176616761A963B2643A656C666F68426E1375667A3D7CFB7D4C
+7D997E4B7F6B830E834A86CD8A088A638B668EFD981A9D8F82B88FCE9BE80000
+5287621F64836FC09699684150916B206C7A6F547A747D5088408A2367084EF6
+503950265065517C5238526355A7570F58055ACC5EFA61B261F862F36372691C
+6A29727D72AC732E7814786F7D79770C80A9898B8B198CE28ED290639375967A
+98559A139E785143539F53B35E7B5F266E1B6E90738473FE7D4382378A008AFA
+96504E4E500B53E4547C56FA59D15B645DF15EAB5F276238654567AF6E5672D0
+7CCA88B480A180E183F0864E8A878DE8923796C798679F134E944E924F0D5348
+5449543E5A2F5F8C5FA1609F68A76A8E745A78818A9E8AA48B7791904E5E9BC9
+4EA44F7C4FAF501950165149516C529F52B952FE539A53E35411000000000000
+8D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+540E5589575157A2597D5B545B5D5B8F5DE55DE75DF75E785E835E9A5EB75F18
+6052614C629762D863A7653B6602664366F4676D6821689769CB6C5F6D2A6D69
+6E2F6E9D75327687786C7A3F7CE07D057D187D5E7DB18015800380AF80B18154
+818F822A8352884C88618B1B8CA28CFC90CA91759271783F92FC95A4964D0000
+980599999AD89D3B525B52AB53F7540858D562F76FE08C6A8F5F9EB9514B523B
+544A56FD7A4091779D609ED273446F09817075115FFD60DA9AA872DB8FBC6B64
+98034ECA56F0576458BE5A5A606861C7660F6606683968B16DF775D57D3A826E
+9B424E9B4F5053C955065D6F5DE65DEE67FB6C99747378028A50939688DF5750
+5EA7632B50B550AC518D670054C9585E59BB5BB05F69624D63A1683D6B736E08
+707D91C7728078157826796D658E7D3083DC88C18F09969B5264572867507F6A
+8CA151B45742962A583A698A80B454B25D0E57FC78959DFA4F5C524A548B643E
+6628671467F57A847B567D22932F685C9BAD7B395319518A5237000000000000
+8E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5BDF62F664AE64E6672D6BBA85A996D176909BD6634C93069BAB76BF66524E09
+509853C25C7160E864926563685F71E673CA75237B977E8286958B838CDB9178
+991065AC66AB6B8B4ED54ED44F3A4F7F523A53F853F255E356DB58EB59CB59C9
+59FF5B505C4D5E025E2B5FD7601D6307652F5B5C65AF65BD65E8679D6B620000
+6B7B6C0F7345794979C17CF87D197D2B80A2810281F389968A5E8A698A668A8C
+8AEE8CC78CDC96CC98FC6B6F4E8B4F3C4F8D51505B575BFA6148630166426B21
+6ECB6CBB723E74BD75D478C1793A800C803381EA84948F9E6C509E7F5F0F8B58
+9D2B7AFA8EF85B8D96EB4E0353F157F759315AC95BA460896E7F6F0675BE8CEA
+5B9F85007BE0507267F4829D5C61854A7E1E820E51995C0463688D66659C716E
+793E7D1780058B1D8ECA906E86C790AA501F52FA5C3A6753707C7235914C91C8
+932B82E55BC25F3160F94E3B53D65B88624B67316B8A72E973E07A2E816B8DA3
+91529996511253D7546A5BFF63886A397DAC970056DA53CE5468000000000000
+8F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5B975C315DDE4FEE610162FE6D3279C079CB7D427E4D7FD281ED821F84908846
+89728B908E748F2F9031914B916C96C6919C4EC04F4F514553415F93620E67D4
+6C416E0B73637E2691CD928353D459195BBF6DD1795D7E2E7C9B587E719F51FA
+88538FF04FCA5CFB662577AC7AE3821C99FF51C65FAA65EC696F6B896DF30000
+6E966F6476FE7D145DE190759187980651E6521D6240669166D96E1A5EB67DD2
+7F7266F885AF85F78AF852A953D959735E8F5F90605592E4966450B7511F52DD
+5320534753EC54E8554655315617596859BE5A3C5BB55C065C0F5C115C1A5E84
+5E8A5EE05F70627F628462DB638C63776607660C662D6676677E68A26A1F6A35
+6CBC6D886E096E58713C7126716775C77701785D7901796579F07AE07B117CA7
+7D39809683D6848B8549885D88F38A1F8A3C8A548A738C618CDE91A49266937E
+9418969C97984E0A4E084E1E4E575197527057CE583458CC5B225E3860C564FE
+676167566D4472B675737A6384B88B7291B89320563157F498FE000000000000
+90
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+62ED690D6B9671ED7E548077827289E698DF87558FB15C3B4F384FE14FB55507
+5A205BDD5BE95FC3614E632F65B0664B68EE699B6D786DF1753375B9771F795E
+79E67D3381E382AF85AA89AA8A3A8EAB8F9B903291DD97074EBA4EC152035875
+58EC5C0B751A5C3D814E8A0A8FC59663976D7B258ACF9808916256F353A80000
+9017543957825E2563A86C34708A77617C8B7FE088709042915493109318968F
+745E9AC45D075D69657067A28DA896DB636E6749691983C5981796C088FE6F84
+647A5BF84E16702C755D662F51C4523652E259D35F8160276210653F6574661F
+667468F268166B636E057272751F76DB7CBE805658F088FD897F8AA08A938ACB
+901D91929752975965897A0E810696BB5E2D60DC621A65A56614679077F37A4D
+7C4D7E3E810A8CAC8D648DE18E5F78A9520762D963A5644262988A2D7A837BC0
+8AAC96EA7D76820C87494ED95148534353605BA35C025C165DDD6226624764B0
+681368346CC96D456D1767D36F5C714E717D65CB7A7F7BAD7DDA000000000000
+91
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7E4A7FA8817A821B823985A68A6E8CCE8DF59078907792AD929195839BAE524D
+55846F387136516879857E5581B37CCE564C58515CA863AA66FE66FD695A72D9
+758F758E790E795679DF7C977D207D4486078A34963B90619F2050E7527553CC
+53E2500955AA58EE594F723D5B8B5C64531D60E360F3635C6383633F63BB0000
+64CD65E966F95DE369CD69FD6F1571E54E8975E976F87A937CDF7DCF7D9C8061
+83498358846C84BC85FB88C58D709001906D9397971C9A1250CF5897618E81D3
+85358D0890204FC3507452475373606F6349675F6E2C8DB3901F4FD75C5E8CCA
+65CF7D9A53528896517663C35B585B6B5C0A640D6751905C4ED6591A592A6C70
+8A51553E581559A560F0625367C182356955964099C49A284F5358065BFE8010
+5CB15E2F5F856020614B623466FF6CF06EDE80CE817F82D4888B8CB89000902E
+968A9EDB9BDB4EE353F059277B2C918D984C9DF96EDD7027535355445B856258
+629E62D36CA26FEF74228A1794386FC18AFE833851E786F853EA000000000000
+92
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+53E94F4690548FB0596A81315DFD7AEA8FBF68DA8C3772F89C486A3D8AB04E39
+53585606576662C563A265E66B4E6DE16E5B70AD77ED7AEF7BAA7DBB803D80C6
+86CB8A95935B56E358C75F3E65AD66966A806BB575378AC7502477E557305F1B
+6065667A6C6075F47A1A7F6E81F48718904599B37BC9755C7AF97B5184C40000
+901079E97A9283365AE177404E2D4EF25B995FE062BD663C67F16CE8866B8877
+8A3B914E92F399D06A177026732A82E784578CAF4E01514651CB558B5BF55E16
+5E335E815F145F355F6B5FB461F2631166A2671D6F6E7252753A773A80748139
+817887768ABF8ADC8D858DF3929A957798029CE552C5635776F467156C8873CD
+8CC393AE96736D25589C690E69CC8FFD939A75DB901A585A680263B469FB4F43
+6F2C67D88FBB85267DB49354693F6F70576A58F75B2C7D2C722A540A91E39DB4
+4EAD4F4E505C507552438C9E544858245B9A5E1D5E955EAD5EF75F1F608C62B5
+633A63D068AF6C407887798E7A0B7DE082478A028AE68E449013000000000000
+93
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+90B8912D91D89F0E6CE5645864E265756EF476847B1B906993D16EBA54F25FB9
+64A48F4D8FED92445178586B59295C555E976DFB7E8F751C8CBC8EE2985B70B9
+4F1D6BBF6FB1753096FB514E54105835585759AC5C605F926597675C6E21767B
+83DF8CED901490FD934D7825783A52AA5EA6571F597460125012515A51AC0000
+51CD520055105854585859575B955CF65D8B60BC6295642D6771684368BC68DF
+76D76DD86E6F6D9B706F71C85F5375D879777B497B547B527CD67D7152308463
+856985E48A0E8B048C468E0F9003900F94199676982D9A3095D850CD52D5540C
+58025C0E61A7649E6D1E77B37AE580F48404905392855CE09D07533F5F975FB3
+6D9C7279776379BF7BE46BD272EC8AAD68036A6151F87A8169345C4A9CF682EB
+5BC59149701E56785C6F60C765666C8C8C5A90419813545166C7920D594890A3
+51854E4D51EA85998B0E7058637A934B696299B47E047577535769608EDF96E3
+6C5D4E8C5C3C5F108FE953028CD1808986795EFF65E54E735165000000000000
+94
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59825C3F97EE4EFB598A5FCD8A8D6FE179B079625BE78471732B71B15E745FF5
+637B649A71C37C984E435EFC4E4B57DC56A260A96FC37D0D80FD813381BF8FB2
+899786A45DF4628A64AD898767776CE26D3E743678345A467F7582AD99AC4FF3
+5EC362DD63926557676F76C3724C80CC80BA8F29914D500D57F95A9268850000
+6973716472FD8CB758F28CE0966A9019877F79E477E784294F2F5265535A62CD
+67CF6CCA767D7B947C95823685848FEB66DD6F2072067E1B83AB99C19EA651FD
+7BB178727BB880877B486AE85E61808C75517560516B92626E8C767A91979AEA
+4F107F70629C7B4F95A59CE9567A585986E496BC4F345224534A53CD53DB5E06
+642C6591677F6C3E6C4E724872AF73ED75547E41822C85E98CA97BC491C67169
+981298EF633D6669756A76E478D0854386EE532A5351542659835E875F7C60B2
+6249627962AB65906BD46CCC75B276AE789179D87DCB7F7780A588AB8AB98CBB
+907F975E98DB6A0B7C3850995C3E5FAE67876BD8743577097F8E000000000000
+95
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9F3B67CA7A175339758B9AED5F66819D83F180985F3C5FC575627B46903C6867
+59EB5A9B7D10767E8B2C4FF55F6A6A196C376F0274E2796888688A558C795EDF
+63CF75C579D282D7932892F2849C86ED9C2D54C15F6C658C6D5C70158CA78CD3
+983B654F74F64E0D4ED857E0592B5A665BCC51A85E035E9C6016627665770000
+65A7666E6D6E72367B268150819A82998B5C8CA08CE68D74961C96444FAE64AB
+6B66821E8461856A90E85C01695398A8847A85574F0F526F5FA95E45670D798F
+8179890789866DF55F1762556CB84ECF72699B925206543B567458B361A4626E
+711A596E7C897CDE7D1B96F06587805E4E194F75517558405E635E735F0A67C4
+4E26853D9589965B7C73980150FB58C1765678A7522577A585117B86504F5909
+72477BC77DE88FBA8FD4904D4FBF52C95A295F0197AD4FDD821792EA57036355
+6B69752B88DC8F147A4252DF58936155620A66AE6BCD7C3F83E950234FF85305
+5446583159495B9D5CF05CEF5D295E9662B16367653E65B9670B000000000000
+96
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6CD56CE170F978327E2B80DE82B3840C84EC870289128A2A8C4A90A692D298FD
+9CF39D6C4E4F4EA1508D5256574A59A85E3D5FD85FD9623F66B4671B67D068D2
+51927D2180AA81A88B008C8C8CBF927E96325420982C531750D5535C58A864B2
+6734726777667A4691E652C36CA16B8658005E4C5954672C7FFB51E176C60000
+646978E89B549EBB57CB59B96627679A6BCE54E969D95E55819C67959BAA67FE
+9C52685D4EA64FE353C862B9672B6CAB8FC44FAD7E6D9EBF4E0761626E806F2B
+85135473672A9B455DF37B955CAC5BC6871C6E4A84D17A14810859997C8D6C11
+772052D959227121725F77DB97279D61690B5A7F5A1851A5540D547D660E76DF
+8FF792989CF459EA725D6EC5514D68C97DBF7DEC97629EBA64786A2183025984
+5B5F6BDB731B76F27DB280178499513267289ED976EE676252FF99055C24623B
+7C7E8CB0554F60B67D0B958053014E5F51B6591C723A803691CE5F2577E25384
+5F797D0485AC8A338E8D975667F385AE9453610961086CB9765200000000FF5E
+97
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8AED8F38552F4F51512A52C753CB5BA55E7D60A0618263D6670967DA6E676D8C
+733673377531795088D58A98904A909190F596C4878D59154E884F594E0E8A89
+8F3F981050AD5E7C59965BB95EB863DA63FA64C166DC694A69D86D0B6EB67194
+75287AAF7F8A8000844984C989818B218E0A9065967D990A617E62916B320000
+6C836D747FCC7FFC6DC07F8587BA88F8676583B1983C96F76D1B7D61843D916A
+4E7153755D506B046FEB85CD862D89A75229540F5C65674E68A87406748375E2
+88CF88E191CC96E296785F8B73877ACB844E63A0756552896D416E9C74097559
+786B7C9296867ADC9F8D4FB6616E65C5865C4E864EAE50DA4E2151CC5BEE6599
+68816DBC731F764277AD7A1C7CE7826F8AD2907C91CF96759818529B7DD1502B
+539867976DCB71D0743381E88F2A96A39C579E9F746058416D997D2F985E4EE4
+4F364F8B51B752B15DBA601C73B2793C82D3923496B796F6970A9E979F6266A6
+6B74521752A370C888C25EC9604B61906F2371497C3E7DF4806F000000000000
+98
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+84EE9023932C54429B6F6AD370898CC28DEF973252B45A415ECA5F046717697C
+69946D6A6F0F726272FC7BED8001807E874B90CE516D9E937984808B93328AD6
+502D548C8A716B6A8CC4810760D167A09DF24E994E989C108A6B85C185686900
+6E7E789781550000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000005F0C
+4E104E154E2A4E314E364E3C4E3F4E424E564E584E824E858C6B4E8A82125F0D
+4E8E4E9E4E9F4EA04EA24EB04EB34EB64ECE4ECD4EC44EC64EC24ED74EDE4EED
+4EDF4EF74F094F5A4F304F5B4F5D4F574F474F764F884F8F4F984F7B4F694F70
+4F914F6F4F864F9651184FD44FDF4FCE4FD84FDB4FD14FDA4FD04FE44FE5501A
+50285014502A502550054F1C4FF650215029502C4FFE4FEF5011500650435047
+6703505550505048505A5056506C50785080509A508550B450B2000000000000
+99
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+50C950CA50B350C250D650DE50E550ED50E350EE50F950F55109510151025116
+51155114511A5121513A5137513C513B513F51405152514C515451627AF85169
+516A516E5180518256D8518C5189518F519151935195519651A451A651A251A9
+51AA51AB51B351B151B251B051B551BD51C551C951DB51E0865551E951ED0000
+51F051F551FE5204520B5214520E5227522A522E52335239524F5244524B524C
+525E5254526A527452695273527F527D528D529452925271528852918FA88FA7
+52AC52AD52BC52B552C152CD52D752DE52E352E698ED52E052F352F552F852F9
+530653087538530D5310530F5315531A5323532F533153335338534053465345
+4E175349534D51D6535E5369536E5918537B53775382539653A053A653A553AE
+53B053B653C37C1296D953DF66FC71EE53EE53E853ED53FA5401543D5440542C
+542D543C542E54365429541D544E548F5475548E545F5471547754705492547B
+5480547654845490548654C754A254B854A554AC54C454C854A8000000000000
+9A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+54AB54C254A454BE54BC54D854E554E6550F551454FD54EE54ED54FA54E25539
+55405563554C552E555C55455556555755385533555D5599558054AF558A559F
+557B557E5598559E55AE557C558355A9558755A855DA55C555DF55C455DC55E4
+55D4561455F7561655FE55FD561B55F9564E565071DF56345636563256380000
+566B5664562F566C566A56865680568A56A05694568F56A556AE56B656B456C2
+56BC56C156C356C056C856CE56D156D356D756EE56F9570056FF570457095708
+570B570D57135718571655C7571C572657375738574E573B5740574F576957C0
+57885761577F5789579357A057B357A457AA57B057C357C657D457D257D3580A
+57D657E3580B5819581D587258215862584B58706BC05852583D5879588558B9
+589F58AB58BA58DE58BB58B858AE58C558D358D158D758D958D858E558DC58E4
+58DF58EF58FA58F958FB58FC58FD5902590A5910591B68A65925592C592D5932
+5938593E7AD259555950594E595A5958596259605967596C5969000000000000
+9B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+59785981599D4F5E4FAB59A359B259C659E859DC598D59D959DA5A255A1F5A11
+5A1C5A095A1A5A405A6C5A495A355A365A625A6A5A9A5ABC5ABE5ACB5AC25ABD
+5AE35AD75AE65AE95AD65AFA5AFB5B0C5B0B5B165B325AD05B2A5B365B3E5B43
+5B455B405B515B555B5A5B5B5B655B695B705B735B755B7865885B7A5B800000
+5B835BA65BB85BC35BC75BC95BD45BD05BE45BE65BE25BDE5BE55BEB5BF05BF6
+5BF35C055C075C085C0D5C135C205C225C285C385C395C415C465C4E5C535C50
+5C4F5B715C6C5C6E4E625C765C795C8C5C915C94599B5CAB5CBB5CB65CBC5CB7
+5CC55CBE5CC75CD95CE95CFD5CFA5CED5D8C5CEA5D0B5D155D175D5C5D1F5D1B
+5D115D145D225D1A5D195D185D4C5D525D4E5D4B5D6C5D735D765D875D845D82
+5DA25D9D5DAC5DAE5DBD5D905DB75DBC5DC95DCD5DD35DD25DD65DDB5DEB5DF2
+5DF55E0B5E1A5E195E115E1B5E365E375E445E435E405E4E5E575E545E5F5E62
+5E645E475E755E765E7A9EBC5E7F5EA05EC15EC25EC85ED05ECF000000000000
+9C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+5ED65EE35EDD5EDA5EDB5EE25EE15EE85EE95EEC5EF15EF35EF05EF45EF85EFE
+5F035F095F5D5F5C5F0B5F115F165F295F2D5F385F415F485F4C5F4E5F2F5F51
+5F565F575F595F615F6D5F735F775F835F825F7F5F8A5F885F915F875F9E5F99
+5F985FA05FA85FAD5FBC5FD65FFB5FE45FF85FF15FDD60B35FFF602160600000
+601960106029600E6031601B6015602B6026600F603A605A6041606A6077605F
+604A6046604D6063604360646042606C606B60596081608D60E76083609A6084
+609B60966097609260A7608B60E160B860E060D360B45FF060BD60C660B560D8
+614D6115610660F660F7610060F460FA6103612160FB60F1610D610E6147613E
+61286127614A613F613C612C6134613D614261446173617761586159615A616B
+6174616F61656171615F615D6153617561996196618761AC6194619A618A6191
+61AB61AE61CC61CA61C961F761C861C361C661BA61CB7F7961CD61E661E361F6
+61FA61F461FF61FD61FC61FE620062086209620D620C6214621B000000000000
+9D
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+621E6221622A622E6230623262336241624E625E6263625B62606268627C6282
+6289627E62926293629662D46283629462D762D162BB62CF62FF62C664D462C8
+62DC62CC62CA62C262C7629B62C9630C62EE62F163276302630862EF62F56350
+633E634D641C634F6396638E638063AB637663A3638F6389639F63B5636B0000
+636963BE63E963C063C663E363C963D263F663C4641664346406641364266436
+651D64176428640F6467646F6476644E652A6495649364A564A9648864BC64DA
+64D264C564C764BB64D864C264F164E7820964E064E162AC64E364EF652C64F6
+64F464F264FA650064FD6518651C650565246523652B65346535653765366538
+754B654865566555654D6558655E655D65726578658265838B8A659B659F65AB
+65B765C365C665C165C465CC65D265DB65D965E065E165F16772660A660365FB
+6773663566366634661C664F664466496641665E665D666466676668665F6662
+667066836688668E668966846698669D66C166B966C966BE66BC000000000000
+9E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+66C466B866D666DA66E0663F66E666E966F066F566F7670F6716671E67266727
+9738672E673F67366741673867376746675E67606759676367646789677067A9
+677C676A678C678B67A667A1678567B767EF67B467EC67B367E967B867E467DE
+67DD67E267EE67B967CE67C667E76A9C681E684668296840684D6832684E0000
+68B3682B685968636877687F689F688F68AD6894689D689B68836AAE68B96874
+68B568A068BA690F688D687E690168CA690868D86922692668E1690C68CD68D4
+68E768D569366912690468D768E3692568F968E068EF6928692A691A69236921
+68C669796977695C6978696B6954697E696E69396974693D695969306961695E
+695D6981696A69B269AE69D069BF69C169D369BE69CE5BE869CA69DD69BB69C3
+69A76A2E699169A0699C699569B469DE69E86A026A1B69FF6B0A69F969F269E7
+6A0569B16A1E69ED6A1469EB6A0A6A126AC16A236A136A446A0C6A726A366A78
+6A476A626A596A666A486A386A226A906A8D6AA06A846AA26AA3000000000000
+9F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6A9786176ABB6AC36AC26AB86AB36AAC6ADE6AD16ADF6AAA6ADA6AEA6AFB6B05
+86166AFA6B126B169B316B1F6B386B3776DC6B3998EE6B476B436B496B506B59
+6B546B5B6B5F6B616B786B796B7F6B806B846B836B8D6B986B956B9E6BA46BAA
+6BAB6BAF6BB26BB16BB36BB76BBC6BC66BCB6BD36BDF6BEC6BEB6BF36BEF0000
+9EBE6C086C136C146C1B6C246C236C5E6C556C626C6A6C826C8D6C9A6C816C9B
+6C7E6C686C736C926C906CC46CF16CD36CBD6CD76CC56CDD6CAE6CB16CBE6CBA
+6CDB6CEF6CD96CEA6D1F884D6D366D2B6D3D6D386D196D356D336D126D0C6D63
+6D936D646D5A6D796D596D8E6D956FE46D856DF96E156E0A6DB56DC76DE66DB8
+6DC66DEC6DDE6DCC6DE86DD26DC56DFA6DD96DE46DD56DEA6DEE6E2D6E6E6E2E
+6E196E726E5F6E3E6E236E6B6E2B6E766E4D6E1F6E436E3A6E4E6E246EFF6E1D
+6E386E826EAA6E986EC96EB76ED36EBD6EAF6EC46EB26ED46ED56E8F6EA56EC2
+6E9F6F416F11704C6EEC6EF86EFE6F3F6EF26F316EEF6F326ECC000000000000
+E0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+6F3E6F136EF76F866F7A6F786F816F806F6F6F5B6FF36F6D6F826F7C6F586F8E
+6F916FC26F666FB36FA36FA16FA46FB96FC66FAA6FDF6FD56FEC6FD46FD86FF1
+6FEE6FDB7009700B6FFA70117001700F6FFE701B701A6F74701D7018701F7030
+703E7032705170637099709270AF70F170AC70B870B370AE70DF70CB70DD0000
+70D9710970FD711C711971657155718871667162714C7156716C718F71FB7184
+719571A871AC71D771B971BE71D271C971D471CE71E071EC71E771F571FC71F9
+71FF720D7210721B7228722D722C72307232723B723C723F72407246724B7258
+7274727E7282728172877292729672A272A772B972B272C372C672C472CE72D2
+72E272E072E172F972F7500F7317730A731C7316731D7334732F73297325733E
+734E734F9ED87357736A7368737073787375737B737A73C873B373CE73BB73C0
+73E573EE73DE74A27405746F742573F87432743A7455743F745F74597441745C
+746974707463746A7476747E748B749E74A774CA74CF74D473F1000000000000
+E1
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+74E074E374E774E974EE74F274F074F174F874F7750475037505750C750E750D
+75157513751E7526752C753C7544754D754A7549755B7546755A756975647567
+756B756D75787576758675877574758A758975827594759A759D75A575A375C2
+75B375C375B575BD75B875BC75B175CD75CA75D275D975E375DE75FE75FF0000
+75FC760175F075FA75F275F3760B760D7609761F762776207621762276247634
+7630763B764776487646765C76587661766276687669766A7667766C76707672
+76767678767C768076837688768B768E769676937699769A76B076B476B876B9
+76BA76C276CD76D676D276DE76E176E576E776EA862F76FB7708770777047729
+7724771E77257726771B773777387747775A7768776B775B7765777F777E7779
+778E778B779177A0779E77B077B677B977BF77BC77BD77BB77C777CD77D777DA
+77DC77E377EE77FC780C781279267820792A7845788E78747886787C789A788C
+78A378B578AA78AF78D178C678CB78D478BE78BC78C578CA78EC000000000000
+E2
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+78E778DA78FD78F47907791279117919792C792B794079607957795F795A7955
+7953797A797F798A799D79A79F4B79AA79AE79B379B979BA79C979D579E779EC
+79E179E37A087A0D7A187A197A207A1F79807A317A3B7A3E7A377A437A577A49
+7A617A627A699F9D7A707A797A7D7A887A977A957A987A967AA97AC87AB00000
+7AB67AC57AC47ABF90837AC77ACA7ACD7ACF7AD57AD37AD97ADA7ADD7AE17AE2
+7AE67AED7AF07B027B0F7B0A7B067B337B187B197B1E7B357B287B367B507B7A
+7B047B4D7B0B7B4C7B457B757B657B747B677B707B717B6C7B6E7B9D7B987B9F
+7B8D7B9C7B9A7B8B7B927B8F7B5D7B997BCB7BC17BCC7BCF7BB47BC67BDD7BE9
+7C117C147BE67BE57C607C007C077C137BF37BF77C177C0D7BF67C237C277C2A
+7C1F7C377C2B7C3D7C4C7C437C547C4F7C407C507C587C5F7C647C567C657C6C
+7C757C837C907CA47CAD7CA27CAB7CA17CA87CB37CB27CB17CAE7CB97CBD7CC0
+7CC57CC27CD87CD27CDC7CE29B3B7CEF7CF27CF47CF67CFA7D06000000000000
+E3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+7D027D1C7D157D0A7D457D4B7D2E7D327D3F7D357D467D737D567D4E7D727D68
+7D6E7D4F7D637D937D897D5B7D8F7D7D7D9B7DBA7DAE7DA37DB57DC77DBD7DAB
+7E3D7DA27DAF7DDC7DB87D9F7DB07DD87DDD7DE47DDE7DFB7DF27DE17E057E0A
+7E237E217E127E317E1F7E097E0B7E227E467E667E3B7E357E397E437E370000
+7E327E3A7E677E5D7E567E5E7E597E5A7E797E6A7E697E7C7E7B7E837DD57E7D
+8FAE7E7F7E887E897E8C7E927E907E937E947E967E8E7E9B7E9C7F387F3A7F45
+7F4C7F4D7F4E7F507F517F557F547F587F5F7F607F687F697F677F787F827F86
+7F837F887F877F8C7F947F9E7F9D7F9A7FA37FAF7FB27FB97FAE7FB67FB88B71
+7FC57FC67FCA7FD57FD47FE17FE67FE97FF37FF998DC80068004800B80128018
+8019801C80218028803F803B804A804680528058805A805F8062806880738072
+807080768079807D807F808480868085809B8093809A80AD519080AC80DB80E5
+80D980DD80C480DA80D6810980EF80F1811B81298123812F814B000000000000
+E4
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+968B8146813E8153815180FC8171816E81658166817481838188818A81808182
+81A0819581A481A3815F819381A981B081B581BE81B881BD81C081C281BA81C9
+81CD81D181D981D881C881DA81DF81E081E781FA81FB81FE8201820282058207
+820A820D821082168229822B82388233824082598258825D825A825F82640000
+82628268826A826B822E827182778278827E828D829282AB829F82BB82AC82E1
+82E382DF82D282F482F382FA8393830382FB82F982DE830682DC830982D98335
+83348316833283318340833983508345832F832B831783188385839A83AA839F
+83A283968323838E8387838A837C83B58373837583A0838983A883F4841383EB
+83CE83FD840383D8840B83C183F7840783E083F2840D8422842083BD84388506
+83FB846D842A843C855A84848477846B84AD846E848284698446842C846F8479
+843584CA846284B984BF849F84D984CD84BB84DA84D084C184C684D684A18521
+84FF84F485178518852C851F8515851484FC8540856385588548000000000000
+E5
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+85418602854B8555858085A485888591858A85A8856D8594859B85EA8587859C
+8577857E859085C985BA85CF85B985D085D585DD85E585DC85F9860A8613860B
+85FE85FA86068622861A8630863F864D4E558654865F86678671869386A386A9
+86AA868B868C86B686AF86C486C686B086C9882386AB86D486DE86E986EC0000
+86DF86DB86EF8712870687088700870386FB87118709870D86F9870A8734873F
+8737873B87258729871A8760875F8778874C874E877487578768876E87598753
+8763876A880587A2879F878287AF87CB87BD87C087D096D687AB87C487B387C7
+87C687BB87EF87F287E0880F880D87FE87F687F7880E87D28811881688158822
+88218831883688398827883B8844884288528859885E8862886B8881887E889E
+8875887D88B5887288828897889288AE889988A2888D88A488B088BF88B188C3
+88C488D488D888D988DD88F9890288FC88F488E888F28904890C890A89138943
+891E8925892A892B89418944893B89368938894C891D8960895E000000000000
+E6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+89668964896D896A896F89748977897E89838988898A8993899889A189A989A6
+89AC89AF89B289BA89BD89BF89C089DA89DC89DD89E789F489F88A038A168A10
+8A0C8A1B8A1D8A258A368A418A5B8A528A468A488A7C8A6D8A6C8A628A858A82
+8A848AA88AA18A918AA58AA68A9A8AA38AC48ACD8AC28ADA8AEB8AF38AE70000
+8AE48AF18B148AE08AE28AF78ADE8ADB8B0C8B078B1A8AE18B168B108B178B20
+8B3397AB8B268B2B8B3E8B288B418B4C8B4F8B4E8B498B568B5B8B5A8B6B8B5F
+8B6C8B6F8B748B7D8B808B8C8B8E8B928B938B968B998B9A8C3A8C418C3F8C48
+8C4C8C4E8C508C558C628C6C8C788C7A8C828C898C858C8A8C8D8C8E8C948C7C
+8C98621D8CAD8CAA8CBD8CB28CB38CAE8CB68CC88CC18CE48CE38CDA8CFD8CFA
+8CFB8D048D058D0A8D078D0F8D0D8D109F4E8D138CCD8D148D168D678D6D8D71
+8D738D818D998DC28DBE8DBA8DCF8DDA8DD68DCC8DDB8DCB8DEA8DEB8DDF8DE3
+8DFC8E088E098DFF8E1D8E1E8E108E1F8E428E358E308E348E4A000000000000
+E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+8E478E498E4C8E508E488E598E648E608E2A8E638E558E768E728E7C8E818E87
+8E858E848E8B8E8A8E938E918E948E998EAA8EA18EAC8EB08EC68EB18EBE8EC5
+8EC88ECB8EDB8EE38EFC8EFB8EEB8EFE8F0A8F058F158F128F198F138F1C8F1F
+8F1B8F0C8F268F338F3B8F398F458F428F3E8F4C8F498F468F4E8F578F5C0000
+8F628F638F648F9C8F9F8FA38FAD8FAF8FB78FDA8FE58FE28FEA8FEF90878FF4
+90058FF98FFA901190159021900D901E9016900B90279036903590398FF8904F
+905090519052900E9049903E90569058905E9068906F907696A890729082907D
+90819080908A9089908F90A890AF90B190B590E290E4624890DB910291129119
+91329130914A9156915891639165916991739172918B9189918291A291AB91AF
+91AA91B591B491BA91C091C191C991CB91D091D691DF91E191DB91FC91F591F6
+921E91FF9214922C92159211925E925792459249926492489295923F924B9250
+929C92969293929B925A92CF92B992B792E9930F92FA9344932E000000000000
+E8
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+93199322931A9323933A9335933B935C9360937C936E935693B093AC93AD9394
+93B993D693D793E893E593D893C393DD93D093C893E4941A9414941394039407
+94109436942B94359421943A944194529444945B94609462945E946A92299470
+94759477947D945A947C947E9481947F95829587958A95949596959895990000
+95A095A895A795AD95BC95BB95B995BE95CA6FF695C395CD95CC95D595D495D6
+95DC95E195E595E296219628962E962F9642964C964F964B9677965C965E965D
+965F96669672966C968D96989695969796AA96A796B196B296B096B496B696B8
+96B996CE96CB96C996CD894D96DC970D96D596F99704970697089713970E9711
+970F971697199724972A97309739973D973E97449746974897429749975C9760
+97649766976852D2976B977197799785977C9781977A9786978B978F9790979C
+97A897A697A397B397B497C397C697C897CB97DC97ED9F4F97F27ADF97F697F5
+980F980C9838982498219837983D9846984F984B986B986F9870000000000000
+E9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+98719874987398AA98AF98B198B698C498C398C698E998EB9903990999129914
+99189921991D991E99249920992C992E993D993E9942994999459950994B9951
+9952994C99559997999899A599AD99AE99BC99DF99DB99DD99D899D199ED99EE
+99F199F299FB99F89A019A0F9A0599E29A199A2B9A379A459A429A409A430000
+9A3E9A559A4D9A5B9A579A5F9A629A659A649A699A6B9A6A9AAD9AB09ABC9AC0
+9ACF9AD19AD39AD49ADE9ADF9AE29AE39AE69AEF9AEB9AEE9AF49AF19AF79AFB
+9B069B189B1A9B1F9B229B239B259B279B289B299B2A9B2E9B2F9B329B449B43
+9B4F9B4D9B4E9B519B589B749B939B839B919B969B979B9F9BA09BA89BB49BC0
+9BCA9BB99BC69BCF9BD19BD29BE39BE29BE49BD49BE19C3A9BF29BF19BF09C15
+9C149C099C139C0C9C069C089C129C0A9C049C2E9C1B9C259C249C219C309C47
+9C329C469C3E9C5A9C609C679C769C789CE79CEC9CF09D099D089CEB9D039D06
+9D2A9D269DAF9D239D1F9D449D159D129D419D3F9D3E9D469D48000000000000
+EA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+9D5D9D5E9D649D519D509D599D729D899D879DAB9D6F9D7A9D9A9DA49DA99DB2
+9DC49DC19DBB9DB89DBA9DC69DCF9DC29DD99DD39DF89DE69DED9DEF9DFD9E1A
+9E1B9E1E9E759E799E7D9E819E889E8B9E8C9E929E959E919E9D9EA59EA99EB8
+9EAA9EAD97619ECC9ECE9ECF9ED09ED49EDC9EDE9EDD9EE09EE59EE89EEF0000
+9EF49EF69EF79EF99EFB9EFC9EFD9F079F0876B79F159F219F2C9F3E9F4A9F52
+9F549F639F5F9F609F619F669F679F6C9F6A9F779F729F769F959F9C9FA0582F
+69C79059746451DC719900000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
diff --git a/ext/Encode/Encode/symbol.enc b/ext/Encode/Encode/symbol.enc
new file mode 100644 (file)
index 0000000..ffda9e3
--- /dev/null
@@ -0,0 +1,20 @@
+# Encoding file: symbol, single-byte
+S
+003F 1 1
+00
+0000000100020003000400050006000700080009000A000B000C000D000E000F
+0010001100120013001400150016001700180019001A001B001C001D001E001F
+0020002122000023220300250026220D002800292217002B002C2212002E002F
+0030003100320033003400350036003700380039003A003B003C003D003E003F
+22450391039203A70394039503A603930397039903D1039A039B039C039D039F
+03A0039803A103A303A403A503C203A9039E03A80396005B2234005D22A5005F
+F8E503B103B203C703B403B503C603B303B703B903D503BA03BB03BC03BD03BF
+03C003B803C103C303C403C503D603C903BE03C803B6007B007C007D223C007F
+0080008100820083008400850086008700880089008A008B008C008D008E008F
+0090009100920093009400950096009700980099009A009B009C009D009E009F
+000003D2203222642044221E0192266326662665266021942190219121922193
+00B000B12033226500D7221D2202202200F72260226122482026F8E6F8E721B5
+21352111211C21182297229522052229222A2283228722842282228622082209
+2220220700AE00A92122220F221A22C500AC2227222821D421D021D121D221D3
+22C42329F8E8F8E9F8EA2211F8EBF8ECF8EDF8EEF8EFF8F0F8F1F8F2F8F3F8F4
+F8FF232A222B2320F8F52321F8F6F8F7F8F8F8F9F8FAF8FBF8FCF8FDF8FE0000
diff --git a/ext/Encode/Makefile.PL b/ext/Encode/Makefile.PL
new file mode 100644 (file)
index 0000000..329937e
--- /dev/null
@@ -0,0 +1,11 @@
+use ExtUtils::MakeMaker;
+WriteMakefile(
+       NAME            => "Encode",
+       VERSION_FROM    => 'Encode.pm',
+       'dist'          => {
+                            COMPRESS   => 'gzip -9f',
+                            SUFFIX     => 'gz',
+                            DIST_DEFAULT => 'all tardist',
+                          },
+       MAN3PODS        => {},
+);
diff --git a/ext/Encode/Todo b/ext/Encode/Todo
new file mode 100644 (file)
index 0000000..c59622b
--- /dev/null
@@ -0,0 +1,49 @@
+Use Markus Kuhn's UTF-8 Decode Stress Tester at
+
+       http://www.cl.cam.ac.uk/~mgk25/ucs/examples/
+
+Markus:
+> 
+> What exactly is malformed UTF-8 data here?
+> 
+> Obviously at least everything listed in section R.7 of ISO 10646-1/Amd.2.
+> 
+> Does it also cover overlong UTF-8 sequences, i.e. any string
+> containing any of the five bit sequences
+> 
+>   1100000x,
+>   11100000 100xxxxx,
+>   11110000 1000xxxx,
+>   11111000 10000xxx,
+>   11111100 100000xx
+> 
+> Does it also cover UTF-8 encoded code positions U+D800 to U+DFFF (UTF-16
+> surrogates) as well as U+FFFE (anti-BOM) and U+FFFF, all of which must
+> not occur in proper UTF-8 and UTF-32 data according to the standard
+> (see note 3 in section R.4 of UCS)?
+> 
+> It might be useful, if the spec were clearer here.
+> 
+> References:
+> 
+>   - ISO/IEC 10646-1:1993(E), Amd. 2,            
+>     http://www.cl.cam.ac.uk/~mgk25/ucs/ISO-10646-UTF-8.html
+> 
+>   - http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+> 
+
+Markus:
+> 
+> It is commonly considered to be good practice to reject at least
+> overlong UTF-8 sequences, otherwise one permits multiple encodings for
+> characters, which makes pattern matching far more difficult in
+> applications where strings are processed in both coded and decoded form.
+> It has been argued that this could easily lead to security
+> vulnerabilities. See
+>                   
+>   http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+>   http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt   (section 4)
+>   ftp://sunsite.doc.ic.ac.uk/packages/rfc/rfc2279.txt          (section 6)
+>           
+> for a brief discussion.
+> 
index 2bfa003..dd94b37 100644 (file)
@@ -1,3 +1,8 @@
+Change 171 on 2000-09-12 by <calle@lysator.liu.se> (Calle Dybedahl)
+
+       - Fixed filename-extracting regexp to allow whitespace between
+         "#" and "line", which the cpp on Unicos 9 produces.
+
 Change 170 on 1998/07/05 by <gbarr@pobox.com> (Graham Barr)
 
        Fixed three problems reported by Hans Mulder for NeXT
index df68dc3..0666b2a 100644 (file)
@@ -102,7 +102,7 @@ sub get_files {
            $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
        }
        else {
-           $pat = '^#(?:line)?\s*\d+\s+"([^"]+)"';
+           $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
        }
        while(<CPPO>) {
            if ($^O eq 'os2' or $^O eq 'MSWin32') {
index 870f056..13123ef 100644 (file)
@@ -56,7 +56,7 @@ not_here(char *s)
 static void
 output_datum(pTHX_ SV *arg, char *str, int size)
 {
-#if !defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC))
+#if !defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC) && !defined(LEAKTEST))
        sv_usepvn(arg, str, size);
 #else
        sv_setpvn(arg, str, size);
index 930df55..b6cb410 100644 (file)
@@ -71,7 +71,7 @@ corresponding built-in functions:
     $io->printf ( FMT, [ARGS] )
     $io->stat
     $io->sysread ( BUF, LEN, [OFFSET] )
-    $io->syswrite ( BUF, LEN, [OFFSET] )
+    $io->syswrite ( BUF, [LEN, [OFFSET]] )
     $io->truncate ( LEN )
 
 See L<perlvar> for complete descriptions of each of the following
@@ -115,13 +115,13 @@ Returns true if the object is currently a valid file descriptor.
 =item $io->getline
 
 This works like <$io> described in L<perlop/"I/O Operators">
-except that it's more readable and can be safely called in an
-array context but still returns just one line.
+except that it's more readable and can be safely called in a
+list context but still returns just one line.
 
 =item $io->getlines
 
-This works like <$io> when called in an array context to
-read all the remaining lines in a file, except that it's more readable.
+This works like <$io> when called in a list context to read all
+the remaining lines in a file, except that it's more readable.
 It will also croak() if accidentally called in a scalar context.
 
 =item $io->ungetc ( ORD )
@@ -425,8 +425,11 @@ sub write {
 
 sub syswrite {
     @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
-    $_[2] = length($_[1]) unless defined $_[2];
-    syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+    if (defined($_[2])) {
+       syswrite($_[0], $_[1], $_[2], $_[3] || 0);
+    } else {
+       syswrite($_[0], $_[1]);
+    }
 }
 
 sub stat {
index df92b04..e84b54f 100644 (file)
@@ -300,9 +300,9 @@ Return an array of all registered handles.
 =item can_read ( [ TIMEOUT ] )
 
 Return an array of handles that are ready for reading. C<TIMEOUT> is
-the maximum amount of time to wait before returning an empty list. If
-C<TIMEOUT> is not given and any handles are registered then the call
-will block.
+the maximum amount of time to wait before returning an empty list, in
+seconds, possibly fractional. If C<TIMEOUT> is not given and any
+handles are registered then the call will block.
 
 =item can_write ( [ TIMEOUT ] )
 
index 6884f02..b8da092 100644 (file)
@@ -361,7 +361,7 @@ perform the system call C<accept> on the socket and return a new object. The
 new object will be created in the same class as the listen socket, unless
 C<PKG> is specified. This object can be used to communicate with the client
 that was trying to connect. In a scalar context the new socket is returned,
-or undef upon failure. In an array context a two-element array is returned
+or undef upon failure. In a list context a two-element array is returned
 containing the new socket and the peer address; the list will
 be empty upon failure.
 
index d083f48..2a11752 100644 (file)
@@ -37,7 +37,7 @@ sub configure {
        $sock->bind($addr) or
            return undef;
     }
-    if(exists $arg->{Listen}) {
+    if(exists $arg->{Listen} && $type != SOCK_DGRAM) {
        $sock->listen($arg->{Listen} || 5) or
            return undef;
     }
index f98669f..c9ef699 100644 (file)
@@ -24,15 +24,93 @@ NDBM_File - Tied access to ndbm files
 
 =head1 SYNOPSIS
 
- use NDBM_File;
- use Fcntl;       # for O_ constants
+  use Fcntl;   # For O_RDWR, O_CREAT, etc.
+  use NDBM_File;
 
- tie(%h, 'NDBM_File', 'Op.dbmx', O_RDWR|O_CREAT, 0640);
+  # Now read and change the hash
+  $h{newkey} = newvalue;
+  print $h{oldkey}; 
+  ...
+  untie %h;
+=head1 DESCRIPTION
+C<NDBM_File> establishes a connection between a Perl hash variable and
+a file in NDBM_File format;.  You can manipulate the data in the file
+just as if it were in a Perl hash, but when your program exits, the
+data will remain in the file, to be used the next time your program
+runs.
 
- untie %h;
+Use C<NDBM_File> with the Perl built-in C<tie> function to establish
+the connection between the variable and the file.  The arguments to
+C<tie> should be:
 
-=head1 DESCRIPTION
+=over 4
+
+=item 1.
+
+The hash variable you want to tie.
+
+=item 2. 
+
+The string C<"NDBM_File">.  (Ths tells Perl to use the C<NDBM_File>
+package to perform the functions of the hash.)
+
+=item 3. 
+
+The name of the file you want to tie to the hash.  
+
+=item 4.
+
+Flags.  Use one of:
+
+=over 2
+
+=item C<O_RDONLY>
+
+Read-only access to the data in the file.
+
+=item C<O_WRONLY>
+
+Write-only access to the data in the file.
+
+=item C<O_RDWR>
+
+Both read and write access.
+
+=back
+
+If you want to create the file if it does not exist, add C<O_CREAT> to
+any of these, as in the example.  If you omit C<O_CREAT> and the file
+does not already exist, the C<tie> call will fail.
+
+=item 5.
+
+The default permissions to use if a new file is created.  The actual
+permissions will be modified by the user's umask, so you should
+probably use 0666 here. (See L<perlfunc/umask>.)
+
+=back
+
+=head1 DIAGNOSTICS
+
+On failure, the C<tie> call returns an undefined value and probably
+sets C<$!> to contain the reason the file could not be tied.
+
+=head2 C<ndbm store returned -1, errno 22, key "..." at ...>
+
+This warning is emmitted when you try to store a key or a value that
+is too long.  It means that the change was not recorded in the
+database.  See BUGS AND WARNINGS below.
+
+=head1 BUGS AND WARNINGS
+
+There are a number of limits on the size of the data that you can
+store in the NDBM file.  The most important is that the length of a
+key, plus the length of its associated value, may not exceed 1008
+bytes.
 
-See L<perlfunc/tie>, L<perldbmfilter>
+See L<perlfunc/tie>, L<perldbmfilter>, L<Fcntl>
 
 =cut
index 57fe4c3..732ed60 100644 (file)
@@ -20,14 +20,93 @@ ODBM_File - Tied access to odbm files
 
 =head1 SYNOPSIS
 
+ use Fcntl;   # For O_RDWR, O_CREAT, etc.
  use ODBM_File;
 
- tie(%h, 'ODBM_File', 'Op.dbmx', O_RDWR|O_CREAT, 0640);
+  # Now read and change the hash
+  $h{newkey} = newvalue;
+  print $h{oldkey}; 
+  ...
+  untie %h;
+=head1 DESCRIPTION
+C<ODBM_File> establishes a connection between a Perl hash variable and
+a file in ODBM_File format;.  You can manipulate the data in the file
+just as if it were in a Perl hash, but when your program exits, the
+data will remain in the file, to be used the next time your program
+runs.
 
- untie %h;
+Use C<ODBM_File> with the Perl built-in C<tie> function to establish
+the connection between the variable and the file.  The arguments to
+C<tie> should be:
 
-=head1 DESCRIPTION
+=over 4
+
+=item 1.
+
+The hash variable you want to tie.
+
+=item 2. 
+
+The string C<"ODBM_File">.  (Ths tells Perl to use the C<ODBM_File>
+package to perform the functions of the hash.)
+
+=item 3. 
+
+The name of the file you want to tie to the hash.  
+
+=item 4.
+
+Flags.  Use one of:
+
+=over 2
+
+=item C<O_RDONLY>
+
+Read-only access to the data in the file.
+
+=item C<O_WRONLY>
+
+Write-only access to the data in the file.
+
+=item C<O_RDWR>
+
+Both read and write access.
+
+=back
+
+If you want to create the file if it does not exist, add C<O_CREAT> to
+any of these, as in the example.  If you omit C<O_CREAT> and the file
+does not already exist, the C<tie> call will fail.
+
+=item 5.
+
+The default permissions to use if a new file is created.  The actual
+permissions will be modified by the user's umask, so you should
+probably use 0666 here. (See L<perlfunc/umask>.)
+
+=back
+
+=head1 DIAGNOSTICS
+
+On failure, the C<tie> call returns an undefined value and probably
+sets C<$!> to contain the reason the file could not be tied.
+
+=head2 C<odbm store returned -1, errno 22, key "..." at ...>
+
+This warning is emmitted when you try to store a key or a value that
+is too long.  It means that the change was not recorded in the
+database.  See BUGS AND WARNINGS below.
+
+=head1 BUGS AND WARNINGS
+
+There are a number of limits on the size of the data that you can
+store in the ODBM file.  The most important is that the length of a
+key, plus the length of its associated value, may not exceed 1008
+bytes.
 
-See L<perlfunc/tie>, L<perldbmfilter>
+See L<perlfunc/tie>, L<perldbmfilter>, L<Fcntl>
 
 =cut
index 9338d39..841120c 100644 (file)
@@ -163,7 +163,7 @@ accumulated set of ops at that point.
 
 =item an operator set (opset)
 
-An I<opset> as a binary string of approximately 43 bytes which holds a
+An I<opset> as a binary string of approximately 44 bytes which holds a
 set or zero or more operators.
 
 The opset and opset_to_ops functions can be used to convert from
@@ -185,7 +185,7 @@ tags and sets. All are available for export by the package.
 =item opcodes
 
 In a scalar context opcodes returns the number of opcodes in this
-version of perl (around 340 for perl5.002).
+version of perl (around 350 for perl-5.7.0).
 
 In a list context it returns a list of all the operator names.
 (Not yet implemented, use @names = opset_to_ops(full_opset).)
index b8b80d4..a536671 100644 (file)
@@ -539,12 +539,12 @@ mini_mktime(struct tm *ptm)
 }
 
 #ifdef HAS_LONG_DOUBLE
-#  if LONG_DOUBLESIZE > DOUBLESIZE
+#  if LONG_DOUBLESIZE > NVSIZE
 #    undef HAS_LONG_DOUBLE  /* XXX until we figure out how to use them */
 #  endif
 #endif
 
-#ifndef HAS_LONG_DOUBLE 
+#ifndef HAS_LONG_DOUBLE
 #ifdef LDBL_MAX
 #undef LDBL_MAX
 #endif
@@ -564,11 +564,7 @@ not_here(char *s)
 }
 
 static
-#if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
-long double
-#else
-double
-#endif
+NV
 constant(char *name, int arg)
 {
     errno = 0;
@@ -1528,7 +1524,7 @@ constant(char *name, int arg)
     case 'H':
        if (strEQ(name, "HUGE_VAL"))
 #if defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
-         /* HUGE_VALL is admittedly non-POSIX but if are using long doubles
+         /* HUGE_VALL is admittedly non-POSIX but if we are using long doubles
           * we might as well use long doubles. --jhi */
            return HUGE_VALL;
 #endif
@@ -3020,7 +3016,7 @@ setcc(termios_ref, ccix, cc)
 
 MODULE = POSIX         PACKAGE = POSIX
 
-double
+NV
 constant(name,arg)
        char *          name
        int             arg
@@ -3309,73 +3305,73 @@ setlocale(category, locale = 0)
        RETVAL
 
 
-double
+NV
 acos(x)
-       double          x
+       NV              x
 
-double
+NV
 asin(x)
-       double          x
+       NV              x
 
-double
+NV
 atan(x)
-       double          x
+       NV              x
 
-double
+NV
 ceil(x)
-       double          x
+       NV              x
 
-double
+NV
 cosh(x)
-       double          x
+       NV              x
 
-double
+NV
 floor(x)
-       double          x
+       NV              x
 
-double
+NV
 fmod(x,y)
-       double          x
-       double          y
+       NV              x
+       NV              y
 
 void
 frexp(x)
-       double          x
+       NV              x
     PPCODE:
        int expvar;
        /* (We already know stack is long enough.) */
        PUSHs(sv_2mortal(newSVnv(frexp(x,&expvar))));
        PUSHs(sv_2mortal(newSViv(expvar)));
 
-double
+NV
 ldexp(x,exp)
-       double          x
+       NV              x
        int             exp
 
-double
+NV
 log10(x)
-       double          x
+       NV              x
 
 void
 modf(x)
-       double          x
+       NV              x
     PPCODE:
-       double intvar;
+       NV intvar;
        /* (We already know stack is long enough.) */
        PUSHs(sv_2mortal(newSVnv(Perl_modf(x,&intvar))));
        PUSHs(sv_2mortal(newSVnv(intvar)));
 
-double
+NV
 sinh(x)
-       double          x
+       NV              x
 
-double
+NV
 tan(x)
-       double          x
+       NV              x
 
-double
+NV
 tanh(x)
-       double          x
+       NV              x
 
 SysRet
 sigaction(sig, action, oldaction = 0)
index 63e41c7..baf9bfc 100644 (file)
@@ -5,6 +5,7 @@ Time_t                  T_NV
 Gid_t                  T_NV
 Off_t                  T_NV
 Dev_t                  T_NV
+NV                     T_NV
 fd                     T_IV
 speed_t                        T_IV
 tcflag_t               T_IV
index 438b8d0..b3502b9 100644 (file)
@@ -103,8 +103,6 @@ This warning is emmitted when you try to store a key or a value that
 is too long.  It means that the change was not recorded in the
 database.  See BUGS AND WARNINGS below.
 
-
-
 =head1 BUGS AND WARNINGS
 
 There are a number of limits on the size of the data that you can
index dc47d70..321ac3e 100644 (file)
@@ -3,16 +3,33 @@
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * provided that the above copyright notice and this notice are
+ * duplicated in all such forms.
+ *
+ * [additional clause stricken -- see below]
+ *
+ * The name of the University may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ *
+ * This notice previously contained the additional clause:
+ *
+ *   and that any documentation, advertising materials, and other
+ *   materials related to such distribution and use acknowledge that
+ *   the software was developed by the University of California,
+ *   Berkeley.
+ *
+ * Pursuant to the licensing change made by the Office of Technology
+ * Licensing of the University of California, Berkeley on July 22,
+ * 1999 and documented in:
+ *
+ *   ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ *
+ * this clause has been stricken and no longer is applicable to this
+ * software.
  */
 
 #ifndef lint
index 1196953..e2c9355 100644 (file)
@@ -3,16 +3,33 @@
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * provided that the above copyright notice and this notice are
+ * duplicated in all such forms.
+ *
+ * [additional clause stricken -- see below]
+ *
+ * The name of the University may not be used to endorse or promote 
+ * products derived from this software without specific prior written 
+ * permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE 
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+ * PURPOSE.
+ * 
+ * This notice previously contained the additional clause:
+ *
+ *   and that any documentation, advertising materials, and other 
+ *   materials related to such distribution and use acknowledge that 
+ *   the software was developed by the University of California, 
+ *   Berkeley.
+ *
+ * Pursuant to the licensing change made by the Office of Technology
+ * Licensing of the University of California, Berkeley on July 22, 
+ * 1999 and documented in:
+ *
+ *   ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
+ *
+ * this clause has been stricken and no longer is applicable to this
+ * software.
  *
  *    @(#)dbm.h    5.2 (Berkeley) 5/24/89
  */
index 025888d..b4a0419 100644 (file)
@@ -111,7 +111,7 @@ to inet_aton('255.255.255.255').
 
 =item sockaddr_in SOCKADDR_IN
 
-In an array context, unpacks its SOCKADDR_IN argument and returns an array
+In a list context, unpacks its SOCKADDR_IN argument and returns an array
 consisting of (PORT, ADDRESS).  In a scalar context, packs its (PORT,
 ADDRESS) arguments as a SOCKADDR_IN and returns it.  If this is confusing,
 use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
@@ -135,7 +135,7 @@ Will croak if the structure does not have AF_INET in the right place.
 
 =item sockaddr_un SOCKADDR_UN
 
-In an array context, unpacks its SOCKADDR_UN argument and returns an array
+In a list context, unpacks its SOCKADDR_UN argument and returns an array
 consisting of (PATHNAME).  In a scalar context, packs its PATHNAME
 arguments as a SOCKADDR_UN and returns it.  If this is confusing, use
 pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
diff --git a/ext/Storable/ChangeLog b/ext/Storable/ChangeLog
new file mode 100644 (file)
index 0000000..049ce29
--- /dev/null
@@ -0,0 +1,430 @@
+Fri Sep 29 21:52:29 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Version 1.0.3.
+
+       Avoid using "tainted" and "dirty" since Perl remaps them via
+       cpp (i.e. #define).  This is deeply harmful when threading
+       is enabled.  This concerned both the context structure and
+       local variable and argument names.  Brrr..., scary!
+
+Thu Sep 28 23:46:39 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Version 1.0.2.
+
+       Fixed spelling in README.
+
+       Added lock_store, lock_nstore, and lock_retrieve (advisory locking)
+       after a proposal from Erik Haugan <erik@solbors.no>.
+
+       Perls before 5.004_04 lack newSVpvn, added remapping in XS.
+
+       Fixed stupid typo in the t/utf8.t test.
+
+Sun Sep 17 18:51:10 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Version 1.0.1, binary format 2.3.
+
+       Documented that doubles are stored stringified by nstore().
+
+       Added Salvador Ortiz Garcia in CREDITS section,  He identified
+       a bug in the store hooks and proposed the right fix: the class
+       id was allocated too soon.  His bug case was also added to
+       the regression test suite.
+
+       Now only taint retrieved data when source was tainted.  A bug
+       discovered by Marc Lehmann.
+
+       Added support for UTF-8 strings, a contribution of Marc Lehmann.
+       This is normally only activated in post-5.6 perls.
+
+Thu Aug 31 23:06:06 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+       First official release Storable 1.0, for inclusion in perl 5.7.0.
+       The license scheme is now compatible with Perl's.
+
+Thu Aug 24 01:02:02 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+
+       ANSI-fied most of the code, preparing for Perl core integration.
+       The next version of Storable will be 0.8, and will be integrated
+       into the Perl core (development branch).
+
+       Dispatch tables were moved upfront to relieve some compilers,
+       especially on AIX and Windows platforms.
+
+       Merged 64-bit fixes from perl5-porters.
+
+Mon Aug 14 09:22:04 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Added a refcnt dec in retrieve_tied_key(): sv_magic() increases
+       the refcnt on the mg_ptr as well.
+
+       Removed spurious dependency to Devel::Peek, which was used for
+       testing only in t/tied_items.t.  Thanks to Conrad Heiney
+       <conrad@fringehead.org> for spotting it first.
+
+Sun Aug 13 22:12:59 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Marc Lehmann kindly contributed code to add overloading support
+       and to handle references to tied variables.
+
+       Rewrote leading blurb about compatibility to make it clearer what
+       "backward compatibility" is about: when I say 0.7 is backward
+       compatible with 0.6, it means the revision 0.7 can read files
+       produced by 0.6.
+
+       Mention new Clone(3) extension in SEE ALSO.
+
+       Was wrongly optimizing for "undef" values in hashes by not
+       fully recursing: as a result, tied "undef" values were incorrectly
+       serialized.
+
+Sun Jul 30 12:59:17 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+       First revision of Storable 0.7.
+
+       The serializing format is new, known as version 2.0.  It is fully
+       backward compatible with 0.6.  Earlier formats are deprecated and
+       have not even been tested: next version will drop pre-0.6 format.
+
+       Changes since 0.6@11:
+
+       - Moved interface to the "beta" status.  Some tiny parts are still
+         subject to change, but nothing important enough to warrant an "alpha"
+         status any longer.
+
+       - Slightly reduced the size of the Storable image by factorizing
+         object class names and removing final object storage notification due
+         to a redesign of the blessed object storing.
+
+       - Classes can now redefine how they wish their instances to be serialized
+         and/or deep cloned.  Serializing hooks are written in Perl code.
+
+       - The engine is now fully re-entrant.
+
+Sun Apr  2 23:47:50 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Added provision to detect more recent binary formats, since
+       the new upcoming Storable-0.7 will use a different format.
+       In order to prevent attempting the de-serialization of newer
+       formats by older versions, I'm adding this now to the 0.6 series.
+
+       I'm expecting this revision to be the last of the 0.6 series.
+       Unless it does not work with perl 5.6, which I don't use yet,
+       and therefore against which I cannot test.
+
+Wed Mar 29 19:55:21 MEST 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Added note about format incompatibilities with old versions
+       (i.e. pre 0.5@9 formats, which cannot be understood as there
+       was no versionning information in the file by then).
+
+       Protect all $@ variables when eval {} used, to avoid corrupting
+       it when store/retrieve is called within an exception handler.
+
+       Mistakenly included "patchlevel.h" instead of <patchlevel.h>,
+       preventing Perl's patchlevel from being included, which is
+       needed starting from 5.6.
+
+Tue May 12 09:15:15 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Fixed shared "undef" bug in hashes, which did not remain shared
+       through store/retrieve.
+
+Thu Feb 10 19:48:16 MET 2000   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       added last_op_in_netorder() predicate
+       documented last_op_in_netorder()
+       added tests for the new last_op_in_netorder() predicate
+
+Wed Oct 20 19:07:36 MEST 1999   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Forgot to update VERSION
+
+Tue Oct 19 21:25:02 MEST 1999   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Added mention of japanese translation for the manual page.
+
+       Fixed typo in macro that made threaded code not compilable,
+       especially on Win32 platforms.
+
+       Changed detection of older perls (pre-5.005) by testing PATCHLEVEL
+       directly instead of relying on internal symbols.
+
+Tue Sep 14 22:13:28 MEST 1999   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       Integrated "thread-safe" patch from Murray Nesbitt.
+       Note that this may not be very efficient for threaded code,
+       see comment in the code.
+
+       Try to avoid compilation warning on 64-bit CPUs. Can't test it,
+       since I don't have access to such machines.
+
+Mon Jul 12 14:37:19 METDST 1999   Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+. Description:
+
+       changed my e-mail to pobox.
+
+       mentionned it is not thread-safe.
+
+       updated version number.
+
+       uses new internal PL_* naming convention.
+
+Fri Jul  3 13:38:16 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated benchmark figures due to recent optimizations done in
+       store(): tagnums are now stored as-is in the hash table, so
+       no surrounding SV is created. And the "shared keys" mode for
+       hash table was turned off.
+
+       Fixed backward compatibility (wrt 0.5@9) for retrieval of
+       blessed refs. That old version did something wrong, but the
+       bugfix prevented correct retrieval of the old format.
+
+Mon Jun 22 11:00:48 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Changed benchmark figures.
+
+       Adjust refcnt of tied objects after calling sv_magic() to avoid
+       memory leaks.  Contributed by Jeff Gresham.
+
+Fri Jun 12 11:50:04 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Added workaround for persistent LVALUE-ness in perl5.004. All
+       scalars tagged as being an lvalue are handled as if they were
+       not an lvalue at all.  Added test for that LVALUE bug workaround.
+
+       Now handles Perl immortal scalars explicitely, by storing &sv_yes
+       as such, explicitely.
+
+       Retrieval of non-immortal undef cannot be shared. Previous
+       version was over-optimizing by not creating a separate SV for
+       all undefined scalars seen.
+
+Thu Jun  4 17:21:51 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Baseline for Storable-0.6@0.
+
+       This version introduces a binary incompatibility in the generated
+       binary image, which is more compact than older ones by approximatively
+       15%, depending on the exact degree of sharing in your structures.
+
+       The good news is that your older images can still be retrieved with
+       this version, i.e. backward compatibility is preserved. This version
+       of Storable can only generate new binaries however.
+
+       Another good news is that the retrieval of data structure is
+       significantly quicker than before, because a Perl array is used
+       instead of a hash table to keep track of retrieved objects, and
+       also because the image being smaller, less I/O function calls are
+       made.
+
+Tue May 12 09:15:15 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Version number now got from Storable.pm directly.
+
+       Fixed overzealous sv_type() optimization, which would make
+       Storable fail when faced with an "upgraded" SV to the PVIV
+       or PVNV kind containing a reference.
+
+Thu Apr 30 15:11:30 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Extended the SYNOPSIS section to give quick overview of the
+       routines and their signature.
+
+       Optimized sv_type() to avoid flags checking when not needed, i.e.
+       when their type makes it impossible for them to be refs or tied.
+       This slightly increases throughput by a few percents when refs
+       and tied variables are marginal occurrences in your data.
+
+       Stubs for XS now use OutputStream and InputStream file types to
+       make it work when the given file is actually a socket. Perl
+       makes a distinction for sockets in its internal I/O structures
+       by having both a read and a write structure, whereas plain files
+       share the same one.
+
+Tue Jun  3 09:41:33 METDST 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Thanks to a contribution from Benjamin A. Holzman, Storable is now
+       able to correctly serialize tied SVs, i.e. tied arrays, hashes
+       and scalars.
+
+Thu Apr  9 18:07:51 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       I said SvPOK() had changed to SvPOKp(), but that was a lie...
+
+Wed Apr  8 13:14:29 METDST 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Wrote sizeof(SV *) instead of sizeof(I32) when portable, which
+       in effect mangled the object tags and prevented portability
+       accross 32/64 bit architectures!
+
+Wed Mar 25 14:57:02 MET 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Added code example for store_fd() and retrieve_fd() in the
+       man page, to emphasize that file descriptors must be passed as
+       globs, not as plain strings.
+
+       Cannot use SV addresses as tag when using nstore() on LP64. This
+       was the cause of problems when creating a storable image on an
+       LP64 machine and retrieving it on an ILP32 system, which is
+       exactly what nstore() is meant for...
+
+       However, we continue to use SV addresses as tags for plain store(),
+       because benchamarking shows that it saves up to 8% of the store
+       time, and store() is meant to be fast at the expense of lack
+       of portability.
+
+       This means there will be approximately an 8% degradation of
+       performance for nstore(), but it's now working as expected.
+       That cost may vary on your machine of course, since it is
+       solely caused by the memory allocation overhead used to create
+       unique SV tags for each distinct stored SV.
+
+Tue Jan 20 09:21:53 MET 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Don't use any '_' in version number.
+
+Tue Jan 13 17:51:50 MET 1998   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated version number.
+
+       added binmode() calls for systems where it matters.
+
+       Be sure to pass globs, not plain file strings, to C routines,
+       so that Storable can be used under the Perl debugger.
+
+Wed Nov  5 10:53:22 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Fix memory leaks on seen hash table and returned SV refs.
+
+       Storable did not work properly when tainting enabled.
+
+       Fixed "Allocation too large" messages in freeze/thaw and added.
+       proper regression test in t/freeze.t.
+
+Tue Jun  3 09:41:33 METDST 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated version number
+
+       Added freeze/thaw interface and dclone.
+
+Fri May 16 10:45:47 METDST 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Forgot that AutoLoader does not export its own AUTOLOAD.
+       I could use
+
+               use AutoLoader 'AUTOLOAD';
+       
+       but that would not be backward compatible. So the export is
+       done by hand...
+
+Tue Mar 25 11:21:32 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Empty scalar strings are now "defined" at retrieval time.
+
+       New test to ensure an empty string is defined when retrieved.
+
+Thu Feb 27 16:32:44 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated version number
+
+       Declare VERSION as being used
+
+       Fixed a typo in the PerlIO_putc remapping.
+       PerlIO_read and perlIO_write inverted size/nb_items.
+       (only relevant for pre-perl5.004 versions)
+
+Thu Feb 27 15:58:31 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated version number
+
+       Added VERSION identification
+
+       Allow build with perl5.003, which is ante perlIO time
+
+Mon Jan 13 17:53:18 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Random code fixes.
+
+Wed Jan 22 15:19:56 MET 1997   Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+
+. Description:
+
+       Updated version number in Makefile.PL.
+
+       Added "thanks to" section to README.
+
+       Documented new forgive_me variable.
+
+       Made 64-bit clean.
+
+       Added forgive_me support to allow store() of data structures
+       containing non-storable items like CODE refs.
+
diff --git a/ext/Storable/MANIFEST b/ext/Storable/MANIFEST
new file mode 100644 (file)
index 0000000..e823e48
--- /dev/null
@@ -0,0 +1,6 @@
+README                     Read this first
+MANIFEST                   This shipping list
+Makefile.PL                Generic Makefile template
+Storable.pm                The perl side of Storable
+Storable.xs                The C side of Storable
+ChangeLog                  Changes since baseline
diff --git a/ext/Storable/Makefile.PL b/ext/Storable/Makefile.PL
new file mode 100644 (file)
index 0000000..7ed71e6
--- /dev/null
@@ -0,0 +1,24 @@
+# $Id: Makefile.PL,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: Makefile.PL,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+use ExtUtils::MakeMaker;
+use Config;
+
+WriteMakefile(
+    'NAME'                     => 'Storable',
+    'DISTNAME'         => "Storable",
+       'MAN3PODS'              => {},
+    'VERSION_FROM'     => 'Storable.pm',
+    'dist'                     => { SUFFIX => 'gz', COMPRESS => 'gzip -f' },
+    'clean'                    => {'FILES' => '*%'},
+);
+
diff --git a/ext/Storable/README b/ext/Storable/README
new file mode 100644 (file)
index 0000000..6dfa689
--- /dev/null
@@ -0,0 +1,70 @@
+                         Storable 1.0
+               Copyright (c) 1995-2000, Raphael Manfredi
+
+------------------------------------------------------------------------
+    This program is free software; you can redistribute it and/or modify
+    it under the same terms as Perl 5 itself.
+
+    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
+    Perl 5 License schemes for more details.
+------------------------------------------------------------------------
+
++=======================================================================
+| Storable is distributed as a module, but is also part of the official
+| Perl core distribution.  Maintenance is still done by the Author,
+| whilst the perl5-porters ensure that no change to the Perl internals
+| can break the version of Storable distributed with it.
++=======================================================================
+
+The Storable extension brings persistency to your data.
+
+You may recursively store to disk any data structure, no matter how
+complex and circular it is, provided it contains only SCALAR, ARRAY,
+HASH (possibly tied) and references (possibly blessed) to those items.
+
+At a later stage, or in another program, you may retrieve data from
+the stored file and recreate the same hiearchy in memory. If you
+had blessed references, the retrieved references are blessed into
+the same package, so you must make sure you have access to the
+same perl class than the one used to create the relevant objects.
+
+There is also a dclone() routine which performs an optimized mirroring
+of any data structure, preserving its topology.
+
+Objects (blessed references) may also redefine the way storage and
+retrieval is performed, and/or what deep cloning should do on those
+objects.
+
+To compile this extension, run:
+
+    perl Makefile.PL [PERL_SRC=...where you put perl sources...]
+    make
+    make install
+
+There is an embeded POD manual page in Storable.pm.
+
+Raphael Manfredi <Raphael_Manfredi@pobox.com>
+
+------------------------------------------------------------------------
+Thanks to (in chronological order):
+
+    Jarkko Hietaniemi <jhi@iki.fi>
+    Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+    Benjamin A. Holzman <bah@ecnvantage.com>
+    Andrew Ford <A.Ford@ford-mason.co.uk>
+    Gisle Aas <gisle@aas.no>
+    Jeff Gresham <gresham_jeffrey@jpmorgan.com>
+    Murray Nesbitt <murray@activestate.com>
+    Albert N. Micheev <Albert.N.Micheev@f80.n5049.z2.fidonet.org>
+    Marc Lehmann <pcg@opengroup.org>
+       Justin Banks <justinb@wamnet.com>
+       Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
+
+for their contributions.
+
+There is a Japanese translation of this man page available at
+http://member.nifty.ne.jp/hippo2000/perltips/storable.htm,
+courtesy of Kawai, Takanori <kawai@nippon-rad.co.jp>.
+------------------------------------------------------------------------
diff --git a/ext/Storable/Storable.pm b/ext/Storable/Storable.pm
new file mode 100644 (file)
index 0000000..76c3209
--- /dev/null
@@ -0,0 +1,720 @@
+;# $Id: Storable.pm,v 1.0 2000/09/01 19:40:41 ram Exp $
+;#
+;#  Copyright (c) 1995-2000, Raphael Manfredi
+;#  
+;#  You may redistribute only under the same terms as Perl 5, as specified
+;#  in the README file that comes with the distribution.
+;#
+;# $Log: Storable.pm,v $
+;# Revision 1.0  2000/09/01 19:40:41  ram
+;# Baseline for first official release.
+;#
+
+require DynaLoader;
+require Exporter;
+package Storable; @ISA = qw(Exporter DynaLoader);
+
+@EXPORT = qw(store retrieve);
+@EXPORT_OK = qw(
+       nstore store_fd nstore_fd fd_retrieve
+       freeze nfreeze thaw
+       dclone
+       retrieve_fd
+       lock_store lock_nstore lock_retrieve
+);
+
+use AutoLoader;
+use vars qw($forgive_me $VERSION);
+
+$VERSION = '1.003';
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;            # Grrr...
+
+#
+# Use of Log::Agent is optional
+#
+
+eval "use Log::Agent";
+
+unless (defined @Log::Agent::EXPORT) {
+       eval q{
+               sub logcroak {
+                       require Carp;
+                       Carp::croak(@_);
+               }
+       };
+}
+
+#
+# They might miss :flock in Fcntl
+#
+
+BEGIN {
+       require Fcntl;
+       if (exists $Fcntl::EXPORT_TAGS{'flock'}) {
+               Fcntl->import(':flock');
+       } else {
+               eval q{
+                       sub LOCK_SH ()  {1}
+                       sub LOCK_EX ()  {2}
+               };
+       }
+}
+
+sub logcroak;
+
+sub retrieve_fd { &fd_retrieve }               # Backward compatibility
+
+bootstrap Storable;
+1;
+__END__
+
+#
+# store
+#
+# Store target object hierarchy, identified by a reference to its root.
+# The stored object tree may later be retrieved to memory via retrieve.
+# Returns undef if an I/O error occurred, in which case the file is
+# removed.
+#
+sub store {
+       return _store(\&pstore, @_, 0);
+}
+
+#
+# nstore
+#
+# Same as store, but in network order.
+#
+sub nstore {
+       return _store(\&net_pstore, @_, 0);
+}
+
+#
+# lock_store
+#
+# Same as store, but flock the file first (advisory locking).
+#
+sub lock_store {
+       return _store(\&pstore, @_, 1);
+}
+
+#
+# lock_nstore
+#
+# Same as nstore, but flock the file first (advisory locking).
+#
+sub lock_nstore {
+       return _store(\&net_pstore, @_, 1);
+}
+
+# Internal store to file routine
+sub _store {
+       my $xsptr = shift;
+       my $self = shift;
+       my ($file, $use_locking) = @_;
+       logcroak "not a reference" unless ref($self);
+       logcroak "too many arguments" unless @_ == 2;   # No @foo in arglist
+       local *FILE;
+       open(FILE, ">$file") || logcroak "can't create $file: $!";
+       binmode FILE;                           # Archaic systems...
+       if ($use_locking) {
+               flock(FILE, LOCK_EX) ||
+                       logcroak "can't get exclusive lock on $file: $!";
+               truncate FILE, 0;
+               # Unlocking will happen when FILE is closed
+       }
+       my $da = $@;                            # Don't mess if called from exception handler
+       my $ret;
+       # Call C routine nstore or pstore, depending on network order
+       eval { $ret = &$xsptr(*FILE, $self) };
+       close(FILE) or $ret = undef;
+       unlink($file) or warn "Can't unlink $file: $!\n" if $@ || !defined $ret;
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $ret ? $ret : undef;
+}
+
+#
+# store_fd
+#
+# Same as store, but perform on an already opened file descriptor instead.
+# Returns undef if an I/O error occurred.
+#
+sub store_fd {
+       return _store_fd(\&pstore, @_);
+}
+
+#
+# nstore_fd
+#
+# Same as store_fd, but in network order.
+#
+sub nstore_fd {
+       my ($self, $file) = @_;
+       return _store_fd(\&net_pstore, @_);
+}
+
+# Internal store routine on opened file descriptor
+sub _store_fd {
+       my $xsptr = shift;
+       my $self = shift;
+       my ($file) = @_;
+       logcroak "not a reference" unless ref($self);
+       logcroak "too many arguments" unless @_ == 1;   # No @foo in arglist
+       my $fd = fileno($file);
+       logcroak "not a valid file descriptor" unless defined $fd;
+       my $da = $@;                            # Don't mess if called from exception handler
+       my $ret;
+       # Call C routine nstore or pstore, depending on network order
+       eval { $ret = &$xsptr($file, $self) };
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $ret ? $ret : undef;
+}
+
+#
+# freeze
+#
+# Store oject and its hierarchy in memory and return a scalar
+# containing the result.
+#
+sub freeze {
+       _freeze(\&mstore, @_);
+}
+
+#
+# nfreeze
+#
+# Same as freeze but in network order.
+#
+sub nfreeze {
+       _freeze(\&net_mstore, @_);
+}
+
+# Internal freeze routine
+sub _freeze {
+       my $xsptr = shift;
+       my $self = shift;
+       logcroak "not a reference" unless ref($self);
+       logcroak "too many arguments" unless @_ == 0;   # No @foo in arglist
+       my $da = $@;                            # Don't mess if called from exception handler
+       my $ret;
+       # Call C routine mstore or net_mstore, depending on network order
+       eval { $ret = &$xsptr($self) };
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $ret ? $ret : undef;
+}
+
+#
+# retrieve
+#
+# Retrieve object hierarchy from disk, returning a reference to the root
+# object of that tree.
+#
+sub retrieve {
+       _retrieve($_[0], 0);
+}
+
+#
+# lock_retrieve
+#
+# Same as retrieve, but with advisory locking.
+#
+sub lock_retrieve {
+       _retrieve($_[0], 1);
+}
+
+# Internal retrieve routine
+sub _retrieve {
+       my ($file, $use_locking) = @_;
+       local *FILE;
+       open(FILE, $file) || logcroak "can't open $file: $!";
+       binmode FILE;                                                   # Archaic systems...
+       my $self;
+       my $da = $@;                                                    # Could be from exception handler
+       if ($use_locking) {
+               flock(FILE, LOCK_SH) || logcroak "can't get shared lock on $file: $!";
+               # Unlocking will happen when FILE is closed
+       }
+       eval { $self = pretrieve(*FILE) };              # Call C routine
+       close(FILE);
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $self;
+}
+
+#
+# fd_retrieve
+#
+# Same as retrieve, but perform from an already opened file descriptor instead.
+#
+sub fd_retrieve {
+       my ($file) = @_;
+       my $fd = fileno($file);
+       logcroak "not a valid file descriptor" unless defined $fd;
+       my $self;
+       my $da = $@;                                                    # Could be from exception handler
+       eval { $self = pretrieve($file) };              # Call C routine
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $self;
+}
+
+#
+# thaw
+#
+# Recreate objects in memory from an existing frozen image created
+# by freeze.  If the frozen image passed is undef, return undef.
+#
+sub thaw {
+       my ($frozen) = @_;
+       return undef unless defined $frozen;
+       my $self;
+       my $da = $@;                                                    # Could be from exception handler
+       eval { $self = mretrieve($frozen) };    # Call C routine
+       logcroak $@ if $@ =~ s/\.?\n$/,/;
+       $@ = $da;
+       return $self;
+}
+
+=head1 NAME
+
+Storable - persistency for perl data structures
+
+=head1 SYNOPSIS
+
+ use Storable;
+ store \%table, 'file';
+ $hashref = retrieve('file');
+
+ use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
+
+ # Network order
+ nstore \%table, 'file';
+ $hashref = retrieve('file');  # There is NO nretrieve()
+
+ # Storing to and retrieving from an already opened file
+ store_fd \@array, \*STDOUT;
+ nstore_fd \%table, \*STDOUT;
+ $aryref = fd_retrieve(\*SOCKET);
+ $hashref = fd_retrieve(\*SOCKET);
+
+ # Serializing to memory
+ $serialized = freeze \%table;
+ %table_clone = %{ thaw($serialized) };
+
+ # Deep (recursive) cloning
+ $cloneref = dclone($ref);
+
+ # Advisory locking
+ use Storable qw(lock_store lock_nstore lock_retrieve)
+ lock_store \%table, 'file';
+ lock_nstore \%table, 'file';
+ $hashref = lock_retrieve('file');
+
+=head1 DESCRIPTION
+
+The Storable package brings persistency to your perl data structures
+containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be
+convenientely stored to disk and retrieved at a later time.
+
+It can be used in the regular procedural way by calling C<store> with
+a reference to the object to be stored, along with the file name where
+the image should be written.
+The routine returns C<undef> for I/O problems or other internal error,
+a true value otherwise. Serious errors are propagated as a C<die> exception.
+
+To retrieve data stored to disk, use C<retrieve> with a file name,
+and the objects stored into that file are recreated into memory for you,
+a I<reference> to the root object being returned. In case an I/O error
+occurs while reading, C<undef> is returned instead. Other serious
+errors are propagated via C<die>.
+
+Since storage is performed recursively, you might want to stuff references
+to objects that share a lot of common data into a single array or hash
+table, and then store that object. That way, when you retrieve back the
+whole thing, the objects will continue to share what they originally shared.
+
+At the cost of a slight header overhead, you may store to an already
+opened file descriptor using the C<store_fd> routine, and retrieve
+from a file via C<fd_retrieve>. Those names aren't imported by default,
+so you will have to do that explicitely if you need those routines.
+The file descriptor you supply must be already opened, for read
+if you're going to retrieve and for write if you wish to store.
+
+       store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
+       $hashref = fd_retrieve(*STDIN);
+
+You can also store data in network order to allow easy sharing across
+multiple platforms, or when storing on a socket known to be remotely
+connected. The routines to call have an initial C<n> prefix for I<network>,
+as in C<nstore> and C<nstore_fd>. At retrieval time, your data will be
+correctly restored so you don't have to know whether you're restoring
+from native or network ordered data.  Double values are stored stringified
+to ensure portability as well, at the slight risk of loosing some precision
+in the last decimals.
+
+When using C<fd_retrieve>, objects are retrieved in sequence, one
+object (i.e. one recursive tree) per associated C<store_fd>.
+
+If you're more from the object-oriented camp, you can inherit from
+Storable and directly store your objects by invoking C<store> as
+a method. The fact that the root of the to-be-stored tree is a
+blessed reference (i.e. an object) is special-cased so that the
+retrieve does not provide a reference to that object but rather the
+blessed object reference itself. (Otherwise, you'd get a reference
+to that blessed object).
+
+=head1 MEMORY STORE
+
+The Storable engine can also store data into a Perl scalar instead, to
+later retrieve them. This is mainly used to freeze a complex structure in
+some safe compact memory place (where it can possibly be sent to another
+process via some IPC, since freezing the structure also serializes it in
+effect). Later on, and maybe somewhere else, you can thaw the Perl scalar
+out and recreate the original complex structure in memory.
+
+Surprisingly, the routines to be called are named C<freeze> and C<thaw>.
+If you wish to send out the frozen scalar to another machine, use
+C<nfreeze> instead to get a portable image.
+
+Note that freezing an object structure and immediately thawing it
+actually achieves a deep cloning of that structure:
+
+    dclone(.) = thaw(freeze(.))
+
+Storable provides you with a C<dclone> interface which does not create
+that intermediary scalar but instead freezes the structure in some
+internal memory space and then immediatly thaws it out.
+
+=head1 ADVISORY LOCKING
+
+The C<lock_store> and C<lock_nstore> routine are equivalent to C<store>
+and C<nstore>, only they get an exclusive lock on the file before
+writing.  Likewise, C<lock_retrieve> performs as C<retrieve>, but also
+gets a shared lock on the file before reading.
+
+Like with any advisory locking scheme, the protection only works if
+you systematically use C<lock_store> and C<lock_retrieve>.  If one
+side of your application uses C<store> whilst the other uses C<lock_retrieve>,
+you will get no protection at all.
+
+The internal advisory locking is implemented using Perl's flock() routine.
+If your system does not support any form of flock(), or if you share
+your files across NFS, you might wish to use other forms of locking by
+using modules like LockFile::Simple which lock a file using a filesystem
+entry, instead of locking the file descriptor.
+
+=head1 SPEED
+
+The heart of Storable is written in C for decent speed. Extra low-level
+optimization have been made when manipulating perl internals, to
+sacrifice encapsulation for the benefit of a greater speed.
+
+=head1 CANONICAL REPRESENTATION
+
+Normally Storable stores elements of hashes in the order they are
+stored internally by Perl, i.e. pseudo-randomly.  If you set
+C<$Storable::canonical> to some C<TRUE> value, Storable will store
+hashes with the elements sorted by their key.  This allows you to
+compare data structures by comparing their frozen representations (or
+even the compressed frozen representations), which can be useful for
+creating lookup tables for complicated queries.
+
+Canonical order does not imply network order, those are two orthogonal
+settings.
+
+=head1 ERROR REPORTING
+
+Storable uses the "exception" paradigm, in that it does not try to workaround
+failures: if something bad happens, an exception is generated from the
+caller's perspective (see L<Carp> and C<croak()>).  Use eval {} to trap
+those exceptions.
+
+When Storable croaks, it tries to report the error via the C<logcroak()>
+routine from the C<Log::Agent> package, if it is available.
+
+=head1 WIZARDS ONLY
+
+=head2 Hooks
+
+Any class may define hooks that will be called during the serialization
+and deserialization process on objects that are instances of that class.
+Those hooks can redefine the way serialization is performed (and therefore,
+how the symetrical deserialization should be conducted).
+
+Since we said earlier:
+
+    dclone(.) = thaw(freeze(.))
+
+everything we say about hooks should also hold for deep cloning. However,
+hooks get to know whether the operation is a mere serialization, or a cloning.
+
+Therefore, when serializing hooks are involved,
+
+    dclone(.) <> thaw(freeze(.))
+
+Well, you could keep them in sync, but there's no guarantee it will always
+hold on classes somebody else wrote.  Besides, there is little to gain in
+doing so: a serializing hook could only keep one attribute of an object,
+which is probably not what should happen during a deep cloning of that
+same object.
+
+Here is the hooking interface:
+
+=over
+
+=item C<STORABLE_freeze> I<obj>, I<cloning>
+
+The serializing hook, called on the object during serialization.  It can be
+inherited, or defined in the class itself, like any other method.
+
+Arguments: I<obj> is the object to serialize, I<cloning> is a flag indicating
+whether we're in a dclone() or a regular serialization via store() or freeze().
+
+Returned value: A LIST C<($serialized, $ref1, $ref2, ...)> where $serialized
+is the serialized form to be used, and the optional $ref1, $ref2, etc... are
+extra references that you wish to let the Storable engine serialize.
+
+At deserialization time, you will be given back the same LIST, but all the
+extra references will be pointing into the deserialized structure.
+
+The B<first time> the hook is hit in a serialization flow, you may have it
+return an empty list.  That will signal the Storable engine to further
+discard that hook for this class and to therefore revert to the default
+serialization of the underlying Perl data.  The hook will again be normally
+processed in the next serialization.
+
+Unless you know better, serializing hook should always say:
+
+    sub STORABLE_freeze {
+        my ($self, $cloning) = @_;
+        return if $cloning;         # Regular default serialization
+        ....
+    }
+
+in order to keep reasonable dclone() semantics.
+
+=item C<STORABLE_thaw> I<obj>, I<cloning>, I<serialized>, ...
+
+The deserializing hook called on the object during deserialization.
+But wait. If we're deserializing, there's no object yet... right?
+
+Wrong: the Storable engine creates an empty one for you.  If you know Eiffel,
+you can view C<STORABLE_thaw> as an alternate creation routine.
+
+This means the hook can be inherited like any other method, and that
+I<obj> is your blessed reference for this particular instance.
+
+The other arguments should look familiar if you know C<STORABLE_freeze>:
+I<cloning> is true when we're part of a deep clone operation, I<serialized>
+is the serialized string you returned to the engine in C<STORABLE_freeze>,
+and there may be an optional list of references, in the same order you gave
+them at serialization time, pointing to the deserialized objects (which
+have been processed courtesy of the Storable engine).
+
+It is up to you to use these information to populate I<obj> the way you want.
+
+Returned value: none.
+
+=back
+
+=head2 Predicates
+
+Predicates are not exportable.  They must be called by explicitely prefixing
+them with the Storable package name.
+
+=over
+
+=item C<Storable::last_op_in_netorder>
+
+The C<Storable::last_op_in_netorder()> predicate will tell you whether
+network order was used in the last store or retrieve operation.  If you
+don't know how to use this, just forget about it.
+
+=item C<Storable::is_storing>
+
+Returns true if within a store operation (via STORABLE_freeze hook).
+
+=item C<Storable::is_retrieving>
+
+Returns true if within a retrieve operation, (via STORABLE_thaw hook).
+
+=back
+
+=head2 Recursion
+
+With hooks comes the ability to recurse back to the Storable engine.  Indeed,
+hooks are regular Perl code, and Storable is convenient when it comes to
+serialize and deserialize things, so why not use it to handle the
+serialization string?
+
+There are a few things you need to know however:
+
+=over
+
+=item *
+
+You can create endless loops if the things you serialize via freeze()
+(for instance) point back to the object we're trying to serialize in the hook.
+
+=item *
+
+Shared references among objects will not stay shared: if we're serializing
+the list of object [A, C] where both object A and C refer to the SAME object
+B, and if there is a serializing hook in A that says freeze(B), then when
+deserializing, we'll get [A', C'] where A' refers to B', but C' refers to D,
+a deep clone of B'.  The topology was not preserved.
+
+=back
+
+That's why C<STORABLE_freeze> lets you provide a list of references
+to serialize.  The engine guarantees that those will be serialized in the
+same context as the other objects, and therefore that shared objects will
+stay shared.
+
+In the above [A, C] example, the C<STORABLE_freeze> hook could return:
+
+       ("something", $self->{B})
+
+and the B part would be serialized by the engine.  In C<STORABLE_thaw>, you
+would get back the reference to the B' object, deserialized for you.
+
+Therefore, recursion should normally be avoided, but is nonetheless supported.
+
+=head2 Deep Cloning
+
+There is a new Clone module available on CPAN which implements deep cloning
+natively, i.e. without freezing to memory and thawing the result.  It is
+aimed to replace Storable's dclone() some day.  However, it does not currently
+support Storable hooks to redefine the way deep cloning is performed.
+
+=head1 EXAMPLES
+
+Here are some code samples showing a possible usage of Storable:
+
+       use Storable qw(store retrieve freeze thaw dclone);
+
+       %color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);
+
+       store(\%color, '/tmp/colors') or die "Can't store %a in /tmp/colors!\n";
+
+       $colref = retrieve('/tmp/colors');
+       die "Unable to retrieve from /tmp/colors!\n" unless defined $colref;
+       printf "Blue is still %lf\n", $colref->{'Blue'};
+
+       $colref2 = dclone(\%color);
+
+       $str = freeze(\%color);
+       printf "Serialization of %%color is %d bytes long.\n", length($str);
+       $colref3 = thaw($str);
+
+which prints (on my machine):
+
+       Blue is still 0.100000
+       Serialization of %color is 102 bytes long.
+
+=head1 WARNING
+
+If you're using references as keys within your hash tables, you're bound
+to disapointment when retrieving your data. Indeed, Perl stringifies
+references used as hash table keys. If you later wish to access the
+items via another reference stringification (i.e. using the same
+reference that was used for the key originally to record the value into
+the hash table), it will work because both references stringify to the
+same string.
+
+It won't work across a C<store> and C<retrieve> operations however, because
+the addresses in the retrieved objects, which are part of the stringified
+references, will probably differ from the original addresses. The
+topology of your structure is preserved, but not hidden semantics
+like those.
+
+On platforms where it matters, be sure to call C<binmode()> on the
+descriptors that you pass to Storable functions.
+
+Storing data canonically that contains large hashes can be
+significantly slower than storing the same data normally, as
+temprorary arrays to hold the keys for each hash have to be allocated,
+populated, sorted and freed.  Some tests have shown a halving of the
+speed of storing -- the exact penalty will depend on the complexity of
+your data.  There is no slowdown on retrieval.
+
+=head1 BUGS
+
+You can't store GLOB, CODE, FORMLINE, etc... If you can define
+semantics for those operations, feel free to enhance Storable so that
+it can deal with them.
+
+The store functions will C<croak> if they run into such references
+unless you set C<$Storable::forgive_me> to some C<TRUE> value. In that
+case, the fatal message is turned in a warning and some
+meaningless string is stored instead.
+
+Setting C<$Storable::canonical> may not yield frozen strings that
+compare equal due to possible stringification of numbers. When the
+string version of a scalar exists, it is the form stored, therefore
+if you happen to use your numbers as strings between two freezing
+operations on the same data structures, you will get different
+results.
+
+When storing doubles in network order, their value is stored as text.
+However, you should also not expect non-numeric floating-point values
+such as infinity and "not a number" to pass successfully through a
+nstore()/retrieve() pair.
+
+As Storable neither knows nor cares about character sets (although it
+does know that characters may be more than eight bits wide), any difference
+in the interpretation of character codes between a host and a target
+system is your problem.  In particular, if host and target use different
+code points to represent the characters used in the text representation
+of floating-point numbers, you will not be able be able to exchange
+floating-point data, even with nstore().
+
+=head1 CREDITS
+
+Thank you to (in chronological order):
+
+       Jarkko Hietaniemi <jhi@iki.fi>
+       Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
+       Benjamin A. Holzman <bah@ecnvantage.com>
+       Andrew Ford <A.Ford@ford-mason.co.uk>
+       Gisle Aas <gisle@aas.no>
+       Jeff Gresham <gresham_jeffrey@jpmorgan.com>
+       Murray Nesbitt <murray@activestate.com>
+       Marc Lehmann <pcg@opengroup.org>
+       Justin Banks <justinb@wamnet.com>
+       Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
+       Salvador Ortiz Garcia <sog@msg.com.mx>
+       Dominic Dunlop <domo@computer.org>
+       Erik Haugan <erik@solbors.no>
+
+for their bug reports, suggestions and contributions.
+
+Benjamin Holzman contributed the tied variable support, Andrew Ford
+contributed the canonical order for hashes, and Gisle Aas fixed
+a few misunderstandings of mine regarding the Perl internals,
+and optimized the emission of "tags" in the output streams by
+simply counting the objects instead of tagging them (leading to
+a binary incompatibility for the Storable image starting at version
+0.6--older images are of course still properly understood).
+Murray Nesbitt made Storable thread-safe.  Marc Lehmann added overloading
+and reference to tied items support.
+
+=head1 TRANSLATIONS
+
+There is a Japanese translation of this man page available at
+http://member.nifty.ne.jp/hippo2000/perltips/storable.htm ,
+courtesy of Kawai, Takanori <kawai@nippon-rad.co.jp>.
+
+=head1 AUTHOR
+
+Raphael Manfredi F<E<lt>Raphael_Manfredi@pobox.comE<gt>>
+
+=head1 SEE ALSO
+
+Clone(3).
+
+=cut
+
diff --git a/ext/Storable/Storable.xs b/ext/Storable/Storable.xs
new file mode 100644 (file)
index 0000000..1c412b5
--- /dev/null
@@ -0,0 +1,4627 @@
+/*
+ * Store and retrieve mechanism.
+ */
+
+/*
+ * $Id: Storable.xs,v 1.0 2000/09/01 19:40:41 ram Exp $
+ *
+ *  Copyright (c) 1995-2000, Raphael Manfredi
+ *  
+ *  You may redistribute only under the same terms as Perl 5, as specified
+ *  in the README file that comes with the distribution.
+ *
+ * $Log: Storable.xs,v $
+ * Revision 1.0  2000/09/01 19:40:41  ram
+ * Baseline for first official release.
+ *
+ */
+
+#include <EXTERN.h>
+#include <perl.h>
+#include <patchlevel.h>                /* Perl's one, needed since 5.6 */
+#include <XSUB.h>
+
+#if 0
+#define DEBUGME /* Debug mode, turns assertions on as well */
+#define DASSERT /* Assertion mode */
+#endif
+
+/*
+ * Pre PerlIO time when none of USE_PERLIO and PERLIO_IS_STDIO is defined
+ * Provide them with the necessary defines so they can build with pre-5.004.
+ */
+#ifndef USE_PERLIO
+#ifndef PERLIO_IS_STDIO
+#define PerlIO FILE
+#define PerlIO_getc(x) getc(x)
+#define PerlIO_putc(f,x) putc(x,f)
+#define PerlIO_read(x,y,z) fread(y,1,z,x)
+#define PerlIO_write(x,y,z) fwrite(y,1,z,x)
+#define PerlIO_stdoutf printf
+#endif /* PERLIO_IS_STDIO */
+#endif /* USE_PERLIO */
+
+/*
+ * Earlier versions of perl might be used, we can't assume they have the latest!
+ */
+
+#ifndef PERL_VERSION           /* For perls < 5.6 */
+#define PERL_VERSION PATCHLEVEL
+#ifndef newRV_noinc
+#define newRV_noinc(sv)                ((Sv = newRV(sv)), --SvREFCNT(SvRV(Sv)), Sv)
+#endif
+#if (PATCHLEVEL <= 4)          /* Older perls (<= 5.004) lack PL_ namespace */
+#define PL_sv_yes      sv_yes
+#define PL_sv_no       sv_no
+#define PL_sv_undef    sv_undef
+#if (SUBVERSION <= 4)          /* 5.004_04 has been reported to lack newSVpvn */
+#define newSVpvn newSVpv
+#endif
+#endif                                         /* PATCHLEVEL <= 4 */
+#ifndef HvSHAREKEYS_off
+#define HvSHAREKEYS_off(hv)    /* Ignore */
+#endif
+#ifndef AvFILLp                                /* Older perls (<=5.003) lack AvFILLp */
+#define AvFILLp AvFILL
+#endif
+typedef double NV;                     /* Older perls lack the NV type */
+#define        IVdf            "ld"    /* Various printf formats for Perl types */
+#define        UVuf            "lu"
+#define        UVof            "lo"
+#define        UVxf            "lx"
+#define INT2PTR(t,v) (t)(IV)(v)
+#define PTR2UV(v)    (unsigned long)(v)
+#endif                                         /* PERL_VERSION -- perls < 5.6 */
+
+#ifndef NVef                           /* The following were not part of perl 5.6 */
+#if defined(USE_LONG_DOUBLE) && \
+       defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
+#define NVef           PERL_PRIeldbl
+#define NVff           PERL_PRIfldbl
+#define NVgf           PERL_PRIgldbl
+#else
+#define        NVef            "e"
+#define        NVff            "f"
+#define        NVgf            "g"
+#endif
+#endif
+
+#ifdef DEBUGME
+#ifndef DASSERT
+#define DASSERT
+#endif
+#define TRACEME(x)     do { PerlIO_stdoutf x; PerlIO_stdoutf("\n"); } while (0)
+#else
+#define TRACEME(x)
+#endif
+
+#ifdef DASSERT
+#define ASSERT(x,y)    do {                                                                    \
+       if (!(x)) {                                                                                             \
+               PerlIO_stdoutf("ASSERT FAILED (\"%s\", line %d): ",     \
+                       __FILE__, __LINE__);                                                    \
+               PerlIO_stdoutf y; PerlIO_stdoutf("\n");                         \
+       }                                                                                                               \
+} while (0)
+#else
+#define ASSERT(x,y)
+#endif
+
+/*
+ * Type markers.
+ */
+
+#define C(x) ((char) (x))      /* For markers with dynamic retrieval handling */
+
+#define SX_OBJECT      C(0)    /* Already stored object */
+#define SX_LSCALAR     C(1)    /* Scalar (large binary) follows (length, data) */
+#define SX_ARRAY       C(2)    /* Array forthcominng (size, item list) */
+#define SX_HASH                C(3)    /* Hash forthcoming (size, key/value pair list) */
+#define SX_REF         C(4)    /* Reference to object forthcoming */
+#define SX_UNDEF       C(5)    /* Undefined scalar */
+#define SX_INTEGER     C(6)    /* Integer forthcoming */
+#define SX_DOUBLE      C(7)    /* Double forthcoming */
+#define SX_BYTE                C(8)    /* (signed) byte forthcoming */
+#define SX_NETINT      C(9)    /* Integer in network order forthcoming */
+#define SX_SCALAR      C(10)   /* Scalar (binary, small) follows (length, data) */
+#define SX_TIED_ARRAY  C(11)  /* Tied array forthcoming */
+#define SX_TIED_HASH   C(12)  /* Tied hash forthcoming */
+#define SX_TIED_SCALAR C(13)  /* Tied scalar forthcoming */
+#define SX_SV_UNDEF    C(14)   /* Perl's immortal PL_sv_undef */
+#define SX_SV_YES      C(15)   /* Perl's immortal PL_sv_yes */
+#define SX_SV_NO       C(16)   /* Perl's immortal PL_sv_no */
+#define SX_BLESS       C(17)   /* Object is blessed */
+#define SX_IX_BLESS    C(18)   /* Object is blessed, classname given by index */
+#define SX_HOOK                C(19)   /* Stored via hook, user-defined */
+#define SX_OVERLOAD    C(20)   /* Overloaded reference */
+#define SX_TIED_KEY C(21)   /* Tied magic key forthcoming */
+#define SX_TIED_IDX C(22)   /* Tied magic index forthcoming */
+#define SX_UTF8STR     C(23)   /* UTF-8 string forthcoming (small) */
+#define SX_LUTF8STR    C(24)   /* UTF-8 string forthcoming (large) */
+#define SX_ERROR       C(25)   /* Error */
+
+/*
+ * Those are only used to retrieve "old" pre-0.6 binary images.
+ */
+#define SX_ITEM                'i'             /* An array item introducer */
+#define SX_IT_UNDEF    'I'             /* Undefined array item */
+#define SX_KEY         'k'             /* An hash key introducer */
+#define SX_VALUE       'v'             /* An hash value introducer */
+#define SX_VL_UNDEF    'V'             /* Undefined hash value */
+
+/*
+ * Those are only used to retrieve "old" pre-0.7 binary images
+ */
+
+#define SX_CLASS       'b'             /* Object is blessed, class name length <255 */
+#define SX_LG_CLASS 'B'                /* Object is blessed, class name length >255 */
+#define SX_STORED      'X'             /* End of object */
+
+/*
+ * Limits between short/long length representation.
+ */
+
+#define LG_SCALAR      255             /* Large scalar length limit */
+#define LG_BLESS       127             /* Large classname bless limit */
+
+/*
+ * Operation types
+ */
+
+#define ST_STORE       0x1             /* Store operation */
+#define ST_RETRIEVE    0x2             /* Retrieval operation */
+#define ST_CLONE       0x4             /* Deep cloning operation */
+
+/*
+ * The following structure is used for hash table key retrieval. Since, when
+ * retrieving objects, we'll be facing blessed hash references, it's best
+ * to pre-allocate that buffer once and resize it as the need arises, never
+ * freeing it (keys will be saved away someplace else anyway, so even large
+ * keys are not enough a motivation to reclaim that space).
+ *
+ * This structure is also used for memory store/retrieve operations which
+ * happen in a fixed place before being malloc'ed elsewhere if persistency
+ * is required. Hence the aptr pointer.
+ */
+struct extendable {
+       char *arena;            /* Will hold hash key strings, resized as needed */
+       STRLEN asiz;            /* Size of aforementionned buffer */
+       char *aptr;                     /* Arena pointer, for in-place read/write ops */
+       char *aend;                     /* First invalid address */
+};
+
+/*
+ * At store time:
+ * An hash table records the objects which have already been stored.
+ * Those are referred to as SX_OBJECT in the file, and their "tag" (i.e.
+ * an arbitrary sequence number) is used to identify them.
+ *
+ * At retrieve time:
+ * An array table records the objects which have already been retrieved,
+ * as seen by the tag determind by counting the objects themselves. The
+ * reference to that retrieved object is kept in the table, and is returned
+ * when an SX_OBJECT is found bearing that same tag.
+ *
+ * The same processing is used to record "classname" for blessed objects:
+ * indexing by a hash at store time, and via an array at retrieve time.
+ */
+
+typedef unsigned long stag_t;  /* Used by pre-0.6 binary format */
+
+/*
+ * The following "thread-safe" related defines were contributed by
+ * Murray Nesbitt <murray@activestate.com> and integrated by RAM, who
+ * only renamed things a little bit to ensure consistency with surrounding
+ * code.       -- RAM, 14/09/1999
+ *
+ * The original patch suffered from the fact that the stcxt_t structure
+ * was global.  Murray tried to minimize the impact on the code as much as
+ * possible.
+ *
+ * Starting with 0.7, Storable can be re-entrant, via the STORABLE_xxx hooks
+ * on objects.  Therefore, the notion of context needs to be generalized,
+ * threading or not.
+ */
+
+#define MY_VERSION "Storable(" XS_VERSION ")"
+
+/*
+ * Fields s_tainted and s_dirty are prefixed with s_ because Perl's include
+ * files remap tainted and dirty when threading is enabled.  That's bad for
+ * perl to remap such common words.    -- RAM, 29/09/00
+ */
+
+typedef struct stcxt {
+       int entry;                      /* flags recursion */
+       int optype;                     /* type of traversal operation */
+    HV *hseen;                 /* which objects have been seen, store time */
+    AV *aseen;                 /* which objects have been seen, retrieve time */
+    HV *hclass;                        /* which classnames have been seen, store time */
+    AV *aclass;                        /* which classnames have been seen, retrieve time */
+    HV *hook;                  /* cache for hook methods per class name */
+    I32 tagnum;                        /* incremented at store time for each seen object */
+    I32 classnum;              /* incremented at store time for each seen classname */
+    int netorder;              /* true if network order used */
+    int s_tainted;             /* true if input source is tainted, at retrieve time */
+    int forgive_me;            /* whether to be forgiving... */
+    int canonical;             /* whether to store hashes sorted by key */
+       int s_dirty;            /* context is dirty due to CROAK() -- can be cleaned */
+    struct extendable keybuf;  /* for hash key retrieval */
+    struct extendable membuf;  /* for memory store/retrieve operations */
+       PerlIO *fio;            /* where I/O are performed, NULL for memory */
+       int ver_major;          /* major of version for retrieved object */
+       int ver_minor;          /* minor of version for retrieved object */
+       SV *(**retrieve_vtbl)();        /* retrieve dispatch table */
+       struct stcxt *prev;     /* contexts chained backwards in real recursion */
+} stcxt_t;
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || defined(PERL_CAPI)
+
+#if (PATCHLEVEL <= 4) && (SUBVERSION < 68)
+#define dSTCXT_SV                                                                      \
+       SV *perinterp_sv = perl_get_sv(MY_VERSION, FALSE)
+#else  /* >= perl5.004_68 */
+#define dSTCXT_SV                                                                      \
+       SV *perinterp_sv = *hv_fetch(PL_modglobal,              \
+               MY_VERSION, sizeof(MY_VERSION)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+#define dSTCXT_PTR(T,name)                                                     \
+       T name = (perinterp_sv && SvIOK(perinterp_sv)   \
+                               ? INT2PTR(T, SvIVX(perinterp_sv)) : (T) 0)
+#define dSTCXT                                                                         \
+       dSTCXT_SV;                                                                              \
+       dSTCXT_PTR(stcxt_t *, cxt)
+
+#define INIT_STCXT                                                                     \
+      dSTCXT;                                                                          \
+      Newz(0, cxt, 1, stcxt_t);                                                \
+      sv_setiv(perinterp_sv, PTR2IV(cxt))
+
+#define SET_STCXT(x) do {                                                      \
+       dSTCXT_SV;                                                                              \
+       sv_setiv(perinterp_sv, PTR2IV(x));                              \
+} while (0)
+
+#else /* !MULTIPLICITY && !PERL_OBJECT && !PERL_CAPI */
+
+static stcxt_t Context;
+static stcxt_t *Context_ptr = &Context;
+#define dSTCXT                 stcxt_t *cxt = Context_ptr
+#define INIT_STCXT             dSTCXT
+#define SET_STCXT(x)   Context_ptr = x
+
+#endif /* MULTIPLICITY || PERL_OBJECT || PERL_CAPI */
+
+/*
+ * KNOWN BUG:
+ *   Croaking implies a memory leak, since we don't use setjmp/longjmp
+ *   to catch the exit and free memory used during store or retrieve
+ *   operations.  This is not too difficult to fix, but I need to understand
+ *   how Perl does it, and croaking is exceptional anyway, so I lack the
+ *   motivation to do it.
+ *
+ * The current workaround is to mark the context as dirty when croaking,
+ * so that data structures can be freed whenever we renter Storable code
+ * (but only *then*: it's a workaround, not a fix).
+ *
+ * This is also imperfect, because we don't really know how far they trapped
+ * the croak(), and when we were recursing, we won't be able to clean anything
+ * but the topmost context stacked.
+ */
+
+#define CROAK(x)       do { cxt->s_dirty = 1; croak x; } while (0)
+
+/*
+ * End of "thread-safe" related definitions.
+ */
+
+/*
+ * LOW_32BITS
+ *
+ * Keep only the low 32 bits of a pointer (used for tags, which are not
+ * really pointers).
+ */
+
+#if PTRSIZE <= 4
+#define LOW_32BITS(x)  ((I32) (x))
+#else
+#define LOW_32BITS(x)  ((I32) ((unsigned long) (x) & 0xffffffffUL))
+#endif
+
+/*
+ * oI, oS, oC
+ *
+ * Hack for Crays, where sizeof(I32) == 8, and which are big-endians.
+ * Used in the WLEN and RLEN macros.
+ */
+
+#if INTSIZE > 4
+#define oI(x)  ((I32 *) ((char *) (x) + 4))
+#define oS(x)  ((x) - 4)
+#define oC(x)  (x = 0)
+#define CRAY_HACK
+#else
+#define oI(x)  (x)
+#define oS(x)  (x)
+#define oC(x)
+#endif
+
+/*
+ * key buffer handling
+ */
+#define kbuf   (cxt->keybuf).arena
+#define ksiz   (cxt->keybuf).asiz
+#define KBUFINIT() do {                                        \
+       if (!kbuf) {                                            \
+               TRACEME(("** allocating kbuf of 128 bytes")); \
+               New(10003, kbuf, 128, char);    \
+               ksiz = 128;                                             \
+       }                                                                       \
+} while (0)
+#define KBUFCHK(x) do {                        \
+       if (x >= ksiz) {                        \
+               TRACEME(("** extending kbuf to %d bytes", x+1)); \
+               Renew(kbuf, x+1, char); \
+               ksiz = x+1;                             \
+       }                                                       \
+} while (0)
+
+/*
+ * memory buffer handling
+ */
+#define mbase  (cxt->membuf).arena
+#define msiz   (cxt->membuf).asiz
+#define mptr   (cxt->membuf).aptr
+#define mend   (cxt->membuf).aend
+
+#define MGROW  (1 << 13)
+#define MMASK  (MGROW - 1)
+
+#define round_mgrow(x) \
+       ((unsigned long) (((unsigned long) (x) + MMASK) & ~MMASK))
+#define trunc_int(x)   \
+       ((unsigned long) ((unsigned long) (x) & ~(sizeof(int)-1)))
+#define int_aligned(x) \
+       ((unsigned long) (x) == trunc_int(x))
+
+#define MBUF_INIT(x) do {                              \
+       if (!mbase) {                                           \
+               TRACEME(("** allocating mbase of %d bytes", MGROW)); \
+               New(10003, mbase, MGROW, char); \
+               msiz = MGROW;                                   \
+       }                                                                       \
+       mptr = mbase;                                           \
+       if (x)                                                          \
+               mend = mbase + x;                               \
+       else                                                            \
+               mend = mbase + msiz;                    \
+} while (0)
+
+#define MBUF_TRUNC(x)  mptr = mbase + x
+#define MBUF_SIZE()            (mptr - mbase)
+
+/*
+ * Use SvPOKp(), because SvPOK() fails on tainted scalars.
+ * See store_scalar() for other usage of this workaround.
+ */
+#define MBUF_LOAD(v) do {                              \
+       if (!SvPOKp(v))                                         \
+               CROAK(("Not a scalar string")); \
+       mptr = mbase = SvPV(v, msiz);           \
+       mend = mbase + msiz;                            \
+} while (0)
+
+#define MBUF_XTEND(x) do {                     \
+       int nsz = (int) round_mgrow((x)+msiz);  \
+       int offset = mptr - mbase;              \
+       TRACEME(("** extending mbase to %d bytes", nsz));       \
+       Renew(mbase, nsz, char);                \
+       msiz = nsz;                                             \
+       mptr = mbase + offset;                  \
+       mend = mbase + nsz;                             \
+} while (0)
+
+#define MBUF_CHK(x) do {                       \
+       if ((mptr + (x)) > mend)                \
+               MBUF_XTEND(x);                          \
+} while (0)
+
+#define MBUF_GETC(x) do {                      \
+       if (mptr < mend)                                \
+               x = (int) (unsigned char) *mptr++;      \
+       else                                                    \
+               return (SV *) 0;                        \
+} while (0)
+
+#ifdef CRAY_HACK
+#define MBUF_GETINT(x) do {                            \
+       oC(x);                                                          \
+       if ((mptr + 4) <= mend) {                       \
+               memcpy(oI(&x), mptr, 4);                \
+               mptr += 4;                                              \
+       } else                                                          \
+               return (SV *) 0;                                \
+} while (0)
+#else
+#define MBUF_GETINT(x) do {                            \
+       if ((mptr + sizeof(int)) <= mend) {     \
+               if (int_aligned(mptr))                  \
+                       x = *(int *) mptr;                      \
+               else                                                    \
+                       memcpy(&x, mptr, sizeof(int));  \
+               mptr += sizeof(int);                    \
+       } else                                                          \
+               return (SV *) 0;                                \
+} while (0)
+#endif
+
+#define MBUF_READ(x,s) do {                    \
+       if ((mptr + (s)) <= mend) {             \
+               memcpy(x, mptr, s);                     \
+               mptr += s;                                      \
+       } else                                                  \
+               return (SV *) 0;                        \
+} while (0)
+
+#define MBUF_SAFEREAD(x,s,z) do {      \
+       if ((mptr + (s)) <= mend) {             \
+               memcpy(x, mptr, s);                     \
+               mptr += s;                                      \
+       } else {                                                \
+               sv_free(z);                                     \
+               return (SV *) 0;                        \
+       }                                                               \
+} while (0)
+
+#define MBUF_PUTC(c) do {                      \
+       if (mptr < mend)                                \
+               *mptr++ = (char) c;                     \
+       else {                                                  \
+               MBUF_XTEND(1);                          \
+               *mptr++ = (char) c;                     \
+       }                                                               \
+} while (0)
+
+#ifdef CRAY_HACK
+#define MBUF_PUTINT(i) do {                    \
+       MBUF_CHK(4);                                    \
+       memcpy(mptr, oI(&i), 4);                \
+       mptr += 4;                                              \
+} while (0)
+#else
+#define MBUF_PUTINT(i) do {                    \
+       MBUF_CHK(sizeof(int));                  \
+       if (int_aligned(mptr))                  \
+               *(int *) mptr = i;                      \
+       else                                                    \
+               memcpy(mptr, &i, sizeof(int));  \
+       mptr += sizeof(int);                    \
+} while (0)
+#endif
+
+#define MBUF_WRITE(x,s) do {           \
+       MBUF_CHK(s);                                    \
+       memcpy(mptr, x, s);                             \
+       mptr += s;                                              \
+} while (0)
+
+/*
+ * Possible return values for sv_type().
+ */
+
+#define svis_REF               0
+#define svis_SCALAR            1
+#define svis_ARRAY             2
+#define svis_HASH              3
+#define svis_TIED              4
+#define svis_TIED_ITEM 5
+#define svis_OTHER             6
+
+/*
+ * Flags for SX_HOOK.
+ */
+
+#define SHF_TYPE_MASK          0x03
+#define SHF_LARGE_CLASSLEN     0x04
+#define SHF_LARGE_STRLEN       0x08
+#define SHF_LARGE_LISTLEN      0x10
+#define SHF_IDX_CLASSNAME      0x20
+#define SHF_NEED_RECURSE       0x40
+#define SHF_HAS_LIST           0x80
+
+/*
+ * Types for SX_HOOK (2 bits).
+ */
+
+#define SHT_SCALAR                     0
+#define SHT_ARRAY                      1
+#define SHT_HASH                       2
+
+/*
+ * Before 0.6, the magic string was "perl-store" (binary version number 0).
+ *
+ * Since 0.6 introduced many binary incompatibilities, the magic string has
+ * been changed to "pst0" to allow an old image to be properly retrieved by
+ * a newer Storable, but ensure a newer image cannot be retrieved with an
+ * older version.
+ *
+ * At 0.7, objects are given the ability to serialize themselves, and the
+ * set of markers is extended, backward compatibility is not jeopardized,
+ * so the binary version number could have remained unchanged.  To correctly
+ * spot errors if a file making use of 0.7-specific extensions is given to
+ * 0.6 for retrieval, the binary version was moved to "2".  And I'm introducing
+ * a "minor" version, to better track this kind of evolution from now on.
+ * 
+ */
+static char old_magicstr[] = "perl-store";     /* Magic number before 0.6 */
+static char magicstr[] = "pst0";                       /* Used as a magic number */
+
+#define STORABLE_BIN_MAJOR     2                               /* Binary major "version" */
+#define STORABLE_BIN_MINOR     3                               /* Binary minor "version" */
+
+/*
+ * Useful store shortcuts...
+ */
+
+#define PUTMARK(x) do {                                                \
+       if (!cxt->fio)                                                  \
+               MBUF_PUTC(x);                                           \
+       else if (PerlIO_putc(cxt->fio, x) == EOF)       \
+               return -1;                                                      \
+} while (0)
+
+#define WRITE_I32(x)   do {                    \
+       ASSERT(sizeof(x) == sizeof(I32), ("writing an I32"));   \
+       if (!cxt->fio)                                          \
+               MBUF_PUTINT(x);                                 \
+       else if (PerlIO_write(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
+               return -1;                                      \
+       } while (0)
+
+#ifdef HAS_HTONL
+#define WLEN(x)        do {                            \
+       if (cxt->netorder) {                    \
+               int y = (int) htonl(x);         \
+               if (!cxt->fio)                          \
+                       MBUF_PUTINT(y);                 \
+               else if (PerlIO_write(cxt->fio,oI(&y),oS(sizeof(y))) != oS(sizeof(y))) \
+                       return -1;                              \
+       } else {                                                \
+               if (!cxt->fio)                          \
+                       MBUF_PUTINT(x);                 \
+               else if (PerlIO_write(cxt->fio,oI(&x),oS(sizeof(x))) != oS(sizeof(x))) \
+                       return -1;                              \
+       }                                                               \
+} while (0)
+#else
+#define WLEN(x)        WRITE_I32(x)
+#endif
+
+#define WRITE(x,y) do {                                                \
+       if (!cxt->fio)                                                  \
+               MBUF_WRITE(x,y);                                        \
+       else if (PerlIO_write(cxt->fio, x, y) != y)     \
+               return -1;                                                      \
+       } while (0)
+
+#define STORE_PV_LEN(pv, len, small, large) do {       \
+       if (len <= LG_SCALAR) {                         \
+               unsigned char clen = (unsigned char) len;       \
+               PUTMARK(small);                                 \
+               PUTMARK(clen);                                  \
+               if (len)                                                \
+                       WRITE(pv, len);                         \
+       } else {                                                        \
+               PUTMARK(large);                                 \
+               WLEN(len);                                              \
+               WRITE(pv, len);                                 \
+       }                                                                       \
+} while (0)
+
+#define STORE_SCALAR(pv, len)  STORE_PV_LEN(pv, len, SX_SCALAR, SX_LSCALAR)
+
+/*
+ * Conditional UTF8 support.
+ * On non-UTF8 perls, UTF8 strings are returned as normal strings.
+ *
+ */
+#ifdef SvUTF8_on
+#define STORE_UTF8STR(pv, len) STORE_PV_LEN(pv, len, SX_UTF8STR, SX_LUTF8STR)
+#else
+#define SvUTF8(sv) 0
+#define STORE_UTF8STR(pv, len) CROAK(("panic: storing UTF8 in non-UTF8 perl"))
+#define SvUTF8_on(sv) CROAK(("Cannot retrieve UTF8 data in non-UTF8 perl"))
+#endif
+
+/*
+ * Store undef in arrays and hashes without recursing through store().
+ */
+#define STORE_UNDEF() do {                             \
+       cxt->tagnum++;                                          \
+       PUTMARK(SX_UNDEF);                                      \
+} while (0)
+
+/*
+ * Useful retrieve shortcuts...
+ */
+
+#define GETCHAR() \
+       (cxt->fio ? PerlIO_getc(cxt->fio) : (mptr >= mend ? EOF : (int) *mptr++))
+
+#define GETMARK(x) do {                                                        \
+       if (!cxt->fio)                                                          \
+               MBUF_GETC(x);                                                   \
+       else if ((x = PerlIO_getc(cxt->fio)) == EOF)    \
+               return (SV *) 0;                                                \
+} while (0)
+
+#define READ_I32(x)    do {                            \
+       ASSERT(sizeof(x) == sizeof(I32), ("reading an I32"));   \
+       oC(x);                                                          \
+       if (!cxt->fio)                                          \
+               MBUF_GETINT(x);                                 \
+       else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
+               return (SV *) 0;                                \
+} while (0)
+
+#ifdef HAS_NTOHL
+#define RLEN(x)        do {                                    \
+       oC(x);                                                          \
+       if (!cxt->fio)                                          \
+               MBUF_GETINT(x);                                 \
+       else if (PerlIO_read(cxt->fio, oI(&x), oS(sizeof(x))) != oS(sizeof(x))) \
+               return (SV *) 0;                                \
+       if (cxt->netorder)                                      \
+               x = (int) ntohl(x);                             \
+} while (0)
+#else
+#define RLEN(x) READ_I32(x)
+#endif
+
+#define READ(x,y) do {                                         \
+       if (!cxt->fio)                                                  \
+               MBUF_READ(x, y);                                        \
+       else if (PerlIO_read(cxt->fio, x, y) != y)      \
+               return (SV *) 0;                                        \
+} while (0)
+
+#define SAFEREAD(x,y,z) do {                                   \
+       if (!cxt->fio)                                                          \
+               MBUF_SAFEREAD(x,y,z);                                   \
+       else if (PerlIO_read(cxt->fio, x, y) != y)       {      \
+               sv_free(z);                                                             \
+               return (SV *) 0;                                                \
+       }                                                                                       \
+} while (0)
+
+/*
+ * This macro is used at retrieve time, to remember where object 'y', bearing a
+ * given tag 'tagnum', has been retrieved. Next time we see an SX_OBJECT marker,
+ * we'll therefore know where it has been retrieved and will be able to
+ * share the same reference, as in the original stored memory image.
+ */
+#define SEEN(y) do {                                           \
+       if (!y)                                                                 \
+               return (SV *) 0;                                        \
+       if (av_store(cxt->aseen, cxt->tagnum++, SvREFCNT_inc(y)) == 0) \
+               return (SV *) 0;                                        \
+       TRACEME(("aseen(#%d) = 0x%"UVxf" (refcnt=%d)", cxt->tagnum-1, \
+                PTR2UV(y), SvREFCNT(y)-1)); \
+} while (0)
+
+/*
+ * Bless `s' in `p', via a temporary reference, required by sv_bless().
+ */
+#define BLESS(s,p) do {                                        \
+       SV *ref;                                                                \
+       HV *stash;                                                              \
+       TRACEME(("blessing 0x%"UVxf" in %s", PTR2UV(s), (p))); \
+       stash = gv_stashpv((p), TRUE);                  \
+       ref = newRV_noinc(s);                                   \
+       (void) sv_bless(ref, stash);                    \
+       SvRV(ref) = 0;                                                  \
+       SvREFCNT_dec(ref);                                              \
+} while (0)
+
+static int store();
+static SV *retrieve();
+
+/*
+ * Dynamic dispatching table for SV store.
+ */
+
+static int store_ref(stcxt_t *cxt, SV *sv);
+static int store_scalar(stcxt_t *cxt, SV *sv);
+static int store_array(stcxt_t *cxt, AV *av);
+static int store_hash(stcxt_t *cxt, HV *hv);
+static int store_tied(stcxt_t *cxt, SV *sv);
+static int store_tied_item(stcxt_t *cxt, SV *sv);
+static int store_other(stcxt_t *cxt, SV *sv);
+static int store_blessed(stcxt_t *cxt, SV *sv, int type, HV *pkg);
+
+static int (*sv_store[])() = {
+       store_ref,                      /* svis_REF */
+       store_scalar,           /* svis_SCALAR */
+       store_array,            /* svis_ARRAY */
+       store_hash,                     /* svis_HASH */
+       store_tied,                     /* svis_TIED */
+       store_tied_item,        /* svis_TIED_ITEM */
+       store_other,            /* svis_OTHER */
+};
+
+#define SV_STORE(x)    (*sv_store[x])
+
+/*
+ * Dynamic dispatching tables for SV retrieval.
+ */
+
+static SV *retrieve_lscalar(stcxt_t *cxt);
+static SV *retrieve_lutf8str(stcxt_t *cxt);
+static SV *old_retrieve_array(stcxt_t *cxt);
+static SV *old_retrieve_hash(stcxt_t *cxt);
+static SV *retrieve_ref(stcxt_t *cxt);
+static SV *retrieve_undef(stcxt_t *cxt);
+static SV *retrieve_integer(stcxt_t *cxt);
+static SV *retrieve_double(stcxt_t *cxt);
+static SV *retrieve_byte(stcxt_t *cxt);
+static SV *retrieve_netint(stcxt_t *cxt);
+static SV *retrieve_scalar(stcxt_t *cxt);
+static SV *retrieve_utf8str(stcxt_t *cxt);
+static SV *retrieve_tied_array(stcxt_t *cxt);
+static SV *retrieve_tied_hash(stcxt_t *cxt);
+static SV *retrieve_tied_scalar(stcxt_t *cxt);
+static SV *retrieve_other(stcxt_t *cxt);
+
+static SV *(*sv_old_retrieve[])() = {
+       0,                      /* SX_OBJECT -- entry unused dynamically */
+       retrieve_lscalar,               /* SX_LSCALAR */
+       old_retrieve_array,             /* SX_ARRAY -- for pre-0.6 binaries */
+       old_retrieve_hash,              /* SX_HASH -- for pre-0.6 binaries */
+       retrieve_ref,                   /* SX_REF */
+       retrieve_undef,                 /* SX_UNDEF */
+       retrieve_integer,               /* SX_INTEGER */
+       retrieve_double,                /* SX_DOUBLE */
+       retrieve_byte,                  /* SX_BYTE */
+       retrieve_netint,                /* SX_NETINT */
+       retrieve_scalar,                /* SX_SCALAR */
+       retrieve_tied_array,    /* SX_ARRAY */
+       retrieve_tied_hash,             /* SX_HASH */
+       retrieve_tied_scalar,   /* SX_SCALAR */
+       retrieve_other,                 /* SX_SV_UNDEF not supported */
+       retrieve_other,                 /* SX_SV_YES not supported */
+       retrieve_other,                 /* SX_SV_NO not supported */
+       retrieve_other,                 /* SX_BLESS not supported */
+       retrieve_other,                 /* SX_IX_BLESS not supported */
+       retrieve_other,                 /* SX_HOOK not supported */
+       retrieve_other,                 /* SX_OVERLOADED not supported */
+       retrieve_other,                 /* SX_TIED_KEY not supported */
+       retrieve_other,                 /* SX_TIED_IDX not supported */
+       retrieve_other,                 /* SX_UTF8STR not supported */
+       retrieve_other,                 /* SX_LUTF8STR not supported */
+       retrieve_other,                 /* SX_ERROR */
+};
+
+static SV *retrieve_array(stcxt_t *cxt);
+static SV *retrieve_hash(stcxt_t *cxt);
+static SV *retrieve_sv_undef(stcxt_t *cxt);
+static SV *retrieve_sv_yes(stcxt_t *cxt);
+static SV *retrieve_sv_no(stcxt_t *cxt);
+static SV *retrieve_blessed(stcxt_t *cxt);
+static SV *retrieve_idx_blessed(stcxt_t *cxt);
+static SV *retrieve_hook(stcxt_t *cxt);
+static SV *retrieve_overloaded(stcxt_t *cxt);
+static SV *retrieve_tied_key(stcxt_t *cxt);
+static SV *retrieve_tied_idx(stcxt_t *cxt);
+
+static SV *(*sv_retrieve[])() = {
+       0,                      /* SX_OBJECT -- entry unused dynamically */
+       retrieve_lscalar,               /* SX_LSCALAR */
+       retrieve_array,                 /* SX_ARRAY */
+       retrieve_hash,                  /* SX_HASH */
+       retrieve_ref,                   /* SX_REF */
+       retrieve_undef,                 /* SX_UNDEF */
+       retrieve_integer,               /* SX_INTEGER */
+       retrieve_double,                /* SX_DOUBLE */
+       retrieve_byte,                  /* SX_BYTE */
+       retrieve_netint,                /* SX_NETINT */
+       retrieve_scalar,                /* SX_SCALAR */
+       retrieve_tied_array,    /* SX_ARRAY */
+       retrieve_tied_hash,             /* SX_HASH */
+       retrieve_tied_scalar,   /* SX_SCALAR */
+       retrieve_sv_undef,              /* SX_SV_UNDEF */
+       retrieve_sv_yes,                /* SX_SV_YES */
+       retrieve_sv_no,                 /* SX_SV_NO */
+       retrieve_blessed,               /* SX_BLESS */
+       retrieve_idx_blessed,   /* SX_IX_BLESS */
+       retrieve_hook,                  /* SX_HOOK */
+       retrieve_overloaded,    /* SX_OVERLOAD */
+       retrieve_tied_key,              /* SX_TIED_KEY */
+       retrieve_tied_idx,              /* SX_TIED_IDX */
+       retrieve_utf8str,               /* SX_UTF8STR  */
+       retrieve_lutf8str,              /* SX_LUTF8STR */
+       retrieve_other,                 /* SX_ERROR */
+};
+
+#define RETRIEVE(c,x) (*(c)->retrieve_vtbl[(x) >= SX_ERROR ? SX_ERROR : (x)])
+
+static SV *mbuf2sv(void);
+
+/***
+ *** Context management.
+ ***/
+
+/*
+ * init_perinterp
+ *
+ * Called once per "thread" (interpreter) to initialize some global context.
+ */
+static void init_perinterp(void)
+{
+    INIT_STCXT;
+
+    cxt->netorder = 0;         /* true if network order used */
+    cxt->forgive_me = -1;      /* whether to be forgiving... */
+}
+
+/*
+ * init_store_context
+ *
+ * Initialize a new store context for real recursion.
+ */
+static void init_store_context(
+       stcxt_t *cxt,
+       PerlIO *f,
+       int optype,
+       int network_order)
+{
+       TRACEME(("init_store_context"));
+
+       cxt->netorder = network_order;
+       cxt->forgive_me = -1;                   /* Fetched from perl if needed */
+       cxt->canonical = -1;                    /* Idem */
+       cxt->tagnum = -1;                               /* Reset tag numbers */
+       cxt->classnum = -1;                             /* Reset class numbers */
+       cxt->fio = f;                                   /* Where I/O are performed */
+       cxt->optype = optype;                   /* A store, or a deep clone */
+       cxt->entry = 1;                                 /* No recursion yet */
+
+       /*
+        * The `hseen' table is used to keep track of each SV stored and their
+        * associated tag numbers is special. It is "abused" because the
+        * values stored are not real SV, just integers cast to (SV *),
+        * which explains the freeing below.
+        *
+        * It is also one possible bottlneck to achieve good storing speed,
+        * so the "shared keys" optimization is turned off (unlikely to be
+        * of any use here), and the hash table is "pre-extended". Together,
+        * those optimizations increase the throughput by 12%.
+        */
+
+       cxt->hseen = newHV();                   /* Table where seen objects are stored */
+       HvSHAREKEYS_off(cxt->hseen);
+
+       /*
+        * The following does not work well with perl5.004_04, and causes
+        * a core dump later on, in a completely unrelated spot, which
+        * makes me think there is a memory corruption going on.
+        *
+        * Calling hv_ksplit(hseen, HBUCKETS) instead of manually hacking
+        * it below does not make any difference. It seems to work fine
+        * with perl5.004_68 but given the probable nature of the bug,
+        * that does not prove anything.
+        *
+        * It's a shame because increasing the amount of buckets raises
+        * store() throughput by 5%, but until I figure this out, I can't
+        * allow for this to go into production.
+        *
+        * It is reported fixed in 5.005, hence the #if.
+        */
+#if PERL_VERSION >= 5
+#define HBUCKETS       4096                            /* Buckets for %hseen */
+       HvMAX(cxt->hseen) = HBUCKETS - 1;       /* keys %hseen = $HBUCKETS; */
+#endif
+
+       /*
+        * The `hclass' hash uses the same settings as `hseen' above, but it is
+        * used to assign sequential tags (numbers) to class names for blessed
+        * objects.
+        *
+        * We turn the shared key optimization on.
+        */
+
+       cxt->hclass = newHV();                  /* Where seen classnames are stored */
+
+#if PERL_VERSION >= 5
+       HvMAX(cxt->hclass) = HBUCKETS - 1;      /* keys %hclass = $HBUCKETS; */
+#endif
+
+       /*
+        * The `hook' hash table is used to keep track of the references on
+        * the STORABLE_freeze hook routines, when found in some class name.
+        *
+        * It is assumed that the inheritance tree will not be changed during
+        * storing, and that no new method will be dynamically created by the
+        * hooks.
+        */
+
+       cxt->hook = newHV();                    /* Table where hooks are cached */
+}
+
+/*
+ * clean_store_context
+ *
+ * Clean store context by
+ */
+static void clean_store_context(stcxt_t *cxt)
+{
+       HE *he;
+
+       TRACEME(("clean_store_context"));
+
+       ASSERT(cxt->optype & ST_STORE, ("was performing a store()"));
+
+       /*
+        * Insert real values into hashes where we stored faked pointers.
+        */
+
+       hv_iterinit(cxt->hseen);
+       while (he = hv_iternext(cxt->hseen))
+               HeVAL(he) = &PL_sv_undef;
+
+       hv_iterinit(cxt->hclass);
+       while (he = hv_iternext(cxt->hclass))
+               HeVAL(he) = &PL_sv_undef;
+
+       /*
+        * And now dispose of them...
+        */
+
+       hv_undef(cxt->hseen);
+       sv_free((SV *) cxt->hseen);
+
+       hv_undef(cxt->hclass);
+       sv_free((SV *) cxt->hclass);
+
+       hv_undef(cxt->hook);
+       sv_free((SV *) cxt->hook);
+
+       cxt->entry = 0;
+       cxt->s_dirty = 0;
+}
+
+/*
+ * init_retrieve_context
+ *
+ * Initialize a new retrieve context for real recursion.
+ */
+static void init_retrieve_context(stcxt_t *cxt, int optype, int is_tainted)
+{
+       TRACEME(("init_retrieve_context"));
+
+       /*
+        * The hook hash table is used to keep track of the references on
+        * the STORABLE_thaw hook routines, when found in some class name.
+        *
+        * It is assumed that the inheritance tree will not be changed during
+        * storing, and that no new method will be dynamically created by the
+        * hooks.
+        */
+
+       cxt->hook  = newHV();                   /* Caches STORABLE_thaw */
+
+       /*
+        * If retrieving an old binary version, the cxt->retrieve_vtbl variable
+        * was set to sv_old_retrieve. We'll need a hash table to keep track of
+        * the correspondance between the tags and the tag number used by the
+        * new retrieve routines.
+        */
+
+       cxt->hseen = (cxt->retrieve_vtbl == sv_old_retrieve) ? newHV() : 0;
+
+       cxt->aseen = newAV();                   /* Where retrieved objects are kept */
+       cxt->aclass = newAV();                  /* Where seen classnames are kept */
+       cxt->tagnum = 0;                                /* Have to count objects... */
+       cxt->classnum = 0;                              /* ...and class names as well */
+       cxt->optype = optype;
+       cxt->s_tainted = is_tainted;
+       cxt->entry = 1;                                 /* No recursion yet */
+}
+
+/*
+ * clean_retrieve_context
+ *
+ * Clean retrieve context by
+ */
+static void clean_retrieve_context(stcxt_t *cxt)
+{
+       TRACEME(("clean_retrieve_context"));
+
+       ASSERT(cxt->optype & ST_RETRIEVE, ("was performing a retrieve()"));
+
+       av_undef(cxt->aseen);
+       sv_free((SV *) cxt->aseen);
+
+       av_undef(cxt->aclass);
+       sv_free((SV *) cxt->aclass);
+
+       hv_undef(cxt->hook);
+       sv_free((SV *) cxt->hook);
+
+       if (cxt->hseen)
+               sv_free((SV *) cxt->hseen);             /* optional HV, for backward compat. */
+
+       cxt->entry = 0;
+       cxt->s_dirty = 0;
+}
+
+/*
+ * clean_context
+ *
+ * A workaround for the CROAK bug: cleanup the last context.
+ */
+static void clean_context(cxt)
+stcxt_t *cxt;
+{
+       TRACEME(("clean_context"));
+
+       ASSERT(cxt->s_dirty, ("dirty context"));
+
+       if (cxt->optype & ST_RETRIEVE)
+               clean_retrieve_context(cxt);
+       else
+               clean_store_context(cxt);
+}
+
+/*
+ * allocate_context
+ *
+ * Allocate a new context and push it on top of the parent one.
+ * This new context is made globally visible via SET_STCXT().
+ */
+static stcxt_t *allocate_context(parent_cxt)
+stcxt_t *parent_cxt;
+{
+       stcxt_t *cxt;
+
+       TRACEME(("allocate_context"));
+
+       ASSERT(!parent_cxt->s_dirty, ("parent context clean"));
+
+       Newz(0, cxt, 1, stcxt_t);
+       cxt->prev = parent_cxt;
+       SET_STCXT(cxt);
+
+       return cxt;
+}
+
+/*
+ * free_context
+ *
+ * Free current context, which cannot be the "root" one.
+ * Make the context underneath globally visible via SET_STCXT().
+ */
+static void free_context(cxt)
+stcxt_t *cxt;
+{
+       stcxt_t *prev = cxt->prev;
+
+       TRACEME(("free_context"));
+
+       ASSERT(!cxt->s_dirty, ("clean context"));
+       ASSERT(prev, ("not freeing root context"));
+
+       if (kbuf)
+               Safefree(kbuf);
+       if (mbase)
+               Safefree(mbase);
+
+       Safefree(cxt);
+       SET_STCXT(prev);
+}
+
+/***
+ *** Predicates.
+ ***/
+
+/*
+ * is_storing
+ *
+ * Tells whether we're in the middle of a store operation.
+ */
+int is_storing(void)
+{
+       dSTCXT;
+
+       return cxt->entry && (cxt->optype & ST_STORE);
+}
+
+/*
+ * is_retrieving
+ *
+ * Tells whether we're in the middle of a retrieve operation.
+ */
+int is_retrieving(void)
+{
+       dSTCXT;
+
+       return cxt->entry && (cxt->optype & ST_RETRIEVE);
+}
+
+/*
+ * last_op_in_netorder
+ *
+ * Returns whether last operation was made using network order.
+ *
+ * This is typically out-of-band information that might prove useful
+ * to people wishing to convert native to network order data when used.
+ */
+int last_op_in_netorder(void)
+{
+       dSTCXT;
+
+       return cxt->netorder;
+}
+
+/***
+ *** Hook lookup and calling routines.
+ ***/
+
+/*
+ * pkg_fetchmeth
+ *
+ * A wrapper on gv_fetchmethod_autoload() which caches results.
+ *
+ * Returns the routine reference as an SV*, or null if neither the package
+ * nor its ancestors know about the method.
+ */
+static SV *pkg_fetchmeth(
+       HV *cache,
+       HV *pkg,
+       char *method)
+{
+       GV *gv;
+       SV *sv;
+       SV **svh;
+
+       /*
+        * The following code is the same as the one performed by UNIVERSAL::can
+        * in the Perl core.
+        */
+
+       gv = gv_fetchmethod_autoload(pkg, method, FALSE);
+       if (gv && isGV(gv)) {
+               sv = newRV((SV*) GvCV(gv));
+               TRACEME(("%s->%s: 0x%"UVxf, HvNAME(pkg), method, PTR2UV(sv)));
+       } else {
+               sv = newSVsv(&PL_sv_undef);
+               TRACEME(("%s->%s: not found", HvNAME(pkg), method));
+       }
+
+       /*
+        * Cache the result, ignoring failure: if we can't store the value,
+        * it just won't be cached.
+        */
+
+       (void) hv_store(cache, HvNAME(pkg), strlen(HvNAME(pkg)), sv, 0);
+
+       return SvOK(sv) ? sv : (SV *) 0;
+}
+
+/*
+ * pkg_hide
+ *
+ * Force cached value to be undef: hook ignored even if present.
+ */
+static void pkg_hide(
+       HV *cache,
+       HV *pkg,
+       char *method)
+{
+       (void) hv_store(cache,
+               HvNAME(pkg), strlen(HvNAME(pkg)), newSVsv(&PL_sv_undef), 0);
+}
+
+/*
+ * pkg_can
+ *
+ * Our own "UNIVERSAL::can", which caches results.
+ *
+ * Returns the routine reference as an SV*, or null if the object does not
+ * know about the method.
+ */
+static SV *pkg_can(
+       HV *cache,
+       HV *pkg,
+       char *method)
+{
+       SV **svh;
+       SV *sv;
+
+       TRACEME(("pkg_can for %s->%s", HvNAME(pkg), method));
+
+       /*
+        * Look into the cache to see whether we already have determined
+        * where the routine was, if any.
+        *
+        * NOTA BENE: we don't use `method' at all in our lookup, since we know
+        * that only one hook (i.e. always the same) is cached in a given cache.
+        */
+
+       svh = hv_fetch(cache, HvNAME(pkg), strlen(HvNAME(pkg)), FALSE);
+       if (svh) {
+               sv = *svh;
+               if (!SvOK(sv)) {
+                       TRACEME(("cached %s->%s: not found", HvNAME(pkg), method));
+                       return (SV *) 0;
+               } else {
+                       TRACEME(("cached %s->%s: 0x%"UVxf,
+                               HvNAME(pkg), method, PTR2UV(sv)));
+                       return sv;
+               }
+       }
+
+       TRACEME(("not cached yet"));
+       return pkg_fetchmeth(cache, pkg, method);               /* Fetch and cache */
+}
+
+/*
+ * scalar_call
+ *
+ * Call routine as obj->hook(av) in scalar context.
+ * Propagates the single returned value if not called in void context.
+ */
+static SV *scalar_call(
+       SV *obj,
+       SV *hook,
+       int cloning,
+       AV *av,
+       I32 flags)
+{
+       dSP;
+       int count;
+       SV *sv = 0;
+
+       TRACEME(("scalar_call (cloning=%d)", cloning));
+
+       ENTER;
+       SAVETMPS;
+
+       PUSHMARK(sp);
+       XPUSHs(obj);
+       XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
+       if (av) {
+               SV **ary = AvARRAY(av);
+               int cnt = AvFILLp(av) + 1;
+               int i;
+               XPUSHs(ary[0]);                                                 /* Frozen string */
+               for (i = 1; i < cnt; i++) {
+                       TRACEME(("pushing arg #%d (0x%"UVxf")...",
+                                i, PTR2UV(ary[i])));
+                       XPUSHs(sv_2mortal(newRV(ary[i])));
+               }
+       }
+       PUTBACK;
+
+       TRACEME(("calling..."));
+       count = perl_call_sv(hook, flags);              /* Go back to Perl code */
+       TRACEME(("count = %d", count));
+
+       SPAGAIN;
+
+       if (count) {
+               sv = POPs;
+               SvREFCNT_inc(sv);               /* We're returning it, must stay alive! */
+       }
+
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       return sv;
+}
+
+/*
+ * array_call
+ *
+ * Call routine obj->hook(cloning) in list context.
+ * Returns the list of returned values in an array.
+ */
+static AV *array_call(
+       SV *obj,
+       SV *hook,
+       int cloning)
+{
+       dSP;
+       int count;
+       AV *av;
+       int i;
+
+       TRACEME(("array_call (cloning=%d)", cloning));
+
+       ENTER;
+       SAVETMPS;
+
+       PUSHMARK(sp);
+       XPUSHs(obj);                                                            /* Target object */
+       XPUSHs(sv_2mortal(newSViv(cloning)));           /* Cloning flag */
+       PUTBACK;
+
+       count = perl_call_sv(hook, G_ARRAY);            /* Go back to Perl code */
+
+       SPAGAIN;
+
+       av = newAV();
+       for (i = count - 1; i >= 0; i--) {
+               SV *sv = POPs;
+               av_store(av, i, SvREFCNT_inc(sv));
+       }
+
+       PUTBACK;
+       FREETMPS;
+       LEAVE;
+
+       return av;
+}
+
+/*
+ * known_class
+ *
+ * Lookup the class name in the `hclass' table and either assign it a new ID
+ * or return the existing one, by filling in `classnum'.
+ *
+ * Return true if the class was known, false if the ID was just generated.
+ */
+static int known_class(
+       stcxt_t *cxt,
+       char *name,             /* Class name */
+       int len,                /* Name length */
+       I32 *classnum)
+{
+       SV **svh;
+       HV *hclass = cxt->hclass;
+
+       TRACEME(("known_class (%s)", name));
+
+       /*
+        * Recall that we don't store pointers in this hash table, but tags.
+        * Therefore, we need LOW_32BITS() to extract the relevant parts.
+        */
+
+       svh = hv_fetch(hclass, name, len, FALSE);
+       if (svh) {
+               *classnum = LOW_32BITS(*svh);
+               return TRUE;
+       }
+
+       /*
+        * Unknown classname, we need to record it.
+        */
+
+       cxt->classnum++;
+       if (!hv_store(hclass, name, len, INT2PTR(SV*, cxt->classnum), 0))
+               CROAK(("Unable to record new classname"));
+
+       *classnum = cxt->classnum;
+       return FALSE;
+}
+
+/***
+ *** Sepcific store routines.
+ ***/
+
+/*
+ * store_ref
+ *
+ * Store a reference.
+ * Layout is SX_REF <object> or SX_OVERLOAD <object>.
+ */
+static int store_ref(stcxt_t *cxt, SV *sv)
+{
+       TRACEME(("store_ref (0x%"UVxf")", PTR2UV(sv)));
+
+       /*
+        * Follow reference, and check if target is overloaded.
+        */
+
+       sv = SvRV(sv);
+
+       if (SvOBJECT(sv)) {
+               HV *stash = (HV *) SvSTASH(sv);
+               if (stash && Gv_AMG(stash)) {
+                       TRACEME(("ref (0x%"UVxf") is overloaded", PTR2UV(sv)));
+                       PUTMARK(SX_OVERLOAD);
+               } else
+                       PUTMARK(SX_REF);
+       } else
+               PUTMARK(SX_REF);
+
+       return store(cxt, sv);
+}
+
+/*
+ * store_scalar
+ *
+ * Store a scalar.
+ *
+ * Layout is SX_LSCALAR <length> <data>, SX_SCALAR <lenght> <data> or SX_UNDEF.
+ * The <data> section is omitted if <length> is 0.
+ *
+ * If integer or double, the layout is SX_INTEGER <data> or SX_DOUBLE <data>.
+ * Small integers (within [-127, +127]) are stored as SX_BYTE <byte>.
+ */
+static int store_scalar(stcxt_t *cxt, SV *sv)
+{
+       IV iv;
+       char *pv;
+       STRLEN len;
+       U32 flags = SvFLAGS(sv);                        /* "cc -O" may put it in register */
+
+       TRACEME(("store_scalar (0x%"UVxf")", PTR2UV(sv)));
+
+       /*
+        * For efficiency, break the SV encapsulation by peaking at the flags
+        * directly without using the Perl macros to avoid dereferencing
+        * sv->sv_flags each time we wish to check the flags.
+        */
+
+       if (!(flags & SVf_OK)) {                        /* !SvOK(sv) */
+               if (sv == &PL_sv_undef) {
+                       TRACEME(("immortal undef"));
+                       PUTMARK(SX_SV_UNDEF);
+               } else {
+                       TRACEME(("undef at 0x%"UVxf, PTR2UV(sv)));
+                       PUTMARK(SX_UNDEF);
+               }
+               return 0;
+       }
+
+       /*
+        * Always store the string representation of a scalar if it exists.
+        * Gisle Aas provided me with this test case, better than a long speach:
+        *
+        *  perl -MDevel::Peek -le '$a="abc"; $a+0; Dump($a)'
+        *  SV = PVNV(0x80c8520)
+        *       REFCNT = 1
+        *       FLAGS = (NOK,POK,pNOK,pPOK)
+        *       IV = 0
+        *       NV = 0
+        *       PV = 0x80c83d0 "abc"\0
+        *       CUR = 3
+        *       LEN = 4
+        *
+        * Write SX_SCALAR, length, followed by the actual data.
+        *
+        * Otherwise, write an SX_BYTE, SX_INTEGER or an SX_DOUBLE as
+        * appropriate, followed by the actual (binary) data. A double
+        * is written as a string if network order, for portability.
+        *
+        * NOTE: instead of using SvNOK(sv), we test for SvNOKp(sv).
+        * The reason is that when the scalar value is tainted, the SvNOK(sv)
+        * value is false.
+        *
+        * The test for a read-only scalar with both POK and NOK set is meant
+        * to quickly detect &PL_sv_yes and &PL_sv_no without having to pay the
+        * address comparison for each scalar we store.
+        */
+
+#define SV_MAYBE_IMMORTAL (SVf_READONLY|SVf_POK|SVf_NOK)
+
+       if ((flags & SV_MAYBE_IMMORTAL) == SV_MAYBE_IMMORTAL) {
+               if (sv == &PL_sv_yes) {
+                       TRACEME(("immortal yes"));
+                       PUTMARK(SX_SV_YES);
+               } else if (sv == &PL_sv_no) {
+                       TRACEME(("immortal no"));
+                       PUTMARK(SX_SV_NO);
+               } else {
+                       pv = SvPV(sv, len);                     /* We know it's SvPOK */
+                       goto string;                            /* Share code below */
+               }
+       } else if (flags & SVp_POK) {           /* SvPOKp(sv) => string */
+               I32 wlen;                                               /* For 64-bit machines */
+               pv = SvPV(sv, len);
+
+               /*
+                * Will come here from below with pv and len set if double & netorder,
+                * or from above if it was readonly, POK and NOK but neither &PL_sv_yes
+                * nor &PL_sv_no.
+                */
+       string:
+
+               wlen = (I32) len;                               /* WLEN via STORE_SCALAR expects I32 */
+               if (SvUTF8 (sv))
+                       STORE_UTF8STR(pv, wlen);
+               else
+                       STORE_SCALAR(pv, wlen);
+               TRACEME(("ok (scalar 0x%"UVxf" '%s', length = %"IVdf")",
+                        PTR2UV(sv), SvPVX(sv), (IV)len));
+
+       } else if (flags & SVp_NOK) {           /* SvNOKp(sv) => double */
+               NV nv = SvNV(sv);
+
+               /*
+                * Watch for number being an integer in disguise.
+                */
+               if (nv == (NV) (iv = I_V(nv))) {
+                       TRACEME(("double %"NVff" is actually integer %"IVdf, nv, iv));
+                       goto integer;           /* Share code below */
+               }
+
+               if (cxt->netorder) {
+                       TRACEME(("double %"NVff" stored as string", nv));
+                       pv = SvPV(sv, len);
+                       goto string;            /* Share code above */
+               }
+
+               PUTMARK(SX_DOUBLE);
+               WRITE(&nv, sizeof(nv));
+
+               TRACEME(("ok (double 0x%"UVxf", value = %"NVff")", PTR2UV(sv), nv));
+
+       } else if (flags & SVp_IOK) {           /* SvIOKp(sv) => integer */
+               iv = SvIV(sv);
+
+               /*
+                * Will come here from above with iv set if double is an integer.
+                */
+       integer:
+
+               /*
+                * Optimize small integers into a single byte, otherwise store as
+                * a real integer (converted into network order if they asked).
+                */
+
+               if (iv >= -128 && iv <= 127) {
+                       unsigned char siv = (unsigned char) (iv + 128); /* [0,255] */
+                       PUTMARK(SX_BYTE);
+                       PUTMARK(siv);
+                       TRACEME(("small integer stored as %d", siv));
+               } else if (cxt->netorder) {
+                       I32 niv;
+#ifdef HAS_HTONL
+                       niv = (I32) htonl(iv);
+                       TRACEME(("using network order"));
+#else
+                       niv = (I32) iv;
+                       TRACEME(("as-is for network order"));
+#endif
+                       PUTMARK(SX_NETINT);
+                       WRITE_I32(niv);
+               } else {
+                       PUTMARK(SX_INTEGER);
+                       WRITE(&iv, sizeof(iv));
+               }
+
+               TRACEME(("ok (integer 0x%"UVxf", value = %"IVdf")", PTR2UV(sv), iv));
+
+       } else
+               CROAK(("Can't determine type of %s(0x%"UVxf")",
+                      sv_reftype(sv, FALSE),
+                      PTR2UV(sv)));
+
+       return 0;               /* Ok, no recursion on scalars */
+}
+
+/*
+ * store_array
+ *
+ * Store an array.
+ *
+ * Layout is SX_ARRAY <size> followed by each item, in increading index order.
+ * Each item is stored as <object>.
+ */
+static int store_array(stcxt_t *cxt, AV *av)
+{
+       SV **sav;
+       I32 len = av_len(av) + 1;
+       I32 i;
+       int ret;
+
+       TRACEME(("store_array (0x%"UVxf")", PTR2UV(av)));
+
+       /* 
+        * Signal array by emitting SX_ARRAY, followed by the array length.
+        */
+
+       PUTMARK(SX_ARRAY);
+       WLEN(len);
+       TRACEME(("size = %d", len));
+
+       /*
+        * Now store each item recursively.
+        */
+
+       for (i = 0; i < len; i++) {
+               sav = av_fetch(av, i, 0);
+               if (!sav) {
+                       TRACEME(("(#%d) undef item", i));
+                       STORE_UNDEF();
+                       continue;
+               }
+               TRACEME(("(#%d) item", i));
+               if (ret = store(cxt, *sav))
+                       return ret;
+       }
+
+       TRACEME(("ok (array)"));
+
+       return 0;
+}
+
+/*
+ * sortcmp
+ *
+ * Sort two SVs
+ * Borrowed from perl source file pp_ctl.c, where it is used by pp_sort.
+ */
+static int
+sortcmp(const void *a, const void *b)
+{
+       return sv_cmp(*(SV * const *) a, *(SV * const *) b);
+}
+
+
+/*
+ * store_hash
+ *
+ * Store an hash table.
+ *
+ * Layout is SX_HASH <size> followed by each key/value pair, in random order.
+ * Values are stored as <object>.
+ * Keys are stored as <length> <data>, the <data> section being omitted
+ * if length is 0.
+ */
+static int store_hash(stcxt_t *cxt, HV *hv)
+{
+       I32 len = HvKEYS(hv);
+       I32 i;
+       int ret = 0;
+       I32 riter;
+       HE *eiter;
+
+       TRACEME(("store_hash (0x%"UVxf")", PTR2UV(hv)));
+
+       /* 
+        * Signal hash by emitting SX_HASH, followed by the table length.
+        */
+
+       PUTMARK(SX_HASH);
+       WLEN(len);
+       TRACEME(("size = %d", len));
+
+       /*
+        * Save possible iteration state via each() on that table.
+        */
+
+       riter = HvRITER(hv);
+       eiter = HvEITER(hv);
+       hv_iterinit(hv);
+
+       /*
+        * Now store each item recursively.
+        *
+     * If canonical is defined to some true value then store each
+     * key/value pair in sorted order otherwise the order is random.
+        * Canonical order is irrelevant when a deep clone operation is performed.
+        *
+        * Fetch the value from perl only once per store() operation, and only
+        * when needed.
+        */
+
+       if (
+               !(cxt->optype & ST_CLONE) && (cxt->canonical == 1 ||
+               (cxt->canonical < 0 && (cxt->canonical =
+                       SvTRUE(perl_get_sv("Storable::canonical", TRUE)) ? 1 : 0)))
+       ) {
+               /*
+                * Storing in order, sorted by key.
+                * Run through the hash, building up an array of keys in a
+                * mortal array, sort the array and then run through the
+                * array.  
+                */
+
+               AV *av = newAV();
+
+               TRACEME(("using canonical order"));
+
+               for (i = 0; i < len; i++) {
+                       HE *he = hv_iternext(hv);
+                       SV *key = hv_iterkeysv(he);
+                       av_store(av, AvFILLp(av)+1, key);       /* av_push(), really */
+               }
+                       
+               qsort((char *) AvARRAY(av), len, sizeof(SV *), sortcmp);
+
+               for (i = 0; i < len; i++) {
+                       char *keyval;
+                       I32 keylen;
+                       SV *key = av_shift(av);
+                       HE *he  = hv_fetch_ent(hv, key, 0, 0);
+                       SV *val = HeVAL(he);
+                       if (val == 0)
+                               return 1;               /* Internal error, not I/O error */
+                       
+                       /*
+                        * Store value first.
+                        */
+                       
+                       TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
+
+                       if (ret = store(cxt, val))
+                               goto out;
+
+                       /*
+                        * Write key string.
+                        * Keys are written after values to make sure retrieval
+                        * can be optimal in terms of memory usage, where keys are
+                        * read into a fixed unique buffer called kbuf.
+                        * See retrieve_hash() for details.
+                        */
+                        
+                       keyval = hv_iterkey(he, &keylen);
+                       TRACEME(("(#%d) key '%s'", i, keyval));
+                       WLEN(keylen);
+                       if (keylen)
+                               WRITE(keyval, keylen);
+               }
+
+               /* 
+                * Free up the temporary array
+                */
+
+               av_undef(av);
+               sv_free((SV *) av);
+
+       } else {
+
+               /*
+                * Storing in "random" order (in the order the keys are stored
+                * within the the hash).  This is the default and will be faster!
+                */
+  
+               for (i = 0; i < len; i++) {
+                       char *key;
+                       I32 len;
+                       SV *val = hv_iternextsv(hv, &key, &len);
+
+                       if (val == 0)
+                               return 1;               /* Internal error, not I/O error */
+
+                       /*
+                        * Store value first.
+                        */
+
+                       TRACEME(("(#%d) value 0x%"UVxf, i, PTR2UV(val)));
+
+                       if (ret = store(cxt, val))
+                               goto out;
+
+                       /*
+                        * Write key string.
+                        * Keys are written after values to make sure retrieval
+                        * can be optimal in terms of memory usage, where keys are
+                        * read into a fixed unique buffer called kbuf.
+                        * See retrieve_hash() for details.
+                        */
+
+                       TRACEME(("(#%d) key '%s'", i, key));
+                       WLEN(len);
+                       if (len)
+                               WRITE(key, len);
+               }
+    }
+
+       TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
+
+out:
+       HvRITER(hv) = riter;            /* Restore hash iterator state */
+       HvEITER(hv) = eiter;
+
+       return ret;
+}
+
+/*
+ * store_tied
+ *
+ * When storing a tied object (be it a tied scalar, array or hash), we lay out
+ * a special mark, followed by the underlying tied object. For instance, when
+ * dealing with a tied hash, we store SX_TIED_HASH <hash object>, where
+ * <hash object> stands for the serialization of the tied hash.
+ */
+static int store_tied(stcxt_t *cxt, SV *sv)
+{
+       MAGIC *mg;
+       int ret = 0;
+       int svt = SvTYPE(sv);
+       char mtype = 'P';
+
+       TRACEME(("store_tied (0x%"UVxf")", PTR2UV(sv)));
+
+       /*
+        * We have a small run-time penalty here because we chose to factorise
+        * all tieds objects into the same routine, and not have a store_tied_hash,
+        * a store_tied_array, etc...
+        *
+        * Don't use a switch() statement, as most compilers don't optimize that
+        * well for 2/3 values. An if() else if() cascade is just fine. We put
+        * tied hashes first, as they are the most likely beasts.
+        */
+
+       if (svt == SVt_PVHV) {
+               TRACEME(("tied hash"));
+               PUTMARK(SX_TIED_HASH);                  /* Introduces tied hash */
+       } else if (svt == SVt_PVAV) {
+               TRACEME(("tied array"));
+               PUTMARK(SX_TIED_ARRAY);                 /* Introduces tied array */
+       } else {
+               TRACEME(("tied scalar"));
+               PUTMARK(SX_TIED_SCALAR);                /* Introduces tied scalar */
+               mtype = 'q';
+       }
+
+       if (!(mg = mg_find(sv, mtype)))
+               CROAK(("No magic '%c' found while storing tied %s", mtype,
+                       (svt == SVt_PVHV) ? "hash" :
+                               (svt == SVt_PVAV) ? "array" : "scalar"));
+
+       /*
+        * The mg->mg_obj found by mg_find() above actually points to the
+        * underlying tied Perl object implementation. For instance, if the
+        * original SV was that of a tied array, then mg->mg_obj is an AV.
+        *
+        * Note that we store the Perl object as-is. We don't call its FETCH
+        * method along the way. At retrieval time, we won't call its STORE
+        * method either, but the tieing magic will be re-installed. In itself,
+        * that ensures that the tieing semantics are preserved since futher
+        * accesses on the retrieved object will indeed call the magic methods...
+        */
+
+       if (ret = store(cxt, mg->mg_obj))
+               return ret;
+
+       TRACEME(("ok (tied)"));
+
+       return 0;
+}
+
+/*
+ * store_tied_item
+ *
+ * Stores a reference to an item within a tied structure:
+ *
+ *  . \$h{key}, stores both the (tied %h) object and 'key'.
+ *  . \$a[idx], stores both the (tied @a) object and 'idx'.
+ *
+ * Layout is therefore either:
+ *     SX_TIED_KEY <object> <key>
+ *     SX_TIED_IDX <object> <index>
+ */
+static int store_tied_item(stcxt_t *cxt, SV *sv)
+{
+       MAGIC *mg;
+       int ret;
+
+       TRACEME(("store_tied_item (0x%"UVxf")", PTR2UV(sv)));
+
+       if (!(mg = mg_find(sv, 'p')))
+               CROAK(("No magic 'p' found while storing reference to tied item"));
+
+       /*
+        * We discriminate between \$h{key} and \$a[idx] via mg_ptr.
+        */
+
+       if (mg->mg_ptr) {
+               TRACEME(("store_tied_item: storing a ref to a tied hash item"));
+               PUTMARK(SX_TIED_KEY);
+               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
+
+               if (ret = store(cxt, mg->mg_obj))
+                       return ret;
+
+               TRACEME(("store_tied_item: storing PTR 0x%"UVxf, PTR2UV(mg->mg_ptr)));
+
+               if (ret = store(cxt, (SV *) mg->mg_ptr))
+                       return ret;
+       } else {
+               I32 idx = mg->mg_len;
+
+               TRACEME(("store_tied_item: storing a ref to a tied array item "));
+               PUTMARK(SX_TIED_IDX);
+               TRACEME(("store_tied_item: storing OBJ 0x%"UVxf, PTR2UV(mg->mg_obj)));
+
+               if (ret = store(cxt, mg->mg_obj))
+                       return ret;
+
+               TRACEME(("store_tied_item: storing IDX %d", idx));
+
+               WLEN(idx);
+       }
+
+       TRACEME(("ok (tied item)"));
+
+       return 0;
+}
+
+/*
+ * store_hook          -- dispatched manually, not via sv_store[]
+ *
+ * The blessed SV is serialized by a hook.
+ *
+ * Simple Layout is:
+ *
+ *     SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
+ *
+ * where <flags> indicates how long <len>, <len2> and <len3> are, whether
+ * the trailing part [] is present, the type of object (scalar, array or hash).
+ * There is also a bit which says how the classname is stored between:
+ *
+ *     <len> <classname>
+ *     <index>
+ *
+ * and when the <index> form is used (classname already seen), the "large
+ * classname" bit in <flags> indicates how large the <index> is.
+ * 
+ * The serialized string returned by the hook is of length <len2> and comes
+ * next.  It is an opaque string for us.
+ *
+ * Those <len3> object IDs which are listed last represent the extra references
+ * not directly serialized by the hook, but which are linked to the object.
+ *
+ * When recursion is mandated to resolve object-IDs not yet seen, we have
+ * instead, with <header> being flags with bits set to indicate the object type
+ * and that recursion was indeed needed:
+ *
+ *     SX_HOOK <header> <object> <header> <object> <flags>
+ *
+ * that same header being repeated between serialized objects obtained through
+ * recursion, until we reach flags indicating no recursion, at which point
+ * we know we've resynchronized with a single layout, after <flags>.
+ */
+static int store_hook(
+       stcxt_t *cxt,
+       SV *sv,
+       int type,
+       HV *pkg,
+       SV *hook)
+{
+       I32 len;
+       char *class;
+       STRLEN len2;
+       SV *ref;
+       AV *av;
+       SV **ary;
+       int count;                              /* really len3 + 1 */
+       unsigned char flags;
+       char *pv;
+       int i;
+       int recursed = 0;               /* counts recursion */
+       int obj_type;                   /* object type, on 2 bits */
+       I32 classnum;
+       int ret;
+       int clone = cxt->optype & ST_CLONE;
+
+       TRACEME(("store_hook, class \"%s\", tagged #%d", HvNAME(pkg), cxt->tagnum));
+
+       /*
+        * Determine object type on 2 bits.
+        */
+
+       switch (type) {
+       case svis_SCALAR:
+               obj_type = SHT_SCALAR;
+               break;
+       case svis_ARRAY:
+               obj_type = SHT_ARRAY;
+               break;
+       case svis_HASH:
+               obj_type = SHT_HASH;
+               break;
+       default:
+               CROAK(("Unexpected object type (%d) in store_hook()", type));
+       }
+       flags = SHF_NEED_RECURSE | obj_type;
+
+       class = HvNAME(pkg);
+       len = strlen(class);
+
+       /*
+        * To call the hook, we need to fake a call like:
+        *
+        *    $object->STORABLE_freeze($cloning);
+        *
+        * but we don't have the $object here.  For instance, if $object is
+        * a blessed array, what we have in `sv' is the array, and we can't
+        * call a method on those.
+        *
+        * Therefore, we need to create a temporary reference to the object and
+        * make the call on that reference.
+        */
+
+       TRACEME(("about to call STORABLE_freeze on class %s", class));
+
+       ref = newRV_noinc(sv);                          /* Temporary reference */
+       av = array_call(ref, hook, clone);      /* @a = $object->STORABLE_freeze($c) */
+       SvRV(ref) = 0;
+       SvREFCNT_dec(ref);                                      /* Reclaim temporary reference */
+
+       count = AvFILLp(av) + 1;
+       TRACEME(("store_hook, array holds %d items", count));
+
+       /*
+        * If they return an empty list, it means they wish to ignore the
+        * hook for this class (and not just this instance -- that's for them
+        * to handle if they so wish).
+        *
+        * Simply disable the cached entry for the hook (it won't be recomputed
+        * since it's present in the cache) and recurse to store_blessed().
+        */
+
+       if (!count) {
+               /*
+                * They must not change their mind in the middle of a serialization.
+                */
+
+               if (hv_fetch(cxt->hclass, class, len, FALSE))
+                       CROAK(("Too late to ignore hooks for %s class \"%s\"",
+                               (cxt->optype & ST_CLONE) ? "cloning" : "storing", class));
+       
+               pkg_hide(cxt->hook, pkg, "STORABLE_freeze");
+
+               ASSERT(!pkg_can(cxt->hook, pkg, "STORABLE_freeze"), ("hook invisible"));
+               TRACEME(("ignoring STORABLE_freeze in class \"%s\"", class));
+
+               return store_blessed(cxt, sv, type, pkg);
+       }
+
+       /*
+        * Get frozen string.
+        */
+
+       ary = AvARRAY(av);
+       pv = SvPV(ary[0], len2);
+
+       /*
+        * If they returned more than one item, we need to serialize some
+        * extra references if not already done.
+        *
+        * Loop over the array, starting at postion #1, and for each item,
+        * ensure it is a reference, serialize it if not already done, and
+        * replace the entry with the tag ID of the corresponding serialized
+        * object.
+        *
+        * We CHEAT by not calling av_fetch() and read directly within the
+        * array, for speed.
+        */
+
+       for (i = 1; i < count; i++) {
+               SV **svh;
+               SV *xsv = ary[i];
+
+               if (!SvROK(xsv))
+                       CROAK(("Item #%d from hook in %s is not a reference", i, class));
+               xsv = SvRV(xsv);                /* Follow ref to know what to look for */
+
+               /*
+                * Look in hseen and see if we have a tag already.
+                * Serialize entry if not done already, and get its tag.
+                */
+
+               if (svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE))
+                       goto sv_seen;           /* Avoid moving code too far to the right */
+
+               TRACEME(("listed object %d at 0x%"UVxf" is unknown", i-1, PTR2UV(xsv)));
+
+               /*
+                * We need to recurse to store that object and get it to be known
+                * so that we can resolve the list of object-IDs at retrieve time.
+                *
+                * The first time we do this, we need to emit the proper header
+                * indicating that we recursed, and what the type of object is (the
+                * object we're storing via a user-hook).  Indeed, during retrieval,
+                * we'll have to create the object before recursing to retrieve the
+                * others, in case those would point back at that object.
+                */
+
+               /* [SX_HOOK] <flags> <object>*/
+               if (!recursed++)
+                       PUTMARK(SX_HOOK);
+               PUTMARK(flags);
+
+               if (ret = store(cxt, xsv))              /* Given by hook for us to store */
+                       return ret;
+
+               svh = hv_fetch(cxt->hseen, (char *) &xsv, sizeof(xsv), FALSE);
+               if (!svh)
+                       CROAK(("Could not serialize item #%d from hook in %s", i, class));
+
+               /*
+                * Replace entry with its tag (not a real SV, so no refcnt increment)
+                */
+
+       sv_seen:
+               SvREFCNT_dec(xsv);
+               ary[i] = *svh;
+               TRACEME(("listed object %d at 0x%"UVxf" is tag #%"UVuf,
+                        i-1, PTR2UV(xsv), PTR2UV(*svh)));
+       }
+
+       /*
+        * Allocate a class ID if not already done.
+        *
+        * This needs to be done after the recursion above, since at retrieval
+        * time, we'll see the inner objects first.  Many thanks to
+        * Salvador Ortiz Garcia <sog@msg.com.mx> who spot that bug and
+        * proposed the right fix.  -- RAM, 15/09/2000
+        */
+
+       if (!known_class(cxt, class, len, &classnum)) {
+               TRACEME(("first time we see class %s, ID = %d", class, classnum));
+               classnum = -1;                          /* Mark: we must store classname */
+       } else {
+               TRACEME(("already seen class %s, ID = %d", class, classnum));
+       }
+
+       /*
+        * Compute leading flags.
+        */
+
+       flags = obj_type;
+       if (((classnum == -1) ? len : classnum) > LG_SCALAR)
+               flags |= SHF_LARGE_CLASSLEN;
+       if (classnum != -1)
+               flags |= SHF_IDX_CLASSNAME;
+       if (len2 > LG_SCALAR)
+               flags |= SHF_LARGE_STRLEN;
+       if (count > 1)
+               flags |= SHF_HAS_LIST;
+       if (count > (LG_SCALAR + 1))
+               flags |= SHF_LARGE_LISTLEN;
+
+       /* 
+        * We're ready to emit either serialized form:
+        *
+        *   SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
+        *   SX_HOOK <flags> <index>           <len2> <str> [<len3> <object-IDs>]
+        *
+        * If we recursed, the SX_HOOK has already been emitted.
+        */
+
+       TRACEME(("SX_HOOK (recursed=%d) flags=0x%x "
+                       "class=%"IVdf" len=%"IVdf" len2=%"IVdf" len3=%d",
+                recursed, flags, (IV)classnum, (IV)len, (IV)len2, count-1));
+
+       /* SX_HOOK <flags> */
+       if (!recursed)
+               PUTMARK(SX_HOOK);
+       PUTMARK(flags);
+
+       /* <len> <classname> or <index> */
+       if (flags & SHF_IDX_CLASSNAME) {
+               if (flags & SHF_LARGE_CLASSLEN)
+                       WLEN(classnum);
+               else {
+                       unsigned char cnum = (unsigned char) classnum;
+                       PUTMARK(cnum);
+               }
+       } else {
+               if (flags & SHF_LARGE_CLASSLEN)
+                       WLEN(len);
+               else {
+                       unsigned char clen = (unsigned char) len;
+                       PUTMARK(clen);
+               }
+               WRITE(class, len);              /* Final \0 is omitted */
+       }
+
+       /* <len2> <frozen-str> */
+       if (flags & SHF_LARGE_STRLEN) {
+               I32 wlen2 = len2;               /* STRLEN might be 8 bytes */
+               WLEN(wlen2);                    /* Must write an I32 for 64-bit machines */
+       } else {
+               unsigned char clen = (unsigned char) len2;
+               PUTMARK(clen);
+       }
+       if (len2)
+               WRITE(pv, len2);        /* Final \0 is omitted */
+
+       /* [<len3> <object-IDs>] */
+       if (flags & SHF_HAS_LIST) {
+               int len3 = count - 1;
+               if (flags & SHF_LARGE_LISTLEN)
+                       WLEN(len3);
+               else {
+                       unsigned char clen = (unsigned char) len3;
+                       PUTMARK(clen);
+               }
+
+               /*
+                * NOTA BENE, for 64-bit machines: the ary[i] below does not yield a
+                * real pointer, rather a tag number, well under the 32-bit limit.
+                */
+
+               for (i = 1; i < count; i++) {
+                       I32 tagval = htonl(LOW_32BITS(ary[i]));
+                       WRITE_I32(tagval);
+                       TRACEME(("object %d, tag #%d", i-1, ntohl(tagval)));
+               }
+       }
+
+       /*
+        * Free the array.  We need extra care for indices after 0, since they
+        * don't hold real SVs but integers cast.
+        */
+
+       if (count > 1)
+               AvFILLp(av) = 0;        /* Cheat, nothing after 0 interests us */
+       av_undef(av);
+       sv_free((SV *) av);
+
+       return 0;
+}
+
+/*
+ * store_blessed       -- dispatched manually, not via sv_store[]
+ *
+ * Check whether there is a STORABLE_xxx hook defined in the class or in one
+ * of its ancestors.  If there is, then redispatch to store_hook();
+ *
+ * Otherwise, the blessed SV is stored using the following layout:
+ *
+ *    SX_BLESS <flag> <len> <classname> <object>
+ *
+ * where <flag> indicates whether <len> is stored on 0 or 4 bytes, depending
+ * on the high-order bit in flag: if 1, then length follows on 4 bytes.
+ * Otherwise, the low order bits give the length, thereby giving a compact
+ * representation for class names less than 127 chars long.
+ *
+ * Each <classname> seen is remembered and indexed, so that the next time
+ * an object in the blessed in the same <classname> is stored, the following
+ * will be emitted:
+ *
+ *    SX_IX_BLESS <flag> <index> <object>
+ *
+ * where <index> is the classname index, stored on 0 or 4 bytes depending
+ * on the high-order bit in flag (same encoding as above for <len>).
+ */
+static int store_blessed(
+       stcxt_t *cxt,
+       SV *sv,
+       int type,
+       HV *pkg)
+{
+       SV *hook;
+       I32 len;
+       char *class;
+       I32 classnum;
+
+       TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME(pkg)));
+
+       /*
+        * Look for a hook for this blessed SV and redirect to store_hook()
+        * if needed.
+        */
+
+       hook = pkg_can(cxt->hook, pkg, "STORABLE_freeze");
+       if (hook)
+               return store_hook(cxt, sv, type, pkg, hook);
+
+       /*
+        * This is a blessed SV without any serialization hook.
+        */
+
+       class = HvNAME(pkg);
+       len = strlen(class);
+
+       TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
+                PTR2UV(sv), class, cxt->tagnum));
+
+       /*
+        * Determine whether it is the first time we see that class name (in which
+        * case it will be stored in the SX_BLESS form), or whether we already
+        * saw that class name before (in which case the SX_IX_BLESS form will be
+        * used).
+        */
+
+       if (known_class(cxt, class, len, &classnum)) {
+               TRACEME(("already seen class %s, ID = %d", class, classnum));
+               PUTMARK(SX_IX_BLESS);
+               if (classnum <= LG_BLESS) {
+                       unsigned char cnum = (unsigned char) classnum;
+                       PUTMARK(cnum);
+               } else {
+                       unsigned char flag = (unsigned char) 0x80;
+                       PUTMARK(flag);
+                       WLEN(classnum);
+               }
+       } else {
+               TRACEME(("first time we see class %s, ID = %d", class, classnum));
+               PUTMARK(SX_BLESS);
+               if (len <= LG_BLESS) {
+                       unsigned char clen = (unsigned char) len;
+                       PUTMARK(clen);
+               } else {
+                       unsigned char flag = (unsigned char) 0x80;
+                       PUTMARK(flag);
+                       WLEN(len);                                      /* Don't BER-encode, this should be rare */
+               }
+               WRITE(class, len);                              /* Final \0 is omitted */
+       }
+
+       /*
+        * Now emit the <object> part.
+        */
+
+       return SV_STORE(type)(cxt, sv);
+}
+
+/*
+ * store_other
+ *
+ * We don't know how to store the item we reached, so return an error condition.
+ * (it's probably a GLOB, some CODE reference, etc...)
+ *
+ * If they defined the `forgive_me' variable at the Perl level to some
+ * true value, then don't croak, just warn, and store a placeholder string
+ * instead.
+ */
+static int store_other(stcxt_t *cxt, SV *sv)
+{
+       I32 len;
+       static char buf[80];
+
+       TRACEME(("store_other"));
+
+       /*
+        * Fetch the value from perl only once per store() operation.
+        */
+
+       if (
+               cxt->forgive_me == 0 ||
+               (cxt->forgive_me < 0 && !(cxt->forgive_me =
+                       SvTRUE(perl_get_sv("Storable::forgive_me", TRUE)) ? 1 : 0))
+       )
+               CROAK(("Can't store %s items", sv_reftype(sv, FALSE)));
+
+       warn("Can't store item %s(0x%"UVxf")",
+               sv_reftype(sv, FALSE), PTR2UV(sv));
+
+       /*
+        * Store placeholder string as a scalar instead...
+        */
+
+       (void) sprintf(buf, "You lost %s(0x%"UVxf")\0", sv_reftype(sv, FALSE),
+                      PTR2UV(sv));
+
+       len = strlen(buf);
+       STORE_SCALAR(buf, len);
+       TRACEME(("ok (dummy \"%s\", length = %"IVdf")", buf, len));
+
+       return 0;
+}
+
+/***
+ *** Store driving routines
+ ***/
+
+/*
+ * sv_type
+ *
+ * WARNING: partially duplicates Perl's sv_reftype for speed.
+ *
+ * Returns the type of the SV, identified by an integer. That integer
+ * may then be used to index the dynamic routine dispatch table.
+ */
+static int sv_type(SV *sv)
+{
+       switch (SvTYPE(sv)) {
+       case SVt_NULL:
+       case SVt_IV:
+       case SVt_NV:
+               /*
+                * No need to check for ROK, that can't be set here since there
+                * is no field capable of hodling the xrv_rv reference.
+                */
+               return svis_SCALAR;
+       case SVt_PV:
+       case SVt_RV:
+       case SVt_PVIV:
+       case SVt_PVNV:
+               /*
+                * Starting from SVt_PV, it is possible to have the ROK flag
+                * set, the pointer to the other SV being either stored in
+                * the xrv_rv (in the case of a pure SVt_RV), or as the
+                * xpv_pv field of an SVt_PV and its heirs.
+                *
+                * However, those SV cannot be magical or they would be an
+                * SVt_PVMG at least.
+                */
+               return SvROK(sv) ? svis_REF : svis_SCALAR;
+       case SVt_PVMG:
+       case SVt_PVLV:          /* Workaround for perl5.004_04 "LVALUE" bug */
+               if (SvRMAGICAL(sv) && (mg_find(sv, 'p')))
+                       return svis_TIED_ITEM;
+               /* FALL THROUGH */
+       case SVt_PVBM:
+               if (SvRMAGICAL(sv) && (mg_find(sv, 'q')))
+                       return svis_TIED;
+               return SvROK(sv) ? svis_REF : svis_SCALAR;
+       case SVt_PVAV:
+               if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
+                       return svis_TIED;
+               return svis_ARRAY;
+       case SVt_PVHV:
+               if (SvRMAGICAL(sv) && (mg_find(sv, 'P')))
+                       return svis_TIED;
+               return svis_HASH;
+       default:
+               break;
+       }
+
+       return svis_OTHER;
+}
+
+/*
+ * store
+ *
+ * Recursively store objects pointed to by the sv to the specified file.
+ *
+ * Layout is <content> or SX_OBJECT <tagnum> if we reach an already stored
+ * object (one for which storage has started -- it may not be over if we have
+ * a self-referenced structure). This data set forms a stored <object>.
+ */
+static int store(stcxt_t *cxt, SV *sv)
+{
+       SV **svh;
+       int ret;
+       SV *tag;
+       int type;
+       HV *hseen = cxt->hseen;
+
+       TRACEME(("store (0x%"UVxf")", PTR2UV(sv)));
+
+       /*
+        * If object has already been stored, do not duplicate data.
+        * Simply emit the SX_OBJECT marker followed by its tag data.
+        * The tag is always written in network order.
+        *
+        * NOTA BENE, for 64-bit machines: the "*svh" below does not yield a
+        * real pointer, rather a tag number (watch the insertion code below).
+        * That means it pobably safe to assume it is well under the 32-bit limit,
+        * and makes the truncation safe.
+        *              -- RAM, 14/09/1999
+        */
+
+       svh = hv_fetch(hseen, (char *) &sv, sizeof(sv), FALSE);
+       if (svh) {
+               I32 tagval = htonl(LOW_32BITS(*svh));
+
+               TRACEME(("object 0x%"UVxf" seen as #%d", PTR2UV(sv), ntohl(tagval)));
+
+               PUTMARK(SX_OBJECT);
+               WRITE_I32(tagval);
+               return 0;
+       }
+
+       /*
+        * Allocate a new tag and associate it with the address of the sv being
+        * stored, before recursing...
+        *
+        * In order to avoid creating new SvIVs to hold the tagnum we just
+        * cast the tagnum to a SV pointer and store that in the hash.  This
+        * means that we must clean up the hash manually afterwards, but gives
+        * us a 15% throughput increase.
+        *
+        */
+
+       cxt->tagnum++;
+       if (!hv_store(hseen,
+                       (char *) &sv, sizeof(sv), INT2PTR(SV*, cxt->tagnum), 0))
+               return -1;
+
+       /*
+        * Store `sv' and everything beneath it, using appropriate routine.
+        * Abort immediately if we get a non-zero status back.
+        */
+
+       type = sv_type(sv);
+
+       TRACEME(("storing 0x%"UVxf" tag #%d, type %d...",
+                PTR2UV(sv), cxt->tagnum, type));
+
+       if (SvOBJECT(sv)) {
+               HV *pkg = SvSTASH(sv);
+               ret = store_blessed(cxt, sv, type, pkg);
+       } else
+               ret = SV_STORE(type)(cxt, sv);
+
+       TRACEME(("%s (stored 0x%"UVxf", refcnt=%d, %s)",
+               ret ? "FAILED" : "ok", PTR2UV(sv),
+               SvREFCNT(sv), sv_reftype(sv, FALSE)));
+
+       return ret;
+}
+
+/*
+ * magic_write
+ *
+ * Write magic number and system information into the file.
+ * Layout is <magic> <network> [<len> <byteorder> <sizeof int> <sizeof long>
+ * <sizeof ptr>] where <len> is the length of the byteorder hexa string.
+ * All size and lenghts are written as single characters here.
+ *
+ * Note that no byte ordering info is emitted when <network> is true, since
+ * integers will be emitted in network order in that case.
+ */
+static int magic_write(stcxt_t *cxt)
+{
+       char buf[256];  /* Enough room for 256 hexa digits */
+       unsigned char c;
+       int use_network_order = cxt->netorder;
+
+       TRACEME(("magic_write on fd=%d", cxt->fio ? fileno(cxt->fio) : -1));
+
+       if (cxt->fio)
+               WRITE(magicstr, strlen(magicstr));      /* Don't write final \0 */
+
+       /*
+        * Starting with 0.6, the "use_network_order" byte flag is also used to
+        * indicate the version number of the binary image, encoded in the upper
+        * bits. The bit 0 is always used to indicate network order.
+        */
+
+       c = (unsigned char)
+               ((use_network_order ? 0x1 : 0x0) | (STORABLE_BIN_MAJOR << 1));
+       PUTMARK(c);
+
+       /*
+        * Starting with 0.7, a full byte is dedicated to the minor version of
+        * the binary format, which is incremented only when new markers are
+        * introduced, for instance, but when backward compatibility is preserved.
+        */
+
+       PUTMARK((unsigned char) STORABLE_BIN_MINOR);
+
+       if (use_network_order)
+               return 0;                                               /* Don't bother with byte ordering */
+
+       sprintf(buf, "%lx", (unsigned long) BYTEORDER);
+       c = (unsigned char) strlen(buf);
+       PUTMARK(c);
+       WRITE(buf, (unsigned int) c);           /* Don't write final \0 */
+       PUTMARK((unsigned char) sizeof(int));
+       PUTMARK((unsigned char) sizeof(long));
+       PUTMARK((unsigned char) sizeof(char *));
+       PUTMARK((unsigned char) sizeof(NV));
+
+       TRACEME(("ok (magic_write byteorder = 0x%lx [%d], I%d L%d P%d D%d)",
+                (unsigned long) BYTEORDER, (int) c,
+                (int) sizeof(int), (int) sizeof(long),
+                (int) sizeof(char *), (int) sizeof(NV)));
+
+       return 0;
+}
+
+/*
+ * do_store
+ *
+ * Common code for store operations.
+ *
+ * When memory store is requested (f = NULL) and a non null SV* is given in
+ * `res', it is filled with a new SV created out of the memory buffer.
+ *
+ * It is required to provide a non-null `res' when the operation type is not
+ * dclone() and store() is performed to memory.
+ */
+static int do_store(
+       PerlIO *f,
+       SV *sv,
+       int optype,
+       int network_order,
+       SV **res)
+{
+       dSTCXT;
+       int status;
+
+       ASSERT(!(f == 0 && !(optype & ST_CLONE)) || res,
+               ("must supply result SV pointer for real recursion to memory"));
+
+       TRACEME(("do_store (optype=%d, netorder=%d)",
+               optype, network_order));
+
+       optype |= ST_STORE;
+
+       /*
+        * Workaround for CROAK leak: if they enter with a "dirty" context,
+        * free up memory for them now.
+        */
+
+       if (cxt->s_dirty)
+               clean_context(cxt);
+
+       /*
+        * Now that STORABLE_xxx hooks exist, it is possible that they try to
+        * re-enter store() via the hooks.  We need to stack contexts.
+        */
+
+       if (cxt->entry)
+               cxt = allocate_context(cxt);
+
+       cxt->entry++;
+
+       ASSERT(cxt->entry == 1, ("starting new recursion"));
+       ASSERT(!cxt->s_dirty, ("clean context"));
+
+       /*
+        * Ensure sv is actually a reference. From perl, we called something
+        * like:
+        *       pstore(FILE, \@array);
+        * so we must get the scalar value behing that reference.
+        */
+
+       if (!SvROK(sv))
+               CROAK(("Not a reference"));
+       sv = SvRV(sv);                  /* So follow it to know what to store */
+
+       /* 
+        * If we're going to store to memory, reset the buffer.
+        */
+
+       if (!f)
+               MBUF_INIT(0);
+
+       /*
+        * Prepare context and emit headers.
+        */
+
+       init_store_context(cxt, f, optype, network_order);
+
+       if (-1 == magic_write(cxt))             /* Emit magic and ILP info */
+               return 0;                                       /* Error */
+
+       /*
+        * Recursively store object...
+        */
+
+       ASSERT(is_storing(), ("within store operation"));
+
+       status = store(cxt, sv);                /* Just do it! */
+
+       /*
+        * If they asked for a memory store and they provided an SV pointer,
+        * make an SV string out of the buffer and fill their pointer.
+        *
+        * When asking for ST_REAL, it's MANDATORY for the caller to provide
+        * an SV, since context cleanup might free the buffer if we did recurse.
+        * (unless caller is dclone(), which is aware of that).
+        */
+
+       if (!cxt->fio && res)
+               *res = mbuf2sv();
+
+       /*
+        * Final cleanup.
+        *
+        * The "root" context is never freed, since it is meant to be always
+        * handy for the common case where no recursion occurs at all (i.e.
+        * we enter store() outside of any Storable code and leave it, period).
+        * We know it's the "root" context because there's nothing stacked
+        * underneath it.
+        *
+        * OPTIMIZATION:
+        *
+        * When deep cloning, we don't free the context: doing so would force
+        * us to copy the data in the memory buffer.  Sicne we know we're
+        * about to enter do_retrieve...
+        */
+
+       clean_store_context(cxt);
+       if (cxt->prev && !(cxt->optype & ST_CLONE))
+               free_context(cxt);
+
+       TRACEME(("do_store returns %d", status));
+
+       return status == 0;
+}
+
+/*
+ * pstore
+ *
+ * Store the transitive data closure of given object to disk.
+ * Returns 0 on error, a true value otherwise.
+ */
+int pstore(PerlIO *f, SV *sv)
+{
+       TRACEME(("pstore"));
+       return do_store(f, sv, 0, FALSE, (SV**) 0);
+
+}
+
+/*
+ * net_pstore
+ *
+ * Same as pstore(), but network order is used for integers and doubles are
+ * emitted as strings.
+ */
+int net_pstore(PerlIO *f, SV *sv)
+{
+       TRACEME(("net_pstore"));
+       return do_store(f, sv, 0, TRUE, (SV**) 0);
+}
+
+/***
+ *** Memory stores.
+ ***/
+
+/*
+ * mbuf2sv
+ *
+ * Build a new SV out of the content of the internal memory buffer.
+ */
+static SV *mbuf2sv(void)
+{
+       dSTCXT;
+
+       return newSVpv(mbase, MBUF_SIZE());
+}
+
+/*
+ * mstore
+ *
+ * Store the transitive data closure of given object to memory.
+ * Returns undef on error, a scalar value containing the data otherwise.
+ */
+SV *mstore(SV *sv)
+{
+       dSTCXT;
+       SV *out;
+
+       TRACEME(("mstore"));
+
+       if (!do_store((PerlIO*) 0, sv, 0, FALSE, &out))
+               return &PL_sv_undef;
+
+       return out;
+}
+
+/*
+ * net_mstore
+ *
+ * Same as mstore(), but network order is used for integers and doubles are
+ * emitted as strings.
+ */
+SV *net_mstore(SV *sv)
+{
+       dSTCXT;
+       SV *out;
+
+       TRACEME(("net_mstore"));
+
+       if (!do_store((PerlIO*) 0, sv, 0, TRUE, &out))
+               return &PL_sv_undef;
+
+       return out;
+}
+
+/***
+ *** Specific retrieve callbacks.
+ ***/
+
+/*
+ * retrieve_other
+ *
+ * Return an error via croak, since it is not possible that we get here
+ * under normal conditions, when facing a file produced via pstore().
+ */
+static SV *retrieve_other(stcxt_t *cxt)
+{
+       if (
+               cxt->ver_major != STORABLE_BIN_MAJOR &&
+               cxt->ver_minor != STORABLE_BIN_MINOR
+       ) {
+               CROAK(("Corrupted storable %s (binary v%d.%d), current is v%d.%d",
+                       cxt->fio ? "file" : "string",
+                       cxt->ver_major, cxt->ver_minor,
+                       STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
+       } else {
+               CROAK(("Corrupted storable %s (binary v%d.%d)",
+                       cxt->fio ? "file" : "string",
+                       cxt->ver_major, cxt->ver_minor));
+       }
+
+       return (SV *) 0;                /* Just in case */
+}
+
+/*
+ * retrieve_idx_blessed
+ *
+ * Layout is SX_IX_BLESS <index> <object> with SX_IX_BLESS already read.
+ * <index> can be coded on either 1 or 5 bytes.
+ */
+static SV *retrieve_idx_blessed(stcxt_t *cxt)
+{
+       I32 idx;
+       char *class;
+       SV **sva;
+       SV *sv;
+
+       TRACEME(("retrieve_idx_blessed (#%d)", cxt->tagnum));
+
+       GETMARK(idx);                   /* Index coded on a single char? */
+       if (idx & 0x80)
+               RLEN(idx);
+
+       /*
+        * Fetch classname in `aclass'
+        */
+
+       sva = av_fetch(cxt->aclass, idx, FALSE);
+       if (!sva)
+               CROAK(("Class name #%d should have been seen already", (int)idx));
+
+       class = SvPVX(*sva);    /* We know it's a PV, by construction */
+
+       TRACEME(("class ID %d => %s", idx, class));
+
+       /*
+        * Retrieve object and bless it.
+        */
+
+       sv = retrieve(cxt);
+       if (sv)
+               BLESS(sv, class);
+
+       return sv;
+}
+
+/*
+ * retrieve_blessed
+ *
+ * Layout is SX_BLESS <len> <classname> <object> with SX_BLESS already read.
+ * <len> can be coded on either 1 or 5 bytes.
+ */
+static SV *retrieve_blessed(stcxt_t *cxt)
+{
+       I32 len;
+       SV *sv;
+       char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
+       char *class = buf;
+
+       TRACEME(("retrieve_blessed (#%d)", cxt->tagnum));
+
+       /*
+        * Decode class name length and read that name.
+        *
+        * Short classnames have two advantages: their length is stored on one
+        * single byte, and the string can be read on the stack.
+        */
+
+       GETMARK(len);                   /* Length coded on a single char? */
+       if (len & 0x80) {
+               RLEN(len);
+               TRACEME(("** allocating %d bytes for class name", len+1));
+               New(10003, class, len+1, char);
+       }
+       READ(class, len);
+       class[len] = '\0';              /* Mark string end */
+
+       /*
+        * It's a new classname, otherwise it would have been an SX_IX_BLESS.
+        */
+
+       if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
+               return (SV *) 0;
+
+       /*
+        * Retrieve object and bless it.
+        */
+
+       sv = retrieve(cxt);
+       if (sv) {
+               BLESS(sv, class);
+               if (class != buf)
+                       Safefree(class);
+       }
+
+       return sv;
+}
+
+/*
+ * retrieve_hook
+ *
+ * Layout: SX_HOOK <flags> <len> <classname> <len2> <str> [<len3> <object-IDs>]
+ * with leading mark already read, as usual.
+ *
+ * When recursion was involved during serialization of the object, there
+ * is an unknown amount of serialized objects after the SX_HOOK mark.  Until
+ * we reach a <flags> marker with the recursion bit cleared.
+ */
+static SV *retrieve_hook(stcxt_t *cxt)
+{
+       I32 len;
+       char buf[LG_BLESS + 1];         /* Avoid malloc() if possible */
+       char *class = buf;
+       unsigned int flags;
+       I32 len2;
+       SV *frozen;
+       I32 len3 = 0;
+       AV *av = 0;
+       SV *hook;
+       SV *sv;
+       SV *rv;
+       int obj_type;
+       I32 classname;
+       int clone = cxt->optype & ST_CLONE;
+
+       TRACEME(("retrieve_hook (#%d)", cxt->tagnum));
+
+       /*
+        * Read flags, which tell us about the type, and whether we need to recurse.
+        */
+
+       GETMARK(flags);
+
+       /*
+        * Create the (empty) object, and mark it as seen.
+        *
+        * This must be done now, because tags are incremented, and during
+        * serialization, the object tag was affected before recursion could
+        * take place.
+        */
+
+       obj_type = flags & SHF_TYPE_MASK;
+       switch (obj_type) {
+       case SHT_SCALAR:
+               sv = newSV(0);
+               break;
+       case SHT_ARRAY:
+               sv = (SV *) newAV();
+               break;
+       case SHT_HASH:
+               sv = (SV *) newHV();
+               break;
+       default:
+               return retrieve_other(cxt);             /* Let it croak */
+       }
+       SEEN(sv);
+
+       /*
+        * Whilst flags tell us to recurse, do so.
+        *
+        * We don't need to remember the addresses returned by retrieval, because
+        * all the references will be obtained through indirection via the object
+        * tags in the object-ID list.
+        */
+
+       while (flags & SHF_NEED_RECURSE) {
+               TRACEME(("retrieve_hook recursing..."));
+               rv = retrieve(cxt);
+               if (!rv)
+                       return (SV *) 0;
+               TRACEME(("retrieve_hook back with rv=0x%"UVxf,
+                        PTR2UV(rv)));
+               GETMARK(flags);
+       }
+
+       if (flags & SHF_IDX_CLASSNAME) {
+               SV **sva;
+               I32 idx;
+
+               /*
+                * Fetch index from `aclass'
+                */
+
+               if (flags & SHF_LARGE_CLASSLEN)
+                       RLEN(idx);
+               else
+                       GETMARK(idx);
+
+               sva = av_fetch(cxt->aclass, idx, FALSE);
+               if (!sva)
+                       CROAK(("Class name #%d should have been seen already", (int)idx));
+
+               class = SvPVX(*sva);    /* We know it's a PV, by construction */
+               TRACEME(("class ID %d => %s", idx, class));
+
+       } else {
+               /*
+                * Decode class name length and read that name.
+                *
+                * NOTA BENE: even if the length is stored on one byte, we don't read
+                * on the stack.  Just like retrieve_blessed(), we limit the name to
+                * LG_BLESS bytes.  This is an arbitrary decision.
+                */
+
+               if (flags & SHF_LARGE_CLASSLEN)
+                       RLEN(len);
+               else
+                       GETMARK(len);
+
+               if (len > LG_BLESS) {
+                       TRACEME(("** allocating %d bytes for class name", len+1));
+                       New(10003, class, len+1, char);
+               }
+
+               READ(class, len);
+               class[len] = '\0';              /* Mark string end */
+
+               /*
+                * Record new classname.
+                */
+
+               if (!av_store(cxt->aclass, cxt->classnum++, newSVpvn(class, len)))
+                       return (SV *) 0;
+       }
+
+       TRACEME(("class name: %s", class));
+
+       /*
+        * Decode user-frozen string length and read it in a SV.
+        *
+        * For efficiency reasons, we read data directly into the SV buffer.
+        * To understand that code, read retrieve_scalar()
+        */
+
+       if (flags & SHF_LARGE_STRLEN)
+               RLEN(len2);
+       else
+               GETMARK(len2);
+
+       frozen = NEWSV(10002, len2);
+       if (len2) {
+               SAFEREAD(SvPVX(frozen), len2, frozen);
+               SvCUR_set(frozen, len2);
+               *SvEND(frozen) = '\0';
+       }
+       (void) SvPOK_only(frozen);              /* Validates string pointer */
+       if (cxt->s_tainted)                             /* Is input source tainted? */
+               SvTAINT(frozen);
+
+       TRACEME(("frozen string: %d bytes", len2));
+
+       /*
+        * Decode object-ID list length, if present.
+        */
+
+       if (flags & SHF_HAS_LIST) {
+               if (flags & SHF_LARGE_LISTLEN)
+                       RLEN(len3);
+               else
+                       GETMARK(len3);
+               if (len3) {
+                       av = newAV();
+                       av_extend(av, len3 + 1);        /* Leave room for [0] */
+                       AvFILLp(av) = len3;                     /* About to be filled anyway */
+               }
+       }
+
+       TRACEME(("has %d object IDs to link", len3));
+
+       /*
+        * Read object-ID list into array.
+        * Because we pre-extended it, we can cheat and fill it manually.
+        *
+        * We read object tags and we can convert them into SV* on the fly
+        * because we know all the references listed in there (as tags)
+        * have been already serialized, hence we have a valid correspondance
+        * between each of those tags and the recreated SV.
+        */
+
+       if (av) {
+               SV **ary = AvARRAY(av);
+               int i;
+               for (i = 1; i <= len3; i++) {   /* We leave [0] alone */
+                       I32 tag;
+                       SV **svh;
+                       SV *xsv;
+
+                       READ_I32(tag);
+                       tag = ntohl(tag);
+                       svh = av_fetch(cxt->aseen, tag, FALSE);
+                       if (!svh)
+                               CROAK(("Object #%d should have been retrieved already", (int)tag));
+                       xsv = *svh;
+                       ary[i] = SvREFCNT_inc(xsv);
+               }
+       }
+
+       /*
+        * Bless the object and look up the STORABLE_thaw hook.
+        */
+
+       BLESS(sv, class);
+       hook = pkg_can(cxt->hook, SvSTASH(sv), "STORABLE_thaw");
+       if (!hook)
+               CROAK(("No STORABLE_thaw defined for objects of class %s", class));
+
+       /*
+        * If we don't have an `av' yet, prepare one.
+        * Then insert the frozen string as item [0].
+        */
+
+       if (!av) {
+               av = newAV();
+               av_extend(av, 1);
+               AvFILLp(av) = 0;
+       }
+       AvARRAY(av)[0] = SvREFCNT_inc(frozen);
+
+       /*
+        * Call the hook as:
+        *
+        *   $object->STORABLE_thaw($cloning, $frozen, @refs);
+        * 
+        * where $object is our blessed (empty) object, $cloning is a boolean
+        * telling whether we're running a deep clone, $frozen is the frozen
+        * string the user gave us in his serializing hook, and @refs, which may
+        * be empty, is the list of extra references he returned along for us
+        * to serialize.
+        *
+        * In effect, the hook is an alternate creation routine for the class,
+        * the object itself being already created by the runtime.
+        */
+
+       TRACEME(("calling STORABLE_thaw on %s at 0x%"UVxf" (%"IVdf" args)",
+                class, PTR2UV(sv), AvFILLp(av) + 1));
+
+       rv = newRV(sv);
+       (void) scalar_call(rv, hook, clone, av, G_SCALAR|G_DISCARD);
+       SvREFCNT_dec(rv);
+
+       /*
+        * Final cleanup.
+        */
+
+       SvREFCNT_dec(frozen);
+       av_undef(av);
+       sv_free((SV *) av);
+       if (!(flags & SHF_IDX_CLASSNAME) && class != buf)
+               Safefree(class);
+
+       return sv;
+}
+
+/*
+ * retrieve_ref
+ *
+ * Retrieve reference to some other scalar.
+ * Layout is SX_REF <object>, with SX_REF already read.
+ */
+static SV *retrieve_ref(stcxt_t *cxt)
+{
+       SV *rv;
+       SV *sv;
+
+       TRACEME(("retrieve_ref (#%d)", cxt->tagnum));
+
+       /*
+        * We need to create the SV that holds the reference to the yet-to-retrieve
+        * object now, so that we may record the address in the seen table.
+        * Otherwise, if the object to retrieve references us, we won't be able
+        * to resolve the SX_OBJECT we'll see at that point! Hence we cannot
+        * do the retrieve first and use rv = newRV(sv) since it will be too late
+        * for SEEN() recording.
+        */
+
+       rv = NEWSV(10002, 0);
+       SEEN(rv);                               /* Will return if rv is null */
+       sv = retrieve(cxt);             /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;        /* Failed */
+
+       /*
+        * WARNING: breaks RV encapsulation.
+        *
+        * Now for the tricky part. We have to upgrade our existing SV, so that
+        * it is now an RV on sv... Again, we cheat by duplicating the code
+        * held in newSVrv(), since we already got our SV from retrieve().
+        *
+        * We don't say:
+        *
+        *              SvRV(rv) = SvREFCNT_inc(sv);
+        *
+        * here because the reference count we got from retrieve() above is
+        * already correct: if the object was retrieved from the file, then
+        * its reference count is one. Otherwise, if it was retrieved via
+        * an SX_OBJECT indication, a ref count increment was done.
+        */
+
+       sv_upgrade(rv, SVt_RV);
+       SvRV(rv) = sv;                          /* $rv = \$sv */
+       SvROK_on(rv);
+
+       TRACEME(("ok (retrieve_ref at 0x%"UVxf")", PTR2UV(rv)));
+
+       return rv;
+}
+
+/*
+ * retrieve_overloaded
+ *
+ * Retrieve reference to some other scalar with overloading.
+ * Layout is SX_OVERLOAD <object>, with SX_OVERLOAD already read.
+ */
+static SV *retrieve_overloaded(stcxt_t *cxt)
+{
+       SV *rv;
+       SV *sv;
+       HV *stash;
+
+       TRACEME(("retrieve_overloaded (#%d)", cxt->tagnum));
+
+       /*
+        * Same code as retrieve_ref(), duplicated to avoid extra call.
+        */
+
+       rv = NEWSV(10002, 0);
+       SEEN(rv);                               /* Will return if rv is null */
+       sv = retrieve(cxt);             /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;        /* Failed */
+
+       /*
+        * WARNING: breaks RV encapsulation.
+        */
+
+       sv_upgrade(rv, SVt_RV);
+       SvRV(rv) = sv;                          /* $rv = \$sv */
+       SvROK_on(rv);
+
+       /*
+        * Restore overloading magic.
+        */
+
+       stash = (HV *) SvSTASH (sv);
+       if (!stash || !Gv_AMG(stash))
+               CROAK(("Cannot restore overloading on %s(0x%"UVxf")",
+                      sv_reftype(sv, FALSE),
+                      PTR2UV(sv)));
+
+       SvAMAGIC_on(rv);
+
+       TRACEME(("ok (retrieve_overloaded at 0x%"UVxf")", PTR2UV(rv)));
+
+       return rv;
+}
+
+/*
+ * retrieve_tied_array
+ *
+ * Retrieve tied array
+ * Layout is SX_TIED_ARRAY <object>, with SX_TIED_ARRAY already read.
+ */
+static SV *retrieve_tied_array(stcxt_t *cxt)
+{
+       SV *tv;
+       SV *sv;
+
+       TRACEME(("retrieve_tied_array (#%d)", cxt->tagnum));
+
+       tv = NEWSV(10002, 0);
+       SEEN(tv);                                       /* Will return if tv is null */
+       sv = retrieve(cxt);                     /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;                /* Failed */
+
+       sv_upgrade(tv, SVt_PVAV);
+       AvREAL_off((AV *)tv);
+       sv_magic(tv, sv, 'P', Nullch, 0);
+       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+
+       TRACEME(("ok (retrieve_tied_array at 0x%"UVxf")", PTR2UV(tv)));
+
+       return tv;
+}
+
+/*
+ * retrieve_tied_hash
+ *
+ * Retrieve tied hash
+ * Layout is SX_TIED_HASH <object>, with SX_TIED_HASH already read.
+ */
+static SV *retrieve_tied_hash(stcxt_t *cxt)
+{
+       SV *tv;
+       SV *sv;
+
+       TRACEME(("retrieve_tied_hash (#%d)", cxt->tagnum));
+
+       tv = NEWSV(10002, 0);
+       SEEN(tv);                                       /* Will return if tv is null */
+       sv = retrieve(cxt);                     /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;                /* Failed */
+
+       sv_upgrade(tv, SVt_PVHV);
+       sv_magic(tv, sv, 'P', Nullch, 0);
+       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+
+       TRACEME(("ok (retrieve_tied_hash at 0x%"UVxf")", PTR2UV(tv)));
+
+       return tv;
+}
+
+/*
+ * retrieve_tied_scalar
+ *
+ * Retrieve tied scalar
+ * Layout is SX_TIED_SCALAR <object>, with SX_TIED_SCALAR already read.
+ */
+static SV *retrieve_tied_scalar(cxt)
+stcxt_t *cxt;
+{
+       SV *tv;
+       SV *sv;
+
+       TRACEME(("retrieve_tied_scalar (#%d)", cxt->tagnum));
+
+       tv = NEWSV(10002, 0);
+       SEEN(tv);                                       /* Will return if rv is null */
+       sv = retrieve(cxt);                     /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;                /* Failed */
+
+       sv_upgrade(tv, SVt_PVMG);
+       sv_magic(tv, sv, 'q', Nullch, 0);
+       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+
+       TRACEME(("ok (retrieve_tied_scalar at 0x%"UVxf")", PTR2UV(tv)));
+
+       return tv;
+}
+
+/*
+ * retrieve_tied_key
+ *
+ * Retrieve reference to value in a tied hash.
+ * Layout is SX_TIED_KEY <object> <key>, with SX_TIED_KEY already read.
+ */
+static SV *retrieve_tied_key(stcxt_t *cxt)
+{
+       SV *tv;
+       SV *sv;
+       SV *key;
+
+       TRACEME(("retrieve_tied_key (#%d)", cxt->tagnum));
+
+       tv = NEWSV(10002, 0);
+       SEEN(tv);                                       /* Will return if tv is null */
+       sv = retrieve(cxt);                     /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;                /* Failed */
+
+       key = retrieve(cxt);            /* Retrieve <key> */
+       if (!key)
+               return (SV *) 0;                /* Failed */
+
+       sv_upgrade(tv, SVt_PVMG);
+       sv_magic(tv, sv, 'p', (char *)key, HEf_SVKEY);
+       SvREFCNT_dec(key);                      /* Undo refcnt inc from sv_magic() */
+       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+
+       return tv;
+}
+
+/*
+ * retrieve_tied_idx
+ *
+ * Retrieve reference to value in a tied array.
+ * Layout is SX_TIED_IDX <object> <idx>, with SX_TIED_IDX already read.
+ */
+static SV *retrieve_tied_idx(stcxt_t *cxt)
+{
+       SV *tv;
+       SV *sv;
+       I32 idx;
+
+       TRACEME(("retrieve_tied_idx (#%d)", cxt->tagnum));
+
+       tv = NEWSV(10002, 0);
+       SEEN(tv);                                       /* Will return if tv is null */
+       sv = retrieve(cxt);                     /* Retrieve <object> */
+       if (!sv)
+               return (SV *) 0;                /* Failed */
+
+       RLEN(idx);                                      /* Retrieve <idx> */
+
+       sv_upgrade(tv, SVt_PVMG);
+       sv_magic(tv, sv, 'p', Nullch, idx);
+       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+
+       return tv;
+}
+
+
+/*
+ * retrieve_lscalar
+ *
+ * Retrieve defined long (string) scalar.
+ *
+ * Layout is SX_LSCALAR <length> <data>, with SX_LSCALAR already read.
+ * The scalar is "long" in that <length> is larger than LG_SCALAR so it
+ * was not stored on a single byte.
+ */
+static SV *retrieve_lscalar(stcxt_t *cxt)
+{
+       I32 len;
+       SV *sv;
+
+       RLEN(len);
+       TRACEME(("retrieve_lscalar (#%d), len = %"IVdf, cxt->tagnum, len));
+
+       /*
+        * Allocate an empty scalar of the suitable length.
+        */
+
+       sv = NEWSV(10002, len);
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       /*
+        * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
+        *
+        * Now, for efficiency reasons, read data directly inside the SV buffer,
+        * and perform the SV final settings directly by duplicating the final
+        * work done by sv_setpv. Since we're going to allocate lots of scalars
+        * this way, it's worth the hassle and risk.
+        */
+
+       SAFEREAD(SvPVX(sv), len, sv);
+       SvCUR_set(sv, len);                             /* Record C string length */
+       *SvEND(sv) = '\0';                              /* Ensure it's null terminated anyway */
+       (void) SvPOK_only(sv);                  /* Validate string pointer */
+       if (cxt->s_tainted)                             /* Is input source tainted? */
+               SvTAINT(sv);                            /* External data cannot be trusted */
+
+       TRACEME(("large scalar len %"IVdf" '%s'", len, SvPVX(sv)));
+       TRACEME(("ok (retrieve_lscalar at 0x%"UVxf")", PTR2UV(sv)));
+
+       return sv;
+}
+
+/*
+ * retrieve_scalar
+ *
+ * Retrieve defined short (string) scalar.
+ *
+ * Layout is SX_SCALAR <length> <data>, with SX_SCALAR already read.
+ * The scalar is "short" so <length> is single byte. If it is 0, there
+ * is no <data> section.
+ */
+static SV *retrieve_scalar(stcxt_t *cxt)
+{
+       int len;
+       SV *sv;
+
+       GETMARK(len);
+       TRACEME(("retrieve_scalar (#%d), len = %d", cxt->tagnum, len));
+
+       /*
+        * Allocate an empty scalar of the suitable length.
+        */
+
+       sv = NEWSV(10002, len);
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       /*
+        * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation.
+        */
+
+       if (len == 0) {
+               /*
+                * newSV did not upgrade to SVt_PV so the scalar is undefined.
+                * To make it defined with an empty length, upgrade it now...
+                */
+               sv_upgrade(sv, SVt_PV);
+               SvGROW(sv, 1);
+               *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
+               TRACEME(("ok (retrieve_scalar empty at 0x%"UVxf")", PTR2UV(sv)));
+       } else {
+               /*
+                * Now, for efficiency reasons, read data directly inside the SV buffer,
+                * and perform the SV final settings directly by duplicating the final
+                * work done by sv_setpv. Since we're going to allocate lots of scalars
+                * this way, it's worth the hassle and risk.
+                */
+               SAFEREAD(SvPVX(sv), len, sv);
+               SvCUR_set(sv, len);                     /* Record C string length */
+               *SvEND(sv) = '\0';                      /* Ensure it's null terminated anyway */
+               TRACEME(("small scalar len %d '%s'", len, SvPVX(sv)));
+       }
+
+       (void) SvPOK_only(sv);                  /* Validate string pointer */
+       if (cxt->s_tainted)                             /* Is input source tainted? */
+               SvTAINT(sv);                            /* External data cannot be trusted */
+
+       TRACEME(("ok (retrieve_scalar at 0x%"UVxf")", PTR2UV(sv)));
+       return sv;
+}
+
+/*
+ * retrieve_utf8str
+ *
+ * Like retrieve_scalar(), but tag result as utf8.
+ * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
+ */
+static SV *retrieve_utf8str(stcxt_t *cxt)
+{
+       SV *sv;
+
+       TRACEME(("retrieve_utf8str"));
+
+       sv = retrieve_scalar(cxt);
+       if (sv)
+               SvUTF8_on(sv);
+
+       return sv;
+}
+
+/*
+ * retrieve_lutf8str
+ *
+ * Like retrieve_lscalar(), but tag result as utf8.
+ * If we're retrieving UTF8 data in a non-UTF8 perl, croaks.
+ */
+static SV *retrieve_lutf8str(stcxt_t *cxt)
+{
+       SV *sv;
+
+       TRACEME(("retrieve_lutf8str"));
+
+       sv = retrieve_lscalar(cxt);
+       if (sv)
+               SvUTF8_on(sv);
+
+       return sv;
+}
+
+/*
+ * retrieve_integer
+ *
+ * Retrieve defined integer.
+ * Layout is SX_INTEGER <data>, whith SX_INTEGER already read.
+ */
+static SV *retrieve_integer(stcxt_t *cxt)
+{
+       SV *sv;
+       IV iv;
+
+       TRACEME(("retrieve_integer (#%d)", cxt->tagnum));
+
+       READ(&iv, sizeof(iv));
+       sv = newSViv(iv);
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       TRACEME(("integer %"IVdf, iv));
+       TRACEME(("ok (retrieve_integer at 0x%"UVxf")", PTR2UV(sv)));
+
+       return sv;
+}
+
+/*
+ * retrieve_netint
+ *
+ * Retrieve defined integer in network order.
+ * Layout is SX_NETINT <data>, whith SX_NETINT already read.
+ */
+static SV *retrieve_netint(stcxt_t *cxt)
+{
+       SV *sv;
+       I32 iv;
+
+       TRACEME(("retrieve_netint (#%d)", cxt->tagnum));
+
+       READ_I32(iv);
+#ifdef HAS_NTOHL
+       sv = newSViv((int) ntohl(iv));
+       TRACEME(("network integer %d", (int) ntohl(iv)));
+#else
+       sv = newSViv(iv);
+       TRACEME(("network integer (as-is) %d", iv));
+#endif
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       TRACEME(("ok (retrieve_netint at 0x%"UVxf")", PTR2UV(sv)));
+
+       return sv;
+}
+
+/*
+ * retrieve_double
+ *
+ * Retrieve defined double.
+ * Layout is SX_DOUBLE <data>, whith SX_DOUBLE already read.
+ */
+static SV *retrieve_double(stcxt_t *cxt)
+{
+       SV *sv;
+       NV nv;
+
+       TRACEME(("retrieve_double (#%d)", cxt->tagnum));
+
+       READ(&nv, sizeof(nv));
+       sv = newSVnv(nv);
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       TRACEME(("double %"NVff, nv));
+       TRACEME(("ok (retrieve_double at 0x%"UVxf")", PTR2UV(sv)));
+
+       return sv;
+}
+
+/*
+ * retrieve_byte
+ *
+ * Retrieve defined byte (small integer within the [-128, +127] range).
+ * Layout is SX_BYTE <data>, whith SX_BYTE already read.
+ */
+static SV *retrieve_byte(stcxt_t *cxt)
+{
+       SV *sv;
+       int siv;
+
+       TRACEME(("retrieve_byte (#%d)", cxt->tagnum));
+
+       GETMARK(siv);
+       TRACEME(("small integer read as %d", (unsigned char) siv));
+       sv = newSViv((unsigned char) siv - 128);
+       SEEN(sv);                       /* Associate this new scalar with tag "tagnum" */
+
+       TRACEME(("byte %d", (unsigned char) siv - 128));
+       TRACEME(("ok (retrieve_byte at 0x%"UVxf")", PTR2UV(sv)));
+
+       return sv;
+}
+
+/*
+ * retrieve_undef
+ *
+ * Return the undefined value.
+ */
+static SV *retrieve_undef(stcxt_t *cxt)
+{
+       SV* sv;
+
+       TRACEME(("retrieve_undef"));
+
+       sv = newSV(0);
+       SEEN(sv);
+
+       return sv;
+}
+
+/*
+ * retrieve_sv_undef
+ *
+ * Return the immortal undefined value.
+ */
+static SV *retrieve_sv_undef(stcxt_t *cxt)
+{
+       SV *sv = &PL_sv_undef;
+
+       TRACEME(("retrieve_sv_undef"));
+
+       SEEN(sv);
+       return sv;
+}
+
+/*
+ * retrieve_sv_yes
+ *
+ * Return the immortal yes value.
+ */
+static SV *retrieve_sv_yes(stcxt_t *cxt)
+{
+       SV *sv = &PL_sv_yes;
+
+       TRACEME(("retrieve_sv_yes"));
+
+       SEEN(sv);
+       return sv;
+}
+
+/*
+ * retrieve_sv_no
+ *
+ * Return the immortal no value.
+ */
+static SV *retrieve_sv_no(stcxt_t *cxt)
+{
+       SV *sv = &PL_sv_no;
+
+       TRACEME(("retrieve_sv_no"));
+
+       SEEN(sv);
+       return sv;
+}
+
+/*
+ * retrieve_array
+ *
+ * Retrieve a whole array.
+ * Layout is SX_ARRAY <size> followed by each item, in increading index order.
+ * Each item is stored as <object>.
+ *
+ * When we come here, SX_ARRAY has been read already.
+ */
+static SV *retrieve_array(stcxt_t *cxt)
+{
+       I32 len;
+       I32 i;
+       AV *av;
+       SV *sv;
+
+       TRACEME(("retrieve_array (#%d)", cxt->tagnum));
+
+       /*
+        * Read length, and allocate array, then pre-extend it.
+        */
+
+       RLEN(len);
+       TRACEME(("size = %d", len));
+       av = newAV();
+       SEEN(av);                                       /* Will return if array not allocated nicely */
+       if (len)
+               av_extend(av, len);
+       else
+               return (SV *) av;               /* No data follow if array is empty */
+
+       /*
+        * Now get each item in turn...
+        */
+
+       for (i = 0; i < len; i++) {
+               TRACEME(("(#%d) item", i));
+               sv = retrieve(cxt);                             /* Retrieve item */
+               if (!sv)
+                       return (SV *) 0;
+               if (av_store(av, i, sv) == 0)
+                       return (SV *) 0;
+       }
+
+       TRACEME(("ok (retrieve_array at 0x%"UVxf")", PTR2UV(av)));
+
+       return (SV *) av;
+}
+
+/*
+ * retrieve_hash
+ *
+ * Retrieve a whole hash table.
+ * Layout is SX_HASH <size> followed by each key/value pair, in random order.
+ * Keys are stored as <length> <data>, the <data> section being omitted
+ * if length is 0.
+ * Values are stored as <object>.
+ *
+ * When we come here, SX_HASH has been read already.
+ */
+static SV *retrieve_hash(stcxt_t *cxt)
+{
+       I32 len;
+       I32 size;
+       I32 i;
+       HV *hv;
+       SV *sv;
+       static SV *sv_h_undef = (SV *) 0;               /* hv_store() bug */
+
+       TRACEME(("retrieve_hash (#%d)", cxt->tagnum));
+
+       /*
+        * Read length, allocate table.
+        */
+
+       RLEN(len);
+       TRACEME(("size = %d", len));
+       hv = newHV();
+       SEEN(hv);                       /* Will return if table not allocated properly */
+       if (len == 0)
+               return (SV *) hv;       /* No data follow if table empty */
+
+       /*
+        * Now get each key/value pair in turn...
+        */
+
+       for (i = 0; i < len; i++) {
+               /*
+                * Get value first.
+                */
+
+               TRACEME(("(#%d) value", i));
+               sv = retrieve(cxt);
+               if (!sv)
+                       return (SV *) 0;
+
+               /*
+                * Get key.
+                * Since we're reading into kbuf, we must ensure we're not
+                * recursing between the read and the hv_store() where it's used.
+                * Hence the key comes after the value.
+                */
+
+               RLEN(size);                                             /* Get key size */
+               KBUFCHK(size);                                  /* Grow hash key read pool if needed */
+               if (size)
+                       READ(kbuf, size);
+               kbuf[size] = '\0';                              /* Mark string end, just in case */
+               TRACEME(("(#%d) key '%s'", i, kbuf));
+
+               /*
+                * Enter key/value pair into hash table.
+                */
+
+               if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
+                       return (SV *) 0;
+       }
+
+       TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
+
+       return (SV *) hv;
+}
+
+/*
+ * old_retrieve_array
+ *
+ * Retrieve a whole array in pre-0.6 binary format.
+ *
+ * Layout is SX_ARRAY <size> followed by each item, in increading index order.
+ * Each item is stored as SX_ITEM <object> or SX_IT_UNDEF for "holes".
+ *
+ * When we come here, SX_ARRAY has been read already.
+ */
+static SV *old_retrieve_array(stcxt_t *cxt)
+{
+       I32 len;
+       I32 i;
+       AV *av;
+       SV *sv;
+       int c;
+
+       TRACEME(("old_retrieve_array (#%d)", cxt->tagnum));
+
+       /*
+        * Read length, and allocate array, then pre-extend it.
+        */
+
+       RLEN(len);
+       TRACEME(("size = %d", len));
+       av = newAV();
+       SEEN(av);                                       /* Will return if array not allocated nicely */
+       if (len)
+               av_extend(av, len);
+       else
+               return (SV *) av;               /* No data follow if array is empty */
+
+       /*
+        * Now get each item in turn...
+        */
+
+       for (i = 0; i < len; i++) {
+               GETMARK(c);
+               if (c == SX_IT_UNDEF) {
+                       TRACEME(("(#%d) undef item", i));
+                       continue;                       /* av_extend() already filled us with undef */
+               }
+               if (c != SX_ITEM)
+                       (void) retrieve_other((stcxt_t *) 0);   /* Will croak out */
+               TRACEME(("(#%d) item", i));
+               sv = retrieve(cxt);                                                     /* Retrieve item */
+               if (!sv)
+                       return (SV *) 0;
+               if (av_store(av, i, sv) == 0)
+                       return (SV *) 0;
+       }
+
+       TRACEME(("ok (old_retrieve_array at 0x%"UVxf")", PTR2UV(av)));
+
+       return (SV *) av;
+}
+
+/*
+ * old_retrieve_hash
+ *
+ * Retrieve a whole hash table in pre-0.6 binary format.
+ *
+ * Layout is SX_HASH <size> followed by each key/value pair, in random order.
+ * Keys are stored as SX_KEY <length> <data>, the <data> section being omitted
+ * if length is 0.
+ * Values are stored as SX_VALUE <object> or SX_VL_UNDEF for "holes".
+ *
+ * When we come here, SX_HASH has been read already.
+ */
+static SV *old_retrieve_hash(stcxt_t *cxt)
+{
+       I32 len;
+       I32 size;
+       I32 i;
+       HV *hv;
+       SV *sv;
+       int c;
+       static SV *sv_h_undef = (SV *) 0;               /* hv_store() bug */
+
+       TRACEME(("old_retrieve_hash (#%d)", cxt->tagnum));
+
+       /*
+        * Read length, allocate table.
+        */
+
+       RLEN(len);
+       TRACEME(("size = %d", len));
+       hv = newHV();
+       SEEN(hv);                               /* Will return if table not allocated properly */
+       if (len == 0)
+               return (SV *) hv;       /* No data follow if table empty */
+
+       /*
+        * Now get each key/value pair in turn...
+        */
+
+       for (i = 0; i < len; i++) {
+               /*
+                * Get value first.
+                */
+
+               GETMARK(c);
+               if (c == SX_VL_UNDEF) {
+                       TRACEME(("(#%d) undef value", i));
+                       /*
+                        * Due to a bug in hv_store(), it's not possible to pass
+                        * &PL_sv_undef to hv_store() as a value, otherwise the
+                        * associated key will not be creatable any more. -- RAM, 14/01/97
+                        */
+                       if (!sv_h_undef)
+                               sv_h_undef = newSVsv(&PL_sv_undef);
+                       sv = SvREFCNT_inc(sv_h_undef);
+               } else if (c == SX_VALUE) {
+                       TRACEME(("(#%d) value", i));
+                       sv = retrieve(cxt);
+                       if (!sv)
+                               return (SV *) 0;
+               } else
+                       (void) retrieve_other((stcxt_t *) 0);   /* Will croak out */
+
+               /*
+                * Get key.
+                * Since we're reading into kbuf, we must ensure we're not
+                * recursing between the read and the hv_store() where it's used.
+                * Hence the key comes after the value.
+                */
+
+               GETMARK(c);
+               if (c != SX_KEY)
+                       (void) retrieve_other((stcxt_t *) 0);   /* Will croak out */
+               RLEN(size);                                             /* Get key size */
+               KBUFCHK(size);                                  /* Grow hash key read pool if needed */
+               if (size)
+                       READ(kbuf, size);
+               kbuf[size] = '\0';                              /* Mark string end, just in case */
+               TRACEME(("(#%d) key '%s'", i, kbuf));
+
+               /*
+                * Enter key/value pair into hash table.
+                */
+
+               if (hv_store(hv, kbuf, (U32) size, sv, 0) == 0)
+                       return (SV *) 0;
+       }
+
+       TRACEME(("ok (retrieve_hash at 0x%"UVxf")", PTR2UV(hv)));
+
+       return (SV *) hv;
+}
+
+/***
+ *** Retrieval engine.
+ ***/
+
+/*
+ * magic_check
+ *
+ * Make sure the stored data we're trying to retrieve has been produced
+ * on an ILP compatible system with the same byteorder. It croaks out in
+ * case an error is detected. [ILP = integer-long-pointer sizes]
+ * Returns null if error is detected, &PL_sv_undef otherwise.
+ *
+ * Note that there's no byte ordering info emitted when network order was
+ * used at store time.
+ */
+static SV *magic_check(stcxt_t *cxt)
+{
+       char buf[256];
+       char byteorder[256];
+       int c;
+       int use_network_order;
+       int version_major;
+       int version_minor = 0;
+
+       TRACEME(("magic_check"));
+
+       /*
+        * The "magic number" is only for files, not when freezing in memory.
+        */
+
+       if (cxt->fio) {
+               STRLEN len = sizeof(magicstr) - 1;
+               STRLEN old_len;
+
+               READ(buf, len);                                 /* Not null-terminated */
+               buf[len] = '\0';                                /* Is now */
+
+               if (0 == strcmp(buf, magicstr))
+                       goto magic_ok;
+
+               /*
+                * Try to read more bytes to check for the old magic number, which
+                * was longer.
+                */
+
+               old_len = sizeof(old_magicstr) - 1;
+               READ(&buf[len], old_len - len);
+               buf[old_len] = '\0';                    /* Is now null-terminated */
+
+               if (strcmp(buf, old_magicstr))
+                       CROAK(("File is not a perl storable"));
+       }
+
+magic_ok:
+       /*
+        * Starting with 0.6, the "use_network_order" byte flag is also used to
+        * indicate the version number of the binary, and therefore governs the
+        * setting of sv_retrieve_vtbl. See magic_write().
+        */
+
+       GETMARK(use_network_order);
+       version_major = use_network_order >> 1;
+       cxt->retrieve_vtbl = version_major ? sv_retrieve : sv_old_retrieve;
+
+       TRACEME(("magic_check: netorder = 0x%x", use_network_order));
+
+
+       /*
+        * Starting with 0.7 (binary major 2), a full byte is dedicated to the
+        * minor version of the protocol.  See magic_write().
+        */
+
+       if (version_major > 1)
+               GETMARK(version_minor);
+
+       cxt->ver_major = version_major;
+       cxt->ver_minor = version_minor;
+
+       TRACEME(("binary image version is %d.%d", version_major, version_minor));
+
+       /*
+        * Inter-operability sanity check: we can't retrieve something stored
+        * using a format more recent than ours, because we have no way to
+        * know what has changed, and letting retrieval go would mean a probable
+        * failure reporting a "corrupted" storable file.
+        */
+
+       if (
+               version_major > STORABLE_BIN_MAJOR ||
+                       (version_major == STORABLE_BIN_MAJOR &&
+                       version_minor > STORABLE_BIN_MINOR)
+       )
+               CROAK(("Storable binary image v%d.%d more recent than I am (v%d.%d)",
+                       version_major, version_minor,
+                       STORABLE_BIN_MAJOR, STORABLE_BIN_MINOR));
+
+       /*
+        * If they stored using network order, there's no byte ordering
+        * information to check.
+        */
+
+       if (cxt->netorder = (use_network_order & 0x1))
+               return &PL_sv_undef;                    /* No byte ordering info */
+
+       sprintf(byteorder, "%lx", (unsigned long) BYTEORDER);
+       GETMARK(c);
+       READ(buf, c);                                           /* Not null-terminated */
+       buf[c] = '\0';                                          /* Is now */
+
+       if (strcmp(buf, byteorder))
+               CROAK(("Byte order is not compatible"));
+       
+       GETMARK(c);             /* sizeof(int) */
+       if ((int) c != sizeof(int))
+               CROAK(("Integer size is not compatible"));
+
+       GETMARK(c);             /* sizeof(long) */
+       if ((int) c != sizeof(long))
+               CROAK(("Long integer size is not compatible"));
+
+       GETMARK(c);             /* sizeof(char *) */
+       if ((int) c != sizeof(char *))
+               CROAK(("Pointer integer size is not compatible"));
+
+       if (version_major >= 2 && version_minor >= 2) {
+               GETMARK(c);             /* sizeof(NV) */
+               if ((int) c != sizeof(NV))
+                       CROAK(("Double size is not compatible"));
+       }
+
+       return &PL_sv_undef;    /* OK */
+}
+
+/*
+ * retrieve
+ *
+ * Recursively retrieve objects from the specified file and return their
+ * root SV (which may be an AV or an HV for what we care).
+ * Returns null if there is a problem.
+ */
+static SV *retrieve(stcxt_t *cxt)
+{
+       int type;
+       SV **svh;
+       SV *sv;
+
+       TRACEME(("retrieve"));
+
+       /*
+        * Grab address tag which identifies the object if we are retrieving
+        * an older format. Since the new binary format counts objects and no
+        * longer explicitely tags them, we must keep track of the correspondance
+        * ourselves.
+        *
+        * The following section will disappear one day when the old format is
+        * no longer supported, hence the final "goto" in the "if" block.
+        */
+
+       if (cxt->hseen) {                                               /* Retrieving old binary */
+               stag_t tag;
+               if (cxt->netorder) {
+                       I32 nettag;
+                       READ(&nettag, sizeof(I32));             /* Ordered sequence of I32 */
+                       tag = (stag_t) nettag;
+               } else
+                       READ(&tag, sizeof(stag_t));             /* Original address of the SV */
+
+               GETMARK(type);
+               if (type == SX_OBJECT) {
+                       I32 tagn;
+                       svh = hv_fetch(cxt->hseen, (char *) &tag, sizeof(tag), FALSE);
+                       if (!svh)
+                               CROAK(("Old tag 0x%x should have been mapped already", (unsigned)tag));
+                       tagn = SvIV(*svh);      /* Mapped tag number computed earlier below */
+
+                       /*
+                        * The following code is common with the SX_OBJECT case below.
+                        */
+
+                       svh = av_fetch(cxt->aseen, tagn, FALSE);
+                       if (!svh)
+                               CROAK(("Object #%d should have been retrieved already", (int)tagn));
+                       sv = *svh;
+                       TRACEME(("has retrieved #%d at 0x%"UVxf, tagn, PTR2UV(sv)));
+                       SvREFCNT_inc(sv);       /* One more reference to this same sv */
+                       return sv;                      /* The SV pointer where object was retrieved */
+               }
+
+               /*
+                * Map new object, but don't increase tagnum. This will be done
+                * by each of the retrieve_* functions when they call SEEN().
+                *
+                * The mapping associates the "tag" initially present with a unique
+                * tag number. See test for SX_OBJECT above to see how this is perused.
+                */
+
+               if (!hv_store(cxt->hseen, (char *) &tag, sizeof(tag),
+                               newSViv(cxt->tagnum), 0))
+                       return (SV *) 0;
+
+               goto first_time;
+       }
+
+       /*
+        * Regular post-0.6 binary format.
+        */
+
+again:
+       GETMARK(type);
+
+       TRACEME(("retrieve type = %d", type));
+
+       /*
+        * Are we dealing with an object we should have already retrieved?
+        */
+
+       if (type == SX_OBJECT) {
+               I32 tag;
+               READ_I32(tag);
+               tag = ntohl(tag);
+               svh = av_fetch(cxt->aseen, tag, FALSE);
+               if (!svh)
+                       CROAK(("Object #%d should have been retrieved already", (int)tag));
+               sv = *svh;
+               TRACEME(("had retrieved #%d at 0x%"UVxf, tag, PTR2UV(sv)));
+               SvREFCNT_inc(sv);       /* One more reference to this same sv */
+               return sv;                      /* The SV pointer where object was retrieved */
+       }
+
+first_time:            /* Will disappear when support for old format is dropped */
+
+       /*
+        * Okay, first time through for this one.
+        */
+
+       sv = RETRIEVE(cxt, type)(cxt);
+       if (!sv)
+               return (SV *) 0;                        /* Failed */
+
+       /*
+        * Old binary formats (pre-0.7).
+        *
+        * Final notifications, ended by SX_STORED may now follow.
+        * Currently, the only pertinent notification to apply on the
+        * freshly retrieved object is either:
+        *    SX_CLASS <char-len> <classname> for short classnames.
+        *    SX_LG_CLASS <int-len> <classname> for larger one (rare!).
+        * Class name is then read into the key buffer pool used by
+        * hash table key retrieval.
+        */
+
+       if (cxt->ver_major < 2) {
+               while ((type = GETCHAR()) != SX_STORED) {
+                       I32 len;
+                       switch (type) {
+                       case SX_CLASS:
+                               GETMARK(len);                   /* Length coded on a single char */
+                               break;
+                       case SX_LG_CLASS:                       /* Length coded on a regular integer */
+                               RLEN(len);
+                               break;
+                       case EOF:
+                       default:
+                               return (SV *) 0;                /* Failed */
+                       }
+                       KBUFCHK(len);                           /* Grow buffer as necessary */
+                       if (len)
+                               READ(kbuf, len);
+                       kbuf[len] = '\0';                       /* Mark string end */
+                       BLESS(sv, kbuf);
+               }
+       }
+
+       TRACEME(("ok (retrieved 0x%"UVxf", refcnt=%d, %s)", PTR2UV(sv),
+               SvREFCNT(sv) - 1, sv_reftype(sv, FALSE)));
+
+       return sv;      /* Ok */
+}
+
+/*
+ * do_retrieve
+ *
+ * Retrieve data held in file and return the root object.
+ * Common routine for pretrieve and mretrieve.
+ */
+static SV *do_retrieve(
+       PerlIO *f,
+       SV *in,
+       int optype)
+{
+       dSTCXT;
+       SV *sv;
+       int is_tainted;                         /* Is input source tainted? */
+       struct extendable msave;        /* Where potentially valid mbuf is saved */
+
+       TRACEME(("do_retrieve (optype = 0x%x)", optype));
+
+       optype |= ST_RETRIEVE;
+
+       /*
+        * Sanity assertions for retrieve dispatch tables.
+        */
+
+       ASSERT(sizeof(sv_old_retrieve) == sizeof(sv_retrieve),
+               ("old and new retrieve dispatch table have same size"));
+       ASSERT(sv_old_retrieve[SX_ERROR] == retrieve_other,
+               ("SX_ERROR entry correctly initialized in old dispatch table"));
+       ASSERT(sv_retrieve[SX_ERROR] == retrieve_other,
+               ("SX_ERROR entry correctly initialized in new dispatch table"));
+
+       /*
+        * Workaround for CROAK leak: if they enter with a "dirty" context,
+        * free up memory for them now.
+        */
+
+       if (cxt->s_dirty)
+               clean_context(cxt);
+
+       /*
+        * Now that STORABLE_xxx hooks exist, it is possible that they try to
+        * re-enter retrieve() via the hooks.
+        */
+
+       if (cxt->entry)
+               cxt = allocate_context(cxt);
+
+       cxt->entry++;
+
+       ASSERT(cxt->entry == 1, ("starting new recursion"));
+       ASSERT(!cxt->s_dirty, ("clean context"));
+
+       /*
+        * Prepare context.
+        *
+        * Data is loaded into the memory buffer when f is NULL, unless `in' is
+        * also NULL, in which case we're expecting the data to already lie
+        * in the buffer (dclone case).
+        */
+
+       KBUFINIT();                                     /* Allocate hash key reading pool once */
+
+       if (!f && in) {
+               StructCopy(&cxt->membuf, &msave, struct extendable);
+               MBUF_LOAD(in);
+       }
+
+
+       /*
+        * Magic number verifications.
+        *
+        * This needs to be done before calling init_retrieve_context()
+        * since the format indication in the file are necessary to conduct
+        * some of the initializations.
+        */
+
+       cxt->fio = f;                           /* Where I/O are performed */
+
+       if (!magic_check(cxt))
+               CROAK(("Magic number checking on storable %s failed",
+                       cxt->fio ? "file" : "string"));
+
+       TRACEME(("data stored in %s format",
+               cxt->netorder ? "net order" : "native"));
+
+       /*
+        * Check whether input source is tainted, so that we don't wrongly
+        * taint perfectly good values...
+        *
+        * We assume file input is always tainted.  If both `f' and `in' are
+        * NULL, then we come from dclone, and tainted is already filled in
+        * the context.  That's a kludge, but the whole dclone() thing is
+        * already quite a kludge anyway! -- RAM, 15/09/2000.
+        */
+
+       is_tainted = f ? 1 : (in ? SvTAINTED(in) : cxt->s_tainted);
+       TRACEME(("input source is %s", is_tainted ? "tainted" : "trusted"));
+       init_retrieve_context(cxt, optype, is_tainted);
+
+       ASSERT(is_retrieving(), ("within retrieve operation"));
+
+       sv = retrieve(cxt);             /* Recursively retrieve object, get root SV */
+
+       /*
+        * Final cleanup.
+        */
+
+       if (!f && in)
+               StructCopy(&msave, &cxt->membuf, struct extendable);
+
+       /*
+        * The "root" context is never freed.
+        */
+
+       clean_retrieve_context(cxt);
+       if (cxt->prev)                          /* This context was stacked */
+               free_context(cxt);              /* It was not the "root" context */
+
+       /*
+        * Prepare returned value.
+        */
+
+       if (!sv) {
+               TRACEME(("retrieve ERROR"));
+               return &PL_sv_undef;            /* Something went wrong, return undef */
+       }
+
+       TRACEME(("retrieve got %s(0x%"UVxf")",
+               sv_reftype(sv, FALSE), PTR2UV(sv)));
+
+       /*
+        * Backward compatibility with Storable-0.5@9 (which we know we
+        * are retrieving if hseen is non-null): don't create an extra RV
+        * for objects since we special-cased it at store time.
+        *
+        * Build a reference to the SV returned by pretrieve even if it is
+        * already one and not a scalar, for consistency reasons.
+        *
+        * NB: although context might have been cleaned, the value of `cxt->hseen'
+        * remains intact, and can be used as a flag.
+        */
+
+       if (cxt->hseen) {                       /* Was not handling overloading by then */
+               SV *rv;
+               if (sv_type(sv) == svis_REF && (rv = SvRV(sv)) && SvOBJECT(rv))
+                       return sv;
+       }
+
+       /*
+        * If reference is overloaded, restore behaviour.
+        *
+        * NB: minor glitch here: normally, overloaded refs are stored specially
+        * so that we can croak when behaviour cannot be re-installed, and also
+        * avoid testing for overloading magic at each reference retrieval.
+        *
+        * Unfortunately, the root reference is implicitely stored, so we must
+        * check for possible overloading now.  Furthermore, if we don't restore
+        * overloading, we cannot croak as if the original ref was, because we
+        * have no way to determine whether it was an overloaded ref or not in
+        * the first place.
+        *
+        * It's a pity that overloading magic is attached to the rv, and not to
+        * the underlying sv as blessing is.
+        */
+
+       if (SvOBJECT(sv)) {
+               HV *stash = (HV *) SvSTASH (sv);
+               SV *rv = newRV_noinc(sv);
+               if (stash && Gv_AMG(stash)) {
+                       SvAMAGIC_on(rv);
+                       TRACEME(("restored overloading on root reference"));
+               }
+               return rv;
+       }
+
+       return newRV_noinc(sv);
+}
+
+/*
+ * pretrieve
+ *
+ * Retrieve data held in file and return the root object, undef on error.
+ */
+SV *pretrieve(PerlIO *f)
+{
+       TRACEME(("pretrieve"));
+       return do_retrieve(f, Nullsv, 0);
+}
+
+/*
+ * mretrieve
+ *
+ * Retrieve data held in scalar and return the root object, undef on error.
+ */
+SV *mretrieve(SV *sv)
+{
+       TRACEME(("mretrieve"));
+       return do_retrieve((PerlIO*) 0, sv, 0);
+}
+
+/***
+ *** Deep cloning
+ ***/
+
+/*
+ * dclone
+ *
+ * Deep clone: returns a fresh copy of the original referenced SV tree.
+ *
+ * This is achieved by storing the object in memory and restoring from
+ * there. Not that efficient, but it should be faster than doing it from
+ * pure perl anyway.
+ */
+SV *dclone(SV *sv)
+{
+       dSTCXT;
+       int size;
+       stcxt_t *real_context;
+       SV *out;
+
+       TRACEME(("dclone"));
+
+       /*
+        * Workaround for CROAK leak: if they enter with a "dirty" context,
+        * free up memory for them now.
+        */
+
+       if (cxt->s_dirty)
+               clean_context(cxt);
+
+       /*
+        * do_store() optimizes for dclone by not freeing its context, should
+        * we need to allocate one because we're deep cloning from a hook.
+        */
+
+       if (!do_store((PerlIO*) 0, sv, ST_CLONE, FALSE, (SV**) 0))
+               return &PL_sv_undef;                            /* Error during store */
+
+       /*
+        * Because of the above optimization, we have to refresh the context,
+        * since a new one could have been allocated and stacked by do_store().
+        */
+
+       { dSTCXT; real_context = cxt; }         /* Sub-block needed for macro */
+       cxt = real_context;                                     /* And we need this temporary... */
+
+       /*
+        * Now, `cxt' may refer to a new context.
+        */
+
+       ASSERT(!cxt->s_dirty, ("clean context"));
+       ASSERT(!cxt->entry, ("entry will not cause new context allocation"));
+
+       size = MBUF_SIZE();
+       TRACEME(("dclone stored %d bytes", size));
+       MBUF_INIT(size);
+
+       /*
+        * Since we're passing do_retrieve() both a NULL file and sv, we need
+        * to pre-compute the taintedness of the input by setting cxt->tainted
+        * to whatever state our own input string was.  -- RAM, 15/09/2000
+        *
+        * do_retrieve() will free non-root context.
+        */
+
+       cxt->s_tainted = SvTAINTED(sv);
+       out = do_retrieve((PerlIO*) 0, Nullsv, ST_CLONE);
+
+       TRACEME(("dclone returns 0x%"UVxf, PTR2UV(out)));
+
+       return out;
+}
+
+/***
+ *** Glue with perl.
+ ***/
+
+/*
+ * The Perl IO GV object distinguishes between input and output for sockets
+ * but not for plain files. To allow Storable to transparently work on
+ * plain files and sockets transparently, we have to ask xsubpp to fetch the
+ * right object for us. Hence the OutputStream and InputStream declarations.
+ *
+ * Before perl 5.004_05, those entries in the standard typemap are not
+ * defined in perl include files, so we do that here.
+ */
+
+#ifndef OutputStream
+#define OutputStream   PerlIO *
+#define InputStream            PerlIO *
+#endif /* !OutputStream */
+
+MODULE = Storable      PACKAGE = Storable
+
+PROTOTYPES: ENABLE
+
+BOOT:
+    init_perinterp();
+
+int
+pstore(f,obj)
+OutputStream   f
+SV *   obj
+
+int
+net_pstore(f,obj)
+OutputStream   f
+SV *   obj
+
+SV *
+mstore(obj)
+SV *   obj
+
+SV *
+net_mstore(obj)
+SV *   obj
+
+SV *
+pretrieve(f)
+InputStream    f
+
+SV *
+mretrieve(sv)
+SV *   sv
+
+SV *
+dclone(sv)
+SV *   sv
+
+int
+last_op_in_netorder()
+
+int
+is_storing()
+
+int
+is_retrieving()
+
index 4b5e6db..17e5aef 100644 (file)
@@ -21,7 +21,7 @@ static int sig_pipe[2];
 #endif
 
 static void
-remove_thread(pTHX_ struct perl_thread *t)
+remove_thread(pTHX_ Thread t)
 {
 #ifdef USE_THREADS
     DEBUG_S(WITH_THR(PerlIO_printf(Perl_debug_log,
index bd0f1f7..bc31b2c 100644 (file)
@@ -1,4 +1,6 @@
 use ExtUtils::MakeMaker;
+use File::Spec;
+
 WriteMakefile(
     NAME               => 're',
     VERSION_FROM       => 're.pm',
@@ -9,33 +11,28 @@ WriteMakefile(
     clean              => { FILES => '*$(OBJ_EXT) *.c ../../lib/re.pm' },
 );
 
-sub MY::postamble {
-  if ($^O eq 'VMS') {
-    return <<'VMS_EOF';
-re_comp.c : [--]regcomp.c
-       - $(RM_F) $(MMS$TARGET_NAME)
-       $(CP) [--]regcomp.c $(MMS$TARGET_NAME)
+package MY;
 
-re_comp$(OBJ_EXT) : re_comp.c
+sub upupfile {
+    File::Spec->catfile(File::Spec->updir, File::Spec->updir, $_[0]);
+}
 
-re_exec.c : [--]regexec.c
-       - $(RM_F) $(MMS$TARGET_NAME)
-       $(CP) [--]regexec.c $(MMS$TARGET_NAME)
+sub postamble {
+    my $regcomp_c = upupfile('regcomp.c');
+    my $regexec_c = upupfile('regexec.c');
 
-re_exec$(OBJ_EXT) : re_exec.c
+    <<EOF;
+re_comp.c : $regcomp_c
+       - \$(RM_F) re_comp.c
+       \$(CP) $regcomp_c re_comp.c
 
+re_comp\$(OBJ_EXT) : re_comp.c
 
-VMS_EOF
-  } else {
-    return <<'EOF';
-re_comp.c: ../../regcomp.c
-       -$(RM_F) $@
-       $(CP) ../../regcomp.c $@
+re_exec.c : $regexec_c
+       - \$(RM_F) re_exec.c
+       \$(CP) $regexec_c re_exec.c
 
-re_exec.c: ../../regexec.c
-       -$(RM_F) $@
-       $(CP) ../../regexec.c $@
+re_exec\$(OBJ_EXT) : re_exec.c
 
 EOF
-  }
 }
index 89c8824..0dea03e 100644 (file)
@@ -114,6 +114,7 @@ Perl_gv_autoload4
 Perl_gv_check
 Perl_gv_efullname
 Perl_gv_efullname3
+Perl_gv_efullname4
 Perl_gv_fetchfile
 Perl_gv_fetchmeth
 Perl_gv_fetchmethod
@@ -121,6 +122,7 @@ Perl_gv_fetchmethod_autoload
 Perl_gv_fetchpv
 Perl_gv_fullname
 Perl_gv_fullname3
+Perl_gv_fullname4
 Perl_gv_init
 Perl_gv_stashpv
 Perl_gv_stashpvn
@@ -277,6 +279,7 @@ Perl_newSVuv
 Perl_newSVnv
 Perl_newSVpv
 Perl_newSVpvn
+Perl_newSVpvn_share
 Perl_newSVpvf
 Perl_vnewSVpvf
 Perl_newSVrv
@@ -463,6 +466,7 @@ Perl_utf8_hop
 Perl_utf8_to_bytes
 Perl_bytes_to_utf8
 Perl_utf8_to_uv
+Perl_utf8_to_uv_chk
 Perl_uv_to_utf8
 Perl_warn
 Perl_vwarn
diff --git a/gv.c b/gv.c
index 836fdb2..768824d 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -75,7 +75,7 @@ Perl_gv_fetchfile(pTHX_ const char *name)
        gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
        sv_setpv(GvSV(gv), name);
        if (PERLDB_LINE)
-           hv_magic(GvHVn(gv_AVadd(gv)), gv, 'L');
+           hv_magic(GvHVn(gv_AVadd(gv)), Nullgv, 'L');
     }
     if (tmpbuf != smallbuf)
        Safefree(tmpbuf);
@@ -159,18 +159,18 @@ S_gv_init_sv(pTHX_ GV *gv, I32 sv_type)
 
 Returns the glob with the given C<name> and a defined subroutine or
 C<NULL>.  The glob lives in the given C<stash>, or in the stashes
-accessible via @ISA and @UNIVERSAL. 
+accessible via @ISA and @UNIVERSAL.
 
 The argument C<level> should be either 0 or -1.  If C<level==0>, as a
 side-effect creates a glob with the given C<name> in the given C<stash>
 which in the case of success contains an alias for the subroutine, and sets
-up caching info for this glob.  Similarly for all the searched stashes. 
+up caching info for this glob.  Similarly for all the searched stashes.
 
 This function grants C<"SUPER"> token as a postfix of the stash name. The
 GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
 visible to Perl code.  So when calling C<call_sv>, you should not use
 the GV directly; instead, you should use the method's CV, which can be
-obtained from the GV with the C<GvCV> macro. 
+obtained from the GV with the C<GvCV> macro.
 
 =cut
 */
@@ -317,24 +317,24 @@ Perl_gv_fetchmethod(pTHX_ HV *stash, const char *name)
 Returns the glob which contains the subroutine to call to invoke the method
 on the C<stash>.  In fact in the presence of autoloading this may be the
 glob for "AUTOLOAD".  In this case the corresponding variable $AUTOLOAD is
-already setup. 
+already setup.
 
 The third parameter of C<gv_fetchmethod_autoload> determines whether
 AUTOLOAD lookup is performed if the given method is not present: non-zero
-means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD. 
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
 Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
-with a non-zero C<autoload> parameter. 
+with a non-zero C<autoload> parameter.
 
 These functions grant C<"SUPER"> token as a prefix of the method name. Note
 that if you want to keep the returned glob for a long time, you need to
 check for it being "AUTOLOAD", since at the later time the call may load a
 different subroutine due to $AUTOLOAD changing its value. Use the glob
-created via a side effect to do this. 
+created via a side effect to do this.
 
 These functions have the same side-effects and as C<gv_fetchmeth> with
 C<level==0>.  C<name> should be writable if contains C<':'> or C<'
 ''>. The warning against passing the GV returned by C<gv_fetchmeth> to
-C<call_sv> apply equally to these functions. 
+C<call_sv> apply equally to these functions.
 
 =cut
 */
@@ -346,7 +346,7 @@ Perl_gv_fetchmethod_autoload(pTHX_ HV *stash, const char *name, I32 autoload)
     register const char *nend;
     const char *nsplit = 0;
     GV* gv;
-    
+
     for (nend = name; *nend; nend++) {
        if (*nend == '\'')
            nsplit = nend;
@@ -424,7 +424,7 @@ Perl_gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method)
     /*
      * Inheriting AUTOLOAD for non-methods works ... for now.
      */
-    if (ckWARN(WARN_DEPRECATED) && !method && 
+    if (ckWARN(WARN_DEPRECATED) && !method &&
        (GvCVGEN(gv) || GvSTASH(gv) != stash))
        Perl_warner(aTHX_ WARN_DEPRECATED,
          "Use of inherited AUTOLOAD for non-method %s::%.*s() is deprecated",
@@ -735,7 +735,7 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
         if (strEQ(name, "OVERLOAD")) {
             HV* hv = GvHVn(gv);
             GvMULTI_on(gv);
-            hv_magic(hv, gv, 'A');
+            hv_magic(hv, Nullgv, 'A');
         }
         break;
     case 'S':
@@ -749,7 +749,7 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
            }
            GvMULTI_on(gv);
            hv = GvHVn(gv);
-           hv_magic(hv, gv, 'S');
+           hv_magic(hv, Nullgv, 'S');
            for (i = 1; PL_sig_name[i]; i++) {
                SV ** init;
                init = hv_fetch(hv, PL_sig_name[i], strlen(PL_sig_name[i]), 1);
@@ -819,6 +819,7 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
        else {
             AV* av = GvAVn(gv);
             sv_magic((SV*)av, Nullsv, 'D', Nullch, 0);
+           SvREADONLY_on(av);
         }
        goto magicalize;
     case '#':
@@ -869,6 +870,7 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
        else {
             AV* av = GvAVn(gv);
             sv_magic((SV*)av, (SV*)av, 'D', Nullch, 0);
+           SvREADONLY_on(av);
         }
        /* FALL THROUGH */
     case '1':
@@ -901,9 +903,16 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
        if (len == 1) {
            SV *sv = GvSV(gv);
            (void)SvUPGRADE(sv, SVt_PVNV);
+           Perl_sv_setpvf(aTHX_ sv,
+#if defined(PERL_SUBVERSION) && (PERL_SUBVERSION > 0)
+                           "%8.6"
+#else
+                           "%5.3"
+#endif
+                           NVff,
+                           SvNVX(PL_patchlevel));
            SvNVX(sv) = SvNVX(PL_patchlevel);
            SvNOK_on(sv);
-           (void)SvPV_nolen(sv);
            SvREADONLY_on(sv);
        }
        break;
@@ -1079,7 +1088,7 @@ Perl_gp_ref(pTHX_ GP *gp)
 void
 Perl_gp_free(pTHX_ GV *gv)
 {
-    dTHR;  
+    dTHR;
     GP* gp;
 
     if (!gv || !(gp = GvGP(gv)))
@@ -1119,7 +1128,7 @@ Perl_gp_free(pTHX_ GV *gv)
 AV *GvAVn(gv)
 register GV *gv;
 {
-    if (GvGP(gv)->gp_av) 
+    if (GvGP(gv)->gp_av)
        return GvGP(gv)->gp_av;
     else
        return GvGP(gv_AVadd(gv))->gp_av;
@@ -1191,7 +1200,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
     for (i = 1; i < NofAMmeth; i++) {
       cv = 0;
       cp = (char *)PL_AMG_names[i];
-      
+
         svp = (SV**)hv_fetch(hv, cp, strlen(cp), FALSE);
         if (svp && ((sv = *svp) != &PL_sv_undef)) {
           switch (SvTYPE(sv)) {
@@ -1261,19 +1270,19 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
                /* GvSV contains the name of the method. */
                GV *ngv;
                
-               DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n", 
+               DEBUG_o( Perl_deb(aTHX_ "Resolving method `%.256s' for overloaded `%s' in package `%.256s'\n",
                             SvPV(GvSV(gv), n_a), cp, HvNAME(stash)) );
-               if (!SvPOK(GvSV(gv)) 
+               if (!SvPOK(GvSV(gv))
                    || !(ngv = gv_fetchmethod_autoload(stash, SvPVX(GvSV(gv)),
                                                       FALSE)))
                {
                    /* Can be an import stub (created by `can'). */
                    if (GvCVGEN(gv)) {
-                       Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'", 
+                       Perl_croak(aTHX_ "Stub found while resolving method `%.256s' overloading `%s' in package `%.256s'",
                              (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
                              cp, HvNAME(stash));
                    } else
-                       Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'", 
+                       Perl_croak(aTHX_ "Can't resolve method `%.256s' overloading `%s' in package `%.256s'",
                              (SvPOK(GvSV(gv)) ?  SvPVX(GvSV(gv)) : "???" ),
                              cp, HvNAME(stash));
                }
@@ -1284,7 +1293,7 @@ Perl_Gv_AMupdate(pTHX_ HV *stash)
                         GvNAME(CvGV(cv))) );
            filled = 1;
        }
-#endif 
+#endif
        amt.table[i]=(CV*)SvREFCNT_inc(cv);
     }
     if (filled) {
@@ -1304,8 +1313,8 @@ SV*
 Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
 {
   dTHR;
-  MAGIC *mg; 
-  CV *cv; 
+  MAGIC *mg;
+  CV *cv;
   CV **cvp=NULL, **ocvp=NULL;
   AMT *amtp, *oamtp;
   int fl=0, off, off1, lr=0, assign=AMGf_assign & flags, notfound=0;
@@ -1313,10 +1322,10 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
   HV* stash;
   if (!(AMGf_noleft & flags) && SvAMAGIC(left)
       && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(left))),'c'))
-      && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
+      && (ocvp = cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
                        ? (oamtp = amtp = (AMT*)mg->mg_ptr)->table
                        : (CV **) NULL))
-      && ((cv = cvp[off=method+assignshift]) 
+      && ((cv = cvp[off=method+assignshift])
          || (assign && amtp->fallback > AMGfallNEVER && /* fallback to
                                                          * usual method */
                  (fl = 1, cv = cvp[off=method])))) {
@@ -1352,7 +1361,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
           (void)((cv = cvp[off=numer_amg]) || (cv = cvp[off=bool__amg]));
           break;
  case not_amg:
-   (void)((cv = cvp[off=bool__amg]) 
+   (void)((cv = cvp[off=bool__amg])
          || (cv = cvp[off=numer_amg])
          || (cv = cvp[off=string_amg]));
    postpr = 1;
@@ -1377,7 +1386,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
           }
           break;
         case abs_amg:
-          if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg]) 
+          if ((cvp[off1=lt_amg] || cvp[off1=ncmp_amg])
               && ((cv = cvp[off=neg_amg]) || (cv = cvp[off=subtr_amg]))) {
             SV* nullsv=sv_2mortal(newSViv(0));
             if (off1==lt_amg) {
@@ -1408,13 +1417,16 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
           }
           break;
         case iter_amg:                 /* XXXX Eventually should do to_gv. */
+            /* FAIL safe */
+            return NULL;       /* Delegate operation to standard mechanisms. */
+            break;
         case to_sv_amg:
         case to_av_amg:
         case to_hv_amg:
         case to_gv_amg:
         case to_cv_amg:
             /* FAIL safe */
-            return NULL;       /* Delegate operation to standard mechanisms. */
+            return left;       /* Delegate operation to standard mechanisms. */
             break;
         default:
           goto not_found;
@@ -1422,14 +1434,14 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
         if (!cv) goto not_found;
     } else if (!(AMGf_noright & flags) && SvAMAGIC(right)
               && (mg = mg_find((SV*)(stash=SvSTASH(SvRV(right))),'c'))
-              && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr) 
+              && (cvp = (AMT_AMAGIC((AMT*)mg->mg_ptr)
                          ? (amtp = (AMT*)mg->mg_ptr)->table
                          : (CV **) NULL))
               && (cv = cvp[off=method])) { /* Method for right
                                             * argument found */
       lr=1;
-    } else if (((ocvp && oamtp->fallback > AMGfallNEVER 
-                && (cvp=ocvp) && (lr = -1)) 
+    } else if (((ocvp && oamtp->fallback > AMGfallNEVER
+                && (cvp=ocvp) && (lr = -1))
                || (cvp && amtp->fallback > AMGfallNEVER && (lr=1)))
               && !(flags & AMGf_unary)) {
                                /* We look for substitution for
@@ -1462,6 +1474,16 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
       }
     } else {
     not_found:                 /* No method found, either report or croak */
+      switch (method) {
+        case to_sv_amg:
+        case to_av_amg:
+        case to_hv_amg:
+        case to_gv_amg:
+        case to_cv_amg:
+            /* FAIL safe */
+            return left;       /* Delegate operation to standard mechanisms. */
+            break;
+      }
       if (ocvp && (cv=ocvp[nomethod_amg])) { /* Call report method */
        notfound = 1; lr = -1;
       } else if (cvp && (cv=cvp[nomethod_amg])) {
@@ -1469,22 +1491,22 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
       } else {
        SV *msg;
        if (off==-1) off=method;
-       msg = sv_2mortal(Perl_newSVpvf(aTHX_ 
+       msg = sv_2mortal(Perl_newSVpvf(aTHX_
                      "Operation `%s': no method found,%sargument %s%s%s%s",
                      PL_AMG_names[method + assignshift],
                      (flags & AMGf_unary ? " " : "\n\tleft "),
-                     SvAMAGIC(left)? 
+                     SvAMAGIC(left)?
                        "in overloaded package ":
                        "has no overloaded magic",
-                     SvAMAGIC(left)? 
+                     SvAMAGIC(left)?
                        HvNAME(SvSTASH(SvRV(left))):
                        "",
-                     SvAMAGIC(right)? 
+                     SvAMAGIC(right)?
                        ",\n\tright argument in overloaded package ":
-                       (flags & AMGf_unary 
+                       (flags & AMGf_unary
                         ? ""
                         : ",\n\tright argument has no overloaded magic"),
-                     SvAMAGIC(right)? 
+                     SvAMAGIC(right)?
                        HvNAME(SvSTASH(SvRV(right))):
                        ""));
        if (amtp && amtp->fallback >= AMGfallYES) {
@@ -1498,7 +1520,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
     }
   }
   if (!notfound) {
-    DEBUG_o( Perl_deb(aTHX_ 
+    DEBUG_o( Perl_deb(aTHX_
   "Overloaded operator `%s'%s%s%s:\n\tmethod%s found%s in package %s%s\n",
                 PL_AMG_names[off],
                 method+assignshift==off? "" :
@@ -1509,7 +1531,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
                 flags & AMGf_unary? "" :
                   lr==1 ? " for right argument": " for left argument",
                 flags & AMGf_unary? " for argument" : "",
-                HvNAME(stash), 
+                HvNAME(stash),
                 fl? ",\n\tassignment variant used": "") );
   }
     /* Since we use shallow copy during assignment, we need
@@ -1522,10 +1544,10 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
      * b) Increment or decrement, called directly.
      *                 assignshift==0,  assign==0, method + 0 == off
      * c) Increment or decrement, translated to assignment add/subtr.
-     *                 assignshift==0,  assign==T, 
+     *                 assignshift==0,  assign==T,
      *         force_cpy == T
      * d) Increment or decrement, translated to nomethod.
-     *                 assignshift==0,  assign==0, 
+     *                 assignshift==0,  assign==0,
      *         force_cpy == T
      * e) Assignment form translated to nomethod.
      *                 assignshift==1,  assign==T, method + 1 != off
diff --git a/handy.h b/handy.h
index 9e6f223..f0e39af 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -48,10 +48,10 @@ Null SV pointer.
    just figure out all the headers such a test needs.
    Andy Dougherty      August 1996
 */
-/* bool is built-in for g++-2.6.3 and later, which might be used 
+/* bool is built-in for g++-2.6.3 and later, which might be used
    for extensions.  <_G_config.h> defines _G_HAVE_BOOL, but we can't
    be sure _G_config.h will be included before this file.  _G_config.h
-   also defines _G_HAVE_BOOL for both gcc and g++, but only g++ 
+   also defines _G_HAVE_BOOL for both gcc and g++, but only g++
    actually has bool.  Hence, _G_HAVE_BOOL is pretty useless for us.
    g++ can be identified by __GNUG__.
    Andy Dougherty      February 2000
@@ -101,8 +101,8 @@ Null SV pointer.
    Similarly, there is no guarantee that I16 and U16 have exactly 16
    bits.
 
-   For dealing with issues that may arise from various 32/64-bit 
-   systems, we will ask Configure to check out 
+   For dealing with issues that may arise from various 32/64-bit
+   systems, we will ask Configure to check out
 
        SHORTSIZE == sizeof(short)
        INTSIZE == sizeof(int)
@@ -296,6 +296,8 @@ Converts the specified character to lowercase.
 #define isALPHA(c)     (isUPPER(c) || isLOWER(c))
 #define isSPACE(c) \
        ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) =='\r' || (c) == '\f')
+#define isPSXSPC(c)    (isSPACE(c) || (c) == '\v')
+#define isBLANK(c)     ((c) == ' ' || (c) == '\t')
 #define isDIGIT(c)     ((c) >= '0' && (c) <= '9')
 #ifdef EBCDIC
     /* In EBCDIC we do not do locales: therefore() isupper() is fine. */
@@ -382,6 +384,9 @@ Converts the specified character to lowercase.
 #  endif
 #endif /* USE_NEXT_CTYPE */
 
+#define isPSXSPC_LC(c)         (isSPACE_LC(c) || (c) == '\v')
+#define isBLANK_LC(c)          isBLANK(c) /* could be wrong */
+
 #define isALNUM_uni(c)         is_uni_alnum(c)
 #define isIDFIRST_uni(c)       is_uni_idfirst(c)
 #define isALPHA_uni(c)         is_uni_alpha(c)
@@ -400,6 +405,9 @@ Converts the specified character to lowercase.
 #define toTITLE_uni(c)         to_uni_title(c)
 #define toLOWER_uni(c)         to_uni_lower(c)
 
+#define isPSXSPC_uni(c)                (isSPACE_uni(c) ||(c) == '\f')
+#define isBLANK_uni(c)         isBLANK(c) /* could be wrong */
+
 #define isALNUM_LC_uni(c)      (c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c))
 #define isIDFIRST_LC_uni(c)    (c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c))
 #define isALPHA_LC_uni(c)      (c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c))
@@ -416,6 +424,9 @@ Converts the specified character to lowercase.
 #define toTITLE_LC_uni(c)      (c < 256 ? toUPPER_LC(c) : to_uni_title_lc(c))
 #define toLOWER_LC_uni(c)      (c < 256 ? toLOWER_LC(c) : to_uni_lower_lc(c))
 
+#define isPSXSPC_LC_uni(c)     (isSPACE_LC_uni(c) ||(c) == '\f')
+#define isBLANK_LC_uni(c)      isBLANK(c) /* could be wrong */
+
 #define isALNUM_utf8(p)                is_utf8_alnum(p)
 #define isIDFIRST_utf8(p)      is_utf8_idfirst(p)
 #define isALPHA_utf8(p)                is_utf8_alpha(p)
@@ -434,21 +445,27 @@ Converts the specified character to lowercase.
 #define toTITLE_utf8(p)                to_utf8_title(p)
 #define toLOWER_utf8(p)                to_utf8_lower(p)
 
-#define isALNUM_LC_utf8(p)     isALNUM_LC_uni(utf8_to_uv(p, 0))
-#define isIDFIRST_LC_utf8(p)   isIDFIRST_LC_uni(utf8_to_uv(p, 0))
-#define isALPHA_LC_utf8(p)     isALPHA_LC_uni(utf8_to_uv(p, 0))
-#define isSPACE_LC_utf8(p)     isSPACE_LC_uni(utf8_to_uv(p, 0))
-#define isDIGIT_LC_utf8(p)     isDIGIT_LC_uni(utf8_to_uv(p, 0))
-#define isUPPER_LC_utf8(p)     isUPPER_LC_uni(utf8_to_uv(p, 0))
-#define isLOWER_LC_utf8(p)     isLOWER_LC_uni(utf8_to_uv(p, 0))
-#define isALNUMC_LC_utf8(p)    isALNUMC_LC_uni(utf8_to_uv(p, 0))
-#define isCNTRL_LC_utf8(p)     isCNTRL_LC_uni(utf8_to_uv(p, 0))
-#define isGRAPH_LC_utf8(p)     isGRAPH_LC_uni(utf8_to_uv(p, 0))
-#define isPRINT_LC_utf8(p)     isPRINT_LC_uni(utf8_to_uv(p, 0))
-#define isPUNCT_LC_utf8(p)     isPUNCT_LC_uni(utf8_to_uv(p, 0))
-#define toUPPER_LC_utf8(p)     toUPPER_LC_uni(utf8_to_uv(p, 0))
-#define toTITLE_LC_utf8(p)     toTITLE_LC_uni(utf8_to_uv(p, 0))
-#define toLOWER_LC_utf8(p)     toLOWER_LC_uni(utf8_to_uv(p, 0))
+#define isPSXSPC_utf8(c)       (isSPACE_utf8(c) ||(c) == '\f')
+#define isBLANK_utf8(c)                isBLANK(c) /* could be wrong */
+
+#define isALNUM_LC_utf8(p)     isALNUM_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isIDFIRST_LC_utf8(p)   isIDFIRST_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isALPHA_LC_utf8(p)     isALPHA_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isSPACE_LC_utf8(p)     isSPACE_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isDIGIT_LC_utf8(p)     isDIGIT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isUPPER_LC_utf8(p)     isUPPER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isLOWER_LC_utf8(p)     isLOWER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isALNUMC_LC_utf8(p)    isALNUMC_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isCNTRL_LC_utf8(p)     isCNTRL_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isGRAPH_LC_utf8(p)     isGRAPH_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isPRINT_LC_utf8(p)     isPRINT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define isPUNCT_LC_utf8(p)     isPUNCT_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toUPPER_LC_utf8(p)     toUPPER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toTITLE_LC_utf8(p)     toTITLE_LC_uni(utf8_to_uv_chk(p, 0, 0))
+#define toLOWER_LC_utf8(p)     toLOWER_LC_uni(utf8_to_uv_chk(p, 0, 0))
+
+#define isPSXSPC_LC_utf8(c)    (isSPACE_LC_utf8(c) ||(c) == '\f')
+#define isBLANK_LC_utf8(c)     isBLANK(c) /* could be wrong */
 
 #ifdef EBCDIC
 EXT int ebcdic_control (int);
@@ -467,7 +484,7 @@ typedef U16 line_t;
 #endif
 
 
-/* 
+/*
    XXX LEAKTEST doesn't really work in perl5.  There are direct calls to
    safemalloc() in the source, so LEAKTEST won't pick them up.
    (The main "offenders" are extensions.)
@@ -484,7 +501,7 @@ typedef U16 line_t;
 Creates a new SV.  A non-zero C<len> parameter indicates the number of
 bytes of preallocated string space the SV should have.  An extra byte for a
 tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
-space is allocated.)  The reference count for the new SV is set to 1. 
+space is allocated.)  The reference count for the new SV is set to 1.
 C<id> is an integer id between 0 and 1299 (used to identify leaks).
 
 =for apidoc Am|void|New|int id|void* ptr|int nitems|type
index 5f23b29..0666771 100644 (file)
@@ -9,7 +9,7 @@ can't or doesn't guess properly.  Most of these hint files have been
 tested with at least some version of perl5, but some are still left
 over from perl4.
 
-Please send any problems or suggested changes to perlbug@perl.com.
+Please send any problems or suggested changes to perlbug@perl.org.
 
 =head1 Hint file naming convention.
 
index 8a29b93..cf7e43c 100644 (file)
@@ -128,6 +128,13 @@ d_setreuid='undef'
 # Tell perl which symbols to export for dynamic linking.
 case "$cc" in
 *gcc*) ccdlflags='-Xlinker' ;;
+*) ccversion=`lslpp -L | grep 'C for AIX Compiler$' | awk '{print $2}'`
+   case "$ccversion" in
+     4.4.0.0|4.4.0.1|4.4.0.2)
+       echo >&4 "*** This C compiler ($ccversion) is outdated."
+       echo >&4 "*** Please upgrade to at least 4.4.0.3."
+       ;;
+     esac
 esac
 # the required -bE:$installarchlib/CORE/perl.exp is added by
 # libperl.U (Configure) later.
@@ -171,9 +178,9 @@ $define|true|[yY]*)
            ;;
        *)
            cat >&4 <<EOM
-For pthreads you should use the AIX C compiler cc_r.
-(now your compiler was set to '$cc')
-Cannot continue, aborting.
+*** For pthreads you should use the AIX C compiler cc_r.
+*** (now your compiler was set to '$cc')
+*** Cannot continue, aborting.
 EOM
            exit 1
            ;;
@@ -207,29 +214,46 @@ cat > UU/uselargefiles.cbu <<'EOCBU'
 case "$uselargefiles" in
 ''|$define|true|[yY]*)
 # Keep these at the left margin.
-ccflags_largefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
-ldflags_largefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
+ccflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
+ldflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
        # _Somehow_ in AIX 4.3.1.0 the above getconf call manages to
        # insert(?) *something* to $ldflags so that later (in Configure) evaluating
        # $ldflags causes a newline after the '-b64' (the result of the getconf).
        # (nothing strange shows up in $ldflags even in hexdump;
-       #  so it may be something in the shell, instead?)
+       #  so it may be something (a bug) in the shell, instead?)
        # Try it out: just uncomment the below line and rerun Configure:
-# echo >&4 "AIX 4.3.1.0 $ldflags_largefiles mystery" ; exit 1
+# echo >&4 "AIX 4.3.1.0 $ldflags_uselargefiles mystery" ; exit 1
        # Just don't ask me how AIX does it, I spent hours wondering.
-       # Therefore the line re-evaluating ldflags_largefiles: it seems to fix
+       # Therefore the line re-evaluating ldflags_uselargefiles: it seems to fix
        # the whatever it was that AIX managed to break. --jhi
-       ldflags_largefiles="`echo $ldflags_largefiles`"
+       ldflags_uselargefiles="`echo $ldflags_uselargefiles`"
 # Keep this at the left margin.
-libswanted_largefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
-       case "$ccflags_largefiles$ldflags_largefiles$libs_largefiles" in
+libswanted_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+       case "$ccflags_uselargefiles$ldflags_uselargefiles$libs_uselargefiles" in
        '');;
-       *) ccflags="$ccflags $ccflags_largefiles"
-          ldflags="$ldflags $ldflags_largefiles"
-          libswanted="$libswanted $libswanted_largefiles"
+       *) ccflags="$ccflags $ccflags_uselargefiles"
+          ldflags="$ldflags $ldflags_uselargefiles"
+          libswanted="$libswanted $libswanted_uselargefiles"
           ;;
        esac
-       ;;
+       case "$gccversion" in
+       '') ;;
+       *)
+       cat >&4 <<EOM
+
+*** Warning: gcc in AIX might not work with the largefile support of Perl
+*** (default since 5.6.0), this combination hasn't been tested.
+*** I will try, though.
+
+EOM
+       # Remove xlc-spefific -qflags.
+        ccflags="`echo $ccflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
+        ldflags="`echo $ldflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
+       echo >&4 "(using ccflags $ccflags)"
+       echo >&4 "(using ldflags $ldflags)"
+        ;; 
+        esac
+        ;;
 esac
 EOCBU
 
@@ -356,7 +380,10 @@ cat > UU/uselongdouble.cbu <<'EOCBU'
 # after it has prompted the user for whether to use long doubles.
 case "$uselongdouble" in
 $define|true|[yY]*)
-       ccflags="$ccflags -qlongdouble"
+        case "$cc" in
+        *gcc*) ;;
+        *) ccflags="$ccflags -qlongdouble" ;;
+        esac
        # The explicit cc128, xlc128, xlC128 are not needed,
        # the -qlongdouble should do the trick. --jhi
        d_Gconvert='sprintf((b),"%.*llg",(n),(x))'
index 1d1d823..5875543 100644 (file)
@@ -121,7 +121,7 @@ $define|true|[yY]*)
        *)   cat <<EOM >&4
 I did not know that BSD/OS $osvers supports POSIX threads.
 
-Feel free to tell perlbug@perl.com otherwise.
+Feel free to tell perlbug@perl.org otherwise.
 EOM
            exit 1
            ;;
index 47c2092..7be1735 100644 (file)
@@ -19,9 +19,11 @@ then
     plibpth=`cd $plibpth && pwd`
 fi
 so='dll'
-# - eliminate -lc, implied by gcc
+# - eliminate -lc, implied by gcc and a symlink to libcygwin.a
 libswanted=`echo " $libswanted " | sed -e 's/ c / /g'`
-libswanted="$libswanted cygipc cygwin kernel32"
+# - eliminate -lm, symlink to libcygwin.a
+libswanted=`echo " $libswanted " | sed -e 's/ m / /g'`
+libswanted="$libswanted cygipc"
 test -z "$optimize" && optimize='-O2'
 # - otherwise i686-cygwin
 archname='cygwin'
@@ -35,9 +37,6 @@ ld='ld2'
 # - perl malloc needs to be unpolluted
 bincompat5005='undef'
 
-# stubs (ENOSYS, not implemented)
-d_chroot='undef'
-
 # Win9x problem with non-blocking read from a closed pipe
 d_eofnblk='define'
 
index fd61e42..8625798 100644 (file)
@@ -47,7 +47,7 @@ ld='cc';
 so='dylib';
 dlext='bundle';
 dlsrc='dl_dyld.xs'; usedl='define';
-cccdlflags='';
+cccdlflags=' '; # space, not empty, because otherwise we get -fpic
 lddlflags="${ldflags} -bundle -undefined suppress";
 ldlibpthname='DYLD_LIBRARY_PATH';
 useshrplib='true';
index c110d1e..07b80ea 100644 (file)
@@ -99,6 +99,7 @@ EOF
        fi
         ;;
 *)     # compile something small: taint.c is fine for this.
+       ccversion=`cc -V | awk '/(Compaq|DEC) C/ {print $3}'`
        # the main point is the '-v' flag of 'cc'.
                case "`cc -v -I. -c taint.c -o taint$$.o 2>&1`" in
        */gemc_cc*)     # we have the new DEC GEM CC
index 7122813..0ba6b61 100644 (file)
@@ -184,7 +184,7 @@ $define|true|[yY]*)
        0*|1*|2.0*|2.1*)   cat <<EOM >&4
 I did not know that FreeBSD $osvers supports POSIX threads.
 
-Feel free to tell perlbug@perl.com otherwise.
+Feel free to tell perlbug@perl.org otherwise.
 EOM
              exit 1
              ;;
index ecfcb6d..43d72bc 100644 (file)
@@ -105,9 +105,13 @@ EOM
     ;;
 esac
 
+cc=${cc:-cc}
+
 case `$cc -v 2>&1`"" in
 *gcc*) ccisgcc="$define" ;;
-*) ccisgcc='' ;;
+*) ccisgcc=''
+   ccversion=`which cc | xargs what | awk '/Compiler/{print $2}'`
+   ;;
 esac
 
 # Determine the architecture type of this system.
@@ -388,9 +392,9 @@ case "$uselargefiles" in
 ''|$define|true|[yY]*)
        # there are largefile flags available via getconf(1)
        # but we cheat for now.  (Keep that in the left margin.)
-ccflags_largefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
+ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
 
-       ccflags="$ccflags $ccflags_largefiles"
+       ccflags="$ccflags $ccflags_uselargefiles"
 
         if test -z "$ccisgcc" -a -z "$gccversion"; then
            # The strict ANSI mode (-Aa) doesn't like large files.
index ce301df..32335a0 100644 (file)
@@ -48,7 +48,13 @@ case "$cc" in
     *) test -f /usr/lib32/libm.so && cc='cc -n32' ;;
     esac       
 esac
-test -z "$cc" && cc=cc
+
+cc=${cc:-cc}
+
+case "$cc" in
+*gcc*) ;;
+*) ccversion=`cc -version` ;;
+esac
 
 case "$use64bitint" in
 $define|true|[yY]*)
index 0fa46bd..913cfd0 100644 (file)
@@ -283,9 +283,9 @@ cat > UU/uselargefiles.cbu <<'EOCBU'
 case "$uselargefiles" in
 ''|$define|true|[yY]*)
 # Keep this in the left margin.
-ccflags_largefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
+ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
 
-       ccflags="$ccflags $ccflags_largefiles"
+       ccflags="$ccflags $ccflags_uselargefiles"
        ;;
 esac
 EOCBU
index ab55e61..b9a7886 100644 (file)
@@ -53,7 +53,6 @@ d_fsetpos='fpos_t'
 gidtype='gid_t'
 groupstype='gid_t'
 lseektype='long'
-models='none'
 modetype='mode_t'
 sizetype='size_t'
 timetype='time_t'
diff --git a/hints/nonstopux.sh b/hints/nonstopux.sh
new file mode 100644 (file)
index 0000000..f93c312
--- /dev/null
@@ -0,0 +1,17 @@
+# tom_bates@att.net
+# mips-compaq-nonstopux
+
+. $src/hints/svr4.sh
+
+case "$cc" in
+        *gcc*)
+                ccflags='-fno-strict-aliasing'
+                lddlflags='-shared'
+                ldflags=''
+               ;;
+        '')
+                cc="cc -Xa -Olimit 4096"
+                malloctype="void *"
+               ;;
+esac
+
index a7d8bf2..5b79709 100644 (file)
@@ -37,7 +37,15 @@ OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax)
        # we use -fPIC here because -fpic is *NOT* enough for some of the
        # extensions like Tk on some OpenBSD platforms (ie: sparc)
        cccdlflags="-DPIC -fPIC $cccdlflags"
-       lddlflags="-Bshareable $lddlflags"
+       case "$osvers" in
+       [01].*|2.[0-7]|2.[0-7].*)
+               lddlflags="-Bshareable $lddlflags"
+               ;;
+       *) # from 2.8 onwards
+               ld=${cc:-cc}
+               lddlflags="-shared $lddlflags"
+               ;;
+       esac
        ;;
 esac
 
index 0e9f786..7a99de0 100644 (file)
@@ -249,6 +249,8 @@ nm_opt='-p'
 
 ####### We define these functions ourselves
 
+d_strtoll='define'
+d_strtoull='define'
 d_getprior='define'
 d_setprior='define'
 
@@ -306,10 +308,6 @@ case "$0$running_c_cmd" in
   *) echo "!!! Apparently we are running a renamed Configure: '$0'." >&2
 esac
 
-# Copy pod:
-
-cp -uf ./README.os2 ./pod/perlos2.pod
-
 # This script UU/usethreads.cbu will get 'called-back' by Configure 
 # after it has prompted the user for whether to use threads.
 cat > UU/usethreads.cbu <<'EOCBU'
index 21b0b0e..e8175f2 100644 (file)
@@ -45,8 +45,13 @@ case "$archname" in
     ;;
 esac
 
-test -z "`${cc:-cc} -V 2>&1|grep -i workshop`" || ccisworkshop="$define"
-test -z "`${cc:-cc} -v 2>&1|grep -i gcc`"      || ccisgcc="$define"
+cc=${cc:-cc}
+
+ccversion="`$cc -V 2>&1|head -1|sed 's/^cc: //'`"
+case "$ccversion" in
+*WorkShop*) ccname=workshop ;;
+*) ccversion='' ;;
+esac
 
 cat >UU/workshoplibpth.cbu<<'EOCBU'
 case "$workshoplibpth_done" in
@@ -70,8 +75,8 @@ case "$workshoplibpth_done" in
 esac
 EOCBU
 
-case "$ccisworkshop" in
-"$define")
+case "$ccname" in
+workshop)
        cat >try.c <<EOF
 #include <sunmath.h>
 int main() { return(0); }
@@ -328,8 +333,12 @@ case "$usethreads" in
 $define|true|[yY]*)
         ccflags="-D_REENTRANT $ccflags"
 
-        # sched_yield is in -lposix4
-        set `echo X "$libswanted "| sed -e 's/ c / posix4 pthread c /'`
+        # sched_yield is in -lposix4 up to Solaris 2.6, in -lrt starting with Solaris 7
+       case `uname -r` in
+       5.[0-6] | 5.5.1) sched_yield_lib="posix4" ;;
+       *) sched_yield_lib="rt";
+       esac
+        set `echo X "$libswanted "| sed -e "s/ c / $sched_yield_lib pthread c /"`
         shift
         libswanted="$*"
 
@@ -354,7 +363,7 @@ $define|true|[yY]*)
            siglongjmp(env, 2);
        }
 EOM
-        if test "`arch`" = i86pc -a "$osvers" = 2.6 && \
+        if test "`arch`" = i86pc -a `uname -r` = 5.6 && \
            ${cc:-cc} try.c -lpthread >/dev/null 2>&1 && ./a.out; then
            d_sigsetjmp=$undef
            cat << 'EOM' >&2
@@ -376,45 +385,45 @@ case "$uselargefiles" in
 ''|$define|true|[yY]*)
 
 # Keep these in the left margin.
-ccflags_largefiles="`getconf LFS_CFLAGS 2>/dev/null`"
-ldflags_largefiles="`getconf LFS_LDFLAGS 2>/dev/null`"
-libswanted_largefiles="`getconf LFS_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+ccflags_uselargefiles="`getconf LFS_CFLAGS 2>/dev/null`"
+ldflags_uselargefiles="`getconf LFS_LDFLAGS 2>/dev/null`"
+libswanted_uselargefiles="`getconf LFS_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
 
-    ccflags="$ccflags $ccflags_largefiles"
-    ldflags="$ldflags $ldflags_largefiles"
-    libswanted="$libswanted $libswanted_largefiles"
+    ccflags="$ccflags $ccflags_uselargefiles"
+    ldflags="$ldflags $ldflags_uselargefiles"
+    libswanted="$libswanted $libswanted_uselargefiles"
     ;;
 esac
 EOCBU
 
-cat > UU/use64bitint.cbu <<'EOCBU'
-# This script UU/use64bitint.cbu will get 'called-back' by Configure 
-# after it has prompted the user for whether to use 64 bit integers.
-case "$use64bitint" in
+# This is truly a mess.
+case "$usemorebits" in
 "$define"|true|[yY]*)
+       use64bitint="$define"    
+       uselongdouble="$define"    
+       ;;
+esac
+
+cat > UU/use64bitall.cbu <<'EOCBU'
+# This script UU/use64bitall.cbu will get 'called-back' by Configure 
+# after it has prompted the user for whether to be maximally 64 bitty.
+case "$use64bitall-$use64bitall_done" in
+"$define-"|true-|[yY]*-)
            case "`uname -r`" in
            5.[1-6])
                cat >&4 <<EOM
-Solaris `uname -r|sed -e 's/^5\.\([789]\)$/\1/'` does not support 64-bit integers.
+Solaris `uname -r|sed -e 's/^5\.\([789]\)$/\1/'` does not support 64-bit pointers.
 You should upgrade to at least Solaris 7.
 EOM
                exit 1
                ;;
            esac
-           ;;
-esac
-EOCBU
-
-cat > UU/use64bitall.cbu <<'EOCBU'
-# This script UU/use64bitall.cbu will get 'called-back' by Configure 
-# after it has prompted the user for whether to be maximally 64 bitty.
-case "$use64bitall-$use64bitall_done" in
-"$define-"|true-|[yY]*-)
            libc='/usr/lib/sparcv9/libc.so'
            if test ! -f $libc; then
                cat >&4 <<EOM
 
 I do not see the 64-bit libc, $libc.
+(You are either in an old sparc or in an x86.)
 Cannot continue, aborting.
 
 EOM
@@ -424,16 +433,17 @@ EOM
            case "$cc -v 2>/dev/null" in
            *gcc*)
                echo 'main() { return 0; }' > try.c
-               if ${cc:-cc} -mcpu=v9 -m64 -S try.c 2>&1 | grep -e \
-                   '-m64 is not supported by this configuration'; then
+               case "`${cc:-cc} -mcpu=v9 -m64 -S try.c 2>&1 | grep 'm64 is not supported by this configuration'`" in
+               *"m64 is not supported"*)
                    cat >&4 <<EOM
 
-Full 64-bit build not supported by this configuration.
+Full 64-bit build not supported by this gcc configuration.
 Cannot continue, aborting.
 
 EOM
                    exit 1
-               fi
+                   ;;
+               esac    
                ccflags="$ccflags -mcpu=v9 -m64"
                if test X`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null` != X; then
                    ccflags="$ccflags -Wa,`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
@@ -473,18 +483,19 @@ cat > UU/uselongdouble.cbu <<'EOCBU'
 # after it has prompted the user for whether to use long doubles.
 case "$uselongdouble-$uselongdouble_done" in
 "$define-"|true-|[yY]*-)
-       case "$ccisworkshop" in
-       '')     cat >&4 <<EOM
+       case "$ccname" in
+       workshop)
+               libswanted="$libswanted sunmath"
+               loclibpth="$loclibpth /opt/SUNWspro/lib"
+               ;;
+       *)      cat >&4 <<EOM
 
-I do not see the Sun Workshop compiler; therefore I do not see
+The Sun Workshop compiler is not being used; therefore I do not see
 the libsunmath; therefore I do not know how to do long doubles, sorry.
 I'm disabling the use of long doubles.
 EOM
                uselongdouble="$undef"
                ;;
-       *)      libswanted="$libswanted sunmath"
-               loclibpth="$loclibpth /opt/SUNWspro/lib"
-               ;;
        esac
        uselongdouble_done=yes
        ;;
@@ -500,9 +511,6 @@ case "$uselongdouble" in
 esac
 
 rm -f try.c try.o try
-# keep that leading tab
-       ccisworkshop=''
-       ccisgcc=''
 
 # This is just a trick to include some useful notes.
 cat > /dev/null <<'End_of_Solaris_Notes'
index cea99f8..88a3e7a 100644 (file)
@@ -12,7 +12,6 @@ intsize='4'
 usenm='true'
 nm_opt='-eh'
 malloctype='void *'
-models='none'
 ccflags="$ccflags -I/usr/include/net -DDEBUGGING -DSTANDARD_C"
 cppflags="$cppflags -I/usr/include/net -DDEBUGGING -DSTANDARD_C"
 stdchar='unsigned char'
index e49b373..089b960 100644 (file)
@@ -2,7 +2,7 @@ case `uname -r` in
 6.1*) shellflags="-m+65536" ;;
 esac
 case "$optimize" in
-# If we used fastmd (the default) integer values would be limited to 43 bits.
+# If we used fastmd (the default) integer values would be limited to 46 bits.
 # --Mark P. Lutz
 '') optimize="$optimize -h nofastmd" ;;
 esac
index 9ad72d7..74698db 100644 (file)
@@ -1,2 +1,4 @@
 ccflags="$ccflags -DCRIPPLED_CC"
-d_lstat=define
+d_lstat='define'
+usedl='undef'
+
index 0e5e11a..0b2cf9d 100644 (file)
@@ -24,7 +24,7 @@ i_utime=undef
 # compile/link flags
 ldflags=-g
 optimize=-g
-static_ext="B Data/Dumper Fcntl IO IPC/SysV Opcode POSIX SDBM_File Socket attrs"
+static_ext="B Data/Dumper Fcntl IO IPC/SysV Opcode POSIX SDBM_File Socket Storable attrs"
 #static_ext=none
 # dynamic loading needs work
 usedl=undef
index bc03387..2b3dd28 100644 (file)
@@ -218,7 +218,7 @@ dynamic_ext=''
 eagain='EAGAIN'
 ebcdic='define'
 exe_ext=''
-extensions='Fcntl GDBM_File IO NDBM_File Opcode POSIX Socket IPC/SysV Errno Thread attrs re Data/dumper'
+extensions='Fcntl GDBM_File IO NDBM_File Opcode POSIX Socket Storable IPC/SysV Errno Thread attrs re Data/Dumper'
 fpostype='fpos_t'
 freetype='void'
 groupstype='gid_t'
@@ -294,7 +294,6 @@ make='gnumake'
 mallocobj=''
 mallocsrc=''
 malloctype='void *'
-models='none'
 netdb_hlen_type='size_t'
 netdb_host_type='char *'
 netdb_name_type='const char *'
@@ -318,7 +317,7 @@ sig_num_init='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,2
 sizetype='size_t'
 so='.a'
 ssizetype='ssize_t'
-static_ext='Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File Opcode POSIX Socket Thread attrs re'
+static_ext='Data/Dumper Fcntl GDBM_File IO IPC/SysV NDBM_File Opcode POSIX Socket Storable Thread attrs re'
 stdchar='char'
 stdio_cnt='(fp)->__countIn'
 stdio_ptr='(fp)->__bufPtr'
diff --git a/hv.c b/hv.c
index 6a07615..8a43a19 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -15,6 +15,7 @@
 #define PERL_IN_HV_C
 #include "perl.h"
 
+
 STATIC HE*
 S_new_he(pTHX)
 {
@@ -74,7 +75,7 @@ S_save_hek(pTHX_ const char *str, I32 len, U32 hash)
 {
     char *k;
     register HEK *hek;
-    
+
     New(54, k, HEK_BASESIZE + len + 1, char);
     hek = (HEK*)k;
     Copy(str, HEK_KEY(hek), len, char);
@@ -128,7 +129,7 @@ Perl_he_dup(pTHX_ HE *e, bool shared)
 Returns the SV which corresponds to the specified key in the hash.  The
 C<klen> is the length of the key.  If C<lval> is set then the fetch will be
 part of a store.  Check that the return value is non-null before
-dereferencing it to a C<SV*>. 
+dereferencing it to a C<SV*>.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -172,7 +173,7 @@ Perl_hv_fetch(pTHX_ HV *hv, const char *key, U32 klen, I32 lval)
 
     xhv = (XPVHV*)SvANY(hv);
     if (!xhv->xhv_array) {
-       if (lval 
+       if (lval
 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
                 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
 #endif
@@ -191,7 +192,7 @@ Perl_hv_fetch(pTHX_ HV *hv, const char *key, U32 klen, I32 lval)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        return &HeVAL(entry);
     }
@@ -224,7 +225,7 @@ if you want the function to compute it.  IF C<lval> is set then the fetch
 will be part of a store.  Make sure the return value is non-null before
 accessing it.  The return value when C<tb> is a tied hash is a pointer to a
 static location, so be sure to make a copy of the structure if you need to
-store it somewhere. 
+store it somewhere.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -278,7 +279,7 @@ Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
 
     xhv = (XPVHV*)SvANY(hv);
     if (!xhv->xhv_array) {
-       if (lval 
+       if (lval
 #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
                 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
 #endif
@@ -290,7 +291,7 @@ Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
     }
 
     key = SvPV(keysv, klen);
-    
+
     if (!hash)
        PERL_HASH(hash, key, klen);
 
@@ -300,7 +301,7 @@ Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        return entry;
     }
@@ -351,7 +352,7 @@ NULL if the operation failed or if the value did not need to be actually
 stored within the hash (as in the case of tied hashes).  Otherwise it can
 be dereferenced to get the original C<SV*>.  Note that the caller is
 responsible for suitably incrementing the reference count of C<val> before
-the call, and decrementing it if the function returned NULL.  
+the call, and decrementing it if the function returned NULL.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -403,7 +404,7 @@ Perl_hv_store(pTHX_ HV *hv, const char *key, U32 klen, SV *val, register U32 has
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        SvREFCNT_dec(HeVAL(entry));
        HeVAL(entry) = val;
@@ -440,7 +441,7 @@ stored within the hash (as in the case of tied hashes).  Otherwise the
 contents of the return value can be accessed using the C<He???> macros
 described here.  Note that the caller is responsible for suitably
 incrementing the reference count of C<val> before the call, and
-decrementing it if the function returned NULL. 
+decrementing it if the function returned NULL.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -504,7 +505,7 @@ Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        SvREFCNT_dec(HeVAL(entry));
        HeVAL(entry) = val;
@@ -534,7 +535,7 @@ Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
 =for apidoc hv_delete
 
 Deletes a key/value pair in the hash.  The value SV is removed from the
-hash and returned to the caller.  The C<klen> is the length of the key. 
+hash and returned to the caller.  The C<klen> is the length of the key.
 The C<flags> value will normally be zero; if set to G_DISCARD then NULL
 will be returned.
 
@@ -591,7 +592,7 @@ Perl_hv_delete(pTHX_ HV *hv, const char *key, U32 klen, I32 flags)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        *oentry = HeNEXT(entry);
        if (i && !*oentry)
@@ -633,7 +634,7 @@ Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
     register HE *entry;
     register HE **oentry;
     SV *sv;
-    
+
     if (!hv)
        return Nullsv;
     if (SvRMAGICAL(hv)) {
@@ -656,7 +657,7 @@ Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
                key = SvPV(keysv, klen);
                keysv = sv_2mortal(newSVpvn(key,klen));
                (void)strupr(SvPVX(keysv));
-               hash = 0; 
+               hash = 0;
            }
 #endif
        }
@@ -666,7 +667,7 @@ Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
        return Nullsv;
 
     key = SvPV(keysv, klen);
-    
+
     if (!hash)
        PERL_HASH(hash, key, klen);
 
@@ -678,7 +679,7 @@ Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        *oentry = HeNEXT(entry);
        if (i && !*oentry)
@@ -723,7 +724,7 @@ Perl_hv_exists(pTHX_ HV *hv, const char *key, U32 klen)
        if (mg_find((SV*)hv,'P')) {
            dTHR;
            sv = sv_newmortal();
-           mg_copy((SV*)hv, sv, key, klen); 
+           mg_copy((SV*)hv, sv, key, klen);
            magic_existspack(sv, mg_find(sv, 'p'));
            return SvTRUE(sv);
        }
@@ -738,7 +739,7 @@ Perl_hv_exists(pTHX_ HV *hv, const char *key, U32 klen)
     xhv = (XPVHV*)SvANY(hv);
 #ifndef DYNAMIC_ENV_FETCH
     if (!xhv->xhv_array)
-       return 0; 
+       return 0;
 #endif
 
     PERL_HASH(hash, key, klen);
@@ -753,7 +754,7 @@ Perl_hv_exists(pTHX_ HV *hv, const char *key, U32 klen)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        return TRUE;
     }
@@ -800,7 +801,7 @@ Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
            dTHR;               /* just for SvTRUE */
            sv = sv_newmortal();
            keysv = sv_2mortal(newSVsv(keysv));
-           mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY); 
+           mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
            magic_existspack(sv, mg_find(sv, 'p'));
            return SvTRUE(sv);
        }
@@ -809,7 +810,7 @@ Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
            key = SvPV(keysv, klen);
            keysv = sv_2mortal(newSVpvn(key,klen));
            (void)strupr(SvPVX(keysv));
-           hash = 0; 
+           hash = 0;
        }
 #endif
     }
@@ -817,7 +818,7 @@ Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
     xhv = (XPVHV*)SvANY(hv);
 #ifndef DYNAMIC_ENV_FETCH
     if (!xhv->xhv_array)
-       return 0; 
+       return 0;
 #endif
 
     key = SvPV(keysv, klen);
@@ -834,7 +835,7 @@ Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
+       if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen))        /* is this it? */
            continue;
        return TRUE;
     }
@@ -1012,9 +1013,9 @@ Perl_newHV(pTHX)
     xhv = (XPVHV*)SvANY(hv);
     SvPOK_off(hv);
     SvNOK_off(hv);
-#ifndef NODEFAULT_SHAREKEYS    
+#ifndef NODEFAULT_SHAREKEYS
     HvSHAREKEYS_on(hv);         /* key-sharing on by default */
-#endif    
+#endif
     xhv->xhv_max = 7;          /* start with 8 buckets */
     xhv->xhv_fill = 0;
     xhv->xhv_pmroot = 0;
@@ -1039,8 +1040,8 @@ Perl_newHVhv(pTHX_ HV *ohv)
 #if 0
     if (! SvTIED_mg((SV*)ohv, 'P')) {
        /* Quick way ???*/
-    } 
-    else 
+    }
+    else
 #endif
     {
        HE *entry;
@@ -1050,13 +1051,13 @@ Perl_newHVhv(pTHX_ HV *ohv)
        /* Slow way */
        hv_iterinit(ohv);
        while ((entry = hv_iternext(ohv))) {
-           hv_store(hv, HeKEY(entry), HeKLEN(entry), 
+           hv_store(hv, HeKEY(entry), HeKLEN(entry),
                     SvREFCNT_inc(HeVAL(entry)), HeHASH(entry));
        }
        HvRITER(ohv) = hv_riter;
        HvEITER(ohv) = hv_eiter;
     }
-    
+
     return hv;
 }
 
@@ -1123,7 +1124,7 @@ Perl_hv_clear(pTHX_ HV *hv)
        (void)memzero(xhv->xhv_array, (xhv->xhv_max + 1) * sizeof(HE*));
 
     if (SvRMAGICAL(hv))
-       mg_clear((SV*)hv); 
+       mg_clear((SV*)hv);
 }
 
 STATIC void
@@ -1154,7 +1155,7 @@ S_hfreeentries(pTHX_ HV *hv)
            if (++riter > max)
                break;
            entry = array[riter];
-       } 
+       }
     }
     (void)hv_iterinit(hv);
 }
@@ -1186,7 +1187,7 @@ Perl_hv_undef(pTHX_ HV *hv)
     xhv->xhv_keys = 0;
 
     if (SvRMAGICAL(hv))
-       mg_clear((SV*)hv); 
+       mg_clear((SV*)hv);
 }
 
 /*
@@ -1194,7 +1195,7 @@ Perl_hv_undef(pTHX_ HV *hv)
 
 Prepares a starting point to traverse a hash table.  Returns the number of
 keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
-currently only meaningful for hashes without tie magic. 
+currently only meaningful for hashes without tie magic.
 
 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
 hash buckets that happen to be in use.  If you still need that esoteric
@@ -1341,9 +1342,10 @@ Perl_hv_iterkeysv(pTHX_ register HE *entry)
 {
     if (HeKLEN(entry) == HEf_SVKEY)
        return sv_mortalcopy(HeKEY_sv(entry));
-    else
-       return sv_2mortal(newSVpvn((HeKLEN(entry) ? HeKEY(entry) : ""),
-                                 HeKLEN(entry)));
+    else {
+       return sv_2mortal(newSVpvn_share((HeKLEN(entry) ? HeKEY(entry) : ""),
+                                 HeKLEN(entry), HeHASH(entry)));
+    }
 }
 
 /*
@@ -1420,7 +1422,7 @@ Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
     register HE **oentry;
     register I32 i = 1;
     I32 found = 0;
-    
+
     /* what follows is the moral equivalent of:
     if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
        if (--*Svp == Nullsv)
@@ -1435,7 +1437,7 @@ Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
            continue;
        if (HeKLEN(entry) != len)
            continue;
-       if (memNE(HeKEY(entry),str,len))        /* is this it? */
+       if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
            continue;
        found = 1;
        if (--HeVAL(entry) == Nullsv) {
@@ -1449,11 +1451,11 @@ Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
        break;
     }
     UNLOCK_STRTAB_MUTEX;
-    
+
     {
         dTHR;
         if (!found && ckWARN_d(WARN_INTERNAL))
-           Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string");    
+           Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string '%s'",str);
     }
 }
 
@@ -1471,7 +1473,7 @@ Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
     I32 found = 0;
 
     /* what follows is the moral equivalent of:
-       
+
     if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
        hv_store(PL_strtab, str, len, Nullsv, hash);
     */
@@ -1484,7 +1486,7 @@ Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
            continue;
        if (HeKLEN(entry) != len)
            continue;
-       if (memNE(HeKEY(entry),str,len))        /* is this it? */
+       if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
            continue;
        found = 1;
        break;
diff --git a/hv.h b/hv.h
index 5bc38a0..08f3bed 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -7,21 +7,25 @@
  *
  */
 
+/* typedefs to eliminate some typing */
 typedef struct he HE;
 typedef struct hek HEK;
 
+/* entry in hash value chain */
 struct he {
-    HE         *hent_next;
-    HEK                *hent_hek;
-    SV         *hent_val;
+    HE         *hent_next;     /* next entry in chain */
+    HEK                *hent_hek;      /* hash key */
+    SV         *hent_val;      /* scalar value that was hashed */
 };
 
+/* hash key -- defined separately for use as shared pointer */
 struct hek {
-    U32                hek_hash;
-    I32                hek_len;
-    char       hek_key[1];
+    U32                hek_hash;       /* hash of key */
+    I32                hek_len;        /* length of hash key */
+    char       hek_key[1];     /* variable-length hash key */
 };
 
+/* hash structure: */
 /* This structure must match the beginning of struct xpvmg in sv.h. */
 struct xpvhv {
     char *     xhv_array;      /* pointer to malloced string */
@@ -38,6 +42,7 @@ struct xpvhv {
     char       *xhv_name;      /* name, if a symbol table */
 };
 
+/* hash a key */
 #define PERL_HASH(hash,str,len) \
      STMT_START        { \
        register const char *s_PeRlHaSh = str; \
@@ -171,6 +176,7 @@ C<SV*>.
 #define HEK_LEN(hek)           (hek)->hek_len
 #define HEK_KEY(hek)           (hek)->hek_key
 
+/* calculate HV array allocation */
 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
 #  define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*))
 #else
index cfbbe9f..bef35e9 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl -w
 
-# This file should really be a extracted from a .PL
+# This file should really be extracted from a .PL file
 
 use lib 'lib';         # use source library if present
 
index c9fb0fe..72c76fd 100755 (executable)
@@ -1,5 +1,6 @@
-#!./perl
+#!./perl -w
 BEGIN { @INC = ('lib') }
+use strict;
 use Config;
 use Getopt::Long;
 use File::Find;
@@ -7,40 +8,49 @@ use File::Copy;
 use File::Path qw(mkpath);
 use ExtUtils::Packlist;
 use subs qw(unlink chmod rename link);
-use vars qw($packlist);
+use vars qw($packlist @modpods);
 require Cwd;
 
 $ENV{SHELL} = 'sh' if $^O eq 'os2';
 
-$ver = $Config{version};
-$release = substr($],0,3);   # Not used presently.
-$patchlevel = substr($],3,2);
+my $ver = $Config{version};     # Not used presently.
+my $release = substr($],0,3);   # Not used presently.
+my $patchlevel = substr($],3,2);
 die "Patchlevel of perl ($patchlevel)",
     "and patchlevel of config.sh ($Config{'PERL_VERSION'}) don't match\n"
        if $patchlevel != $Config{'PERL_VERSION'};
 
-$usage =
+my $usage =
 "Usage:  installman --man1dir=/usr/wherever --man1ext=1
-                    --man3dir=/usr/wherever --man3ext=3
-                   --notify --help
+                   --man3dir=/usr/wherever --man3ext=3
+                  --notify --verbose --silent --help
        Defaults are:
        man1dir = $Config{'installman1dir'};
        man1ext = $Config{'man1ext'};
        man3dir = $Config{'installman3dir'};
        man3ext = $Config{'man3ext'};
-       --notify (or -n) just lists commands that would be executed.\n";
-
-GetOptions( qw( man1dir=s man1ext=s man3dir=s man3ext=s notify n help)) 
+       --notify  (or -n) just lists commands that would be executed.
+        --verbose (or -V) report all progress.
+        --silent  (or -S) be silent. Only report errors.\n";
+
+my %opts;
+GetOptions( \%opts,
+            qw( man1dir=s man1ext=s man3dir=s man3ext=s
+                notify n help silent S verbose V)) 
        || die $usage;
-die $usage if $opt_help;
-
-# These are written funny to avoid -w typo warnings.
-$man1dir = defined($opt_man1dir) ? $opt_man1dir : $Config{'installman1dir'};
-$man1ext = defined($opt_man1ext) ? $opt_man1ext : $Config{'man1ext'};
-$man3dir = defined($opt_man3dir) ? $opt_man3dir : $Config{'installman3dir'};
-$man3ext = defined($opt_man3ext) ? $opt_man3ext : $Config{'man3ext'};
-
-$notify = $opt_notify || $opt_n;
+die $usage if $opts{help};
+
+$opts{man1dir} = $Config{'installman1dir'}
+    unless defined($opts{man1dir}); 
+$opts{man1ext} = $Config{'man1ext'}
+    unless defined($opts{man1ext}); 
+$opts{man3dir} = $Config{'installman3dir'}
+    unless defined($opts{man3dir}); 
+$opts{man3ext} = $Config{'man3ext'}
+    unless defined($opts{man3ext}); 
+$opts{silent} ||= $opts{S};
+$opts{notify} ||= $opts{n};
+$opts{verbose} ||= $opts{V} || $opts{notify};
 
 #Sanity checks
 
@@ -55,37 +65,37 @@ $notify = $opt_notify || $opt_n;
 $packlist = ExtUtils::Packlist->new("$Config{installarchlib}/.packlist");
 
 # Install the main pod pages.
-runpod2man('pod', $man1dir, $man1ext);
+runpod2man('pod', $opts{man1dir}, $opts{man1ext});
 
 # Install the pods for library modules.
-runpod2man('lib', $man3dir, $man3ext);
+runpod2man('lib', $opts{man3dir}, $opts{man3ext});
 
 # Install the pods embedded in the installed scripts
-runpod2man('utils', $man1dir, $man1ext, 'c2ph');
-runpod2man('utils', $man1dir, $man1ext, 'h2ph');
-runpod2man('utils', $man1dir, $man1ext, 'h2xs');
-runpod2man('utils', $man1dir, $man1ext, 'perlcc');
-runpod2man('utils', $man1dir, $man1ext, 'perldoc');
-runpod2man('utils', $man1dir, $man1ext, 'perlbug');
-runpod2man('utils', $man1dir, $man1ext, 'pl2pm');
-runpod2man('utils', $man1dir, $man1ext, 'splain');
-runpod2man('utils', $man1dir, $man1ext, 'dprofpp');
-runpod2man('x2p', $man1dir, $man1ext, 's2p');
-runpod2man('x2p', $man1dir, $man1ext, 'a2p.pod');
-runpod2man('x2p', $man1dir, $man1ext, 'find2perl');
-runpod2man('pod', $man1dir, $man1ext, 'pod2man');
-runpod2man('pod', $man1dir, $man1ext, 'pod2html');
-runpod2man('pod', $man1dir, $man1ext, 'pod2text');
-runpod2man('pod', $man1dir, $man1ext, 'pod2usage');
-runpod2man('pod', $man1dir, $man1ext, 'podchecker');
-runpod2man('pod', $man1dir, $man1ext, 'podselect');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'c2ph');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'h2ph');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'h2xs');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'perlcc');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'perldoc');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'perlbug');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'pl2pm');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'splain');
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'dprofpp');
+runpod2man('x2p', $opts{man1dir}, $opts{man1ext}, 's2p');
+runpod2man('x2p', $opts{man1dir}, $opts{man1ext}, 'a2p.pod');
+runpod2man('x2p', $opts{man1dir}, $opts{man1ext}, 'find2perl');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'pod2man');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'pod2html');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'pod2text');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'pod2usage');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'podchecker');
+runpod2man('pod', $opts{man1dir}, $opts{man1ext}, 'podselect');
 
 # It would probably be better to have this page linked
 # to the c2ph man page.  Or, this one could say ".so man1/c2ph.1",
-# but then it would have to pay attention to $man1dir and $man1ext.
-runpod2man('utils', $man1dir, $man1ext, 'pstruct'); 
+# but then it would have to pay attention to $opts{man1dir} and $opts{man1ext}.
+runpod2man('utils', $opts{man1dir}, $opts{man1ext}, 'pstruct'); 
 
-runpod2man('lib/ExtUtils', $man1dir, $man1ext, 'xsubpp');
+runpod2man('lib/ExtUtils', $opts{man1dir}, $opts{man1ext}, 'xsubpp');
 
 sub runpod2man {
     # $script is script name if we are installing a manpage embedded 
@@ -99,12 +109,12 @@ sub runpod2man {
     my($builddir) = Cwd::getcwd();
 
     if ($mandir eq ' ' or $mandir eq '') {
-       print STDERR "Skipping installation of ",
+       warn "Skipping installation of ",
            ($script ? "$poddir/$script man page" : "$poddir man pages"), ".\n";
        return;
     }
 
-    print STDERR "chdir $poddir\n";
+    print "chdir $poddir\n" if $opts{verbose};
     chdir $poddir || die "Unable to cd to $poddir directory!\n$!\n";
 
     # We insist on using the current version of pod2man in case there
@@ -118,9 +128,9 @@ sub runpod2man {
     # yet. (The user may have set the $install* Configure variables 
     # to point to some temporary home, from which the executable gets
     # installed by occult means.)
-    $pod2man = "$downdir/perl -I $downdir/lib $downdir/pod/pod2man --section=$manext --official";
+    my $pod2man = "$downdir/perl -I $downdir/lib $downdir/pod/pod2man --section=$manext --official";
 
-    mkpath($mandir, 1, 0777) unless $notify;  # In File::Path
+    mkpath($mandir, $opts{verbose}, 0777) unless $opts{notify};  # In File::Path
     # Make a list of all the .pm and .pod files in the directory.  We will
     # always run pod2man from the lib directory and feed it the full pathname
     # of the pod.  This might be useful for pod2man someday.
@@ -129,10 +139,10 @@ sub runpod2man {
     }
     else {
        @modpods = ();
-       find(\&lsmodpods, '.');
+       File::Find::find(\&lsmodpods, '.');
     }
-    foreach $mod (@modpods) {
-       $manpage = $mod;
+    foreach my $mod (@modpods) {
+       my $manpage = $mod;
        my $tmp;
        # Skip .pm files that have corresponding .pod files, and Functions.pm.
        next if (($tmp = $mod) =~ s/\.pm$/.pod/ && -f $tmp);
@@ -149,18 +159,18 @@ sub runpod2man {
        }
        $tmp = "${mandir}/${manpage}.tmp";
        $manpage = "${mandir}/${manpage}.${manext}";
-       if (&cmd("$pod2man $mod > $tmp") == 0 && !$notify && -s $tmp) {
+       if (&cmd("$pod2man $mod > $tmp") == 0 && !$opts{notify} && -s $tmp) {
            if (rename($tmp, $manpage)) {
                $packlist->{$manpage} = { type => 'file' };
                next;
            }
        }
-       unless ($notify) {
+       unless ($opts{notify}) {
            unlink($tmp);
        }
     }
     chdir "$builddir" || die "Unable to cd back to $builddir directory!\n$!\n";
-    print STDERR "chdir $builddir\n";
+    print "  chdir $builddir\n" if $opts{verbose};
 }
 
 sub lsmodpods {
@@ -172,8 +182,8 @@ sub lsmodpods {
     }
 }
 
-$packlist->write() unless $notify;
-print STDERR "  Installation complete\n";
+$packlist->write() unless $opts{notify};
+print "  Installation complete\n" if $opts{verbose};
 
 exit 0;
     
@@ -182,9 +192,9 @@ exit 0;
 # Utility subroutines from installperl
 
 sub cmd {
-    local($cmd) = @_;
-    print STDERR "  $cmd\n";
-    unless ($notify) {
+    my ($cmd) = @_;
+    print "  $cmd\n" if $opts{verbose};
+    unless ($opts{notify}) {
        if ($Config{d_fork}) {
            fork ? wait : exec $cmd;  # Allow user to ^C out of command.
        }
@@ -197,15 +207,15 @@ sub cmd {
 }
 
 sub unlink {
-    local(@names) = @_;
+    my(@names) = @_;
     my $cnt = 0;
 
-    foreach $name (@names) {
+    foreach my $name (@names) {
        next unless -e $name;
        chmod 0777, $name if $^O eq 'os2';
-       print STDERR "  unlink $name\n";
+       print "  unlink $name\n" if $opts{verbose};
        ( CORE::unlink($name) and ++$cnt 
-           or warn "Couldn't unlink $name: $!\n" ) unless $notify;
+           or warn "Couldn't unlink $name: $!\n" ) unless $opts{notify};
     }
     return $cnt;
 }
@@ -214,26 +224,26 @@ sub link {
     my($from,$to) = @_;
     my($success) = 0;
 
-    print STDERR "  ln $from $to\n";
+    print $opts{verbose} ? "  ln $from $to\n" : "  $to\n" unless $opts{silent};
     eval {
         CORE::link($from, $to)
             ? $success++
             : ($from =~ m#^/afs/# || $to =~ m#^/afs/#)
               ? die "AFS"  # okay inside eval {}
               : warn "Couldn't link $from to $to: $!\n"
-          unless $notify;
+          unless $opts{notify};
     };
     if ($@) {
         File::Copy::copy($from, $to)
             ? $success++
             : warn "Couldn't copy $from to $to: $!\n"
-          unless $notify;
+          unless $opts{notify};
     }
     $success;
 }
 
 sub rename {
-    local($from,$to) = @_;
+    my($from,$to) = @_;
     if (-f $to and not unlink($to)) {
        my($i);
        for ($i = 1; $i < 50; $i++) {
@@ -247,16 +257,16 @@ sub rename {
 }
 
 sub chmod {
-    local($mode,$name) = @_;
+    my($mode,$name) = @_;
 
-    printf STDERR "  chmod %o %s\n", $mode, $name;
+    printf "  chmod %o %s\n", $mode, $name if $opts{verbose};
     CORE::chmod($mode,$name) || warn sprintf("Couldn't chmod %o %s: $!\n",$mode,$name)
-       unless $notify;
+       unless $opts{notify};
 }
 
 sub samepath {
-    local($p1, $p2) = @_;
-    local($dev1, $ino1, $dev2, $ino2);
+    my($p1, $p2) = @_;
+    my($dev1, $ino1, $dev2, $ino2);
 
     if ($p1 ne $p2) {
        ($dev1, $ino1) = stat($p1);
index f296712..99d376f 100755 (executable)
@@ -8,7 +8,9 @@ BEGIN {
 }
 
 use strict;
-use vars qw($Is_VMS $Is_W32 $Is_OS2 $Is_Cygwin $nonono $dostrip $versiononly $depth);
+my ($Is_VMS, $Is_W32, $Is_OS2, $Is_Cygwin, $nonono, $dostrip,
+    $versiononly, $silent, $verbose, $otherperls);
+use vars qw /$depth/;
 
 BEGIN {
     $Is_VMS = $^O eq 'VMS';
@@ -27,7 +29,6 @@ use File::Path ();
 use ExtUtils::Packlist;
 use Config;
 use subs qw(unlink link chmod);
-use vars qw($packlist);
 
 # override the ones in the rest of the script
 sub mkpath {
@@ -48,13 +49,19 @@ my $perl_verbase = defined($ENV{PERLNAME_VERBASE})
                    ? $ENV{PERLNAME_VERBASE}
                    : $perl;
 
+$otherperls = 1;
 while (@ARGV) {
     $nonono = 1 if $ARGV[0] eq '-n';
     $dostrip = 1 if $ARGV[0] eq '-s';
     $versiononly = 1 if $ARGV[0] eq '-v';
+    $silent = 1 if $ARGV[0] eq '-S';
+    $otherperls = 0 if $ARGV[0] eq '-o';
+    $verbose = 1 if $ARGV[0] eq '-V' || $ARGV [0] eq '-n';
     shift;
 }
 
+$versiononly = 1 if $Config{versiononly};
+
 my @scripts = qw(utils/c2ph utils/h2ph utils/h2xs utils/perlbug utils/perldoc
                utils/pl2pm utils/splain utils/perlcc utils/dprofpp
                x2p/s2p x2p/find2perl 
@@ -146,7 +153,7 @@ if ($Is_VMS) {  # Hang in there until File::Spec hits the big time
 if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 
    $installbin         || die "No installbin directory in config.sh\n";
--d $installbin         || mkpath($installbin, 1, 0777);
+-d $installbin         || mkpath($installbin, $verbose, 0777);
 -d $installbin         || $nonono || die "$installbin is not a directory\n";
 -w $installbin         || $nonono || die "$installbin is not writable by you\n"
        unless $installbin =~ m#^/afs/# || $nonono;
@@ -154,36 +161,36 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 -x 'perl' . $exe_ext   || die "perl isn't executable!\n";
 -x 'suidperl' . $exe_ext|| die "suidperl isn't executable!\n" if $d_dosuid;
 
--x 't/TEST'            || $Is_W32
+-f 't/rantests'                || $Is_W32
                        || warn "WARNING: You've never run 'make test'!!!",
                                "  (Installing anyway.)\n";
 
 if ($Is_W32 or $Is_Cygwin) {
   my $perldll;
 
-if ($Is_Cygwin) {
-  $perldll = $libperl;
-  $perldll =~ s/(\..*)?$/.$dlext/;
-  if ($Config{useshrplib} eq 'true') {
-    # install ld2 and perlld as well
-    foreach ('ld2', 'perlld') {
-      safe_unlink("$installbin/$_");
-      copy("$_", "$installbin/$_");
-      chmod(0755, "$installbin/$_");
+  if ($Is_Cygwin) {
+    $perldll = $libperl;
+    $perldll =~ s/(\..*)?$/.$dlext/;
+    if ($Config{useshrplib} eq 'true') {
+      # install ld2 and perlld as well
+      foreach ('ld2', 'perlld') {
+        safe_unlink("$installbin/$_");
+        copy("$_", "$installbin/$_");
+        chmod(0755, "$installbin/$_");
+      };
     };
-  };
-} else {
-  $perldll = 'perl56.' . $dlext;
-}
-
-   if ($dlsrc ne "dl_none.xs") {
-      -f $perldll || die "No perl DLL built\n";
-   }
-# Install the DLL
-
-   safe_unlink("$installbin/$perldll");
-   copy("$perldll", "$installbin/$perldll");
-   chmod(0755, "$installbin/$perldll");
+  } else {
+    $perldll = 'perl56.' . $dlext;
+  }
+
+  if ($dlsrc ne "dl_none.xs") {
+    -f $perldll || die "No perl DLL built\n";
+  }
+  # Install the DLL
+
+  safe_unlink("$installbin/$perldll");
+  copy("$perldll", "$installbin/$perldll");
+  chmod(0755, "$installbin/$perldll");
    
 } # if ($Is_W32 or $Is_Cygwin)
 
@@ -231,10 +238,10 @@ if ($d_dosuid) {
 
 my ($do_installarchlib, $do_installprivlib) = (0, 0);
     
-mkpath($installprivlib, 1, 0777);
-mkpath($installarchlib, 1, 0777);
-mkpath($installsitelib, 1, 0777) if ($installsitelib);
-mkpath($installsitearch, 1, 0777) if ($installsitearch);
+mkpath($installprivlib, $verbose, 0777);
+mkpath($installarchlib, $verbose, 0777);
+mkpath($installsitelib, $verbose, 0777) if ($installsitelib);
+mkpath($installsitearch, $verbose, 0777) if ($installsitearch);
 
 if (chdir "lib") {
     $do_installarchlib = ! samepath($installarchlib, '.');
@@ -251,7 +258,7 @@ else {
 }
 
 # Install header files and libraries.
-mkpath("$installarchlib/CORE", 1, 0777);
+mkpath("$installarchlib/CORE", $verbose, 0777);
 my @corefiles;
 if ($Is_VMS) {  # We did core file selection during build
     my $coredir = "lib/$Config{archname}/$ver/CORE";
@@ -266,7 +273,7 @@ else {
     push(@corefiles,'perl.exp') if $^O eq 'aix';
     if ($^O eq 'mpeix') {
         # MPE needs mpeixish.h installed as well.
-        mkpath("$installarchlib/CORE/mpeix", 1, 0777);
+        mkpath("$installarchlib/CORE/mpeix", $verbose, 0777);
         push(@corefiles,'mpeix/mpeixish.h');
     }
     # If they have built sperl.o...
@@ -359,26 +366,25 @@ if (! $versiononly && (-f 'cppstdin') && (! samepath($installbin, '.'))) {
     chmod(0755, "$installbin/cppstdin");
 }
 
-# Install scripts.
+if (! $versiononly) {
+    # Install scripts.
 
-mkpath($installscript, 1, 0777);
+    mkpath($installscript, $verbose, 0777);
 
-if (! $versiononly) {
     for (@scripts) {
        (my $base = $_) =~ s#.*/##;
        copy($_, "$installscript/$base");
        chmod(0755, "$installscript/$base");
     }
-}
 
-# pstruct should be a link to c2ph
-
-if (! $versiononly) {
+    # pstruct should be a link to c2ph
     safe_unlink("$installscript/pstruct$scr_ext");
     if ($^O eq 'dos' or $Is_VMS or $^O eq 'transit') {
-        copy("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext"); 
+       copy("$installscript/c2ph$scr_ext",
+            "$installscript/pstruct$scr_ext"); 
     } else {
-        link("$installscript/c2ph$scr_ext", "$installscript/pstruct$scr_ext");
+       link("$installscript/c2ph$scr_ext",
+            "$installscript/pstruct$scr_ext");
     }
 }
 
@@ -386,8 +392,8 @@ if (! $versiononly) {
 # ($installprivlib/pods for cygwin).
 
 my $pod = $Is_Cygwin ? 'pods' : 'pod';
-unless ( $versiononly && !($installprivlib =~ m/\Q$ver/)) {
-    mkpath("${installprivlib}/$pod", 1, 0777);
+if ( !$versiononly || ($installprivlib =~ m/\Q$ver/)) {
+    mkpath("${installprivlib}/$pod", $verbose, 0777);
 
     # If Perl 5.003's perldiag.pod is there, rename it.
     if (open POD, "${installprivlib}/$pod/perldiag.pod") {
@@ -418,7 +424,7 @@ unless ( $versiononly && !($installprivlib =~ m/\Q$ver/)) {
 # Also skip $mainperl if the user opted to have it be a link to the
 # installed perl.
 
-if (!$versiononly) {
+if (!$versiononly && $otherperls) {
     my ($path, @path);
     my $dirsep = ($Is_OS2 || $Is_W32) ? ';' : ':' ;
     ($path = $ENV{"PATH"}) =~ s:\\:/:g ;
@@ -444,18 +450,18 @@ if (!$versiononly) {
            if (-x $otherperl && ! -d $otherperl);
     }
     if (@otherperls) {
-       print STDERR "\nWarning: $perl appears in your path in the following " .
+       warn "\nWarning: $perl appears in your path in the following " .
            "locations beyond where\nwe just installed it:\n";
        for (@otherperls) {
-           print STDERR "    ", $_, "\n";
+           warn "    ", $_, "\n";
        }
-       print STDERR "\n";
+       warn "\n";
     }
 
 }
 
 $packlist->write() unless $nonono;
-print "  Installation complete\n";
+print "  Installation complete\n" if $verbose;
 
 exit 0;
 
@@ -465,7 +471,7 @@ sub yn {
     my($prompt) = @_;
     my($answer);
     my($default) = $prompt =~ m/\[([yn])\]\s*$/i;
-    print STDERR $prompt;
+    warn $prompt;
     chop($answer = <STDIN>);
     $answer = $default if $answer =~ m/^\s*$/;
     ($answer =~ m/^[yY]/);
@@ -480,7 +486,7 @@ sub unlink {
     foreach my $name (@names) {
        next unless -e $name;
        chmod 0777, $name if ($Is_OS2 || $Is_W32 || $Is_Cygwin);
-       print "  unlink $name\n";
+       print "  unlink $name\n" if $verbose;
        ( CORE::unlink($name) and ++$cnt 
          or warn "Couldn't unlink $name: $!\n" ) unless $nonono;
     }
@@ -493,11 +499,11 @@ sub safe_unlink {
     foreach my $name (@names) {
        next unless -e $name;
        chmod 0777, $name if ($Is_OS2 || $Is_W32);
-       print "  unlink $name\n";
+       print "  unlink $name\n" if $verbose;
        next if CORE::unlink($name);
        warn "Couldn't unlink $name: $!\n";
        if ($! =~ /busy/i) {
-           print "  mv $name $name.old\n";
+           print "  mv $name $name.old\n" if $verbose;
            safe_rename($name, "$name.old")
                or warn "Couldn't rename $name: $!\n";
        }
@@ -522,7 +528,7 @@ sub link {
     my($from,$to) = @_;
     my($success) = 0;
 
-    print "  ln $from $to\n";
+    print $verbose ? "  ln $from $to\n" : "  $to\n" unless $silent;
     eval {
        CORE::link($from, $to)
            ? $success++
@@ -534,8 +540,9 @@ sub link {
     };
     if ($@) {
        warn $@;
-       print "  cp $from $to\n";
-       print "  creating new version of $to\n" if $Is_VMS and -e $to;
+        print $verbose ? "  cp $from $to\n" : "  $to\n" unless $silent;
+       print "  creating new version of $to\n"
+                 if $Is_VMS and -e $to and !$silent;
        File::Copy::copy($from, $to)
            ? $success++
            : warn "Couldn't copy $from to $to: $!\n"
@@ -549,7 +556,7 @@ sub chmod {
     my($mode,$name) = @_;
 
     return if ($^O eq 'dos');
-    printf "  chmod %o %s\n", $mode, $name;
+    printf "  chmod %o %s\n", $mode, $name if $verbose;
     CORE::chmod($mode,$name)
        || warn sprintf("Couldn't chmod %o %s: $!\n", $mode, $name)
       unless $nonono;
@@ -558,8 +565,8 @@ sub chmod {
 sub copy {
     my($from,$to) = @_;
 
-    print "  cp $from $to\n";
-    print "  creating new version of $to\n" if $Is_VMS and -e $to;
+    print $verbose ? "  cp $from $to\n" : "  $to\n" unless $silent;
+    print "  creating new version of $to\n" if $Is_VMS and -e $to and !$silent;
     File::Copy::copy($from, $to)
        || warn "Couldn't copy $from to $to: $!\n"
       unless $nonono;
@@ -624,7 +631,7 @@ sub installlib {
         $packlist->{"$installlib/$name"} = { type => 'file' };
        if (compare($_, "$installlib/$name") || $nonono) {
            unlink("$installlib/$name");
-           mkpath("$installlib/$dir", 1, 0777);
+           mkpath("$installlib/$dir", $verbose, 0777);
            # HP-UX (at least) needs to maintain execute permissions
            # on dynamically-loaded libraries.
            copy_if_diff($_, "$installlib/$name")
@@ -677,10 +684,10 @@ sub strip
 
     foreach my $file (@args) {
         if (-f $file) {
-            print "  strip $file\n";
+            print "  strip $file\n" if $verbose;
             system("strip", @opts, $file);
         } else {
-            print "# file '$file' skipped\n";
+            print "# file '$file' skipped\n" if $verbose;
         }
     }
 }
index f84de79..07ec33e 100644 (file)
@@ -443,6 +443,7 @@ PERLVAR(IProc,              struct IPerlProc*)
 #if defined(USE_ITHREADS)
 PERLVAR(Iptr_table,    PTR_TBL_t*)
 #endif
+PERLVARI(Ibeginav_save, AV*, Nullav)   /* save BEGIN{}s when compiling */
 
 #ifdef USE_THREADS
 PERLVAR(Ifdpid_mutex,  perl_mutex)     /* mutex for fdpid array */
index 57f52c4..66da2ec 100644 (file)
@@ -224,8 +224,7 @@ Information on accessing the bleeding edge JPL via CVS can be found at:
 More Info
 ---------
 
-You can look at the Sample and Test directories, as well as the ../eg
-directory for examples.
+You can look at the Sample and Test directories.
 
 Perhaps the most important bit of advice we can give you is to watch
 
index c26db72..af33ee8 100644 (file)
@@ -4,6 +4,7 @@ use 5.005_64;
 our(@EXPORT, @EXPORT_OK, $VERSION);
 
 my $is_dosish;
+my $is_epoc;
 my $is_vms;
 
 BEGIN {
@@ -11,6 +12,7 @@ BEGIN {
     @EXPORT = @EXPORT = ();
     @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD);
     $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32';
+    $is_epoc = $^O eq 'epoc';
     $is_vms = $^O eq 'VMS';
     $VERSION = '5.57';
 }
@@ -51,7 +53,11 @@ AUTOLOAD {
                             $filename = "./$filename";
                        }
                    }
-                   elsif ($is_vms) {
+                   elsif ($is_epoc) {
+                       unless ($filename =~ m{^([a-z?]:)?[\\/]}is) {
+                            $filename = "./$filename";
+                       }
+                   }elsif ($is_vms) {
                        # XXX todo by VMSmiths
                        $filename = "./$filename";
                    }
index 3c10a5b..b557be3 100644 (file)
@@ -552,7 +552,9 @@ sub countit {
        # accuracy since we're not couting these times.
        $n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation.
        my $td = timeit($n, $code);
-       $tc = $td->[1] + $td->[2];
+       my $new_tc = $td->[1] + $td->[2];
+        # Make sure we are making progress.
+        $tc = $new_tc > 1.2 * $tc ? $new_tc : 1.2 * $tc;
     }
 
     # Now, do the 'for real' timing(s), repeating until we exceed
@@ -581,6 +583,7 @@ sub countit {
        $ttot = $utot + $stot;
        last if $ttot >= $tmax;
 
+        $ttot = 0.01 if $ttot < 0.01;
        my $r = $tmax / $ttot - 1; # Linear approximation.
        $n = int( $r * $ntot );
        $n = $nmin if $n < $nmin;
index 6380554..fd06f64 100644 (file)
@@ -17,18 +17,24 @@ require 5.004;
 # The most recent version and complete docs are available at:
 #   http://stein.cshl.org/WWW/software/CGI/
 
-$CGI::revision = '$Id: CGI.pm,v 1.30 2000/03/28 21:31:40 lstein Exp $';
-$CGI::VERSION='2.66';
+$CGI::revision = '$Id: CGI.pm,v 1.45 2000/09/13 02:55:41 lstein Exp $';
+$CGI::VERSION='2.74';
 
 # HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
 # UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
 # $TempFile::TMPDIRECTORY = '/usr/tmp';
 use CGI::Util qw(rearrange make_attributes unescape escape expires);
 
+use constant XHTML_DTD => ['-//W3C//DTD XHTML 1.0 Transitional//EN',
+                          'DTD/xhtml1-transitional.dtd'];
+
 # >>>>> Here are some globals that you might want to adjust <<<<<<
 sub initialize_globals {
     # Set this to 1 to enable copious autoloader debugging messages
     $AUTOLOAD_DEBUG = 0;
+    
+    # Set this to 1 to generate XTML-compatible output
+    $XHTML = 1;
 
     # Change this to the preferred DTD to print in start_html()
     # or use default_dtd('text of DTD to use');
@@ -80,6 +86,8 @@ sub initialize_globals {
     $BEEN_THERE = 0;
     undef @QUERY_PARAM;
     undef %EXPORT;
+    undef $QUERY_CHARSET;
+    undef %QUERY_FIELDNAMES;
 
     # prevent complaints by mod_perl
     1;
@@ -344,10 +352,12 @@ sub init {
     # if we get called more than once, we want to initialize
     # ourselves from the original query (which may be gone
     # if it was read from STDIN originally.)
-    if (@QUERY_PARAM && !defined($initializer)) {
+    if (defined(@QUERY_PARAM) && !defined($initializer)) {
        foreach (@QUERY_PARAM) {
            $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_});
        }
+       $self->charset($QUERY_CHARSET);
+       $self->{'.fieldnames'} = {%QUERY_FIELDNAMES};
        return;
     }
 
@@ -356,6 +366,9 @@ sub init {
 
     $fh = to_filehandle($initializer) if $initializer;
 
+    # set charset to the safe ISO-8859-1
+    $self->charset('ISO-8859-1');
+
   METHOD: {
 
       # avoid unreasonably large postings
@@ -468,8 +481,6 @@ sub init {
     $self->delete('.submit');
     $self->delete('.cgifields');
 
-    # set charset to the safe ISO-8859-1
-    $self->charset('ISO-8859-1');
     $self->save_request unless $initializer;
 }
 
@@ -519,6 +530,8 @@ sub save_request {
       next unless defined $_;
       $QUERY_PARAM{$_}=$self->{$_};
     }
+    $QUERY_CHARSET = $self->charset;
+    %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}};
 }
 
 sub parse_params {
@@ -569,13 +582,13 @@ sub _make_tag_func {
            }
        );
     if ($tagname=~/start_(\w+)/i) {
-       $func .= qq! return "<\U$1\E\$attr>";} !;
+       $func .= qq! return "<\L$1\E\$attr>";} !;
     } elsif ($tagname=~/end_(\w+)/i) {
-       $func .= qq! return "<\U/$1\E>"; } !;
+       $func .= qq! return "<\L/$1\E>"; } !;
     } else {
        $func .= qq#
-           my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U</$tagname>\E");
-           return \$tag unless \@_;
+           return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@_;
+           my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
            my \@result = map { "\$tag\$_\$untag" } 
                               (ref(\$_[0]) eq 'ARRAY') ? \@{\$_[0]} : "\@_";
            return "\@result";
@@ -644,6 +657,8 @@ sub _setup_symbols {
        $DEBUG=0,                next if /^[:-]no_?[Dd]ebug$/;
        $DEBUG=2,                next if /^[:-][Dd]ebug$/;
        $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/;
+       $XHTML++,                next if /^[:-]xhtml$/;
+       $XHTML=0,                next if /^[:-]no_?xhtml$/;
        $USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/;
        $PRIVATE_TEMPFILES++,    next if /^[:-]private_tempfiles$/;
        $EXPORT{$_}++,           next if /^[:-]any$/;
@@ -717,7 +732,8 @@ END_OF_FUNC
 # Deletes the named parameter entirely.
 ####
 sub delete {
-    my($self,$name) = self_or_default(@_);
+    my($self,@p) = self_or_default(@_);
+    my($name) = rearrange([NAME],@p);
     CORE::delete $self->{$name};
     CORE::delete $self->{'.fieldnames'}->{$name};
     @{$self->{'.parameters'}}=grep($_ ne $name,$self->param());
@@ -851,7 +867,8 @@ END_OF_FUNC
 sub STORE {
     my $self = shift;
     my $tag  = shift;
-    my @vals = split("\0",shift);
+    my $vals = shift;
+    my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals;
     $self->param(-name=>$tag,-value=>\@vals);
 }
 END_OF_FUNC
@@ -1042,6 +1059,9 @@ sub save {
            print $filehandle "$escaped_param=",escape("$value"),"\n";
        }
     }
+    foreach (keys %{$self->{'.fieldnames'}}) {
+          print $filehandle ".cgifields=",escape("$_"),"\n";
+    }
     print $filehandle "=\n";    # end of record
 }
 END_OF_FUNC
@@ -1135,10 +1155,11 @@ sub header {
 
     return undef if $self->{'.header_printed'}++ and $HEADERS_ONCE;
 
-    my($type,$status,$cookie,$target,$expires,$nph,$charset,@other) = 
+    my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,@other) = 
        rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'],
                            'STATUS',['COOKIE','COOKIES'],'TARGET',
-                            'EXPIRES','NPH','CHARSET'],@p);
+                            'EXPIRES','NPH','CHARSET',
+                            'ATTACHMENT'],@p);
 
     $nph     ||= $NPH;
     if (defined $charset) {
@@ -1151,11 +1172,11 @@ sub header {
     # need to fix it up a little.
     foreach (@other) {
         next unless my($header,$value) = /([^\s=]+)=\"?(.+?)\"?$/;
-       ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ": $value"/e;
+       ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
     }
 
     $type ||= 'text/html' unless defined($type);
-    $type .= "; charset=$charset" if $type ne '' and $type !~ /\bcharset\b/;
+    $type .= "; charset=$charset" if $type ne '' and $type =~ m!^text/! and $type !~ /\bcharset\b/;
 
     # Maybe future compatibility.  Maybe not.
     my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0';
@@ -1178,6 +1199,7 @@ sub header {
        if $expires;
     push(@header,"Date: " . expires(0,'http')) if $expires || $cookie;
     push(@header,"Pragma: no-cache") if $self->cache();
+    push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment;
     push(@header,@other);
     push(@header,"Content-Type: $type") if $type ne '';
 
@@ -1216,7 +1238,7 @@ END_OF_FUNC
 sub redirect {
     my($self,@p) = self_or_default(@_);
     my($url,$target,$cookie,$nph,@other) = rearrange([[LOCATION,URI,URL],TARGET,COOKIE,NPH],@p);
-    $url = $url || $self->self_url;
+    $url ||= $self->self_url;
     my(@o);
     foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
     unshift(@o,
@@ -1253,39 +1275,45 @@ END_OF_FUNC
 'start_html' => <<'END_OF_FUNC',
 sub start_html {
     my($self,@p) = &self_or_default(@_);
-    my($title,$author,$base,$xbase,$script,$noscript,$target,$meta,$head,$style,$dtd,@other) = 
-       rearrange([TITLE,AUTHOR,BASE,XBASE,SCRIPT,NOSCRIPT,TARGET,META,HEAD,STYLE,DTD],@p);
+    my($title,$author,$base,$xbase,$script,$noscript,$target,$meta,$head,$style,$dtd,$lang,@other) = 
+       rearrange([TITLE,AUTHOR,BASE,XBASE,SCRIPT,NOSCRIPT,TARGET,META,HEAD,STYLE,DTD,LANG],@p);
 
     # strangely enough, the title needs to be escaped as HTML
     # while the author needs to be escaped as a URL
     $title = $self->escapeHTML($title || 'Untitled Document');
     $author = $self->escape($author);
+    $lang ||= 'en-US';
     my(@result);
     if ($dtd) {
-        if (ref $dtd && $ref eq 'ARRAY') {
+        if (defined(ref($dtd)) and (ref($dtd) eq 'ARRAY')) {
             $dtd = $DEFAULT_DTD unless $dtd->[0] =~ m|^-//|;
         } else {
             $dtd = $DEFAULT_DTD unless $dtd =~ m|^-//|;
         }
     } else {
-        $dtd = $DEFAULT_DTD;
+        $dtd = $XHTML ? XHTML_DTD : $DEFAULT_DTD;
     }
     if (ref($dtd) && ref($dtd) eq 'ARRAY') {
-        push(@result,qq(<!DOCTYPE HTML PUBLIC "$dtd->[0]"\n\t"$dtd->[1]">));
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd->[0]"\n\t"$dtd->[1]">));
     } else {
-        push(@result,qq(<!DOCTYPE HTML PUBLIC "$dtd">));
+        push(@result,qq(<!DOCTYPE html\n\tPUBLIC "$dtd">));
     }
-    push(@result,"<HTML><HEAD><TITLE>$title</TITLE>");
-    push(@result,"<LINK REV=MADE HREF=\"mailto:$author\">") if defined $author;
+    push(@result,$XHTML ? qq(<html xmlns="http://www.w3.org/1999/xhtml" lang="$lang"><head><title>$title</title>)
+                        : qq(<html lang="$lang"><head><title>$title</title>));
+       if (defined $author) {
+    push(@result,$XHTML ? "<link rev=\"made\" href=\"mailto:$author\" />"
+                                                               : "<link rev=\"made\" href=\"mailto:$author\">");
+       }
 
     if ($base || $xbase || $target) {
        my $href = $xbase || $self->url('-path'=>1);
-       my $t = $target ? qq/ TARGET="$target"/ : '';
-       push(@result,qq/<BASE HREF="$href"$t>/);
+       my $t = $target ? qq/ target="$target"/ : '';
+       push(@result,$XHTML ? qq(<base href="$href"$t />) : qq(<base href="$href"$t>));
     }
 
     if ($meta && ref($meta) && (ref($meta) eq 'HASH')) {
-       foreach (keys %$meta) { push(@result,qq(<META NAME="$_" CONTENT="$meta->{$_}">)); }
+       foreach (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />) 
+                       : qq(<meta name="$_" content="$meta->{$_}">)); }
     }
 
     push(@result,ref($head) ? @$head : $head) if $head;
@@ -1296,13 +1324,13 @@ sub start_html {
 
     # handle -noscript parameter
     push(@result,<<END) if $noscript;
-<NOSCRIPT>
+<noscript>
 $noscript
-</NOSCRIPT>
+</noscript>
 END
     ;
     my($other) = @other ? " @other" : '';
-    push(@result,"</HEAD><BODY$other>");
+    push(@result,"</head><body$other>");
     return join("\n",@result);
 }
 END_OF_FUNC
@@ -1315,26 +1343,40 @@ sub _style {
     my ($self,$style) = @_;
     my (@result);
     my $type = 'text/css';
+
+    my $cdata_start = $XHTML ? "\n<!--/* <![CDATA[ */" : "\n<!-- ";
+    my $cdata_end   = $XHTML ? "\n/* ]]> */-->\n" : " -->\n";
+
     if (ref($style)) {
-       my($src,$code,$stype,@other) =
-           rearrange([SRC,CODE,TYPE],
-                            '-foo'=>'bar',     # a trick to allow the '-' to be omitted
-                            ref($style) eq 'ARRAY' ? @$style : %$style);
-       $type = $stype if $stype;
-       push(@result,qq/<LINK REL="stylesheet" TYPE="$type" HREF="$src">/) if $src;
-       push(@result,style({'type'=>$type},"<!--\n$code\n-->")) if $code;
+     my($src,$code,$stype,@other) =
+         rearrange([SRC,CODE,TYPE],
+                    '-foo'=>'bar', # a trick to allow the '-' to be omitted
+                    ref($style) eq 'ARRAY' ? @$style : %$style);
+     $type = $stype if $stype;
+     if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference
+     { # If it is, push a LINK tag for each one.
+       foreach $src (@$src)
+       {
+         push(@result,qq/<link rel="stylesheet" type="$type" href="$src">/) if $src;
+       }
+     }
+     else
+     { # Otherwise, push the single -src, if it exists.
+       push(@result,qq/<link rel="stylesheet" type="$type" href="$src">/) if $src;
+      }
+     push(@result,style({'type'=>$type},"$cdata_start\n$code\n$cdata_end")) if $code;
     } else {
-       push(@result,style({'type'=>$type},"<!--\n$style\n-->"));
+     push(@result,style({'type'=>$type},"$cdata_start\n$style\n$cdata_end"));
     }
     @result;
 }
 END_OF_FUNC
 
-
 '_script' => <<'END_OF_FUNC',
 sub _script {
     my ($self,$script) = @_;
     my (@result);
+
     my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script);
     foreach $script (@scripts) {
        my($src,$code,$language);
@@ -1353,18 +1395,21 @@ sub _script {
        } else {
            ($src,$code,$language, $type) = ('',$script,'JavaScript', 'text/javascript');
        }
+
+    my $comment = '//';  # javascript by default
+    $comment = '#' if $type=~/perl|tcl/i;
+    $comment = "'" if $type=~/vbscript/i;
+
+    my $cdata_start  =  "\n<!-- Hide script\n";
+    $cdata_start    .= "$comment<![CDATA[\n"  if $XHTML; 
+    my $cdata_end    = $XHTML ? "\n$comment]]>" : $comment;
+    $cdata_end      .= " End script hiding -->\n";
+
        my(@satts);
        push(@satts,'src'=>$src) if $src;
        push(@satts,'language'=>$language);
         push(@satts,'type'=>$type);
-       $code = "<!-- Hide script\n$code\n// End script hiding -->"
-           if $code && $type=~/javascript/i;
-       $code = "<!-- Hide script\n$code\n\# End script hiding -->"
-           if $code && $type=~/perl/i;
-       $code = "<!-- Hide script\n$code\n\# End script hiding -->"
-           if $code && $type=~/tcl/i;
-        $code = "<!-- Hide script\n$code\n' End script hiding -->"
-            if $code && $type=~/vbscript/i;
+       $code = "$cdata_start$code$cdata_end";
        push(@result,script({@satts},$code || ''));
     }
     @result;
@@ -1377,7 +1422,7 @@ END_OF_FUNC
 ####
 'end_html' => <<'END_OF_FUNC',
 sub end_html {
-    return "</BODY></HTML>";
+    return "</body></html>";
 }
 END_OF_FUNC
 
@@ -1396,9 +1441,9 @@ END_OF_FUNC
 sub isindex {
     my($self,@p) = self_or_default(@_);
     my($action,@other) = rearrange([ACTION],@p);
-    $action = qq/ACTION="$action"/ if $action;
+    $action = qq/action="$action"/ if $action;
     my($other) = @other ? " @other" : '';
-    return "<ISINDEX $action$other>";
+    return $XHTML ? "<isindex $action$other />" : "<isindex $action$other>";
 }
 END_OF_FUNC
 
@@ -1416,13 +1461,16 @@ sub startform {
     my($method,$action,$enctype,@other) = 
        rearrange([METHOD,ACTION,ENCTYPE],@p);
 
-    $method = $method || 'POST';
+    $method = lc($method) || 'post';
     $enctype = $enctype || &URL_ENCODED;
-    $action = $action ? qq/ACTION="$action"/ : $method eq 'GET' ?
-       'ACTION="'.$self->script_name.'"' : '';
+    unless (defined $action) {
+       $action = $self->url(-absolute=>1,-path=>1);
+       $action .= "?$ENV{QUERY_STRING}" if $ENV{QUERY_STRING};
+    }
+    $action = qq(action="$action");
     my($other) = @other ? " @other" : '';
     $self->{'.parametersToAdd'}={};
-    return qq/<FORM METHOD="$method" $action ENCTYPE="$enctype"$other>\n/;
+    return qq/<form method="$method" $action enctype="$enctype"$other>\n/;
 }
 END_OF_FUNC
 
@@ -1465,10 +1513,10 @@ END_OF_FUNC
 sub endform {
     my($self,@p) = self_or_default(@_);    
     if ( $NOSTICKY ) {
-    return wantarray ? ("</FORM>") : "\n</FORM>";
+    return wantarray ? ("</form>") : "\n</form>";
     } else {
-    return wantarray ? ($self->get_fields,"</FORM>") : 
-                        $self->get_fields ."\n</FORM>";
+    return wantarray ? ($self->get_fields,"</form>") : 
+                        $self->get_fields ."\n</form>";
     }
 }
 END_OF_FUNC
@@ -1492,15 +1540,16 @@ sub _textfield {
     my $current = $override ? $default : 
        (defined($self->param($name)) ? $self->param($name) : $default);
 
-    $current = defined($current) ? $self->escapeHTML($current) : '';
+    $current = defined($current) ? $self->escapeHTML($current,1) : '';
     $name = defined($name) ? $self->escapeHTML($name) : '';
-    my($s) = defined($size) ? qq/ SIZE=$size/ : '';
-    my($m) = defined($maxlength) ? qq/ MAXLENGTH=$maxlength/ : '';
+    my($s) = defined($size) ? qq/ size=$size/ : '';
+    my($m) = defined($maxlength) ? qq/ maxlength=$maxlength/ : '';
     my($other) = @other ? " @other" : '';
     # this entered at cristy's request to fix problems with file upload fields
     # and WebTV -- not sure it won't break stuff
-    my($value) = $current ne '' ? qq(VALUE="$current") : '';
-    return qq/<INPUT TYPE="$tag" NAME="$name" $value$s$m$other>/;
+    my($value) = $current ne '' ? qq(value="$current") : '';
+    return $XHTML ? qq(<input type="$tag" name="$name" $value$s$m$other />) 
+                  : qq/<input type="$tag" name="$name" $value$s$m$other>/;
 }
 END_OF_FUNC
 
@@ -1578,10 +1627,10 @@ sub textarea {
 
     $name = defined($name) ? $self->escapeHTML($name) : '';
     $current = defined($current) ? $self->escapeHTML($current) : '';
-    my($r) = $rows ? " ROWS=$rows" : '';
-    my($c) = $cols ? " COLS=$cols" : '';
+    my($r) = $rows ? " rows=$rows" : '';
+    my($c) = $cols ? " cols=$cols" : '';
     my($other) = @other ? " @other" : '';
-    return qq{<TEXTAREA NAME="$name"$r$c$other>$current</TEXTAREA>};
+    return qq{<textarea name="$name"$r$c$other>$current</textarea>};
 }
 END_OF_FUNC
 
@@ -1604,17 +1653,18 @@ sub button {
                                                         [ONCLICK,SCRIPT]],@p);
 
     $label=$self->escapeHTML($label);
-    $value=$self->escapeHTML($value);
+    $value=$self->escapeHTML($value,1);
     $script=$self->escapeHTML($script);
 
     my($name) = '';
     $name = qq/ NAME="$label"/ if $label;
     $value = $value || $label;
     my($val) = '';
-    $val = qq/ VALUE="$value"/ if $value;
-    $script = qq/ ONCLICK="$script"/ if $script;
+    $val = qq/ value="$value"/ if $value;
+    $script = qq/ onclick="$script"/ if $script;
     my($other) = @other ? " @other" : '';
-    return qq/<INPUT TYPE="button"$name$val$script$other>/;
+    return $XHTML ? qq(<input type="button"$name$val$script$other />)
+                  : qq/<input type="button"$name$val$script$other>/;
 }
 END_OF_FUNC
 
@@ -1635,15 +1685,16 @@ sub submit {
     my($label,$value,@other) = rearrange([NAME,[VALUE,LABEL]],@p);
 
     $label=$self->escapeHTML($label);
-    $value=$self->escapeHTML($value);
+    $value=$self->escapeHTML($value,1);
 
-    my($name) = ' NAME=".submit"' unless $NOSTICKY;
-    $name = qq/ NAME="$label"/ if defined($label);
+    my($name) = ' name=".submit"' unless $NOSTICKY;
+    $name = qq/ name="$label"/ if defined($label);
     $value = defined($value) ? $value : $label;
     my($val) = '';
-    $val = qq/ VALUE="$value"/ if defined($value);
+    $val = qq/ value="$value"/ if defined($value);
     my($other) = @other ? " @other" : '';
-    return qq/<INPUT TYPE="submit"$name$val$other>/;
+    return $XHTML ? qq(<input type="submit"$name$val$other />)
+                  : qq/<input type="submit"$name$val$other>/;
 }
 END_OF_FUNC
 
@@ -1660,9 +1711,10 @@ sub reset {
     my($self,@p) = self_or_default(@_);
     my($label,@other) = rearrange([NAME],@p);
     $label=$self->escapeHTML($label);
-    my($value) = defined($label) ? qq/ VALUE="$label"/ : '';
+    my($value) = defined($label) ? qq/ value="$label"/ : '';
     my($other) = @other ? " @other" : '';
-    return qq/<INPUT TYPE="reset"$value$other>/;
+    return $XHTML ? qq(<input type="reset"$value$other />)
+                  : qq/<input type="reset"$value$other>/;
 }
 END_OF_FUNC
 
@@ -1684,11 +1736,12 @@ sub defaults {
 
     my($label,@other) = rearrange([[NAME,VALUE]],@p);
 
-    $label=$self->escapeHTML($label);
+    $label=$self->escapeHTML($label,1);
     $label = $label || "Defaults";
-    my($value) = qq/ VALUE="$label"/;
+    my($value) = qq/ value="$label"/;
     my($other) = @other ? " @other" : '';
-    return qq/<INPUT TYPE="submit" NAME=".defaults"$value$other>/;
+    return $XHTML ? qq(<input type="submit" name=".defaults"$value$other />)
+                  : qq/<input type="submit" NAME=".defaults"$value$other>/;
 }
 END_OF_FUNC
 
@@ -1726,17 +1779,18 @@ sub checkbox {
 
     if (!$override && ($self->{'.fieldnames'}->{$name} || 
                       defined $self->param($name))) {
-       $checked = grep($_ eq $value,$self->param($name)) ? ' CHECKED' : '';
+       $checked = grep($_ eq $value,$self->param($name)) ? ' checked' : '';
     } else {
-       $checked = $checked ? ' CHECKED' : '';
+       $checked = $checked ? qq/ checked/ : '';
     }
     my($the_label) = defined $label ? $label : $name;
     $name = $self->escapeHTML($name);
-    $value = $self->escapeHTML($value);
+    $value = $self->escapeHTML($value,1);
     $the_label = $self->escapeHTML($the_label);
     my($other) = @other ? " @other" : '';
     $self->register_parameter($name);
-    return qq{<INPUT TYPE="checkbox" NAME="$name" VALUE="$value"$checked$other>$the_label};
+    return $XHTML ? qq{<input type="checkbox" name="$name" value="$value"$checked$other />$the_label}
+                  : qq{<input type="checkbox" name="$name" value="$value"$checked$other>$the_label};
 }
 END_OF_FUNC
 
@@ -1777,7 +1831,12 @@ sub checkbox_group {
 
     my(%checked) = $self->previous_or_default($name,$defaults,$override);
 
-    $break = $linebreak ? "<BR>" : '';
+       if ($linebreak) {
+    $break = $XHTML ? "<br />" : "<br>";
+       }
+       else {
+       $break = '';
+       }
     $name=$self->escapeHTML($name);
 
     # Create the elements
@@ -1787,15 +1846,16 @@ sub checkbox_group {
 
     my($other) = @other ? " @other" : '';
     foreach (@values) {
-       $checked = $checked{$_} ? ' CHECKED' : '';
+       $checked = $checked{$_} ? qq/ checked/ : '';
        $label = '';
        unless (defined($nolabels) && $nolabels) {
            $label = $_;
            $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
            $label = $self->escapeHTML($label);
        }
-       $_ = $self->escapeHTML($_);
-       push(@elements,qq/<INPUT TYPE="checkbox" NAME="$name" VALUE="$_"$checked$other>${label}${break}/);
+       $_ = $self->escapeHTML($_,1);
+       push(@elements,$XHTML ? qq(<input type="checkbox" name="$name" value="$_"$checked$other />${label}${break})
+                              : qq/<input type="checkbox" name="$name" value="$_"$checked$other>${label}${break}/);
     }
     $self->register_parameter($name);
     return wantarray ? @elements : join(' ',@elements)            
@@ -1807,32 +1867,34 @@ END_OF_FUNC
 # Escape HTML -- used internally
 'escapeHTML' => <<'END_OF_FUNC',
 sub escapeHTML {
-    my ($self,$toencode) = self_or_default(@_);
-    return undef unless defined($toencode);
-    return $toencode if ref($self) && $self->{'dontescape'};
-    if (uc $self->{'.charset'} eq 'ISO-8859-1') {
-       # fix non-compliant bug in IE and Netscape
-       $toencode =~ s{(.)}{
-              if    ($1 eq '<')                            { '&lt;'    }
-              elsif ($1 eq '>')                            { '&gt;'    }
-              elsif ($1 eq '&')                            { '&amp;'   }
-              elsif ($1 eq '"')                            { '&quot;'  }
-              elsif ($1 eq "\x8b")                         { '&#139;'  }
-              elsif ($1 eq "\x9b")                         { '&#155;'  }
-              else                                         { $1        }
-       }gsex;
-     } else {
-        $toencode =~ s/(.)/'&#'.ord($1).';'/gsex;
-     }
-    return $toencode;
+         my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_);
+         return undef unless defined($toencode);
+         return $toencode if ref($self) && $self->{'dontescape'};
+         $toencode =~ s{&}{&amp;}gso;
+         $toencode =~ s{<}{&lt;}gso;
+         $toencode =~ s{>}{&gt;}gso;
+         $toencode =~ s{"}{&quot;}gso;
+         my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' ||
+                     uc $self->{'.charset'} eq 'WINDOWS-1252';
+         if ($latin) {  # bug in some browsers
+                $toencode =~ s{\x8b}{&#139;}gso;
+                $toencode =~ s{\x9b}{&#155;}gso;
+                if (defined $newlinestoo && $newlinestoo) {
+                     $toencode =~ s{\012}{&#10;}gso;
+                     $toencode =~ s{\015}{&#13;}gso;
+                }
+         }
+         return $toencode;
 }
 END_OF_FUNC
 
 # unescape HTML -- used internally
 'unescapeHTML' => <<'END_OF_FUNC',
 sub unescapeHTML {
-    my $string = ref($_[0]) ? $_[1] : $_[0];
+    my ($self,$string) = CGI::self_or_default(@_);
     return undef unless defined($string);
+    my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i
+                                            : 1;
     # thanks to Randal Schwartz for the correct solution to this one
     $string=~ s[&(.*?);]{
        local $_ = $1;
@@ -1840,8 +1902,8 @@ sub unescapeHTML {
        /^quot$/i       ? '"' :
         /^gt$/i                ? ">" :
        /^lt$/i         ? "<" :
-       /^#(\d+)$/      ? chr($1) :
-       /^#x([0-9a-f]+)$/i ? chr(hex($1)) :
+       /^#(\d+)$/ && $latin         ? chr($1) :
+       /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) :
        $_
        }gex;
     return $string;
@@ -1852,6 +1914,8 @@ END_OF_FUNC
 '_tableize' => <<'END_OF_FUNC',
 sub _tableize {
     my($rows,$columns,$rowheaders,$colheaders,@elements) = @_;
+    $rowheaders = [] unless defined $rowheaders;
+    $colheaders = [] unless defined $colheaders;
     my($result);
 
     if (defined($columns)) {
@@ -1862,23 +1926,23 @@ sub _tableize {
     }
     
     # rearrange into a pretty table
-    $result = "<TABLE>";
+    $result = "<table>";
     my($row,$column);
     unshift(@$colheaders,'') if @$colheaders && @$rowheaders;
-    $result .= "<TR>" if @{$colheaders};
+    $result .= "<tr>" if @{$colheaders};
     foreach (@{$colheaders}) {
-       $result .= "<TH>$_</TH>";
+       $result .= "<th>$_</th>";
     }
     for ($row=0;$row<$rows;$row++) {
-       $result .= "<TR>";
-       $result .= "<TH>$rowheaders->[$row]</TH>" if @$rowheaders;
+       $result .= "<tr>";
+       $result .= "<th>$rowheaders->[$row]</th>" if @$rowheaders;
        for ($column=0;$column<$columns;$column++) {
-           $result .= "<TD>" . $elements[$column*$rows + $row] . "</TD>"
+           $result .= "<td>" . $elements[$column*$rows + $row] . "</td>"
                if defined($elements[$column*$rows + $row]);
        }
-       $result .= "</TR>";
+       $result .= "</tr>";
     }
-    $result .= "</TABLE>";
+    $result .= "</table>";
     return $result;
 }
 END_OF_FUNC
@@ -1927,16 +1991,23 @@ sub radio_group {
 
     my($other) = @other ? " @other" : '';
     foreach (@values) {
-       my($checkit) = $checked eq $_ ? ' CHECKED' : '';
-       my($break) = $linebreak ? '<BR>' : '';
+       my($checkit) = $checked eq $_ ? qq/ checked/ : '';
+       my($break);
+       if ($linebreak) {
+    $break = $XHTML ? "<br />" : "<br>";
+       }
+       else {
+       $break = '';
+       }
        my($label)='';
        unless (defined($nolabels) && $nolabels) {
            $label = $_;
            $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
-           $label = $self->escapeHTML($label);
+           $label = $self->escapeHTML($label,1);
        }
        $_=$self->escapeHTML($_);
-       push(@elements,qq/<INPUT TYPE="radio" NAME="$name" VALUE="$_"$checkit$other>${label}${break}/);
+       push(@elements,$XHTML ? qq(<input type="radio" name="$name" value="$_"$checkit$other />${label}${break})
+                              : qq/<input type="radio" name="$name" value="$_"$checkit$other>${label}${break}/);
     }
     $self->register_parameter($name);
     return wantarray ? @elements : join(' ',@elements) 
@@ -1979,17 +2050,17 @@ sub popup_menu {
     my(@values);
     @values = $self->_set_values_and_labels($values,\$labels,$name);
 
-    $result = qq/<SELECT NAME="$name"$other>\n/;
+    $result = qq/<select name="$name"$other>\n/;
     foreach (@values) {
-       my($selectit) = defined($selected) ? ($selected eq $_ ? 'SELECTED' : '' ) : '';
+       my($selectit) = defined($selected) ? ($selected eq $_ ? qq/selected/ : '' ) : '';
        my($label) = $_;
        $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
        my($value) = $self->escapeHTML($_);
-       $label=$self->escapeHTML($label);
-       $result .= "<OPTION $selectit VALUE=\"$value\">$label\n";
+       $label=$self->escapeHTML($label,1);
+       $result .= "<option $selectit value=\"$value\">$label</option>\n";
     }
 
-    $result .= "</SELECT>\n";
+    $result .= "</select>\n";
     return $result;
 }
 END_OF_FUNC
@@ -2028,21 +2099,21 @@ sub scrolling_list {
     $size = $size || scalar(@values);
 
     my(%selected) = $self->previous_or_default($name,$defaults,$override);
-    my($is_multiple) = $multiple ? ' MULTIPLE' : '';
-    my($has_size) = $size ? " SIZE=$size" : '';
+    my($is_multiple) = $multiple ? qq/ multiple/ : '';
+    my($has_size) = $size ? qq/ size="$size"/: '';
     my($other) = @other ? " @other" : '';
 
     $name=$self->escapeHTML($name);
-    $result = qq/<SELECT NAME="$name"$has_size$is_multiple$other>\n/;
+    $result = qq/<select name="$name"$has_size$is_multiple$other>\n/;
     foreach (@values) {
-       my($selectit) = $selected{$_} ? 'SELECTED' : '';
+       my($selectit) = $selected{$_} ? qq/selected/ : '';
        my($label) = $_;
        $label = $labels->{$_} if defined($labels) && defined($labels->{$_});
        $label=$self->escapeHTML($label);
-       my($value)=$self->escapeHTML($_);
-       $result .= "<OPTION $selectit VALUE=\"$value\">$label</OPTION>\n";
+       my($value)=$self->escapeHTML($_,1);
+       $result .= "<option $selectit value=\"$value\">$label</option>\n";
     }
-    $result .= "</SELECT>\n";
+    $result .= "</select>\n";
     $self->register_parameter($name);
     return $result;
 }
@@ -2084,8 +2155,9 @@ sub hidden {
 
     $name=$self->escapeHTML($name);
     foreach (@value) {
-       $_ = defined($_) ? $self->escapeHTML($_) : '';
-       push(@result,qq/<INPUT TYPE="hidden" NAME="$name" VALUE="$_">/);
+       $_ = defined($_) ? $self->escapeHTML($_,1) : '';
+       push @result,$XHTMl ? qq(<input type="hidden" name="$name" value="$_" />)
+                            : qq(<input type="hidden" name="$name" value="$_">);
     }
     return wantarray ? @result : join('',@result);
 }
@@ -2107,10 +2179,11 @@ sub image_button {
     my($name,$src,$alignment,@other) =
        rearrange([NAME,SRC,ALIGN],@p);
 
-    my($align) = $alignment ? " ALIGN=\U$alignment" : '';
+    my($align) = $alignment ? " align=\U$alignment" : '';
     my($other) = @other ? " @other" : '';
     $name=$self->escapeHTML($name);
-    return qq/<INPUT TYPE="image" NAME="$name" SRC="$src"$align$other>/;
+    return $XHTML ? qq(<input type="image" name="$name" src="$src"$align$other />)
+                  : qq/<input type="image" name="$name" src="$src"$align$other>/;
 }
 END_OF_FUNC
 
@@ -2145,26 +2218,28 @@ END_OF_FUNC
 'url' => <<'END_OF_FUNC',
 sub url {
     my($self,@p) = self_or_default(@_);
-    my ($relative,$absolute,$full,$path_info,$query) = 
-       rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING']],@p);
+    my ($relative,$absolute,$full,$path_info,$query,$base) = 
+       rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE'],@p);
     my $url;
-    $full++ if !($relative || $absolute);
+    $full++ if $base || !($relative || $absolute);
 
     my $path = $self->path_info;
-    my $script_name;
-    if (exists($ENV{REQUEST_URI})) {
-        my $index;
-       $script_name = $ENV{REQUEST_URI};
-        # strip query string
-        substr($script_name,$index) = '' if ($index = index($script_name,'?')) >= 0;
-        # and path
-        if (exists($ENV{PATH_INFO})) {
-           my $decoded_path = unescape($ENV{PATH_INFO});
-           substr($script_name,$index) = '' if ($index = rindex($script_name,$decoded_path)) >= 0;
-         }
-    } else {
-       $script_name = $self->script_name;
-    }
+    my $script_name = $self->script_name;
+
+# If anybody knows why I ever wrote this please tell me!
+#    if (exists($ENV{REQUEST_URI})) {
+#        my $index;
+#      $script_name = $ENV{REQUEST_URI};
+#        # strip query string
+#        substr($script_name,$index) = '' if ($index = index($script_name,'?')) >= 0;
+#        # and path
+#        if (exists($ENV{PATH_INFO})) {
+#           (my $encoded_path = $ENV{PATH_INFO}) =~ s!([^a-zA-Z0-9_./-])!uc sprintf("%%%02x",ord($1))!eg;;
+#           substr($script_name,$index) = '' if ($index = rindex($script_name,$encoded_path)) >= 0;
+#         }
+#    } else {
+#      $script_name = $self->script_name;
+#    }
 
     if ($full) {
        my $protocol = $self->protocol();
@@ -2179,12 +2254,14 @@ sub url {
                unless (lc($protocol) eq 'http' && $port == 80)
                    || (lc($protocol) eq 'https' && $port == 443);
        }
+        return $url if $base;
        $url .= $script_name;
     } elsif ($relative) {
        ($url) = $script_name =~ m!([^/]+)$!;
     } elsif ($absolute) {
        $url = $script_name;
     }
+
     $url .= $path if $path_info and defined $path;
     $url .= "?" . $self->query_string if $query and $self->query_string;
     $url = '' unless defined $url;
@@ -2239,7 +2316,7 @@ sub cookie {
     push(@param,'-expires'=>$expires) if $expires;
     push(@param,'-secure'=>$secure) if $secure;
 
-    return CGI::Cookie->new(@param);
+    return new CGI::Cookie(@param);
 }
 END_OF_FUNC
 
@@ -2338,6 +2415,9 @@ sub query_string {
            push(@pairs,"$eparam=$value");
        }
     }
+    foreach (keys %{$self->{'.fieldnames'}}) {
+      push(@pairs,".cgifields=".escape("$_"));
+    }
     return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs);
 }
 END_OF_FUNC
@@ -2762,7 +2842,7 @@ sub read_multipart {
        my($param)= $header{'Content-Disposition'}=~/ name="?([^\";]*)"?/;
 
        # Bug:  Netscape doesn't escape quotation marks in file names!!!
-       my($filename) = $header{'Content-Disposition'}=~/ filename="?([^\";]*)"?/;
+       my($filename) = $header{'Content-Disposition'}=~/ filename="?([^\"]*)"?/;
 
        # add this parameter to our list
        $self->add_parameter($param);
@@ -2920,12 +3000,11 @@ END_OF_FUNC
 sub new {
     my($pack,$name,$file,$delete) = @_;
     require Fcntl unless defined &Fcntl::O_RDWR;
-    my $fv = ('Fh::' .  ++$FH . quotemeta($name));
-    warn unless *{$fv};
-    my $ref = \*{$fv};
+    my $fv = ++$FH . quotemeta($name);
+    my $ref = \*{"Fh::$fv"};
     sysopen($ref,$file,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return;
     unlink($file) if $delete;
-    CORE::delete $Fh::{$FH};
+    CORE::delete $Fh::{$fv};
     return bless $ref,$pack;
 }
 END_OF_FUNC
@@ -3099,8 +3178,7 @@ sub read {
     die "Malformed multipart POST\n" unless ($start >= 0) || ($self->{LENGTH} > 0);
 
     # If the boundary begins the data, then skip past it
-    # and return undef.  The +2 here is a fiendish plot to
-    # remove the CR/LF pair at the end of the boundary.
+    # and return undef.
     if ($start == 0) {
 
        # clear us out completely if we've hit the last boundary.
@@ -3111,7 +3189,8 @@ sub read {
        }
 
        # just remove the boundary.
-       substr($self->{BUFFER},0,length($self->{BOUNDARY})+2)='';
+       substr($self->{BUFFER},0,length($self->{BOUNDARY}))='';
+        $self->{BUFFER} =~ s/^\012\015?//;
        return undef;
     }
 
@@ -3678,13 +3757,13 @@ the keys are the names of the CGI parameters, and the values are the
 parameters' values.  The Vars() method does this.  Called in a scalar
 context, it returns the parameter list as a tied hash reference.
 Changing a key changes the value of the parameter in the underlying
-CGI parameter list.  Called in an array context, it returns the
+CGI parameter list.  Called in a list context, it returns the
 parameter list as an ordinary hash.  This allows you to read the
 contents of the parameter list, but not to change it.
 
 When using this, the thing you must watch out for are multivalued CGI
 parameters.  Because a hash cannot distinguish between scalar and
-array context, multivalued parameters will be returned as a packed
+list context, multivalued parameters will be returned as a packed
 string, separated by the "\0" (null) character.  You must split this
 packed string in order to get at the individual values.  This is the
 convention introduced long ago by Steve Brenner in his cgi-lib.pl
@@ -3942,6 +4021,13 @@ have the hidden fields appear in the querystring in a GET method.
 For example, a search script generated this way will have
 a very nice url with search parameters for bookmarking.
 
+=item -no_xhtml
+
+By default, CGI.pm versions 2.69 and higher emit XHTML
+(http://www.w3.org/TR/xhtml1/).  The -no_xhtml pragma disables this
+feature.  Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this
+feature.
+
 =item -nph
 
 This makes CGI.pm produce a header appropriate for an NPH (no
@@ -4114,6 +4200,7 @@ pages.
                             -expires=>'+3d',
                             -cookie=>$cookie,
                              -charset=>'utf-7',
+                             -attachment=>'foo.gif',
                             -Cost=>'$2.00');
 
 header() returns the Content-type: header.  You can provide your own
@@ -4162,6 +4249,12 @@ The B<-charset> parameter can be used to control the character set
 sent to the browser.  If not provided, defaults to ISO-8859-1.  As a
 side effect, this sets the charset() method as well.
 
+The B<-attachment> parameter can be used to turn the page into an
+attachment.  Instead of displaying the page, some browsers will prompt
+the user to save it to disk.  The value of the argument is the
+suggested name for the saved file.  In order for this to work, you may
+have to set the B<-type> to "application/octet-stream".
+
 =head2 GENERATING A REDIRECTION HEADER
 
    print $query->redirect('http://somewhere.else/in/movie/land');
@@ -4172,9 +4265,7 @@ time of day or the identity of the user.
 
 The redirect() function redirects the browser to a different URL.  If
 you use redirection like this, you should B<not> print out a header as
-well.  As of version 2.0, we produce both the unofficial Location:
-header and the official URI: header.  This should satisfy most servers
-and browsers.
+well.
 
 One hint I can offer is that relative links may not work correctly
 when you generate a redirection to another document on your site.
@@ -4210,10 +4301,11 @@ page's appearance and behavior.
 
 This method returns a canned HTML header and the opening <BODY> tag.
 All parameters are optional.  In the named parameter form, recognized
-parameters are -title, -author, -base, -xbase and -target (see below
-for the explanation).  Any additional parameters you provide, such as
-the Netscape unofficial BGCOLOR attribute, are added to the <BODY>
-tag.  Additional parameters must be proceeded by a hyphen.
+parameters are -title, -author, -base, -xbase, -dtd, -lang and -target
+(see below for the explanation).  Any additional parameters you
+provide, such as the Netscape unofficial BGCOLOR attribute, are added
+to the <BODY> tag.  Additional parameters must be proceeded by a
+hyphen.
 
 The argument B<-xbase> allows you to provide an HREF for the <BASE> tag
 different from the current location, as in
@@ -4239,22 +4331,25 @@ into a series of header <META> tags that look something like this:
     <META NAME="keywords" CONTENT="pharaoh secret mummy">
     <META NAME="description" CONTENT="copyright 1996 King Tut">
 
-There is no direct support for the HTTP-EQUIV type of <META> tag.
-This is because you can modify the HTTP header directly with the
-B<header()> method.  For example, if you want to send the Refresh:
-header, do it in the header() method:
+To create an HTTP-EQUIV type of <META> tag, use B<-head>, described
+below.
+
+The B<-style> argument is used to incorporate cascading stylesheets
+into your code.  See the section on CASCADING STYLESHEETS for more
+information.
 
-    print $q->header(-Refresh=>'10; URL=http://www.capricorn.com');
+The B<-lang> argument is used to incorporate a language attribute into
+the <HTML> tag.  The default if not specified is "en-US" for US
+English.  For example:
 
-The B<-style> tag is used to incorporate cascading stylesheets into
-your code.  See the section on CASCADING STYLESHEETS for more information.
+    print $q->header(-lang=>'fr-CA');
 
 You can place other arbitrary HTML elements to the <HEAD> section with the
 B<-head> tag.  For example, to place the rarely-used <LINK> element in the
 head section, use this:
 
     print start_html(-head=>Link({-rel=>'next',
-                    -href=>'http://www.capricorn.com/s2.html'}));
+                                 -href=>'http://www.capricorn.com/s2.html'}));
 
 To incorporate multiple HTML elements into the <HEAD> section, just pass an
 array reference:
@@ -4267,6 +4362,12 @@ array reference:
                             ]
                     );
 
+And here's how to create an HTTP-EQUIV <META> tag:
+
+      print header(-head=>meta({-http_equiv => 'Content-Type',
+                                -content    => 'text/html'}))
+
+
 JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>,
 B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used
 to add Netscape JavaScript calls to your pages.  B<-script> should
@@ -4423,6 +4524,7 @@ You can also retrieve the unprocessed query string with query_string():
     $absolute_url  = $query->url(-absolute=>1);
     $url_with_path = $query->url(-path_info=>1);
     $url_with_path_and_query = $query->url(-path_info=>1,-query=>1);
+    $netloc        = $query->url(-base => 1);
 
 B<url()> returns the script's URL in a variety of formats.  Called
 without any arguments, it returns the full form of the URL, including
@@ -4464,6 +4566,10 @@ Append the query string to the URL.  This can be combined with
 B<-full>, B<-absolute> or B<-relative>.  B<-query_string> is provided
 as a synonym.
 
+=item B<-base>
+
+Generate just the protocol and net location, as in http://www.foo.com:8000
+
 =back
 
 =head2 MIXING POST AND URL PARAMETERS
@@ -4579,7 +4685,7 @@ element of the list.  For example, here's one way to make an ordered
 list:
 
    print ul(
-             li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy']);
+             li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy'])
            );
 
 This example will result in HTML output that looks like this:
@@ -4793,7 +4899,7 @@ This is the older type of encoding used by all browsers prior to
 Netscape 2.0.  It is compatible with many CGI scripts and is
 suitable for short fields containing text data.  For your
 convenience, CGI.pm stores the name of this encoding
-type in B<$CGI::URL_ENCODED>.
+type in B<&CGI::URL_ENCODED>.
 
 =item B<multipart/form-data>
 
@@ -4947,7 +5053,7 @@ recognized.  See textfield().
 filefield() will return a file upload field for Netscape 2.0 browsers.
 In order to take full advantage of this I<you must use the new 
 multipart encoding scheme> for the form.  You can do this either
-by calling B<start_form()> with an encoding type of B<$CGI::MULTIPART>,
+by calling B<start_form()> with an encoding type of B<&CGI::MULTIPART>,
 or by calling the new method B<start_multipart_form()> instead of
 vanilla B<start_form()>.
 
@@ -5711,13 +5817,17 @@ To create multiple cookies, give header() an array reference:
                                  -value=>\%answers);
        print $query->header(-cookie=>[$cookie1,$cookie2]);
 
-To retrieve a cookie, request it by name by calling cookie()
-method without the B<-value> parameter:
+To retrieve a cookie, request it by name by calling cookie() method
+without the B<-value> parameter:
 
        use CGI;
        $query = new CGI;
-       %answers = $query->cookie(-name=>'answers');
-       # $query->cookie('answers') will work too!
+       $riddle = $query->cookie('riddle_name');
+        %answers = $query->cookie('answers');
+
+Cookies created with a single scalar value, such as the "riddle_name"
+cookie, will be returned in that form.  Cookies with array and hash
+values can also be retrieved.
 
 The cookie and CGI namespaces are separate.  If you have a parameter
 named 'answers' and a cookie named 'answers', the values retrieved by
@@ -5854,6 +5964,9 @@ http://www.w3.org/pub/WWW/TR/Wd-css-1.html for more information.
               );
     print end_html;
 
+Pass an array reference to B<-style> in order to incorporate multiple
+stylesheets into your document.
+
 =head1 DEBUGGING
 
 If you are running the script from the command line or in the perl
@@ -5962,9 +6075,8 @@ like $query->user_agent(netscape);
 =item B<path_info()>
 
 Returns additional path information from the script URL.
-E.G. fetching /cgi-bin/your_script/additional/stuff will
-result in $query->path_info() returning
-"additional/stuff".
+E.G. fetching /cgi-bin/your_script/additional/stuff will result in
+$query->path_info() returning "/additional/stuff".
 
 NOTE: The Microsoft Internet Information Server
 is broken with respect to additional path information.  If
@@ -6014,6 +6126,10 @@ name.
 When using virtual hosts, returns the name of the host that
 the browser attempted to contact
 
+=item B<server_port ()>
+
+Return the port that the server is listening on.
+
 =item B<server_software ()>
 
 Returns the server software and version number.
index 0a5c121..5aea198 100644 (file)
@@ -142,6 +142,33 @@ of the error message that caused the script to die.  Example:
 In order to correctly intercept compile-time errors, you should call
 set_message() from within a BEGIN{} block.
 
+=head1 MAKING WARNINGS APPEAR AS HTML COMMENTS
+
+It is now also possible to make non-fatal errors appear as HTML
+comments embedded in the output of your program.  To enable this
+feature, export the new "warningsToBrowser" subroutine.  Since sending
+warnings to the browser before the HTTP headers have been sent would
+cause an error, any warnings are stored in an internal buffer until
+you call the warningsToBrowser() subroutine with a true argument:
+
+    use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
+    use CGI qw(:standard);
+    print header();
+    warningsToBrowser(1);
+
+You may also give a false argument to warningsToBrowser() to prevent
+warnings from being sent to the browser while you are printing some
+content where HTML comments are not allowed:
+
+    warningsToBrowser(0);    # disable warnings
+    print "<SCRIPT type=javascript><!--\n";
+    print_some_javascript_code();
+    print "//--></SCRIPT>\n";
+    warningsToBrowser(1);    # re-enable warnings
+
+Note: In this respect warningsToBrowser() differs fundamentally from
+fatalsToBrowser(), which you should never call yourself!
+
 =head1 CHANGE LOG
 
 1.05 carpout() added and minor corrections by Marc Hedlund
@@ -166,7 +193,11 @@ set_message() from within a BEGIN{} block.
 1.12 Changed die() on line 217 to CORE::die to avoid B<-w> warning.
 
 1.13 Added cluck() to make the module orthogonal with Carp.
-    More mod_perl related fixes.
+     More mod_perl related fixes.
+
+1.20 Patch from Ilmari Karonen (perl@itz.pp.sci.fi):  Added
+     warningsToBrowser().  Replaced <CODE> tags with <PRE> in
+     fatalsToBrowser() output.
 
 =head1 AUTHORS
 
@@ -190,18 +221,11 @@ use Carp;
 
 @ISA = qw(Exporter);
 @EXPORT = qw(confess croak carp);
-@EXPORT_OK = qw(carpout fatalsToBrowser wrap set_message cluck);
-
-BEGIN {
-  $] >= 5.005
-    ? eval q#sub ineval { defined $^S ? $^S : _longmess() =~ /eval [\{\']/m }#
-    : eval q#sub ineval { _longmess() =~ /eval [\{\']/m }#;
-  $@ and die;
-}
+@EXPORT_OK = qw(carpout fatalsToBrowser warningsToBrowser wrap set_message cluck);
 
 $main::SIG{__WARN__}=\&CGI::Carp::warn;
 $main::SIG{__DIE__}=\&CGI::Carp::die;
-$CGI::Carp::VERSION = '1.16';
+$CGI::Carp::VERSION = '1.20';
 $CGI::Carp::CUSTOM_MSG = undef;
 
 # fancy import routine detects and handles 'errorWrap' specially.
@@ -210,6 +234,7 @@ sub import {
     my(%routines);
     grep($routines{$_}++,@_,@EXPORT);
     $WRAP++ if $routines{'fatalsToBrowser'} || $routines{'wrap'};
+    $WARN++ if $routines{'warningsToBrowser'};
     my($oldlevel) = $Exporter::ExportLevel;
     $Exporter::ExportLevel = 1;
     Exporter::import($pkg,keys %routines);
@@ -223,7 +248,7 @@ sub realdie { CORE::die(@_); }
 sub id {
     my $level = shift;
     my($pack,$file,$line,$sub) = caller($level);
-    my($id) = $file=~m|([^/]+)\z|;
+    my($id) = $file=~m|([^/]+)$|;
     return ($file,$line,$id);
 }
 
@@ -235,7 +260,7 @@ sub stamp {
        $id = $file;
        ($pack,$file) = caller($frame++);
     } until !$file;
-    ($id) = $id=~m|([^/]+)\z|;
+    ($id) = $id=~m|([^/]+)$|;
     return "[$time] $id: ";
 }
 
@@ -243,23 +268,40 @@ sub warn {
     my $message = shift;
     my($file,$line,$id) = id(1);
     $message .= " at $file line $line.\n" unless $message=~/\n$/;
+    _warn($message) if $WARN;
     my $stamp = stamp;
     $message=~s/^/$stamp/gm;
     realwarn $message;
 }
 
+sub _warn {
+    my $msg = shift;
+    if ($EMIT_WARNINGS) {
+       # We need to mangle the message a bit to make it a valid HTML
+       # comment.  This is done by substituting similar-looking ISO
+       # 8859-1 characters for <, > and -.  This is a hack.
+       $msg =~ tr/<>-/\253\273\255/;
+       chomp $msg;
+       print STDOUT "<!-- warning: $msg -->\n";
+    } else {
+       push @WARNINGS, $msg;
+    }
+}
+
+sub ineval { _longmess() =~ /eval [\{\']/m }
+
 # The mod_perl package Apache::Registry loads CGI programs by calling
 # eval.  These evals don't count when looking at the stack backtrace.
 sub _longmess {
     my $message = Carp::longmess();
     my $mod_perl = exists $ENV{MOD_PERL};
     $message =~ s,eval[^\n]+Apache/Registry\.pm.*,,s if $mod_perl;
-    return( $message );    
+    return $message;    
 }
 
 sub die {
   realdie @_ if ineval;
-  my $message = shift;
+  my ($message) = @_;
   my $time = scalar(localtime);
   my($file,$line,$id) = id(1);
   $message .= " at $file line $line." unless $message=~/\n$/;
@@ -299,6 +341,11 @@ sub carpout {
        ( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
 }
 
+sub warningsToBrowser {
+    $EMIT_WARNINGS = @_ ? shift : 1;
+    _warn(shift @WARNINGS) while $EMIT_WARNINGS and @WARNINGS;
+}
+
 # headers
 sub fatalsToBrowser {
     my($msg) = @_;
@@ -318,6 +365,8 @@ END
     print STDOUT "Content-type: text/html\n\n" 
        unless $mod_perl;
 
+    warningsToBrowser(1);    # emit warnings before dying
+
     if ($CUSTOM_MSG) {
        if (ref($CUSTOM_MSG) eq 'CODE') {
            &$CUSTOM_MSG($msg); # nicer to perl 5.003 users
@@ -329,7 +378,7 @@ END
     
     my $mess = <<END;
 <H1>Software error:</H1>
-<CODE>$msg</CODE>
+<PRE>$msg</PRE>
 <P>
 $outer_message
 END
index 9e5a14b..6737832 100644 (file)
@@ -40,17 +40,18 @@ sub raw_fetch {
     my %results;
     my($key,$value);
 
-    my(@pairs) = split("; ",$raw_cookie);
+    my(@pairs) = split("; ?",$raw_cookie);
     foreach (@pairs) {
-       if (/^([^=]+)=(.*)/) {
-           $key = $1;
-           $value = $2;
-       }
-       else {
-           $key = $_;
-           $value = '';
-       }
-       $results{$key} = $value;
+      s/\s*(.*?)\s*/$1/;
+      if (/^([^=]+)=(.*)/) {
+       $key = $1;
+       $value = $2;
+      }
+      else {
+       $key = $_;
+       $value = '';
+      }
+      $results{$key} = $value;
     }
     return \%results unless wantarray;
     return %results;
@@ -60,17 +61,18 @@ sub parse {
     my ($self,$raw_cookie) = @_;
     my %results;
 
-    my(@pairs) = split("; ",$raw_cookie);
+    my(@pairs) = split("; ?",$raw_cookie);
     foreach (@pairs) {
-       my($key,$value) = split("=");
-       my(@values) = map unescape($_),split('&',$value);
-       $key = unescape($key);
-       # Some foreign cookies are not in name=value format, so ignore
-       # them.
-       next if !defined($value);
-       # A bug in Netscape can cause several cookies with same name to
-       # appear.  The FIRST one in HTTP_COOKIE is the most recent version.
-       $results{$key} ||= $self->new(-name=>$key,-value=>\@values);
+      s/\s*(.*?)\s*/$1/;
+      my($key,$value) = split("=");
+      my(@values) = map unescape($_),split('&',$value);
+      $key = unescape($key);
+      # Some foreign cookies are not in name=value format, so ignore
+      # them.
+      next if !defined($value);
+      # A bug in Netscape can cause several cookies with same name to
+      # appear.  The FIRST one in HTTP_COOKIE is the most recent version.
+      $results{$key} ||= $self->new(-name=>$key,-value=>\@values);
     }
     return \%results unless wantarray;
     return %results;
@@ -382,7 +384,7 @@ Get or set the cookie's value.  Example:
        $value = $c->value;
        @new_value = $c->value(['a','b','c','d']);
 
-B<value()> is context sensitive.  In an array context it will return
+B<value()> is context sensitive.  In a list context it will return
 the current value of the cookie as an array.  In a scalar context it
 will return the B<first> value of a multivalued cookie.
 
index 20173f9..d348807 100644 (file)
@@ -72,7 +72,7 @@ sub _make_tag_func {
                \$attr = " \@attr" if \@attr;
            }
 
-           my(\$tag,\$untag) = ("\U<$tagname\E\$attr>","\U</$tagname>\E");
+           my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L</$tagname>\E");
            return \$tag unless \@_;
 
            my \@result;
@@ -128,7 +128,7 @@ sub initialize_globals {
     $CGI::Pretty::LINEBREAK = "\n";
 
     # These tags are not prettify'd.
-    @CGI::Pretty::AS_IS = qw( A PRE CODE SCRIPT TEXTAREA );
+    @CGI::Pretty::AS_IS = qw( a pre code script textarea );
 
     1;
 }
index 6b8e012..83002f2 100644 (file)
@@ -16,7 +16,7 @@ package CGI::Push;
 # The most recent version and complete docs are available at:
 #   http://stein.cshl.org/WWW/software/CGI/
 
-$CGI::Push::VERSION='1.02';
+$CGI::Push::VERSION='1.03';
 use CGI;
 use CGI::Util 'rearrange';
 @ISA = ('CGI');
@@ -60,7 +60,7 @@ sub do_push {
     while (1) {
        last unless (@contents = &$callback($self,++$COUNTER)) && defined($contents[0]);
        print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" 
-           unless $type eq 'dynamic';
+           unless $type =~ /^dynamic|heterogeneous$/i;
        print @contents,"$CGI::CRLF";
        print "${boundary}$CGI::CRLF";
        do_sleep($self->push_delay()) if $self->push_delay();
index cb6dd8a..ac7376d 100644 (file)
@@ -1,13 +1,5 @@
 package CGI::Util;
 
-=pod
-
-=head1 NAME
-
-CGI::Util - various utilities
-
-=cut
-
 use strict;
 use vars '$VERSION','@EXPORT_OK','@ISA','$EBCDIC','@A2E';
 require Exporter;
@@ -56,14 +48,14 @@ sub rearrange {
     my ($i,%pos);
     $i = 0;
     foreach (@$order) {
-       foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{$_} = $i; }
+       foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{lc($_)} = $i; }
        $i++;
     }
 
     my (@result,%leftover);
     $#result = $#$order;  # preextend
     while (@param) {
-       my $key = uc(shift(@param));
+       my $key = lc(shift(@param));
        $key =~ s/^\-//;
        if (exists $pos{$key}) {
            $result[$pos{$key}] = shift(@param);
@@ -72,7 +64,7 @@ sub rearrange {
        }
     }
 
-    push (@result,make_attributes(\%leftover)) if %leftover;
+    push (@result,make_attributes(\%leftover,1)) if %leftover;
     @result;
 }
 
@@ -84,7 +76,7 @@ sub make_attributes {
     foreach (keys %{$attr}) {
        my($key) = $_;
        $key=~s/^\-//;     # get rid of initial - if present
-       $key=~tr/a-z_/A-Z-/; # parameters are upper case, use dashes
+       $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
        my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
        push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
     }
@@ -92,16 +84,14 @@ sub make_attributes {
 }
 
 sub simple_escape {
-  return unless defined (my $toencode = shift);
-  $toencode =~ s{(.)}{
-              if    ($1 eq '<')                            { '&lt;'    }
-              elsif ($1 eq '>')                            { '&gt;'    }
-              elsif ($1 eq '&')                            { '&amp;'   }
-              elsif ($1 eq '"')                            { '&quot;'  }
-              elsif ($1 eq "\x8b")                         { '&#139;'  }
-              elsif ($1 eq "\x9b")                         { '&#155;'  }
-              else                                         { $1        }
-       }gsex;
+  return unless defined(my $toencode = shift);
+  $toencode =~ s{&}{&amp;}gso;
+  $toencode =~ s{<}{&lt;}gso;
+  $toencode =~ s{>}{&gt;}gso;
+  $toencode =~ s{\"}{&quot;}gso;
+# Doesn't work.  Can't work.  forget it.
+#  $toencode =~ s{\x8b}{&#139;}gso;
+#  $toencode =~ s{\x9b}{&#155;}gso;
   $toencode;
 }
 
similarity index 100%
rename from eg/cgi/RunMeFirst
rename to lib/CGI/eg/RunMeFirst
similarity index 100%
rename from eg/cgi/caution.xbm
rename to lib/CGI/eg/caution.xbm
similarity index 100%
rename from eg/cgi/cookie.cgi
rename to lib/CGI/eg/cookie.cgi
similarity index 100%
rename from eg/cgi/crash.cgi
rename to lib/CGI/eg/crash.cgi
similarity index 100%
rename from eg/cgi/frameset.cgi
rename to lib/CGI/eg/frameset.cgi
similarity index 100%
rename from eg/cgi/index.html
rename to lib/CGI/eg/index.html
diff --git a/lib/CGI/eg/make_links.pl b/lib/CGI/eg/make_links.pl
new file mode 100755 (executable)
index 0000000..a0aa824
--- /dev/null
@@ -0,0 +1,8 @@
+#!/usr/local/bin/perl
+
+# this is just a utility for creating symlinks from *.txt to *.cgi
+# for documentation purposes.
+foreach (<*.cgi>) {
+    ($target=$_)=~s/cgi$/txt/;
+    symlink $_,$target
+}
similarity index 100%
rename from eg/cgi/monty.cgi
rename to lib/CGI/eg/monty.cgi
similarity index 100%
rename from eg/cgi/popup.cgi
rename to lib/CGI/eg/popup.cgi
similarity index 100%
rename from eg/cgi/tryit.cgi
rename to lib/CGI/eg/tryit.cgi
index 84dfd31..aeb6a57 100644 (file)
@@ -1,18 +1,12 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
 package CPAN;
-use vars qw{$Try_autoload
-            $Revision
-           $META $Signal $Cwd $End
-           $Suppress_readline %Dontload
-           $Frontend  $Defaultsite
-          }; #};
+$VERSION = '1.57_68RC';
 
-$VERSION = '1.52';
-
-# $Id: CPAN.pm,v 1.276 2000/01/08 15:29:46 k Exp $
+# $Id: CPAN.pm,v 1.354 2000/10/08 14:20:57 k Exp $
 
 # only used during development:
 $Revision = "";
-# $Revision = "[".substr(q$Revision: 1.276 $, 10)."]";
+# $Revision = "[".substr(q$Revision: 1.354 $, 10)."]";
 
 use Carp ();
 use Config ();
@@ -29,6 +23,8 @@ use Safe ();
 use Text::ParseWords ();
 use Text::Wrap;
 use File::Spec;
+no lib "."; # we need to run chdir all over and we would get at wrong
+            # libraries there
 
 END { $End++; &cleanup; }
 
@@ -47,6 +43,8 @@ END { $End++; &cleanup; }
                  Eval           2048
                  Config         4096
                  Tarzip         8192
+                 Version       16384
+                 Queue         32768
 ];
 
 $CPAN::DEBUG ||= 0;
@@ -55,9 +53,12 @@ $CPAN::Frontend ||= "CPAN::Shell";
 $CPAN::Defaultsite ||= "ftp://ftp.perl.org/pub/CPAN";
 
 package CPAN;
-use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $term);
 use strict qw(vars);
 
+use vars qw($VERSION @EXPORT $AUTOLOAD $DEBUG $META $HAS_USABLE $term
+            $Revision $Signal $Cwd $End $Suppress_readline $Frontend
+            $Defaultsite $Have_warned);
+
 @CPAN::ISA = qw(CPAN::Debug Exporter);
 
 @EXPORT = qw(
@@ -75,12 +76,6 @@ sub AUTOLOAD {
     if (exists $EXPORT{$l}){
        CPAN::Shell->$l(@_);
     } else {
-       my $ok = CPAN::Shell->try_dot_al($AUTOLOAD);
-       if ($ok) {
-           goto &$AUTOLOAD;
-#      } else {
-#          $CPAN::Frontend->mywarn("Could not autoload $AUTOLOAD");
-       }
        $CPAN::Frontend->mywarn(qq{Unknown command "$AUTOLOAD". }.
                                qq{Type ? for help.
 });
@@ -93,6 +88,8 @@ sub shell {
     $Suppress_readline = ! -t STDIN unless defined $Suppress_readline;
     CPAN::Config->load unless $CPAN::Config_loaded++;
 
+    CPAN::Index->read_metadata_cache;
+
     my $prompt = "cpan> ";
     local($^W) = 1;
     unless ($Suppress_readline) {
@@ -121,7 +118,7 @@ sub shell {
        select $odef;
     }
 
-    no strict;
+    # no strict; # I do not recall why no strict was here (2000-09-03)
     $META->checklock();
     my $getcwd;
     $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
@@ -130,14 +127,19 @@ sub shell {
     $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term;
     my $rl_avail = $Suppress_readline ? "suppressed" :
        ($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" :
-           "available (try ``install Bundle::CPAN'')";
+           "available (try 'install Bundle::CPAN')";
 
     $CPAN::Frontend->myprint(
-                            qq{
-cpan shell -- CPAN exploration and modules installation (v$CPAN::VERSION$CPAN::Revision)
-ReadLine support $rl_avail
+                            sprintf qq{
+cpan shell -- CPAN exploration and modules installation (v%s%s)
+ReadLine support %s
 
-}) unless $CPAN::Config->{'inhibit_startup_message'} ;
+},
+                             $CPAN::VERSION,
+                             $CPAN::Revision,
+                             $rl_avail
+                            )
+        unless $CPAN::Config->{'inhibit_startup_message'} ;
     my($continuation) = "";
     while () {
        if ($Suppress_readline) {
@@ -180,7 +182,7 @@ ReadLine support $rl_avail
            my $command = shift @line;
            eval { CPAN::Shell->$command(@line) };
            warn $@ if $@;
-           chdir $cwd;
+           chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
            $CPAN::Frontend->myprint("\n");
            $continuation = "";
            $prompt = "cpan> ";
@@ -194,8 +196,8 @@ ReadLine support $rl_avail
            $CPAN::META->has_inst("Term::ReadLine::Perl")
           ) {
            delete $INC{"Term/ReadLine.pm"};
-           my $redef;
-           local($SIG{__WARN__}) = CPAN::Shell::dotdot_onreload(\$redef);
+           my $redef = 0;
+           local($SIG{__WARN__}) = CPAN::Shell::paintdots_onreload(\$redef);
            require Term::ReadLine;
            $CPAN::Frontend->myprint("\n$redef subroutines in ".
                                     "Term::ReadLine redefined\n");
@@ -210,7 +212,6 @@ package CPAN::CacheMgr;
 use File::Find;
 
 package CPAN::Config;
-import ExtUtils::MakeMaker 'neatvalue';
 use vars qw(%can $dot_cpan);
 
 %can = (
@@ -231,6 +232,8 @@ use vars qw($last_time $date_of_03);
 @CPAN::Index::ISA = qw(CPAN::Debug);
 $last_time ||= 0;
 $date_of_03 ||= 0;
+# use constant PROTOCOL => "2.0"; # outcommented to avoid warning on upgrade from 1.57
+sub PROTOCOL { 2.0 }
 
 package CPAN::InfoObj;
 @CPAN::InfoObj::ISA = qw(CPAN::Debug);
@@ -248,7 +251,7 @@ package CPAN::Module;
 @CPAN::Module::ISA = qw(CPAN::InfoObj);
 
 package CPAN::Shell;
-use vars qw($AUTOLOAD $redef @ISA);
+use vars qw($AUTOLOAD @ISA);
 @CPAN::Shell::ISA = qw(CPAN::Debug);
 
 #-> sub CPAN::Shell::AUTOLOAD ;
@@ -269,86 +272,12 @@ For this you just need to type
 });
        }
     } else {
-       my $ok = CPAN::Shell->try_dot_al($AUTOLOAD);
-       if ($ok) {
-           goto &$AUTOLOAD;
-#      } else {
-#          $CPAN::Frontend->mywarn("Could not autoload $autoload");
-       }
        $CPAN::Frontend->mywarn(qq{Unknown command '$autoload'. }.
                                qq{Type ? for help.
 });
     }
 }
 
-#-> CPAN::Shell::try_dot_al
-sub try_dot_al {
-    my($class,$autoload) = @_;
-    return unless $CPAN::Try_autoload;
-    # I don't see how to re-use that from the AutoLoader...
-    my($name,$ok);
-    # Braces used to preserve $1 et al.
-    {
-       my ($pkg,$func) = $autoload =~ /(.*)::([^:]+)$/;
-       $pkg =~ s|::|/|g;
-       if (defined($name=$INC{"$pkg.pm"}))
-           {
-               $name =~ s|^(.*)$pkg\.pm\z|$1auto/$pkg/$func.al|s;
-               $name = undef unless (-r $name);
-           }
-       unless (defined $name)
-           {
-               $name = "auto/$autoload.al";
-               $name =~ s|::|/|g;
-           }
-    }
-    my $save = $@;
-    eval {local $SIG{__DIE__};require $name};
-    if ($@) {
-       if (substr($autoload,-9) eq '::DESTROY') {
-           *$autoload = sub {};
-           $ok = 1;
-       } else {
-           if ($name =~ s{(\w{12,})\.al\z}{substr($1,0,11).".al"}e){
-               eval {local $SIG{__DIE__};require $name};
-           }
-           if ($@){
-               $@ =~ s/ at .*\n//;
-               Carp::croak $@;
-           } else {
-               $ok = 1;
-           }
-       }
-    } else {
-
-      $ok = 1;
-
-    }
-    $@ = $save;
-#    my $lm = Carp::longmess();
-#    warn "ok[$ok] autoload[$autoload] longmess[$lm]"; # debug
-    return $ok;
-}
-
-#### autoloader is experimental
-#### to try it we have to set $Try_autoload and uncomment
-#### the use statement and uncomment the __END__ below
-#### You also need AutoSplit 1.01 available. MakeMaker will
-#### then build CPAN with all the AutoLoad stuff.
-# use AutoLoader;
-# $Try_autoload = 1;
-
-if ($CPAN::Try_autoload) {
-  my $p;
-    for $p (qw(
-              CPAN::Author CPAN::Bundle CPAN::CacheMgr CPAN::Complete
-              CPAN::Config CPAN::Debug CPAN::Distribution CPAN::FTP
-              CPAN::FTP::netrc CPAN::Index CPAN::InfoObj CPAN::Module
-                )) {
-       *{"$p\::AUTOLOAD"} = \&AutoLoader::AUTOLOAD;
-    }
-}
-
 package CPAN::Tarzip;
 use vars qw($AUTOLOAD @ISA);
 @CPAN::Tarzip::ISA = qw(CPAN::Debug);
@@ -402,70 +331,81 @@ package CPAN::Queue;
 
 use vars qw{ @All };
 
+# CPAN::Queue::new ;
 sub new {
-  my($class,$mod) = @_;
-  my $self = bless {mod => $mod}, $class;
+  my($class,$s) = @_;
+  my $self = bless { qmod => $s }, $class;
   push @All, $self;
-  # my @all = map { $_->{mod} } @All;
-  # warn "Adding Queue object for mod[$mod] all[@all]";
   return $self;
 }
 
+# CPAN::Queue::first ;
 sub first {
   my $obj = $All[0];
-  $obj->{mod};
+  $obj->{qmod};
 }
 
+# CPAN::Queue::delete_first ;
 sub delete_first {
   my($class,$what) = @_;
   my $i;
   for my $i (0..$#All) {
-    if (  $All[$i]->{mod} eq $what ) {
+    if (  $All[$i]->{qmod} eq $what ) {
       splice @All, $i, 1;
       return;
     }
   }
 }
 
+# CPAN::Queue::jumpqueue ;
 sub jumpqueue {
-  my $class = shift;
-  my @what = @_;
-  my $obj;
+    my $class = shift;
+    my @what = @_;
+    CPAN->debug(sprintf("before jumpqueue All[%s] what[%s]",
+                        join(",",map {$_->{qmod}} @All),
+                        join(",",@what)
+                       )) if $CPAN::DEBUG;
   WHAT: for my $what (reverse @what) {
-    my $jumped = 0;
-    for (my $i=0; $i<$#All;$i++) { #prevent deep recursion
-      if ($All[$i]->{mod} eq $what){
-       $jumped++;
-       if ($jumped > 100) { # one's OK if e.g. just processing now;
-                             # more are OK if user typed it several
-                             # times
-         $CPAN::Frontend->mywarn(
+        my $jumped = 0;
+        for (my $i=0; $i<$#All;$i++) { #prevent deep recursion
+            CPAN->debug("i[$All[$i]]what[$what]") if $CPAN::DEBUG;
+            if ($All[$i]->{qmod} eq $what){
+                $jumped++;
+                if ($jumped > 100) { # one's OK if e.g. just
+                                     # processing now; more are OK if
+                                     # user typed it several times
+                    $CPAN::Frontend->mywarn(
 qq{Object [$what] queued more than 100 times, ignoring}
                                 );
-         next WHAT;
-       }
-      }
+                    next WHAT;
+                }
+            }
+        }
+        my $obj = bless { qmod => $what }, $class;
+        unshift @All, $obj;
     }
-    my $obj = bless { mod => $what }, $class;
-    unshift @All, $obj;
-  }
+    CPAN->debug(sprintf("after jumpqueue All[%s] what[%s]",
+                        join(",",map {$_->{qmod}} @All),
+                        join(",",@what)
+                       )) if $CPAN::DEBUG;
 }
 
+# CPAN::Queue::exists ;
 sub exists {
   my($self,$what) = @_;
-  my @all = map { $_->{mod} } @All;
-  my $exists = grep { $_->{mod} eq $what } @All;
-  # warn "Checking exists in Queue object for mod[$what] all[@all] exists[$exists]";
+  my @all = map { $_->{qmod} } @All;
+  my $exists = grep { $_->{qmod} eq $what } @All;
+  # warn "in exists what[$what] all[@all] exists[$exists]";
   $exists;
 }
 
+# CPAN::Queue::delete ;
 sub delete {
   my($self,$mod) = @_;
-  @All = grep { $_->{mod} ne $mod } @All;
-  # my @all = map { $_->{mod} } @All;
-  # warn "Deleting Queue object for mod[$mod] all[@all]";
+  @All = grep { $_->{qmod} ne $mod } @All;
 }
 
+# CPAN::Queue::nullify_queue ;
 sub nullify_queue {
   @All = ();
 }
@@ -476,44 +416,31 @@ package CPAN;
 
 $META ||= CPAN->new; # In case we re-eval ourselves we need the ||
 
-1;
+# from here on only subs.
+################################################################################
 
-# __END__ # uncomment this and AutoSplit version 1.01 will split it
-
-#-> sub CPAN::autobundle ;
-sub autobundle;
-#-> sub CPAN::bundle ;
-sub bundle;
-#-> sub CPAN::expand ;
-sub expand;
-#-> sub CPAN::force ;
-sub force;
-#-> sub CPAN::install ;
-sub install;
-#-> sub CPAN::make ;
-sub make;
-#-> sub CPAN::clean ;
-sub clean;
-#-> sub CPAN::test ;
-sub test;
-
-#-> sub CPAN::all ;
+#-> sub CPAN::all_objects ;
 sub all_objects {
     my($mgr,$class) = @_;
     CPAN::Config->load unless $CPAN::Config_loaded++;
     CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG;
     CPAN::Index->reload;
-    values %{ $META->{$class} };
+    values %{ $META->{readwrite}{$class} }; # unsafe meta access, ok
 }
 *all = \&all_objects;
 
-# Called by shell, not in batch mode. Not clean XXX
+# Called by shell, not in batch mode. In batch mode I see no risk in
+# having many processes updating something as installations are
+# continually checked at runtime. In shell mode I suspect it is
+# unintentional to open more than one shell at a time
+
 #-> sub CPAN::checklock ;
 sub checklock {
     my($self) = @_;
     my $lockfile = MM->catfile($CPAN::Config->{cpan_home},".lock");
     if (-f $lockfile && -M _ > 0) {
-       my $fh = FileHandle->new($lockfile);
+       my $fh = FileHandle->new($lockfile) or
+            $CPAN::Frontend->mydie("Could not open $lockfile: $!");
        my $other = <$fh>;
        $fh->close;
        if (defined $other && $other) {
@@ -545,7 +472,11 @@ You may want to kill it and delete the lockfile, maybe. On UNIX try:
                            qq{  and then rerun us.\n}
                           );
            }
-       }
+       } else {
+            $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile $lockfile ".
+                                           "reports other process with ID ".
+                                           "$other. Cannot proceed.\n"));
+        }
     }
     my $dotcpan = $CPAN::Config->{cpan_home};
     eval { File::Path::mkpath($dotcpan);};
@@ -610,11 +541,11 @@ or
     $fh->print($$, "\n");
     $self->{LOCK} = $lockfile;
     $fh->close;
-    $SIG{'TERM'} = sub {
+    $SIG{TERM} = sub {
       &cleanup;
       $CPAN::Frontend->mydie("Got SIGTERM, leaving");
     };
-    $SIG{'INT'} = sub {
+    $SIG{INT} = sub {
       # no blocks!!!
       &cleanup if $Signal;
       $CPAN::Frontend->mydie("Got another SIGINT") if $Signal;
@@ -642,7 +573,8 @@ or
 #
 #       Larry
 
-    $SIG{'__DIE__'} = \&cleanup;
+    # global backstop to cleanup if we should really die
+    $SIG{__DIE__} = \&cleanup;
     $self->debug("Signal handler set.") if $CPAN::DEBUG;
 }
 
@@ -663,13 +595,51 @@ sub exists {
     CPAN::Index->reload;
     ### Carp::croak "exists called without class argument" unless $class;
     $id ||= "";
-    exists $META->{$class}{$id};
+    exists $META->{readonly}{$class}{$id} or
+        exists $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
 }
 
 #-> sub CPAN::delete ;
 sub delete {
   my($mgr,$class,$id) = @_;
-  delete $META->{$class}{$id};
+  delete $META->{readonly}{$class}{$id}; # unsafe meta access, ok
+  delete $META->{readwrite}{$class}{$id}; # unsafe meta access, ok
+}
+
+#-> sub CPAN::has_usable
+# has_inst is sometimes too optimistic, we should replace it with this
+# has_usable whenever a case is given
+sub has_usable {
+    my($self,$mod,$message) = @_;
+    return 1 if $HAS_USABLE->{$mod};
+    my $has_inst = $self->has_inst($mod,$message);
+    return unless $has_inst;
+    my $usable;
+    $usable = {
+               LWP => [ # we frequently had "Can't locate object
+                        # method "new" via package "LWP::UserAgent" at
+                        # (eval 69) line 2006
+                       sub {require LWP},
+                       sub {require LWP::UserAgent},
+                       sub {require HTTP::Request},
+                       sub {require URI::URL},
+                      ],
+               Net::FTP => [
+                            sub {require Net::FTP},
+                            sub {require Net::Config},
+                           ]
+              };
+    if ($usable->{$mod}) {
+      for my $c (0..$#{$usable->{$mod}}) {
+        my $code = $usable->{$mod}[$c];
+        my $ret = eval { &$code() };
+        if ($@) {
+          warn "DEBUG: c[$c]\$\@[$@]ret[$ret]";
+          return;
+        }
+      }
+    }
+    return $HAS_USABLE->{$mod} = 1;
 }
 
 #-> sub CPAN::has_inst
@@ -677,11 +647,14 @@ sub has_inst {
     my($self,$mod,$message) = @_;
     Carp::croak("CPAN->has_inst() called without an argument")
        unless defined $mod;
-    if (defined $message && $message eq "no") {
-       $Dontload{$mod}||=1;
-       return 0;
-    } elsif (exists $Dontload{$mod}) {
-       return 0;
+    if (defined $message && $message eq "no"
+        ||
+        exists $CPAN::META->{dontload_hash}{$mod} # unsafe meta access, ok
+        ||
+        exists $CPAN::Config->{dontload_hash}{$mod}
+       ) {
+      $CPAN::META->{dontload_hash}{$mod}||=1; # unsafe meta access, ok
+      return 0;
     }
     my $file = $mod;
     my $obj;
@@ -707,13 +680,13 @@ sub has_inst {
        }
        return 1;
     } elsif ($mod eq "Net::FTP") {
-       warn qq{
+       $CPAN::Frontend->mywarn(qq{
   Please, install Net::FTP as soon as possible. CPAN.pm installs it for you
   if you just type
       install Bundle::libnet
 
-};
-       sleep 2;
+}) unless $Have_warned->{"Net::FTP"}++;
+       sleep 3;
     } elsif ($mod eq "MD5"){
        $CPAN::Frontend->myprint(qq{
   CPAN: MD5 security checks disabled because MD5 not installed.
@@ -732,7 +705,9 @@ sub instance {
     my($mgr,$class,$id) = @_;
     CPAN::Index->reload;
     $id ||= "";
-    $META->{$class}{$id} ||= $class->new(ID => $id );
+    # unsafe meta access, ok?
+    return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id};
+    $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id);
 }
 
 #-> sub CPAN::new ;
@@ -760,9 +735,9 @@ sub cleanup {
     }
   }
   return if $ineval && !$End;
-  return unless defined $META->{'LOCK'};
-  return unless -f $META->{'LOCK'};
-  unlink $META->{'LOCK'};
+  return unless defined $META->{LOCK}; # unsafe meta access, ok
+  return unless -f $META->{LOCK}; # unsafe meta access, ok
+  unlink $META->{LOCK}; # unsafe meta access, ok
   # require Carp;
   # Carp::cluck("DEBUGGING");
   $CPAN::Frontend->mywarn("Lockfile removed.\n");
@@ -785,6 +760,7 @@ sub cachesize {
     shift->{DU};
 }
 
+#-> sub CPAN::CacheMgr::tidyup ;
 sub tidyup {
   my($self) = @_;
   return unless -d $self->{ID};
@@ -942,49 +918,85 @@ sub debug {
 package CPAN::Config;
 
 #-> sub CPAN::Config::edit ;
+# returns true on successful action
 sub edit {
-    my($class,@args) = @_;
+    my($self,@args) = @_;
     return unless @args;
-    CPAN->debug("class[$class]args[".join(" | ",@args)."]");
+    CPAN->debug("self[$self]args[".join(" | ",@args)."]");
     my($o,$str,$func,$args,$key_exists);
     $o = shift @args;
     if($can{$o}) {
-       $class->$o(@args);
+       $self->$o(@args);
        return 1;
     } else {
-       if (ref($CPAN::Config->{$o}) eq ARRAY) {
+        CPAN->debug("o[$o]") if $CPAN::DEBUG;
+       if ($o =~ /list$/) {
            $func = shift @args;
            $func ||= "";
+            CPAN->debug("func[$func]") if $CPAN::DEBUG;
+            my $changed;
            # Let's avoid eval, it's easier to comprehend without.
            if ($func eq "push") {
                push @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
            } elsif ($func eq "pop") {
                pop @{$CPAN::Config->{$o}};
+                $changed = 1;
            } elsif ($func eq "shift") {
                shift @{$CPAN::Config->{$o}};
+                $changed = 1;
            } elsif ($func eq "unshift") {
                unshift @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
            } elsif ($func eq "splice") {
                splice @{$CPAN::Config->{$o}}, @args;
+                $changed = 1;
            } elsif (@args) {
                $CPAN::Config->{$o} = [@args];
+                $changed = 1;
            } else {
-               $CPAN::Frontend->myprint(
-                                        join "",
-                                        "  $o  ",
-                                        ExtUtils::MakeMaker::neatvalue($CPAN::Config->{$o}),
-                                        "\n"
-                    );
+                $self->prettyprint($o);
            }
+            if ($o eq "urllist" && $changed) {
+                # reset the cached values
+                undef $CPAN::FTP::Thesite;
+                undef $CPAN::FTP::Themethod;
+            }
+            return $changed;
        } else {
            $CPAN::Config->{$o} = $args[0] if defined $args[0];
-           $CPAN::Frontend->myprint("    $o    " .
-                                    (defined $CPAN::Config->{$o} ?
-                                     $CPAN::Config->{$o} : "UNDEFINED"));
+           $self->prettyprint($o);
        }
     }
 }
 
+sub prettyprint {
+  my($self,$k) = @_;
+  my $v = $CPAN::Config->{$k};
+  if (ref $v) {
+    my(@report) = ref $v eq "ARRAY" ?
+        @$v :
+            map { sprintf("   %-18s => %s\n",
+                          $_,
+                          defined $v->{$_} ? $v->{$_} : "UNDEFINED"
+                         )} keys %$v;
+    $CPAN::Frontend->myprint(
+                             join(
+                                  "",
+                                  sprintf(
+                                          "    %-18s\n",
+                                          $k
+                                         ),
+                                  map {"\t$_\n"} @report
+                                 )
+                            );
+  } elsif (defined $v) {
+    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
+  } else {
+    $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, "UNDEFINED");
+  }
+}
+
 #-> sub CPAN::Config::commit ;
 sub commit {
     my($self,$configpm) = @_;
@@ -1005,7 +1017,8 @@ Please specify a filename where to save the configuration or try
        }
     }
 
-    my $msg = <<EOF unless $configpm =~ /MyConfig/;
+    my $msg;
+    $msg = <<EOF unless $configpm =~ /MyConfig/;
 
 # This is CPAN.pm's systemwide configuration file. This file provides
 # defaults for users, and the values can be changed in a per-user
@@ -1016,7 +1029,8 @@ EOF
     $msg ||= "\n";
     my($fh) = FileHandle->new;
     rename $configpm, "$configpm~" if -f $configpm;
-    open $fh, ">$configpm" or warn "Couldn't open >$configpm: $!";
+    open $fh, ">$configpm" or
+        $CPAN::Frontend->mywarn("Couldn't open >$configpm: $!");
     $fh->print(qq[$msg\$CPAN::Config = \{\n]);
     foreach (sort keys %$CPAN::Config) {
        $fh->print(
@@ -1069,8 +1083,8 @@ sub load {
                                         # system wide settings
       shift @INC;
     }
-    return unless @miss = $self->not_loaded;
-    # XXX better check for arrayrefs too
+    return unless @miss = $self->missing_config_data;
+
     require CPAN::FirstTime;
     my($configpm,$fh,$redo,$theycalled);
     $redo ||= "";
@@ -1137,15 +1151,18 @@ $configpm initialized.
     CPAN::FirstTime::init($configpm);
 }
 
-#-> sub CPAN::Config::not_loaded ;
-sub not_loaded {
+#-> sub CPAN::Config::missing_config_data ;
+sub missing_config_data {
     my(@miss);
-    for (qw(
-           cpan_home keep_source_where build_dir build_cache scan_cache
-           index_expire gzip tar unzip make pager makepl_arg make_arg
-           make_install_arg urllist inhibit_startup_message
-           ftp_proxy http_proxy no_proxy prerequisites_policy
-          )) {
+    for (
+         "cpan_home", "keep_source_where", "build_dir", "build_cache",
+         "scan_cache", "index_expire", "gzip", "tar", "unzip", "make",
+         "pager",
+         "makepl_arg", "make_arg", "make_install_arg", "urllist",
+         "inhibit_startup_message", "ftp_proxy", "http_proxy", "no_proxy",
+         "prerequisites_policy",
+         "cache_metadata",
+        ) {
        push @miss, $_ unless defined $CPAN::Config->{$_};
     }
     return @miss;
@@ -1241,11 +1258,19 @@ Other
 *help = \&h;
 
 #-> sub CPAN::Shell::a ;
-sub a { $CPAN::Frontend->myprint(shift->format_result('Author',@_));}
-#-> sub CPAN::Shell::b ;
-sub b {
+sub a {
+  my($self,@arg) = @_;
+  # authors are always UPPERCASE
+  for (@arg) {
+    $_ = uc $_;
+  }
+  $CPAN::Frontend->myprint($self->format_result('Author',@arg));
+}
+
+#-> sub CPAN::Shell::local_bundles ;
+
+sub local_bundles {
     my($self,@which) = @_;
-    CPAN->debug("which[@which]") if $CPAN::DEBUG;
     my($incdir,$bdir,$dh);
     foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
        $bdir = MM->catdir($incdir,"Bundle");
@@ -1253,15 +1278,24 @@ sub b {
            my($entry);
            for $entry ($dh->read) {
                next if -d MM->catdir($bdir,$entry);
-               next unless $entry =~ s/\.pm\z//;
+               next unless $entry =~ s/\.pm(?!\n)\Z//;
                $CPAN::META->instance('CPAN::Bundle',"Bundle::$entry");
            }
        }
     }
+}
+
+#-> sub CPAN::Shell::b ;
+sub b {
+    my($self,@which) = @_;
+    CPAN->debug("which[@which]") if $CPAN::DEBUG;
+    $self->local_bundles;
     $CPAN::Frontend->myprint($self->format_result('Bundle',@which));
 }
+
 #-> sub CPAN::Shell::d ;
 sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));}
+
 #-> sub CPAN::Shell::m ;
 sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here
     $CPAN::Frontend->myprint(shift->format_result('Module',@_));
@@ -1286,13 +1320,16 @@ sub i {
 }
 
 #-> sub CPAN::Shell::o ;
+
+# CPAN::Shell::o and CPAN::Config::edit are closely related. 'o conf'
+# should have been called set and 'o debug' maybe 'set debug'
 sub o {
     my($self,$o_type,@o_what) = @_;
     $o_type ||= "";
     CPAN->debug("o_type[$o_type] o_what[".join(" | ",@o_what)."]\n");
     if ($o_type eq 'conf') {
        shift @o_what if @o_what && $o_what[0] eq 'help';
-       if (!@o_what) {
+       if (!@o_what) { # print all things, "o conf"
            my($k,$v);
            $CPAN::Frontend->myprint("CPAN::Config options");
            if (exists $INC{'CPAN/Config.pm'}) {
@@ -1308,25 +1345,12 @@ sub o {
            }
            $CPAN::Frontend->myprint("\n");
            for $k (sort keys %$CPAN::Config) {
-               $v = $CPAN::Config->{$k};
-               if (ref $v) {
-                   $CPAN::Frontend->myprint(
-                                            join(
-                                                 "",
-                                                 sprintf(
-                                                         "    %-18s\n",
-                                                         $k
-                                                        ),
-                                                 map {"\t$_\n"} @{$v}
-                                                )
-                                           );
-               } else {
-                   $CPAN::Frontend->myprint(sprintf "    %-18s %s\n", $k, $v);
-               }
+                CPAN::Config->prettyprint($k);
            }
            $CPAN::Frontend->myprint("\n");
        } elsif (!CPAN::Config->edit(@o_what)) {
-           $CPAN::Frontend->myprint(qq[Type 'o conf' to view configuration edit options\n\n]);
+           $CPAN::Frontend->myprint(qq{Type 'o conf' to view configuration }.
+                                     qq{edit options\n\n});
        }
     } elsif ($o_type eq 'debug') {
        my(%valid);
@@ -1369,7 +1393,8 @@ sub o {
            my($k,$v);
            for $k (sort {$CPAN::DEBUG{$a} <=> $CPAN::DEBUG{$b}} keys %CPAN::DEBUG) {
                $v = $CPAN::DEBUG{$k};
-               $CPAN::Frontend->myprint(sprintf "    %-14s(%s)\n", $k, $v) if $v & $CPAN::DEBUG;
+               $CPAN::Frontend->myprint(sprintf "    %-14s(%s)\n", $k, $v)
+                    if $v & $CPAN::DEBUG;
            }
        } else {
            $CPAN::Frontend->myprint("Debugging turned off completely.\n");
@@ -1383,10 +1408,10 @@ Known options:
     }
 }
 
-sub dotdot_onreload {
+sub paintdots_onreload {
     my($ref) = shift;
     sub {
-       if ( $_[0] =~ /Subroutine (\w+) redefined/ ) {
+       if ( $_[0] =~ /[Ss]ubroutine (\w+) redefined/ ) {
            my($subr) = $1;
            ++$$ref;
            local($|) = 1;
@@ -1407,8 +1432,8 @@ sub reload {
        CPAN->debug("reloading the whole CPAN.pm") if $CPAN::DEBUG;
        my $fh = FileHandle->new($INC{'CPAN.pm'});
        local($/);
-       $redef = 0;
-       local($SIG{__WARN__}) = dotdot_onreload(\$redef);
+       my $redef = 0;
+       local($SIG{__WARN__}) = paintdots_onreload(\$redef);
        eval <$fh>;
        warn $@ if $@;
        $CPAN::Frontend->myprint("\n$redef subroutines redefined\n");
@@ -1424,12 +1449,12 @@ index    re-reads the index files\n});
 sub _binary_extensions {
     my($self) = shift @_;
     my(@result,$module,%seen,%need,$headerdone);
-    my $isaperl = q{perl5[._-]\\d{3}(_[0-4][0-9])?\\.tar[._-]gz\z};
     for $module ($self->expand('Module','/./')) {
        my $file  = $module->cpan_file;
        next if $file eq "N/A";
        next if $file =~ /^Contact Author/;
-       next if $file =~ / $isaperl /xo;
+        my $dist = $CPAN::META->instance('CPAN::Distribution',$file);
+       next if $dist->isa_perl;
        next unless $module->xs_file;
        local($|) = 1;
        $CPAN::Frontend->myprint(".");
@@ -1467,15 +1492,21 @@ sub _u_r_common {
     my($self) = shift @_;
     my($what) = shift @_;
     CPAN->debug("self[$self] what[$what] args[@_]") if $CPAN::DEBUG;
-    Carp::croak "Usage: \$obj->_u_r_common($what)" unless defined $what;
-    Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless $what =~ /^[aru]$/;
+    Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless
+          $what && $what =~ /^[aru]$/;
     my(@args) = @_;
     @args = '/./' unless @args;
     my(@result,$module,%seen,%need,$headerdone,
        $version_undefs,$version_zeroes);
     $version_undefs = $version_zeroes = 0;
     my $sprintf = "%-25s %9s %9s  %s\n";
-    for $module ($self->expand('Module',@args)) {
+    my @expand = $self->expand('Module',@args);
+    my $expand = scalar @expand;
+    if (0) { # Looks like noise to me, was very useful for debugging
+             # for metadata cache
+        $CPAN::Frontend->myprint(sprintf "%d matches in the database\n", $expand);
+    }
+    for $module (@expand) {
        my $file  = $module->cpan_file;
        next unless defined $file; # ??
        my($latest) = $module->cpan_version;
@@ -1493,7 +1524,7 @@ sub _u_r_common {
                } elsif ($have == 0){
                    $version_zeroes++;
                }
-               next if $have >= $latest;
+               next unless CPAN::Version->vgt($latest, $have);
 # to be pedantic we should probably say:
 #    && !($have eq "undef" && $latest ne "undef" && $latest gt "");
 # to catch the case where CPAN has a version 0 and we have a version undef
@@ -1531,9 +1562,11 @@ sub _u_r_common {
                   "in CPAN file"
                   ));
        }
-       $latest = substr($latest,0,8) if length($latest) > 8;
-       $have = substr($have,0,8) if length($have) > 8;
-       $CPAN::Frontend->myprint(sprintf $sprintf, $module->id, $have, $latest, $file);
+       $CPAN::Frontend->myprint(sprintf $sprintf,
+                                 $module->id,
+                                 $have,
+                                 $latest,
+                                 $file);
        $need{$module->id}++;
     }
     unless (%need) {
@@ -1615,47 +1648,80 @@ sub autobundle {
     $to\n\n");
 }
 
+#-> sub CPAN::Shell::expandany ;
+sub expandany {
+    my($self,$s) = @_;
+    CPAN->debug("s[$s]") if $CPAN::DEBUG;
+    if ($s =~ m|/|) { # looks like a file
+        return $CPAN::META->instance('CPAN::Distribution',$s);
+        # Distributions spring into existence, not expand
+    } elsif ($s =~ m|^Bundle::|) {
+        $self->local_bundles; # scanning so late for bundles seems
+                              # both attractive and crumpy: always
+                              # current state but easy to forget
+                              # somewhere
+        return $self->expand('Bundle',$s);
+    } else {
+        return $self->expand('Module',$s)
+            if $CPAN::META->exists('CPAN::Module',$s);
+    }
+    return;
+}
+
 #-> sub CPAN::Shell::expand ;
 sub expand {
     shift;
     my($type,@args) = @_;
     my($arg,@m);
     for $arg (@args) {
-       my $regex;
+       my($regex,$command);
        if ($arg =~ m|^/(.*)/$|) {
            $regex = $1;
-       }
+       } elsif ($arg =~ m/^=/) {
+            $command = substr($arg,1);
+        }
        my $class = "CPAN::$type";
        my $obj;
        if (defined $regex) {
-         for $obj (
-                   sort
-                   {$a->id cmp $b->id}
-                   $CPAN::META->all_objects($class)
-                  ) {
-           unless ($obj->id){
-             # BUG, we got an empty object somewhere
-             CPAN->debug(sprintf(
-                                 "Empty id on obj[%s]%%[%s]",
-                                 $obj,
-                                 join(":", %$obj)
-                                )) if $CPAN::DEBUG;
-             next;
-           }
-           push @m, $obj
-               if $obj->id =~ /$regex/i
-                   or
-                       (
-                        (
-                         $] < 5.00303 ### provide sort of
-                                       ### compatibility with 5.003
-                         ||
-                         $obj->can('name')
-                        )
-                        &&
-                        $obj->name  =~ /$regex/i
-                       );
-         }
+            for $obj (
+                      sort
+                      {$a->id cmp $b->id}
+                      $CPAN::META->all_objects($class)
+                     ) {
+                unless ($obj->id){
+                    # BUG, we got an empty object somewhere
+                    CPAN->debug(sprintf(
+                                        "Empty id on obj[%s]%%[%s]",
+                                        $obj,
+                                        join(":", %$obj)
+                                       )) if $CPAN::DEBUG;
+                    next;
+                }
+                push @m, $obj
+                    if $obj->id =~ /$regex/i
+                        or
+                            (
+                             (
+                              $] < 5.00303 ### provide sort of
+                              ### compatibility with 5.003
+                              ||
+                              $obj->can('name')
+                             )
+                             &&
+                             $obj->name  =~ /$regex/i
+                            );
+            }
+        } elsif ($command) {
+            die "leading equal sign in command disabled, ".
+                "please edit CPAN.pm to enable eval() or ".
+                    "do not use = on argument list";
+            for my $self (
+                          sort
+                          {$a->id cmp $b->id}
+                          $CPAN::META->all_objects($class)
+                         ) {
+                push @m, $self if eval $command;
+            }
        } else {
            my($xarg) = $arg;
            if ( $type eq 'Bundle' ) {
@@ -1770,42 +1836,41 @@ sub rematein {
     }
     setup_output();
     CPAN->debug("pragma[$pragma]meth[$meth] some[@some]") if $CPAN::DEBUG;
-    my($s,@s);
+
+    # Here is the place to set "test_count" on all involved parties to
+    # 0. We then can pass this counter on to the involved
+    # distributions and those can refuse to test if test_count > X. In
+    # the first stab at it we could use a 1 for "X".
+
+    # But when do I reset the distributions to start with 0 again?
+    # Jost suggested to have a random or cycling interaction ID that
+    # we pass through. But the ID is something that is just left lying
+    # around in addition to the counter, so I'd prefer to set the
+    # counter to 0 now, and repeat at the end of the loop. But what
+    # about dependencies? They appear later and are not reset, they
+    # enter the queue but not its copy. How do they get a sensible
+    # test_count?
+
+    # construct the queue
+    my($s,@s,@qcopy);
     foreach $s (@some) {
-      CPAN::Queue->new($s);
-    }
-    while ($s = CPAN::Queue->first) {
        my $obj;
        if (ref $s) {
+            CPAN->debug("s is an object[$s]") if $CPAN::DEBUG;
            $obj = $s;
-       } elsif ($s =~ m|/|) { # looks like a file
-           $obj = $CPAN::META->instance('CPAN::Distribution',$s);
-       } elsif ($s =~ m|^Bundle::|) {
-           $obj = $CPAN::META->instance('CPAN::Bundle',$s);
+       } elsif ($s =~ m|^/|) { # looks like a regexp
+            $CPAN::Frontend->mywarn("Sorry, $meth with a regular expression is ".
+                                    "not supported\n");
+            sleep 2;
+            next;
        } else {
-           $obj = $CPAN::META->instance('CPAN::Module',$s)
-               if $CPAN::META->exists('CPAN::Module',$s);
+            CPAN->debug("calling expandany [$s]") if $CPAN::DEBUG;
+           $obj = CPAN::Shell->expandany($s);
        }
        if (ref $obj) {
-           CPAN->debug(
-                       qq{pragma[$pragma]meth[$meth]obj[$obj]as_string\[}.
-                       $obj->as_string.
-                       qq{\]}
-                      ) if $CPAN::DEBUG;
-           $obj->$pragma()
-               if
-                   $pragma
-                       &&
-                   ($] < 5.00303 || $obj->can($pragma)); ###
-                                                          ### compatibility
-                                                          ### with
-                                                          ### 5.003
-           if ($]>=5.00303 && $obj->can('called_for')) {
-             $obj->called_for($s);
-           }
-           CPAN::Queue->delete($s) if $obj->$meth(); # if it is more
-                                                      # than once in
-                                                      # the queue
+            $obj->color_cmd_tmps(0,1);
+            CPAN::Queue->new($s);
+            push @qcopy, $obj;
        } elsif ($CPAN::META->exists('CPAN::Author',$s)) {
            $obj = $CPAN::META->instance('CPAN::Author',$s);
            $CPAN::Frontend->myprint(
@@ -1814,6 +1879,7 @@ sub rematein {
                                     $obj->fullname,
                                     " ;-)\n"
                                    );
+            sleep 2;
        } else {
            $CPAN::Frontend
                ->myprint(qq{Warning: Cannot $meth $s, }.
@@ -1822,13 +1888,55 @@ Try the command
 
     i /$s/
 
-to find objects with similar identifiers.
+to find objects with matching identifiers.
 });
+            sleep 2;
        }
+    }
+
+    # queuerunner (please be warned: when I started to change the
+    # queue to hold objects instead of names, I made one or two
+    # mistakes and never found which. I reverted back instead)
+    while ($s = CPAN::Queue->first) {
+        my $obj;
+       if (ref $s) {
+           $obj = $s; # I do not believe, we would survive if this happened
+       } else {
+           $obj = CPAN::Shell->expandany($s);
+       }
+        if ($pragma
+            &&
+            ($] < 5.00303 || $obj->can($pragma))){
+            ### compatibility with 5.003
+            $obj->$pragma($meth); # the pragma "force" in
+                                  # "CPAN::Distribution" must know
+                                  # what we are intending
+        }
+        if ($]>=5.00303 && $obj->can('called_for')) {
+            $obj->called_for($s);
+        }
+        CPAN->debug(
+                    qq{pragma[$pragma]meth[$meth]obj[$obj]as_string\[}.
+                    $obj->as_string.
+                    qq{\]}
+                   ) if $CPAN::DEBUG;
+
+        if ($obj->$meth()){
+            CPAN::Queue->delete($s);
+        } else {
+            CPAN->debug("failed");
+        }
+
+        $obj->undelay;
        CPAN::Queue->delete_first($s);
     }
+    for my $obj (@qcopy) {
+        $obj->color_cmd_tmps(0,0);
+    }
 }
 
+#-> sub CPAN::Shell::dump ;
+sub dump    { shift->rematein('dump',@_); }
 #-> sub CPAN::Shell::force ;
 sub force   { shift->rematein('force',@_); }
 #-> sub CPAN::Shell::get ;
@@ -1860,7 +1968,7 @@ sub ftp_get {
   my $ftp = Net::FTP->new($host);
   return 0 unless defined $ftp;
   $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG;
-  $class->debug(qq[Going to ->login("anonymous","$Config::Config{'cf_email'}")\n]);
+  $class->debug(qq[Going to login("anonymous","$Config::Config{cf_email}")]);
   unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ){
     warn "Couldn't login on $host";
     return;
@@ -1881,61 +1989,33 @@ sub ftp_get {
 
 # If more accuracy is wanted/needed, Chris Leach sent me this patch...
 
- # leach,> *** /install/perl/live/lib/CPAN.pm- Wed Sep 24 13:08:48 1997
- # leach,> --- /tmp/cp Wed Sep 24 13:26:40 1997
- # leach,> ***************
- # leach,> *** 1562,1567 ****
- # leach,> --- 1562,1580 ----
- # leach,>       return 1 if substr($url,0,4) eq "file";
- # leach,>       return 1 unless $url =~ m|://([^/]+)|;
- # leach,>       my $host = $1;
- # leach,> +     my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
- # leach,> +     if ($proxy) {
- # leach,> +         $proxy =~ m|://([^/:]+)|;
- # leach,> +         $proxy = $1;
- # leach,> +         my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
- # leach,> +         if ($noproxy) {
- # leach,> +             if ($host !~ /$noproxy$/) {
- # leach,> +                 $host = $proxy;
- # leach,> +             }
- # leach,> +         } else {
- # leach,> +             $host = $proxy;
- # leach,> +         }
- # leach,> +     }
- # leach,>       require Net::Ping;
- # leach,>       return 1 unless $Net::Ping::VERSION >= 2;
- # leach,>       my $p;
-
-
-# this is quite optimistic and returns one on several occasions where
-# inappropriate. But this does no harm. It would do harm if we were
-# too pessimistic (as I was before the http_proxy
-sub is_reachable {
-    my($self,$url) = @_;
-    return 1; # we can't simply roll our own, firewalls may break ping
-    return 0 unless $url;
-    return 1 if substr($url,0,4) eq "file";
-    return 1 unless $url =~ m|^(\w+)://([^/]+)|;
-    my $proxytype = $1 . "_proxy"; # ftp_proxy or http_proxy
-    my $host = $2;
-    return 1 if $CPAN::Config->{$proxytype} || $ENV{$proxytype};
-    require Net::Ping;
-    return 1 unless $Net::Ping::VERSION >= 2;
-    my $p;
-    # 1.3101 had it different: only if the first eval raised an
-    # exception we tried it with TCP. Now we are happy if icmp wins
-    # the order and return, we don't even check for $@. Thanks to
-    # thayer@uis.edu for the suggestion.
-    eval {$p = Net::Ping->new("icmp");};
-    return 1 if $p && ref($p) && $p->ping($host, 10);
-    eval {$p = Net::Ping->new("tcp");};
-    $CPAN::Frontend->mydie($@) if $@;
-    return $p->ping($host, 10);
-}
+ # > *** /install/perl/live/lib/CPAN.pm-       Wed Sep 24 13:08:48 1997
+ # > --- /tmp/cp       Wed Sep 24 13:26:40 1997
+ # > ***************
+ # > *** 1562,1567 ****
+ # > --- 1562,1580 ----
+ # >       return 1 if substr($url,0,4) eq "file";
+ # >       return 1 unless $url =~ m|://([^/]+)|;
+ # >       my $host = $1;
+ # > +     my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
+ # > +     if ($proxy) {
+ # > +         $proxy =~ m|://([^/:]+)|;
+ # > +         $proxy = $1;
+ # > +         my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
+ # > +         if ($noproxy) {
+ # > +             if ($host !~ /$noproxy$/) {
+ # > +                 $host = $proxy;
+ # > +             }
+ # > +         } else {
+ # > +             $host = $proxy;
+ # > +         }
+ # > +     }
+ # >       require Net::Ping;
+ # >       return 1 unless $Net::Ping::VERSION >= 2;
+ # >       my $p;
+
 
 #-> sub CPAN::FTP::localize ;
-# sorry for the ugly code here, I'll clean it up as soon as Net::FTP
-# is in the core
 sub localize {
     my($self,$file,$aslocal,$force) = @_;
     $force ||= 0;
@@ -1945,9 +2025,19 @@ sub localize {
        if $CPAN::DEBUG;
 
     if ($^O eq 'MacOS') {
+        # Comment by AK on 2000-09-03: Uniq short filenames would be
+        # available in CHECKSUMS file
         my($name, $path) = File::Basename::fileparse($aslocal, '');
         if (length($name) > 31) {
-            $name =~ s/(\.(readme(\.(gz|Z))?|(tar\.)?(gz|Z)|tgz|zip|pm\.(gz|Z)))$//;
+            $name =~ s/(
+                        \.(
+                           readme(\.(gz|Z))? |
+                           (tar\.)?(gz|Z) |
+                           tgz |
+                           zip |
+                           pm\.(gz|Z)
+                          )
+                       )$//x;
             my $suf = $1;
             my $size = 31 - length($suf);
             while (length($name) > $size) {
@@ -1973,19 +2063,22 @@ sub localize {
     to insufficient permissions.\n}) unless -w $aslocal_dir;
 
     # Inheritance is not easier to manage than a few if/else branches
-    if ($CPAN::META->has_inst('LWP::UserAgent')) {
-       require LWP::UserAgent;
+    if ($CPAN::META->has_usable('LWP::UserAgent')) {
        unless ($Ua) {
            $Ua = LWP::UserAgent->new;
            my($var);
            $Ua->proxy('ftp',  $var)
-               if $var = $CPAN::Config->{'ftp_proxy'} || $ENV{'ftp_proxy'};
+               if $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy};
            $Ua->proxy('http', $var)
-               if $var = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
+               if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy};
            $Ua->no_proxy($var)
-               if $var = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
+               if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy};
        }
     }
+    $ENV{ftp_proxy} = $CPAN::Config->{ftp_proxy} if $CPAN::Config->{ftp_proxy};
+    $ENV{http_proxy} = $CPAN::Config->{http_proxy}
+        if $CPAN::Config->{http_proxy};
+    $ENV{no_proxy} = $CPAN::Config->{no_proxy} if $CPAN::Config->{no_proxy};
 
     # Try the list of urls for each single object. We keep a record
     # where we did get a file from
@@ -2008,14 +2101,16 @@ sub localize {
                ($a == $Thesite)
            } 0..$last;
     }
-    my($level,@levels);
+    my(@levels);
     if ($Themethod) {
        @levels = ($Themethod, grep {$_ ne $Themethod} qw/easy hard hardest/);
     } else {
        @levels = qw/easy hard hardest/;
     }
     @levels = qw/easy/ if $^O eq 'MacOS';
-    for $level (@levels) {
+    my($levelno);
+    for $levelno (0..$#levels) {
+        my $level = $levels[$levelno];
        my $method = "host$level";
        my @host_seq = $level eq "easy" ?
            @reordered : 0..$last;  # reordered has CDROM up front
@@ -2030,17 +2125,20 @@ sub localize {
          return $ret;
        } else {
          unlink $aslocal;
+          last if $CPAN::Signal; # need to cleanup
        }
     }
-    my(@mess);
-    push @mess,
-    qq{Please check, if the URLs I found in your configuration file \(}.
-       join(", ", @{$CPAN::Config->{urllist}}).
-           qq{\) are valid. The urllist can be edited.},
-           qq{E.g. with ``o conf urllist push ftp://myurl/''};
-    $CPAN::Frontend->myprint(Text::Wrap::wrap("","",@mess). "\n\n");
-    sleep 2;
-    $CPAN::Frontend->myprint("Cannot fetch $file\n\n");
+    unless ($CPAN::Signal) {
+        my(@mess);
+        push @mess,
+            qq{Please check, if the URLs I found in your configuration file \(}.
+                join(", ", @{$CPAN::Config->{urllist}}).
+                    qq{\) are valid. The urllist can be edited.},
+                        qq{E.g. with 'o conf urllist push ftp://myurl/'};
+        $CPAN::Frontend->myprint(Text::Wrap::wrap("","",@mess). "\n\n");
+        sleep 2;
+        $CPAN::Frontend->myprint("Cannot fetch $file\n\n");
+    }
     if ($restore) {
        rename "$aslocal.bak", $aslocal;
        $CPAN::Frontend->myprint("Trying to get away with old file:\n" .
@@ -2054,19 +2152,13 @@ sub hosteasy {
     my($self,$host_seq,$file,$aslocal) = @_;
     my($i);
   HOSTEASY: for $i (@$host_seq) {
-      my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
-       unless ($self->is_reachable($url)) {
-           $CPAN::Frontend->myprint("Skipping $url (seems to be not reachable)\n");
-           sleep 2;
-           next;
-       }
+        my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
        $url .= "/" unless substr($url,-1) eq "/";
        $url .= $file;
        $self->debug("localizing perlish[$url]") if $CPAN::DEBUG;
        if ($url =~ /^file:/) {
            my $l;
-           if ($CPAN::META->has_inst('LWP')) {
-               require URI::URL;
+           if ($CPAN::META->has_inst('URI::URL')) {
                my $u =  URI::URL->new($url);
                $l = $u->path;
            } else { # works only on Unix, is poorly constructed, but
@@ -2095,7 +2187,7 @@ sub hosteasy {
                }
            }
        }
-      if ($CPAN::META->has_inst('LWP')) {
+        if ($CPAN::META->has_usable('LWP')) {
          $CPAN::Frontend->myprint("Fetching with LWP:
   $url
 ");
@@ -2110,7 +2202,7 @@ sub hosteasy {
            utime $now, $now, $aslocal; # download time is more
                                         # important than upload time
            return $aslocal;
-         } elsif ($url !~ /\.gz\z/) {
+         } elsif ($url !~ /\.gz(?!\n)\Z/) {
            my $gzurl = "$url.gz";
            $CPAN::Frontend->myprint("Fetching with LWP:
   $gzurl
@@ -2121,22 +2213,20 @@ sub hosteasy {
               ) {
              $Thesite = $i;
              return $aslocal;
-           } else {
-             # next HOSTEASY ;
            }
          } else {
-           # Alan Burlison informed me that in firewall envs Net::FTP
-           # can still succeed where LWP fails. So we do not skip
-           # Net::FTP anymore when LWP is available.
-           # next HOSTEASY ;
+           # Alan Burlison informed me that in firewall environments
+           # Net::FTP can still succeed where LWP fails. So we do not
+           # skip Net::FTP anymore when LWP is available.
          }
        } else {
          $self->debug("LWP not installed") if $CPAN::DEBUG;
        }
+        return if $CPAN::Signal;
        if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
            # that's the nice and easy way thanks to Graham
            my($host,$dir,$getfile) = ($1,$2,$3);
-           if ($CPAN::META->has_inst('Net::FTP')) {
+           if ($CPAN::META->has_usable('Net::FTP')) {
                $dir =~ s|/+|/|g;
                $CPAN::Frontend->myprint("Fetching with Net::FTP:
   $url
@@ -2147,7 +2237,7 @@ sub hosteasy {
                    $Thesite = $i;
                    return $aslocal;
                }
-               if ($aslocal !~ /\.gz\z/) {
+               if ($aslocal !~ /\.gz(?!\n)\Z/) {
                    my $gz = "$aslocal.gz";
                    $CPAN::Frontend->myprint("Fetching with Net::FTP
   $url.gz
@@ -2165,6 +2255,7 @@ sub hosteasy {
                # next HOSTEASY;
            }
        }
+        return if $CPAN::Signal;
     }
 }
 
@@ -2182,10 +2273,6 @@ sub hosthard {
   File::Path::mkpath($aslocal_dir);
   HOSTHARD: for $i (@$host_seq) {
        my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
-       unless ($self->is_reachable($url)) {
-         $CPAN::Frontend->myprint("Skipping $url (not reachable)\n");
-         next;
-       }
        $url .= "/" unless substr($url,-1) eq "/";
        $url .= $file;
        my($proto,$host,$dir,$getfile);
@@ -2199,6 +2286,8 @@ sub hosthard {
        } else {
          next HOSTHARD; # who said, we could ftp anything except ftp?
        }
+        next HOSTHARD if $proto eq "file"; # file URLs would have had
+                                           # success above. Likely a bogus URL
 
        $self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG;
        my($f,$funkyftp);
@@ -2207,83 +2296,78 @@ sub hosthard {
          $funkyftp = $CPAN::Config->{$f};
          next unless defined $funkyftp;
          next if $funkyftp =~ /^\s*$/;
-         my($want_compressed);
-         my $aslocal_uncompressed;
-         ($aslocal_uncompressed = $aslocal) =~ s/\.gz//;
-         my($source_switch) = "";
+         my($asl_ungz, $asl_gz);
+         ($asl_ungz = $aslocal) =~ s/\.gz//;
+          $asl_gz = "$asl_ungz.gz";
+         my($src_switch) = "";
          if ($f eq "lynx"){
-           $source_switch = " -source";
+           $src_switch = " -source";
          } elsif ($f eq "ncftp"){
-           $source_switch = " -c";
+           $src_switch = " -c";
          }
          my($chdir) = "";
-         my($stdout_redir) = " > $aslocal_uncompressed";
+         my($stdout_redir) = " > $asl_ungz";
          if ($f eq "ncftpget"){
            $chdir = "cd $aslocal_dir && ";
            $stdout_redir = "";
          }
          $CPAN::Frontend->myprint(
                                   qq[
-Trying with "$funkyftp$source_switch" to get
+Trying with "$funkyftp$src_switch" to get
     $url
 ]);
          my($system) =
-             "$chdir$funkyftp$source_switch '$url' $devnull$stdout_redir";
+             "$chdir$funkyftp$src_switch '$url' $devnull$stdout_redir";
          $self->debug("system[$system]") if $CPAN::DEBUG;
          my($wstatus);
          if (($wstatus = system($system)) == 0
              &&
              ($f eq "lynx" ?
-              -s $aslocal_uncompressed   # lynx returns 0 on my
-                                          # system even if it fails
+              -s $asl_ungz # lynx returns 0 when it fails somewhere
               : 1
              )
             ) {
            if (-s $aslocal) {
              # Looks good
-           } elsif ($aslocal_uncompressed ne $aslocal) {
+           } elsif ($asl_ungz ne $aslocal) {
              # test gzip integrity
-             if (
-                 CPAN::Tarzip->gtest($aslocal_uncompressed)
-                ) {
-               rename $aslocal_uncompressed, $aslocal;
+             if (CPAN::Tarzip->gtest($asl_ungz)) {
+                  # e.g. foo.tar is gzipped --> foo.tar.gz
+                  rename $asl_ungz, $aslocal;
              } else {
-               CPAN::Tarzip->gzip($aslocal_uncompressed,
-                                  "$aslocal_uncompressed.gz");
+                  CPAN::Tarzip->gzip($asl_ungz,$asl_gz);
              }
            }
            $Thesite = $i;
            return $aslocal;
-         } elsif ($url !~ /\.gz\z/) {
-           unlink $aslocal_uncompressed if
-               -f $aslocal_uncompressed && -s _ == 0;
+         } elsif ($url !~ /\.gz(?!\n)\Z/) {
+           unlink $asl_ungz if
+               -f $asl_ungz && -s _ == 0;
            my $gz = "$aslocal.gz";
            my $gzurl = "$url.gz";
            $CPAN::Frontend->myprint(
                                     qq[
-Trying with "$funkyftp$source_switch" to get
+Trying with "$funkyftp$src_switch" to get
   $url.gz
 ]);
-           my($system) = "$funkyftp$source_switch '$url.gz' $devnull > ".
-               "$aslocal_uncompressed.gz";
+           my($system) = "$funkyftp$src_switch '$url.gz' $devnull > $asl_gz";
            $self->debug("system[$system]") if $CPAN::DEBUG;
            my($wstatus);
            if (($wstatus = system($system)) == 0
                &&
-               -s "$aslocal_uncompressed.gz"
+               -s $asl_gz
               ) {
              # test gzip integrity
-             if (CPAN::Tarzip->gtest("$aslocal_uncompressed.gz")) {
-               CPAN::Tarzip->gunzip("$aslocal_uncompressed.gz",
-                                    $aslocal);
+             if (CPAN::Tarzip->gtest($asl_gz)) {
+                  CPAN::Tarzip->gunzip($asl_gz,$aslocal);
              } else {
-               rename $aslocal_uncompressed, $aslocal;
+                  # somebody uncompressed file for us?
+                  rename $asl_ungz, $aslocal;
              }
              $Thesite = $i;
              return $aslocal;
            } else {
-             unlink "$aslocal_uncompressed.gz" if
-                 -f "$aslocal_uncompressed.gz";
+             unlink $asl_gz if -f $asl_gz;
            }
          } else {
            my $estatus = $wstatus >> 8;
@@ -2295,8 +2379,9 @@ System call "$system"
 returned status $estatus (wstat $wstatus)$size
 });
          }
-       }
-    }
+          return if $CPAN::Signal;
+       } # lynx,ncftpget,ncftp
+    } # host
 }
 
 sub hosthardest {
@@ -2311,10 +2396,6 @@ sub hosthardest {
            last HOSTHARDEST;
        }
        my $url = $CPAN::Config->{urllist}[$i] || $CPAN::Defaultsite;
-       unless ($self->is_reachable($url)) {
-           $CPAN::Frontend->myprint("Skipping $url (not reachable)\n");
-           next;
-       }
        $url .= "/" unless substr($url,-1) eq "/";
        $url .= $file;
        $self->debug("localizing ftpwise[$url]") if $CPAN::DEBUG;
@@ -2367,6 +2448,7 @@ sub hosthardest {
                } else {
                    $CPAN::Frontend->myprint("Hmm... Still failed!\n");
                }
+                return if $CPAN::Signal;
            } else {
                $CPAN::Frontend->mywarn(qq{Your $netrcfile is not }.
                                        qq{correctly protected.\n});
@@ -2396,9 +2478,10 @@ sub hosthardest {
        } else {
            $CPAN::Frontend->myprint("Bad luck... Still failed!\n");
        }
+        return if $CPAN::Signal;
        $CPAN::Frontend->myprint("Can't access URL $url.\n\n");
        sleep 2;
-    }
+    } # host
 }
 
 sub talk_ftp {
@@ -2576,8 +2659,8 @@ sub cpl {
        @return = grep(
                       /^$word/,
                       sort qw(
-                              ! a b d h i m o q r u autobundle clean
-                              make test install force reload look cvs_import
+                              ! a b d h i m o q r u autobundle clean dump
+                              make test install force readme reload look cvs_import
                              )
                      );
     } elsif ( $line !~ /^[\!abcdhimorutl]/ ) {
@@ -2588,7 +2671,9 @@ sub cpl {
        @return = cplx('CPAN::Bundle',$word);
     } elsif ($line =~ /^d\s/) {
        @return = cplx('CPAN::Distribution',$word);
-    } elsif ($line =~ /^([mru]|make|clean|test|install|readme|look|cvs_import)\s/ ) {
+    } elsif ($line =~ m/^(
+                          [mru]|make|clean|dump|test|install|readme|look|cvs_import
+                         )\s/x ) {
        @return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
     } elsif ($line =~ /^i\s/) {
        @return = cpl_any($word);
@@ -2605,7 +2690,11 @@ sub cpl {
 #-> sub CPAN::Complete::cplx ;
 sub cplx {
     my($class, $word) = @_;
-    grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
+    # I believed for many years that this was sorted, today I
+    # realized, it wasn't sorted anymore. Now (rev 1.301 / v 1.55) I
+    # make it sorted again. Maybe sort was dropped when GNU-readline
+    # support came in? The RCS file is difficult to read on that:-(
+    sort grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
 }
 
 #-> sub CPAN::Complete::cpl_any ;
@@ -2668,51 +2757,63 @@ sub reload {
     for ($CPAN::Config->{index_expire}) {
        $_ = 0.001 unless $_ && $_ > 0.001;
     }
+    $CPAN::META->{PROTOCOL} ||= "1.0";
+    if ( $CPAN::META->{PROTOCOL} < PROTOCOL  ) {
+        # warn "Setting last_time to 0";
+        $last_time = 0; # No warning necessary
+    }
     return if $last_time + $CPAN::Config->{index_expire}*86400 > $time
        and ! $force;
-    ## IFF we are developing, it helps to wipe out the memory between
-    ## reloads, otherwise it is not what a user expects.
-
-    ## undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
-    ## $CPAN::META = CPAN->new;
-    my($debug,$t2);
+    if (0) {
+        # IFF we are developing, it helps to wipe out the memory
+        # between reloads, otherwise it is not what a user expects.
+        undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
+        $CPAN::META = CPAN->new;
+    }
+    {
+        my($debug,$t2);
+        local $last_time = $time;
+        local $CPAN::META->{PROTOCOL} = PROTOCOL;
+
+        my $needshort = $^O eq "dos";
+
+        $cl->rd_authindex($cl
+                          ->reload_x(
+                                     "authors/01mailrc.txt.gz",
+                                     $needshort ?
+                                     File::Spec->catfile('authors', '01mailrc.gz') :
+                                     File::Spec->catfile('authors', '01mailrc.txt.gz'),
+                                     $force));
+        $t2 = time;
+        $debug = "timing reading 01[".($t2 - $time)."]";
+        $time = $t2;
+        return if $CPAN::Signal; # this is sometimes lengthy
+        $cl->rd_modpacks($cl
+                         ->reload_x(
+                                    "modules/02packages.details.txt.gz",
+                                    $needshort ?
+                                    File::Spec->catfile('modules', '02packag.gz') :
+                                    File::Spec->catfile('modules', '02packages.details.txt.gz'),
+                                    $force));
+        $t2 = time;
+        $debug .= "02[".($t2 - $time)."]";
+        $time = $t2;
+        return if $CPAN::Signal; # this is sometimes lengthy
+        $cl->rd_modlist($cl
+                        ->reload_x(
+                                   "modules/03modlist.data.gz",
+                                   $needshort ?
+                                   File::Spec->catfile('modules', '03mlist.gz') :
+                                   File::Spec->catfile('modules', '03modlist.data.gz'),
+                                   $force));
+        $cl->write_metadata_cache;
+        $t2 = time;
+        $debug .= "03[".($t2 - $time)."]";
+        $time = $t2;
+        CPAN->debug($debug) if $CPAN::DEBUG;
+    }
     $last_time = $time;
-
-    my $needshort = $^O eq "dos";
-
-    $cl->rd_authindex($cl
-                     ->reload_x(
-                                "authors/01mailrc.txt.gz",
-                                $needshort ?
-                                File::Spec->catfile('authors', '01mailrc.gz') :
-                                File::Spec->catfile('authors', '01mailrc.txt.gz'),
-                                $force));
-    $t2 = time;
-    $debug = "timing reading 01[".($t2 - $time)."]";
-    $time = $t2;
-    return if $CPAN::Signal; # this is sometimes lengthy
-    $cl->rd_modpacks($cl
-                    ->reload_x(
-                               "modules/02packages.details.txt.gz",
-                               $needshort ?
-                               File::Spec->catfile('modules', '02packag.gz') :
-                               File::Spec->catfile('modules', '02packages.details.txt.gz'),
-                               $force));
-    $t2 = time;
-    $debug .= "02[".($t2 - $time)."]";
-    $time = $t2;
-    return if $CPAN::Signal; # this is sometimes lengthy
-    $cl->rd_modlist($cl
-                   ->reload_x(
-                              "modules/03modlist.data.gz",
-                              $needshort ?
-                              File::Spec->catfile('modules', '03mlist.gz') :
-                              File::Spec->catfile('modules', '03modlist.data.gz'),
-                              $force));
-    $t2 = time;
-    $debug .= "03[".($t2 - $time)."]";
-    $time = $t2;
-    CPAN->debug($debug) if $CPAN::DEBUG;
+    $CPAN::META->{PROTOCOL} = PROTOCOL;
 }
 
 #-> sub CPAN::Index::reload_x ;
@@ -2773,7 +2874,7 @@ sub userid {
 
 #-> sub CPAN::Index::rd_modpacks ;
 sub rd_modpacks {
-    my($cl, $index_target) = @_;
+    my($self, $index_target) = @_;
     my @lines;
     return unless defined $index_target;
     $CPAN::Frontend->myprint("Going to read $index_target\n");
@@ -2785,16 +2886,43 @@ sub rd_modpacks {
        unshift @ls, "\n" x length($1) if /^(\n+)/;
        push @lines, @ls;
     }
+    # read header
+    my $line_count;
     while (@lines) {
        my $shift = shift(@lines);
+       $shift =~ /^Line-Count:\s+(\d+)/;
+       $line_count = $1 if $1;
        last if $shift =~ /^\s*$/;
     }
+    if (not defined $line_count) {
+
+       warn qq{Warning: Your $index_target does not contain a Line-Count header.
+Please check the validity of the index file by comparing it to more
+than one CPAN mirror. I'll continue but problems seem likely to
+happen.\a
+};
+
+       sleep 5;
+    } elsif ($line_count != scalar @lines) {
+
+       warn sprintf qq{Warning: Your %s
+contains a Line-Count header of %d but I see %d lines there. Please
+check the validity of the index file by comparing it to more than one
+CPAN mirror. I'll continue but problems seem likely to happen.\a\n},
+$index_target, $line_count, scalar(@lines);
+
+    }
+    # A necessity since we have metadata_cache: delete what isn't
+    # there anymore
+    my $secondtime = $CPAN::META->exists("CPAN::Module","CPAN");
+    CPAN->debug("secondtime[$secondtime]") if $CPAN::DEBUG;
+    my(%exists);
     foreach (@lines) {
        chomp;
-       my($mod,$version,$dist) = split;
-###    $version =~ s/^\+//;
-
-       # if it is a bundle, instantiate a bundle object
+        # before 1.56 we split into 3 and discarded the rest. From
+        # 1.57 we assign remaining text to $comment thus allowing to
+        # influence isa_perl
+       my($mod,$version,$dist,$comment) = split " ", $_, 4;
        my($bundle,$id,$userid);
 
        if ($mod eq 'CPAN' &&
@@ -2803,18 +2931,18 @@ sub rd_modpacks {
               CPAN::Queue->exists('CPAN')
              )
           ) {
-           local($^W)= 0;
-           if ($version > $CPAN::VERSION){
-               $CPAN::Frontend->myprint(qq{
-  There\'s a new CPAN.pm version (v$version) available!
+            local($^W)= 0;
+            if ($version > $CPAN::VERSION){
+                $CPAN::Frontend->myprint(qq{
+  There's a new CPAN.pm version (v$version) available!
   [Current version is v$CPAN::VERSION]
   You might want to try
     install Bundle::CPAN
     reload cpan
   without quitting the current session. It should be a seamless upgrade
   while we are running...
-});
-               sleep 2;
+}); #});
+                sleep 2;
                $CPAN::Frontend->myprint(qq{\n});
            }
            last if $CPAN::Signal;
@@ -2824,29 +2952,29 @@ sub rd_modpacks {
 
        if ($bundle){
            $id =  $CPAN::META->instance('CPAN::Bundle',$mod);
-           # warn "made mod[$mod]a bundle";
            # Let's make it a module too, because bundles have so much
-           # in common with modules
-           $CPAN::META->instance('CPAN::Module',$mod);
-           # warn "made mod[$mod]a module";
+           # in common with modules.
 
-# This "next" makes us faster but if the job is running long, we ignore
-# rereads which is bad. So we have to be a bit slower again.
-#      } elsif ($CPAN::META->exists('CPAN::Module',$mod)) {
-#          next;
+            # Changed in 1.57_63: seems like memory bloat now without
+            # any value, so commented out
+
+           # $CPAN::META->instance('CPAN::Module',$mod);
+
+       } else {
 
-       }
-       else {
            # instantiate a module object
            $id = $CPAN::META->instance('CPAN::Module',$mod);
+
        }
 
-       if ($id->cpan_file ne $dist){
-           $userid = $cl->userid($dist);
+       if ($id->cpan_file ne $dist){ # update only if file is
+                                      # different. CPAN prohibits same
+                                      # name with different version
+           $userid = $self->userid($dist);
            $id->set(
                     'CPAN_USERID' => $userid,
                     'CPAN_VERSION' => $version,
-                    'CPAN_FILE' => $dist
+                    'CPAN_FILE' => $dist,
                    );
        }
 
@@ -2863,13 +2991,29 @@ sub rd_modpacks {
          $CPAN::META->instance(
                                'CPAN::Distribution' => $dist
                               )->set(
-                                     'CPAN_USERID' => $userid
+                                     'CPAN_USERID' => $userid,
+                                      'CPAN_COMMENT' => $comment,
                                     );
        }
-
+        if ($secondtime) {
+            for my $name ($mod,$dist) {
+                CPAN->debug("exists name[$name]") if $CPAN::DEBUG;
+                $exists{$name} = undef;
+            }
+        }
        return if $CPAN::Signal;
     }
     undef $fh;
+    if ($secondtime) {
+        for my $class (qw(CPAN::Module CPAN::Bundle CPAN::Distribution)) {
+            for my $o ($CPAN::META->all_objects($class)) {
+                next if exists $exists{$o->{ID}};
+                $CPAN::META->delete($class,$o->{ID});
+                CPAN->debug("deleting ID[$o->{ID}] in class[$class]")
+                    if $CPAN::DEBUG;
+            }
+        }
+    }
 }
 
 #-> sub CPAN::Index::rd_modlist ;
@@ -2904,25 +3048,123 @@ sub rd_modlist {
     return if $CPAN::Signal;
     for (keys %$ret) {
        my $obj = $CPAN::META->instance(CPAN::Module,$_);
+        delete $ret->{$_}{modid}; # not needed here, maybe elsewhere
        $obj->set(%{$ret->{$_}});
        return if $CPAN::Signal;
     }
 }
 
+#-> sub CPAN::Index::write_metadata_cache ;
+sub write_metadata_cache {
+    my($self) = @_;
+    return unless $CPAN::Config->{'cache_metadata'};
+    return unless $CPAN::META->has_usable("Storable");
+    my $cache;
+    foreach my $k (qw(CPAN::Bundle CPAN::Author CPAN::Module
+                     CPAN::Distribution)) {
+       $cache->{$k} = $CPAN::META->{readonly}{$k}; # unsafe meta access, ok
+    }
+    my $metadata_file = MM->catfile($CPAN::Config->{cpan_home},"Metadata");
+    $cache->{last_time} = $last_time;
+    $cache->{PROTOCOL} = PROTOCOL;
+    $CPAN::Frontend->myprint("Going to write $metadata_file\n");
+    eval { Storable::nstore($cache, $metadata_file) };
+    $CPAN::Frontend->mywarn($@) if $@;
+}
+
+#-> sub CPAN::Index::read_metadata_cache ;
+sub read_metadata_cache {
+    my($self) = @_;
+    return unless $CPAN::Config->{'cache_metadata'};
+    return unless $CPAN::META->has_usable("Storable");
+    my $metadata_file = MM->catfile($CPAN::Config->{cpan_home},"Metadata");
+    return unless -r $metadata_file and -f $metadata_file;
+    $CPAN::Frontend->myprint("Going to read $metadata_file\n");
+    my $cache;
+    eval { $cache = Storable::retrieve($metadata_file) };
+    $CPAN::Frontend->mywarn($@) if $@;
+    if (!$cache || ref $cache ne 'HASH'){
+        $last_time = 0;
+        return;
+    }
+    if (exists $cache->{PROTOCOL}) {
+        if (PROTOCOL > $cache->{PROTOCOL}) {
+            $CPAN::Frontend->mywarn(sprintf("Ignoring Metadata cache written ".
+                                            "with protocol v%s, requiring v%s",
+                                            $cache->{PROTOCOL},
+                                            PROTOCOL)
+                                   );
+            return;
+        }
+    } else {
+        $CPAN::Frontend->mywarn("Ignoring Metadata cache written ".
+                                "with protocol v1.0");
+        return;
+    }
+    my $clcnt = 0;
+    my $idcnt = 0;
+    while(my($class,$v) = each %$cache) {
+       next unless $class =~ /^CPAN::/;
+       $CPAN::META->{readonly}{$class} = $v; # unsafe meta access, ok
+        while (my($id,$ro) = each %$v) {
+            $CPAN::META->{readwrite}{$class}{$id} ||=
+                $class->new(ID=>$id, RO=>$ro);
+            $idcnt++;
+        }
+        $clcnt++;
+    }
+    unless ($clcnt) { # sanity check
+        $CPAN::Frontend->myprint("Warning: Found no data in $metadata_file\n");
+        return;
+    }
+    if ($idcnt < 1000) {
+        $CPAN::Frontend->myprint("Warning: Found only $idcnt objects ".
+                                 "in $metadata_file\n");
+        return;
+    }
+    $CPAN::META->{PROTOCOL} ||=
+        $cache->{PROTOCOL}; # reading does not up or downgrade, but it
+                            # does initialize to some protocol
+    $last_time = $cache->{last_time};
+}
+
 package CPAN::InfoObj;
 
+# Accessors
+sub cpan_userid { shift->{RO}{CPAN_USERID} }
+sub id { shift->{ID} }
+
 #-> sub CPAN::InfoObj::new ;
-sub new { my $this = bless {}, shift; %$this = @_; $this }
+sub new {
+    my $this = bless {}, shift;
+    %$this = @_;
+    $this
+}
+
+# The set method may only be used by code that reads index data or
+# otherwise "objective" data from the outside world. All session
+# related material may do anything else with instance variables but
+# must not touch the hash under the RO attribute. The reason is that
+# the RO hash gets written to Metadata file and is thus persistent.
 
 #-> sub CPAN::InfoObj::set ;
 sub set {
     my($self,%att) = @_;
-    my(%oldatt) = %$self;
-    %$self = (%oldatt, %att);
-}
+    my $class = ref $self;
+
+    # This must be ||=, not ||, because only if we write an empty
+    # reference, only then the set method will write into the readonly
+    # area. But for Distributions that spring into existence, maybe
+    # because of a typo, we do not like it that they are written into
+    # the readonly area and made permanent (at least for a while) and
+    # that is why we do not "allow" other places to call ->set.
+    my $ro = $self->{RO} =
+        $CPAN::META->{readonly}{$class}{$self->id} ||= {};
 
-#-> sub CPAN::InfoObj::id ;
-sub id { shift->{'ID'} }
+    while (my($k,$v) = each %att) {
+        $ro->{$k} = $v;
+    }
+}
 
 #-> sub CPAN::InfoObj::as_glimpse ;
 sub as_glimpse {
@@ -2941,31 +3183,36 @@ sub as_string {
     my $class = ref($self);
     $class =~ s/^CPAN:://;
     push @m, $class, " id = $self->{ID}\n";
-    for (sort keys %$self) {
-       next if $_ eq 'ID';
+    for (sort keys %{$self->{RO}}) {
+       # next if m/^(ID|RO)$/;
        my $extra = "";
        if ($_ eq "CPAN_USERID") {
          $extra .= " (".$self->author;
          my $email; # old perls!
          if ($email = $CPAN::META->instance(CPAN::Author,
-                                               $self->{$_}
-                                              )->email) {
+                                             $self->cpan_userid
+                                            )->email) {
            $extra .= " <$email>";
          } else {
            $extra .= " <no email>";
          }
          $extra .= ")";
        }
-       if (ref($self->{$_}) eq "ARRAY") { # language interface? XXX
-         push @m, sprintf "    %-12s %s%s\n", $_, "@{$self->{$_}}", $extra;
+        next unless defined $self->{RO}{$_};
+        push @m, sprintf "    %-12s %s%s\n", $_, $self->{RO}{$_}, $extra;
+    }
+    for (sort keys %$self) {
+       next if m/^(ID|RO)$/;
+       if (ref($self->{$_}) eq "ARRAY") {
+         push @m, sprintf "    %-12s %s\n", $_, "@{$self->{$_}}";
        } elsif (ref($self->{$_}) eq "HASH") {
          push @m, sprintf(
-                          "    %-12s %s%s\n",
+                          "    %-12s %s\n",
                           $_,
                           join(" ",keys %{$self->{$_}}),
-                          $extra);
+                          );
        } else {
-         push @m, sprintf "    %-12s %s%s\n", $_, $self->{$_}, $extra;
+         push @m, sprintf "    %-12s %s\n", $_, $self->{$_};
        }
     }
     join "", @m, "\n";
@@ -2974,13 +3221,14 @@ sub as_string {
 #-> sub CPAN::InfoObj::author ;
 sub author {
     my($self) = @_;
-    $CPAN::META->instance(CPAN::Author,$self->{CPAN_USERID})->fullname;
+    $CPAN::META->instance(CPAN::Author,$self->cpan_userid)->fullname;
 }
 
+#-> sub CPAN::InfoObj::dump ;
 sub dump {
   my($self) = @_;
   require Data::Dumper;
-  Data::Dumper::Dumper($self);
+  print Data::Dumper::Dumper($self);
 }
 
 package CPAN::Author;
@@ -2995,21 +3243,53 @@ sub as_glimpse {
     join "", @m;
 }
 
-# Dead code, I would have liked to have,,, but it was never reached,,,
-#sub make {
-#    my($self) = @_;
-#    return "Don't be silly, you can't make $self->{FULLNAME} ;-)\n";
-#}
-
 #-> sub CPAN::Author::fullname ;
-sub fullname { shift->{'FULLNAME'} }
+sub fullname { shift->{RO}{FULLNAME} }
 *name = \&fullname;
 
 #-> sub CPAN::Author::email ;
-sub email    { shift->{'EMAIL'} }
+sub email    { shift->{RO}{EMAIL} }
 
 package CPAN::Distribution;
 
+# Accessors
+sub cpan_comment { shift->{RO}{CPAN_COMMENT} }
+
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+}
+
+#-> sub CPAN::Distribution::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    # a distribution needs to recurse into its prereq_pms
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
+                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
+                                   $depth,
+                                   $self,
+                                   $self->id
+                                  )) if $depth>=100;
+    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+    my $prereq_pm = $self->prereq_pm;
+    if (defined $prereq_pm) {
+        for my $pre (keys %$prereq_pm) {
+            my $premo = CPAN::Shell->expand("Module",$pre);
+            $premo->color_cmd_tmps($depth+1,$color);
+        }
+    }
+    if ($color==0) {
+        delete $self->{sponsored_mods};
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
 #-> sub CPAN::Distribution::as_string ;
 sub as_string {
   my $self = shift;
@@ -3022,9 +3302,11 @@ sub containsmods {
   my $self = shift;
   return if exists $self->{CONTAINSMODS};
   for my $mod ($CPAN::META->all_objects("CPAN::Module")) {
-    my $mod_file = $mod->{CPAN_FILE} or next;
+    my $mod_file = $mod->cpan_file or next;
     my $dist_id = $self->{ID} or next;
     my $mod_id = $mod->{ID} or next;
+    # warn "mod_file[$mod_file] dist_id[$dist_id] mod_id[$mod_id]";
+    # sleep 1;
     $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id;
   }
 }
@@ -3032,8 +3314,8 @@ sub containsmods {
 #-> sub CPAN::Distribution::called_for ;
 sub called_for {
     my($self,$id) = @_;
-    $self->{'CALLED_FOR'} = $id if defined $id;
-    return $self->{'CALLED_FOR'};
+    $self->{CALLED_FOR} = $id if defined $id;
+    return $self->{CALLED_FOR};
 }
 
 #-> sub CPAN::Distribution::get ;
@@ -3042,30 +3324,32 @@ sub get {
   EXCUSE: {
        my @e;
        exists $self->{'build_dir'} and push @e,
-           "Unwrapped into directory $self->{'build_dir'}";
+           "Is already unwrapped into directory $self->{'build_dir'}";
        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
     }
     my($local_file);
     my($local_wanted) =
-        MM->catfile(
-                       $CPAN::Config->{keep_source_where},
-                       "authors",
-                       "id",
-                       split("/",$self->{ID})
-                      );
+        MM->catfile(
+                    $CPAN::Config->{keep_source_where},
+                    "authors",
+                    "id",
+                    split("/",$self->id)
+                   );
 
     $self->debug("Doing localize") if $CPAN::DEBUG;
     $local_file =
        CPAN::FTP->localize("authors/id/$self->{ID}", $local_wanted)
            or $CPAN::Frontend->mydie("Giving up on '$local_wanted'\n");
+    return if $CPAN::Signal;
     $self->{localfile} = $local_file;
-    my $builddir = $CPAN::META->{cachemgr}->dir;
+    $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); # unsafe meta access, ok
+    my $builddir = $CPAN::META->{cachemgr}->dir; # unsafe meta access, ok
     $self->debug("doing chdir $builddir") if $CPAN::DEBUG;
     chdir $builddir or Carp::croak("Couldn't chdir $builddir: $!");
     my $packagedir;
 
     $self->debug("local_file[$local_file]") if $CPAN::DEBUG;
-    if ($CPAN::META->has_inst('MD5')) {
+    if ($CPAN::META->has_inst("MD5")) {
        $self->debug("MD5 is installed, verifying");
        $self->verifyMD5;
     } else {
@@ -3074,74 +3358,96 @@ sub get {
     $self->debug("Removing tmp") if $CPAN::DEBUG;
     File::Path::rmtree("tmp");
     mkdir "tmp", 0755 or Carp::croak "Couldn't mkdir tmp: $!";
-    chdir "tmp";
+    chdir "tmp" or $CPAN::Frontend->mydie(qq{Could not chdir to "tmp": $!});;
     $self->debug("Changed directory to tmp") if $CPAN::DEBUG;
+    return if $CPAN::Signal;
     if (! $local_file) {
        Carp::croak "bad download, can't do anything :-(\n";
-    } elsif ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)\z/i){
+    } elsif ($local_file =~ /(\.tar\.(gz|Z)|\.tgz)(?!\n)\Z/i){
+        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
        $self->untar_me($local_file);
-    } elsif ( $local_file =~ /\.zip\z/i ) {
+    } elsif ( $local_file =~ /\.zip(?!\n)\Z/i ) {
        $self->unzip_me($local_file);
-    } elsif ( $local_file =~ /\.pm\.(gz|Z)\z/) {
+    } elsif ( $local_file =~ /\.pm\.(gz|Z)(?!\n)\Z/) {
+        $self->{was_uncompressed}++ unless CPAN::Tarzip->gtest($local_file);
        $self->pm2dir_me($local_file);
     } else {
        $self->{archived} = "NO";
     }
-    chdir File::Spec->updir;
+    my $cwd = File::Spec->updir;
+    chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "": $!});
     if ($self->{archived} ne 'NO') {
-       chdir File::Spec->catdir(File::Spec->curdir, "tmp");
-       # Let's check if the package has its own directory.
-       my $dh = DirHandle->new(File::Spec->curdir)
-           or Carp::croak("Couldn't opendir .: $!");
-       my @readdir = grep $_ !~ /^\.\.?\z/s, $dh->read; ### MAC??
-       $dh->close;
-       my ($distdir,$packagedir);
-       if (@readdir == 1 && -d $readdir[0]) {
-           $distdir = $readdir[0];
-           $packagedir = MM->catdir($builddir,$distdir);
-           -d $packagedir and $CPAN::Frontend->myprint("Removing previously used $packagedir\n");
-           File::Path::rmtree($packagedir);
-           rename($distdir,$packagedir) or Carp::confess("Couldn't rename $distdir to $packagedir: $!");
-       } else {
-           my $pragmatic_dir = $self->{'CPAN_USERID'} . '000';
-           $pragmatic_dir =~ s/\W_//g;
-           $pragmatic_dir++ while -d "../$pragmatic_dir";
-           $packagedir = MM->catdir($builddir,$pragmatic_dir);
-           File::Path::mkpath($packagedir);
-           my($f);
-           for $f (@readdir) { # is already without "." and ".."
-               my $to = MM->catdir($packagedir,$f);
-               rename($f,$to) or Carp::confess("Couldn't rename $f to $to: $!");
-           }
-       }
-       $self->{'build_dir'} = $packagedir;
-       chdir File::Spec->updir;
-
-       $self->debug("Changed directory to .. (self is $self [".$self->as_string."])")
-           if $CPAN::DEBUG;
-       File::Path::rmtree("tmp");
-       if ($CPAN::Config->{keep_source_where} =~ /^no/i ){
-           $CPAN::Frontend->myprint("Going to unlink $local_file\n");
-           unlink $local_file or Carp::carp "Couldn't unlink $local_file";
-       }
-       my($makefilepl) = MM->catfile($packagedir,"Makefile.PL");
-       unless (-f $makefilepl) {
-         my($configure) = MM->catfile($packagedir,"Configure");
-         if (-f $configure) {
-           # do we have anything to do?
-           $self->{'configure'} = $configure;
-         } elsif (-f MM->catfile($packagedir,"Makefile")) {
-           $CPAN::Frontend->myprint(qq{
+      $cwd = File::Spec->catdir(File::Spec->curdir, "tmp");
+      chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
+      # Let's check if the package has its own directory.
+      my $dh = DirHandle->new(File::Spec->curdir)
+          or Carp::croak("Couldn't opendir .: $!");
+      my @readdir = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh->read; ### MAC??
+      $dh->close;
+      my ($distdir,$packagedir);
+      if (@readdir == 1 && -d $readdir[0]) {
+        $distdir = $readdir[0];
+        $packagedir = MM->catdir($builddir,$distdir);
+        -d $packagedir and $CPAN::Frontend->myprint("Removing previously used ".
+                                                    "$packagedir\n");
+        File::Path::rmtree($packagedir);
+        rename($distdir,$packagedir) or
+            Carp::confess("Couldn't rename $distdir to $packagedir: $!");
+      } else {
+          my $userid = $self->cpan_userid;
+          unless ($userid) {
+              CPAN->debug("no userid? self[$self]");
+              $userid = "anon";
+          }
+          my $pragmatic_dir = $userid . '000';
+          $pragmatic_dir =~ s/\W_//g;
+          $pragmatic_dir++ while -d "../$pragmatic_dir";
+          $packagedir = MM->catdir($builddir,$pragmatic_dir);
+          File::Path::mkpath($packagedir);
+          my($f);
+          for $f (@readdir) { # is already without "." and ".."
+              my $to = MM->catdir($packagedir,$f);
+              rename($f,$to) or Carp::confess("Couldn't rename $f to $to: $!");
+          }
+      }
+      $self->{'build_dir'} = $packagedir;
+      $cwd = File::Spec->updir;
+      chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
+
+      $self->debug("Changed directory to .. (self[$self]=[".
+                   $self->as_string."])") if $CPAN::DEBUG;
+      File::Path::rmtree("tmp");
+      if ($CPAN::Config->{keep_source_where} =~ /^no/i ){
+        $CPAN::Frontend->myprint("Going to unlink $local_file\n");
+        unlink $local_file or Carp::carp "Couldn't unlink $local_file";
+      }
+      my($makefilepl) = MM->catfile($packagedir,"Makefile.PL");
+      unless (-f $makefilepl) {
+        my($configure) = MM->catfile($packagedir,"Configure");
+        if (-f $configure) {
+          # do we have anything to do?
+          $self->{'configure'} = $configure;
+        } elsif (-f MM->catfile($packagedir,"Makefile")) {
+          $CPAN::Frontend->myprint(qq{
 Package comes with a Makefile and without a Makefile.PL.
 We\'ll try to build it with that Makefile then.
 });
-           $self->{writemakefile} = "YES";
-           sleep 2;
-         } else {
-           my $fh = FileHandle->new(">$makefilepl")
-               or Carp::croak("Could not open >$makefilepl");
-           my $cf = $self->called_for || "unknown";
-           $fh->print(
+          $self->{writemakefile} = "YES";
+          sleep 2;
+        } else {
+          my $cf = $self->called_for || "unknown";
+          if ($cf =~ m|/|) {
+              $cf =~ s|.*/||;
+              $cf =~ s|\W.*||;
+          }
+          $cf =~ s|[/\\:]||g; # risk of filesystem damage
+          $cf = "unknown" unless length($cf);
+          $CPAN::Frontend->myprint(qq{Package comes without Makefile.PL.
+  Writing one on our own (calling it $cf)\n});
+          $self->{had_no_makefile_pl}++;
+          my $fh = FileHandle->new(">$makefilepl")
+              or Carp::croak("Could not open >$makefilepl");
+          $fh->print(
 qq{# This Makefile.PL has been autogenerated by the module CPAN.pm
 # because there was no Makefile.PL supplied.
 # Autogenerated on: }.scalar localtime().qq{
@@ -3150,14 +3456,14 @@ use ExtUtils::MakeMaker;
 WriteMakefile(NAME => q[$cf]);
 
 });
-           $CPAN::Frontend->myprint(qq{Package comes without Makefile.PL.
-  Writing one on our own (calling it $cf)\n});
-           }
-       }
+          $fh->close;
+        }
+      }
     }
     return $self;
 }
 
+# CPAN::Distribution::untar_me ;
 sub untar_me {
     my($self,$local_file) = @_;
     $self->{archived} = "tar";
@@ -3168,22 +3474,23 @@ sub untar_me {
     }
 }
 
+# CPAN::Distribution::unzip_me ;
 sub unzip_me {
     my($self,$local_file) = @_;
     $self->{archived} = "zip";
-    my $system = "$CPAN::Config->{unzip} $local_file";
-    if (system($system) == 0) {
+    if (CPAN::Tarzip->unzip($local_file)) {
        $self->{unwrapped} = "YES";
     } else {
        $self->{unwrapped} = "NO";
     }
+    return;
 }
 
 sub pm2dir_me {
     my($self,$local_file) = @_;
     $self->{archived} = "pm";
     my $to = File::Basename::basename($local_file);
-    $to =~ s/\.(gz|Z)\z//;
+    $to =~ s/\.(gz|Z)(?!\n)\Z//;
     if (CPAN::Tarzip->gunzip($local_file,$to)) {
        $self->{unwrapped} = "YES";
     } else {
@@ -3195,7 +3502,7 @@ sub pm2dir_me {
 sub new {
     my($class,%att) = @_;
 
-    $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new();
+    # $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new();
 
     my $this = { %att };
     return bless $this, $class;
@@ -3227,13 +3534,14 @@ Please define it with "o conf shell <your shell>"
     my $getcwd;
     $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
     my $pwd  = CPAN->$getcwd();
-    chdir($dir);
+    chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!});
     $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
     system($CPAN::Config->{'shell'}) == 0
        or $CPAN::Frontend->mydie("Subprocess shell error");
-    chdir($pwd);
+    chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!});
 }
 
+# CPAN::Distribution::cvs_import ;
 sub cvs_import {
     my($self) = @_;
     $self->get;
@@ -3243,10 +3551,10 @@ sub cvs_import {
     my $module = $CPAN::META->instance('CPAN::Module', $package);
     my $version = $module->cpan_version;
 
-    my $userid = $self->{CPAN_USERID};
+    my $userid = $self->cpan_userid;
 
     my $cvs_dir = (split '/', $dir)[-1];
-    $cvs_dir =~ s/-\d+[^-]+\z//;
+    $cvs_dir =~ s/-\d+[^-]+(?!\n)\Z//;
     my $cvs_root = 
       $CPAN::Config->{cvsroot} || $ENV{CVSROOT};
     my $cvs_site_perl = 
@@ -3262,14 +3570,14 @@ sub cvs_import {
     my $getcwd;
     $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
     my $pwd  = CPAN->$getcwd();
-    chdir($dir);
+    chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!});
 
     $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
 
     $CPAN::Frontend->myprint(qq{@cmd\n});
-    system(@cmd) == 0 or 
+    system(@cmd) == 0 or
        $CPAN::Frontend->mydie("cvs import failed");
-    chdir($pwd);
+    chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!});
 }
 
 #-> sub CPAN::Distribution::readme ;
@@ -3343,7 +3651,7 @@ sub verifyMD5 {
        $lc_file = CPAN::FTP->localize("authors/id/@local",
                                       "$lc_want.gz",1);
        if ($lc_file) {
-           $lc_file =~ s/\.gz\z//;
+           $lc_file =~ s/\.gz(?!\n)\Z//;
            CPAN::Tarzip->gunzip("$lc_file.gz",$lc_file);
        } else {
            return;
@@ -3401,33 +3709,42 @@ sub MD5_check_file {
          $CPAN::Frontend->myprint("Checksum for $file ok\n");
          return $self->{MD5_STATUS} = "OK";
        } else {
-           $CPAN::Frontend->myprint(qq{Checksum mismatch for }.
+           $CPAN::Frontend->myprint(qq{\nChecksum mismatch for }.
                                     qq{distribution file. }.
                                     qq{Please investigate.\n\n}.
                                     $self->as_string,
                                     $CPAN::META->instance(
                                                           'CPAN::Author',
-                                                          $self->{CPAN_USERID}
+                                                          $self->cpan_userid
                                                          )->as_string);
-           my $wrap = qq{I\'d recommend removing $file. It seems to
-be a bogus file. Maybe you have configured your \`urllist\' with a
-bad URL. Please check this array with \`o conf urllist\', and
+
+           my $wrap = qq{I\'d recommend removing $file. Its MD5
+checksum is incorrect. Maybe you have configured your 'urllist' with
+a bad URL. Please check this array with 'o conf urllist', and
 retry.};
-           $CPAN::Frontend->myprint(Text::Wrap::wrap("","",$wrap));
-           $CPAN::Frontend->myprint("\n\n");
-           sleep 3;
-           return;
+
+            $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap));
+
+            # former versions just returned here but this seems a
+            # serious threat that deserves a die
+
+           # $CPAN::Frontend->myprint("\n\n");
+           # sleep 3;
+           # return;
        }
        # close $fh if fileno($fh);
     } else {
        $self->{MD5_STATUS} ||= "";
        if ($self->{MD5_STATUS} eq "NIL") {
-           $CPAN::Frontend->myprint(qq{
-No md5 checksum for $basename in local $chk_file.
-Removing $chk_file
+           $CPAN::Frontend->mywarn(qq{
+Warning: No md5 checksum for $basename in $chk_file.
+
+The cause for this may be that the file is very new and the checksum
+has not yet been calculated, but it may also be that something is
+going awry right now.
 });
-           unlink $chk_file or $CPAN::Frontend->myprint("Could not unlink: $!");
-           sleep 1;
+            my $answer = ExtUtils::MakeMaker::prompt("Proceed?", "yes");
+            $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.");
        }
        $self->{MD5_STATUS} = "NIL";
        return;
@@ -3449,28 +3766,58 @@ sub eq_MD5 {
 }
 
 #-> sub CPAN::Distribution::force ;
+
+# Both modules and distributions know if "force" is in effect by
+# autoinspection, not by inspecting a global variable. One of the
+# reason why this was chosen to work that way was the treatment of
+# dependencies. They should not autpomatically inherit the force
+# status. But this has the downside that ^C and die() will return to
+# the prompt but will not be able to reset the force_update
+# attributes. We try to correct for it currently in the read_metadata
+# routine, and immediately before we check for a Signal. I hope this
+# works out in one of v1.57_53ff
+
 sub force {
-  my($self) = @_;
-  $self->{'force_update'}++;
+  my($self, $method) = @_;
   for my $att (qw(
   MD5_STATUS archived build_dir localfile make install unwrapped
   writemakefile
  )) {
     delete $self->{$att};
   }
+  if ($method && $method eq "install") {
+    $self->{"force_update"}++; # name should probably have been force_install
+  }
 }
 
+#-> sub CPAN::Distribution::unforce ;
+sub unforce {
+  my($self) = @_;
+  delete $self->{'force_update'};
+}
+
+#-> sub CPAN::Distribution::isa_perl ;
 sub isa_perl {
   my($self) = @_;
   my $file = File::Basename::basename($self->id);
-  return unless $file =~ m{ ^ perl
-                           (5)
-                           ([._-])
-                           (\d{3}(_[0-4][0-9])?)
-                           \.tar[._-]gz
-                           \z
-                         }xs;
-  "$1.$3";
+  if ($file =~ m{ ^ perl
+                  -?
+                 (5)
+                 ([._-])
+                 (
+                   \d{3}(_[0-4][0-9])?
+                   |
+                   \d*[24680]\.\d+
+                  )
+                 \.tar[._-]gz
+                 (?!\n)\Z
+               }xs){
+    return "$1.$3";
+  } elsif ($self->cpan_comment
+           &&
+           $self->cpan_comment =~ /isa_perl\(.+?\)/){
+    return $1;
+  }
 }
 
 #-> sub CPAN::Distribution::perl ;
@@ -3505,9 +3852,11 @@ sub make {
     # Emergency brake if they said install Pippi and get newest perl
     if ($self->isa_perl) {
       if (
-         $self->called_for ne $self->id && ! $self->{'force_update'}
+         $self->called_for ne $self->id &&
+          ! $self->{force_update}
         ) {
-       $CPAN::Frontend->mydie(sprintf qq{
+        # if we die here, we break bundles
+       $CPAN::Frontend->mywarn(sprintf qq{
 The most recent version "%s" of the module "%s"
 comes with the current version of perl (%s).
 I\'ll build that only if you ask for something like
@@ -3523,6 +3872,7 @@ or
                               $self->isa_perl,
                               $self->called_for,
                               $self->id);
+        sleep 5; return;
       }
     }
     $self->get;
@@ -3539,7 +3889,10 @@ or
                $1 || "Had some problem writing Makefile";
 
        defined $self->{'make'} and push @e,
-       "Has already been processed within this session";
+            "Has already been processed within this session";
+
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
 
        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
     }
@@ -3606,6 +3959,7 @@ or
        }
        if (-f "Makefile") {
          $self->{writemakefile} = "YES";
+          delete $self->{make_clean}; # if cleaned before, enable next
        } else {
          $self->{writemakefile} =
              qq{NO Makefile.PL refused to write a Makefile.};
          # $self->{writemakefile} .= <$fh>;
        }
     }
-    return if $CPAN::Signal;
-    if (my @prereq = $self->needs_prereq){
-      my $id = $self->id;
-      $CPAN::Frontend->myprint("---- Dependencies detected ".
-                              "during [$id] -----\n");
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
+    if (my @prereq = $self->unsat_prereq){
+      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
+    }
+    $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg};
+    if (system($system) == 0) {
+        $CPAN::Frontend->myprint("  $system -- OK\n");
+        $self->{'make'} = "YES";
+    } else {
+        $self->{writemakefile} ||= "YES";
+        $self->{'make'} = "NO";
+        $CPAN::Frontend->myprint("  $system -- NOT OK\n");
+    }
+}
+
+sub follow_prereqs {
+    my($self) = shift;
+    my(@prereq) = @_;
+    my $id = $self->id;
+    $CPAN::Frontend->myprint("---- Unsatisfied dependencies detected ".
+                             "during [$id] -----\n");
 
-      for my $p (@prereq) {
+    for my $p (@prereq) {
        $CPAN::Frontend->myprint("    $p\n");
-      }
-      my $follow = 0;
-      if ($CPAN::Config->{prerequisites_policy} eq "follow") {
+    }
+    my $follow = 0;
+    if ($CPAN::Config->{prerequisites_policy} eq "follow") {
        $follow = 1;
-      } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") {
+    } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") {
        require ExtUtils::MakeMaker;
        my $answer = ExtUtils::MakeMaker::prompt(
 "Shall I follow them and prepend them to the queue
 of modules we are processing right now?", "yes");
        $follow = $answer =~ /^\s*y/i;
-      } else {
+    } else {
        local($") = ", ";
-       $CPAN::Frontend->myprint("  Ignoring dependencies on modules @prereq\n");
-      }
-      if ($follow) {
-       CPAN::Queue->jumpqueue(@prereq,$id); # requeue yourself
-       return;
-      }
+       $CPAN::Frontend->
+            myprint("  Ignoring dependencies on modules @prereq\n");
     }
-    $system = join " ", $CPAN::Config->{'make'}, $CPAN::Config->{make_arg};
-    if (system($system) == 0) {
-        $CPAN::Frontend->myprint("  $system -- OK\n");
-        $self->{'make'} = "YES";
-    } else {
-        $self->{writemakefile} ||= "YES";
-        $self->{'make'} = "NO";
-        $CPAN::Frontend->myprint("  $system -- NOT OK\n");
+    if ($follow) {
+        # color them as dirty
+        for my $p (@prereq) {
+            CPAN::Shell->expandany($p)->color_cmd_tmps(0,1);
+        }
+        CPAN::Queue->jumpqueue(@prereq,$id); # queue them and requeue yourself
+        $self->{later} = "Delayed until after prerequisites";
+        return 1; # signal success to the queuerunner
     }
 }
 
-#-> sub CPAN::Distribution::needs_prereq ;
-sub needs_prereq {
-  my($self) = @_;
-  return unless -f "Makefile"; # we cannot say much
-  my $fh = FileHandle->new("<Makefile") or
-      $CPAN::Frontend->mydie("Couldn't open Makefile: $!");
-  local($/) = "\n";
+#-> sub CPAN::Distribution::unsat_prereq ;
+sub unsat_prereq {
+    my($self) = @_;
+    my $prereq_pm = $self->prereq_pm or return;
+    my(@need);
+  NEED: while (my($need_module, $need_version) = each %$prereq_pm) {
+        my $nmo = $CPAN::META->instance("CPAN::Module",$need_module);
+        # we were too demanding:
+        next if $nmo->uptodate;
+
+        # if they have not specified a version, we accept any installed one
+        if (not defined $need_version or
+           $need_version == 0 or
+           $need_version eq "undef") {
+            next if defined $nmo->inst_file;
+        }
 
-  my(@p,@need);
-  while (<$fh>) {
-    last if /MakeMaker post_initialize section/;
-    my($p) = m{^[\#]
-                \s+PREREQ_PM\s+=>\s+(.+)
-                }x;
-    next unless $p;
-    # warn "Found prereq expr[$p]";
+        # We only want to install prereqs if either they're not installed
+        # or if the installed version is too old. We cannot omit this
+        # check, because if 'force' is in effect, nobody else will check.
+        {
+            local($^W) = 0;
+            if (
+                defined $nmo->inst_file &&
+                ! CPAN::Version->vgt($need_version, $nmo->inst_version)
+               ){
+                CPAN->debug(sprintf "id[%s]inst_file[%s]inst_version[%s]need_version[%s]",
+                            $nmo->id,
+                            $nmo->inst_file,
+                            $nmo->inst_version,
+                            CPAN::Version->readable($need_version)
+                           );
+                next NEED;
+            }
+        }
 
-    while ( $p =~ m/(?:\s)([\w\:]+)=>q\[.*?\],?/g ){
-      push @p, $1;
+        if ($self->{sponsored_mods}{$need_module}++){
+            # We have already sponsored it and for some reason it's still
+            # not available. So we do nothing. Or what should we do?
+            # if we push it again, we have a potential infinite loop
+            next;
+        }
+        push @need, $need_module;
     }
-    last;
-  }
-  for my $p (@p) {
-    my $mo = $CPAN::META->instance("CPAN::Module",$p);
-    next if $mo->uptodate;
-    # it's not needed, so don't push it. We cannot omit this step, because
-    # if 'force' is in effect, nobody else will check.
-    if ($self->{have_sponsored}{$p}++){
-      # We have already sponsored it and for some reason it's still
-      # not available. So we do nothing. Or what should we do?
-      # if we push it again, we have a potential infinite loop
-      next;
-    }
-    push @need, $p;
+    @need;
+}
+
+#-> sub CPAN::Distribution::prereq_pm ;
+sub prereq_pm {
+  my($self) = @_;
+  return $self->{prereq_pm} if
+      exists $self->{prereq_pm_detected} && $self->{prereq_pm_detected};
+  return unless $self->{writemakefile}; # no need to have succeeded
+                                        # but we must have run it
+  my $build_dir = $self->{build_dir} or die "Panic: no build_dir?";
+  my $makefile = File::Spec->catfile($build_dir,"Makefile");
+  my(%p) = ();
+  my $fh;
+  if (-f $makefile
+      and
+      $fh = FileHandle->new("<$makefile\0")) {
+
+      local($/) = "\n";
+
+      #  A.Speer @p -> %p, where %p is $p{Module::Name}=Required_Version
+      while (<$fh>) {
+          last if /MakeMaker post_initialize section/;
+          my($p) = m{^[\#]
+                \s+PREREQ_PM\s+=>\s+(.+)
+                }x;
+          next unless $p;
+          # warn "Found prereq expr[$p]";
+
+          #  Regexp modified by A.Speer to remember actual version of file
+          #  PREREQ_PM hash key wants, then add to
+          while ( $p =~ m/(?:\s)([\w\:]+)=>q\[(.*?)\],?/g ){
+              # In case a prereq is mentioned twice, complain.
+              if ( defined $p{$1} ) {
+                  warn "Warning: PREREQ_PM mentions $1 more than once, last mention wins";
+              }
+              $p{$1} = $2;
+          }
+          last;
+      }
   }
-  return @need;
+  $self->{prereq_pm_detected}++;
+  return $self->{prereq_pm} = \%p;
 }
 
 #-> sub CPAN::Distribution::test ;
 sub test {
     my($self) = @_;
     $self->make;
-    return if $CPAN::Signal;
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
     $CPAN::Frontend->myprint("Running make test\n");
+    if (my @prereq = $self->unsat_prereq){
+      return 1 if $self->follow_prereqs(@prereq); # signal success to the queuerunner
+    }
   EXCUSE: {
        my @e;
-       exists $self->{'make'} or push @e,
+       exists $self->{make} or exists $self->{later} or push @e,
        "Make had some problems, maybe interrupted? Won't test";
 
        exists $self->{'make'} and
            $self->{'make'} eq 'NO' and
-               push @e, "Oops, make had returned bad status";
+               push @e, "Can't test without successful make";
+
+       exists $self->{build_dir} or push @e, "Has no own directory";
+        $self->{badtestcnt} ||= 0;
+        $self->{badtestcnt} > 0 and
+            push @e, "Won't repeat unsuccessful test during this command";
+
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
 
-       exists $self->{'build_dir'} or push @e, "Has no own directory";
        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
     }
     chdir $self->{'build_dir'} or
@@ -3722,9 +4155,10 @@ sub test {
     my $system = join " ", $CPAN::Config->{'make'}, "test";
     if (system($system) == 0) {
         $CPAN::Frontend->myprint("  $system -- OK\n");
-        $self->{'make_test'} = "YES";
+        $self->{make_test} = "YES";
     } else {
-        $self->{'make_test'} = "NO";
+        $self->{make_test} = "NO";
+         $self->{badtestcnt}++;
         $CPAN::Frontend->myprint("  $system -- NOT OK\n");
     }
 }
@@ -3735,7 +4169,9 @@ sub clean {
     $CPAN::Frontend->myprint("Running make clean\n");
   EXCUSE: {
        my @e;
-       exists $self->{'build_dir'} or push @e, "Has no own directory";
+        exists $self->{make_clean} and $self->{make_clean} eq "YES" and
+            push @e, "make clean already called once";
+       exists $self->{build_dir} or push @e, "Has no own directory";
        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
     }
     chdir $self->{'build_dir'} or
@@ -3749,10 +4185,31 @@ sub clean {
 
     my $system = join " ", $CPAN::Config->{'make'}, "clean";
     if (system($system) == 0) {
-       $CPAN::Frontend->myprint("  $system -- OK\n");
-       $self->force;
+      $CPAN::Frontend->myprint("  $system -- OK\n");
+
+      # $self->force;
+
+      # Jost Krieger pointed out that this "force" was wrong because
+      # it has the effect that the next "install" on this distribution
+      # will untar everything again. Instead we should bring the
+      # object's state back to where it is after untarring.
+
+      delete $self->{force_update};
+      delete $self->{install};
+      delete $self->{writemakefile};
+      delete $self->{make};
+      delete $self->{make_test}; # no matter if yes or no, tests must be redone
+      $self->{make_clean} = "YES";
+
     } else {
-       # Hmmm, what to do if make clean failed?
+      # Hmmm, what to do if make clean failed?
+
+      $CPAN::Frontend->myprint(qq{  $system -- NOT OK
+
+make clean did not succeed, marking directory as unusable for further work.
+});
+      $self->force("make"); # so that this directory won't be used again
+
     }
 }
 
@@ -3760,18 +4217,21 @@ sub clean {
 sub install {
     my($self) = @_;
     $self->test;
-    return if $CPAN::Signal;
+    if ($CPAN::Signal){
+      delete $self->{force_update};
+      return;
+    }
     $CPAN::Frontend->myprint("Running make install\n");
   EXCUSE: {
        my @e;
-       exists $self->{'build_dir'} or push @e, "Has no own directory";
+       exists $self->{build_dir} or push @e, "Has no own directory";
 
-       exists $self->{'make'} or push @e,
+       exists $self->{make} or exists $self->{later} or push @e,
        "Make had some problems, maybe interrupted? Won't install";
 
        exists $self->{'make'} and
            $self->{'make'} eq 'NO' and
-               push @e, "Oops, make had returned bad status";
+               push @e, "make had returned bad status, install seems impossible";
 
        push @e, "make test had returned bad status, ".
            "won't install without force"
@@ -3783,6 +4243,9 @@ sub install {
        $self->{'install'} eq "YES" ?
            "Already done" : "Already tried without success";
 
+        exists $self->{later} and length($self->{later}) and
+            push @e, $self->{later};
+
        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
     }
     chdir $self->{'build_dir'} or
@@ -3816,6 +4279,7 @@ sub install {
                                      qq{to root to install the package\n});
         }
     }
+    delete $self->{force_update};
 }
 
 #-> sub CPAN::Distribution::dir ;
@@ -3825,10 +4289,49 @@ sub dir {
 
 package CPAN::Bundle;
 
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+    for my $c ( $self->contains ) {
+        my $obj = CPAN::Shell->expandany($c) or next;
+        $obj->undelay;
+    }
+}
+
+#-> sub CPAN::Bundle::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    # a module needs to recurse to its cpan_file, a distribution needs
+    # to recurse into its prereq_pms, a bundle needs to recurse into its modules
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
+                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
+                                   $depth,
+                                   $self,
+                                   $self->id
+                                  )) if $depth>=100;
+    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+
+    for my $c ( $self->contains ) {
+        my $obj = CPAN::Shell->expandany($c) or next;
+        CPAN->debug("c[$c]obj[$obj]") if $CPAN::DEBUG;
+        $obj->color_cmd_tmps($depth+1,$color);
+    }
+    if ($color==0) {
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
 #-> sub CPAN::Bundle::as_string ;
 sub as_string {
     my($self) = @_;
     $self->contains;
+    # following line must be "=", not "||=" because we have a moving target
     $self->{INST_VERSION} = $self->inst_version;
     return $self->SUPER::as_string;
 }
@@ -3842,9 +4345,9 @@ sub contains {
   unless ($parsefile) {
     # Try to get at it in the cpan directory
     $self->debug("no parsefile") if $CPAN::DEBUG;
-    Carp::confess "I don't know a $id" unless $self->{CPAN_FILE};
+    Carp::confess "I don't know a $id" unless $self->cpan_file;
     my $dist = $CPAN::META->instance('CPAN::Distribution',
-                                    $self->{CPAN_FILE});
+                                    $self->cpan_file);
     $dist->get;
     $self->debug($dist->as_string) if $CPAN::DEBUG;
     my($todir) = $CPAN::Config->{'cpan_home'};
@@ -3877,7 +4380,7 @@ sub contains {
   }
   close $fh;
   delete $self->{STATUS};
-  $self->{CONTAINS} = join ", ", @result;
+  $self->{CONTAINS} = \@result;
   $self->debug("CONTAINS[@result]") if $CPAN::DEBUG;
   unless (@result) {
     $CPAN::Frontend->mywarn(qq{
@@ -3902,9 +4405,9 @@ sub find_bundle_file {
        require ExtUtils::Manifest;
        my $getcwd = $CPAN::Config->{'getcwd'} || 'cwd';
        my $cwd = CPAN->$getcwd();
-       chdir $where;
+       chdir $where or $CPAN::Frontend->mydie(qq{Could not chdir to "$where": $!});
        ExtUtils::Manifest::mkmanifest();
-       chdir $cwd;
+       chdir $cwd or $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd": $!});
     }
     my $fh = FileHandle->new($manifest)
        or Carp::croak("Couldn't open $manifest: $!");
@@ -3936,22 +4439,21 @@ sub find_bundle_file {
     Carp::croak("Couldn't find a Bundle file in $where");
 }
 
+# needs to work slightly different from Module::inst_file because of
+# cpan_home/Bundle/ directory.
+
 #-> sub CPAN::Bundle::inst_file ;
 sub inst_file {
     my($self) = @_;
-    my($me,$inst_file);
-    ($me = $self->id) =~ s/.*://;
-##    my(@me,$inst_file);
-##    @me = split /::/, $self->id;
-##    $me[-1] .= ".pm";
-    $inst_file = MM->catfile($CPAN::Config->{'cpan_home'},
-                                     "Bundle", "$me.pm");
-##                                   "Bundle", @me);
-    return $self->{'INST_FILE'} = $inst_file if -f $inst_file;
-#    $inst_file =
+    return $self->{INST_FILE} if
+        exists $self->{INST_FILE} && $self->{INST_FILE};
+    my($inst_file);
+    my(@me);
+    @me = split /::/, $self->id;
+    $me[-1] .= ".pm";
+    $inst_file = MM->catfile($CPAN::Config->{'cpan_home'}, @me);
+    return $self->{INST_FILE} = $inst_file if -f $inst_file;
     $self->SUPER::inst_file;
-#    return $self->{'INST_FILE'} = $inst_file if -f $inst_file;
-#    return $self->{'INST_FILE'}; # even if undefined?
 }
 
 #-> sub CPAN::Bundle::rematein ;
@@ -3960,7 +4462,7 @@ sub rematein {
     $self->debug("self[$self] meth[$meth]") if $CPAN::DEBUG;
     my($id) = $self->id;
     Carp::croak "Can't $meth $id, don't have an associated bundle file. :-(\n"
-       unless $self->inst_file || $self->{CPAN_FILE};
+       unless $self->inst_file || $self->cpan_file;
     my($s,%fail);
     for $s ($self->contains) {
        my($type) = $s =~ m|/| ? 'CPAN::Distribution' :
@@ -3973,14 +4475,36 @@ explicitly a file $s.
            sleep 3;
        }
        # possibly noisy action:
+        $self->debug("type[$type] s[$s]") if $CPAN::DEBUG;
        my $obj = $CPAN::META->instance($type,$s);
        $obj->$meth();
-       my $success = $obj->can("uptodate") ? $obj->uptodate : 0;
-       $success ||= $obj->{'install'} && $obj->{'install'} eq "YES";
-       $fail{$s} = 1 unless $success;
+        if ($obj->isa(CPAN::Bundle)
+            &&
+            exists $obj->{install_failed}
+            &&
+            ref($obj->{install_failed}) eq "HASH"
+           ) {
+          for (keys %{$obj->{install_failed}}) {
+            $self->{install_failed}{$_} = undef; # propagate faiure up
+                                                 # to me in a
+                                                 # recursive call
+            $fail{$s} = 1; # the bundle itself may have succeeded but
+                           # not all children
+          }
+        } else {
+          my $success;
+          $success = $obj->can("uptodate") ? $obj->uptodate : 0;
+          $success ||= $obj->{'install'} && $obj->{'install'} eq "YES";
+          if ($success) {
+            delete $self->{install_failed}{$s};
+          } else {
+            $fail{$s} = 1;
+          }
+        }
     }
+
     # recap with less noise
-    if ( $meth eq "install") {
+    if ( $meth eq "install" ) {
        if (%fail) {
            require Text::Wrap;
            my $raw = sprintf(qq{Bundle summary:
@@ -3990,9 +4514,21 @@ The following items in bundle %s had installation problems:},
            $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
            $CPAN::Frontend->myprint("\n");
            my $paragraph = "";
+            my %reported;
            for $s ($self->contains) {
-               $paragraph .= "$s " if $fail{$s};
+              if ($fail{$s}){
+               $paragraph .= "$s ";
+                $self->{install_failed}{$s} = undef;
+                $reported{$s} = undef;
+              }
            }
+            my $report_propagated;
+            for $s (sort keys %{$self->{install_failed}}) {
+              next if exists $reported{$s};
+              $paragraph .= "and the following items had problems
+during recursive bundle calls: " unless $report_propagated++;
+              $paragraph .= "$s ";
+            }
            $CPAN::Frontend->myprint(Text::Wrap::fill("  ","  ",$paragraph));
            $CPAN::Frontend->myprint("\n");
        } else {
@@ -4015,7 +4551,11 @@ sub get     { shift->rematein('get',@_); }
 #-> sub CPAN::Bundle::make ;
 sub make    { shift->rematein('make',@_); }
 #-> sub CPAN::Bundle::test ;
-sub test    { shift->rematein('test',@_); }
+sub test    {
+    my $self = shift;
+    $self->{badtestcnt} ||= 0;
+    $self->rematein('test',@_);
+}
 #-> sub CPAN::Bundle::install ;
 sub install {
   my $self = shift;
@@ -4035,6 +4575,49 @@ No File found for bundle } . $self->id . qq{\n}), return;
 
 package CPAN::Module;
 
+# Accessors
+# sub cpan_userid { shift->{RO}{CPAN_USERID} }
+sub userid {
+    my $self = shift;
+    return unless exists $self->{RO}{userid};
+    $self->{RO}{userid};
+}
+sub description { shift->{RO}{description} }
+
+sub undelay {
+    my $self = shift;
+    delete $self->{later};
+    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
+        $dist->undelay;
+    }
+}
+
+#-> sub CPAN::Module::color_cmd_tmps ;
+sub color_cmd_tmps {
+    my($self) = shift;
+    my($depth) = shift || 0;
+    my($color) = shift || 0;
+    # a module needs to recurse to its cpan_file
+
+    return if exists $self->{incommandcolor}
+        && $self->{incommandcolor}==$color;
+    $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: deep recursion in ".
+                                   "color_cmd_tmps depth[%s] self[%s] id[%s]",
+                                   $depth,
+                                   $self,
+                                   $self->id
+                                  )) if $depth>=100;
+    ##### warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
+
+    if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) {
+        $dist->color_cmd_tmps($depth+1,$color);
+    }
+    if ($color==0) {
+        delete $self->{badtestcnt};
+    }
+    $self->{incommandcolor} = $color;
+}
+
 #-> sub CPAN::Module::as_glimpse ;
 sub as_glimpse {
     my($self) = @_;
@@ -4056,11 +4639,11 @@ sub as_string {
     local($^W) = 0;
     push @m, $class, " id = $self->{ID}\n";
     my $sprintf = "    %-12s %s\n";
-    push @m, sprintf($sprintf, 'DESCRIPTION', $self->{description})
-       if $self->{description};
+    push @m, sprintf($sprintf, 'DESCRIPTION', $self->description)
+       if $self->description;
     my $sprintf2 = "    %-12s %s (%s)\n";
     my($userid);
-    if ($userid = $self->{'CPAN_USERID'} || $self->{'userid'}){
+    if ($userid = $self->cpan_userid || $self->userid){
        my $author;
        if ($author = CPAN::Shell->expand('Author',$userid)) {
          my $email = "";
@@ -4076,10 +4659,10 @@ sub as_string {
                          );
        }
     }
-    push @m, sprintf($sprintf, 'CPAN_VERSION', $self->{CPAN_VERSION})
-       if $self->{CPAN_VERSION};
-    push @m, sprintf($sprintf, 'CPAN_FILE', $self->{CPAN_FILE})
-       if $self->{CPAN_FILE};
+    push @m, sprintf($sprintf, 'CPAN_VERSION', $self->cpan_version)
+       if $self->cpan_version;
+    push @m, sprintf($sprintf, 'CPAN_FILE', $self->cpan_file)
+       if $self->cpan_file;
     my $sprintf3 = "    %-12s %1s%1s%1s%1s (%s,%s,%s,%s)\n";
     my(%statd,%stats,%statl,%stati);
     @statd{qw,? i c a b R M S,} = qw,unknown idea
@@ -4096,24 +4679,28 @@ sub as_string {
     push @m, sprintf(
                     $sprintf3,
                     'DSLI_STATUS',
-                    $self->{statd},
-                    $self->{stats},
-                    $self->{statl},
-                    $self->{stati},
-                    $statd{$self->{statd}},
-                    $stats{$self->{stats}},
-                    $statl{$self->{statl}},
-                    $stati{$self->{stati}}
-                   ) if $self->{statd};
+                    $self->{RO}{statd},
+                    $self->{RO}{stats},
+                    $self->{RO}{statl},
+                    $self->{RO}{stati},
+                    $statd{$self->{RO}{statd}},
+                    $stats{$self->{RO}{stats}},
+                    $statl{$self->{RO}{statl}},
+                    $stati{$self->{RO}{stati}}
+                   ) if $self->{RO}{statd};
     my $local_file = $self->inst_file;
     if ($local_file) {
       $self->{MANPAGE} ||= $self->manpage_headline($local_file);
     }
     my($item);
-    for $item (qw/MANPAGE CONTAINS/) {
+    for $item (qw/MANPAGE/) {
        push @m, sprintf($sprintf, $item, $self->{$item})
            if exists $self->{$item};
     }
+    for $item (qw/CONTAINS/) {
+       push @m, sprintf($sprintf, $item, join(" ",@{$self->{$item}}))
+           if exists $self->{$item} && @{$self->{$item}};
+    }
     push @m, sprintf($sprintf, 'INST_FILE',
                     $local_file || "(not installed)");
     push @m, sprintf($sprintf, 'INST_VERSION',
@@ -4124,7 +4711,7 @@ sub as_string {
 sub manpage_headline {
   my($self,$local_file) = @_;
   my(@local_file) = $local_file;
-  $local_file =~ s/\.pm\z/.pod/;
+  $local_file =~ s/\.pm(?!\n)\Z/.pod/;
   push @local_file, $local_file;
   my(@result,$locf);
   for $locf (@local_file) {
@@ -4151,19 +4738,23 @@ sub manpage_headline {
 #-> sub CPAN::Module::cpan_file ;
 sub cpan_file    {
     my $self = shift;
-    CPAN->debug($self->id) if $CPAN::DEBUG;
-    unless (defined $self->{'CPAN_FILE'}) {
+    CPAN->debug(sprintf "id[%s]", $self->id) if $CPAN::DEBUG;
+    unless (defined $self->{RO}{CPAN_FILE}) {
        CPAN::Index->reload;
     }
-    if (exists $self->{'CPAN_FILE'} && defined $self->{'CPAN_FILE'}){
-       return $self->{'CPAN_FILE'};
-    } elsif (exists $self->{'userid'} && defined $self->{'userid'}) {
-       my $fullname = $CPAN::META->instance(CPAN::Author,
-                                     $self->{'userid'})->fullname;
-       my $email = $CPAN::META->instance(CPAN::Author,
-                                     $self->{'userid'})->email;
+    if (exists $self->{RO}{CPAN_FILE} && defined $self->{RO}{CPAN_FILE}){
+       return $self->{RO}{CPAN_FILE};
+    } elsif ( defined $self->userid ) {
+       my $fullname = $CPAN::META->instance("CPAN::Author",
+                                             $self->userid)->fullname;
+       my $email = $CPAN::META->instance("CPAN::Author",
+                                          $self->userid)->email;
        unless (defined $fullname && defined $email) {
-           return "Contact Author $self->{userid} (Try ``a $self->{userid}'')";
+            my $userid = $self->userid;
+           return sprintf("Contact Author %s (Try 'a %s')",
+                           $userid,
+                           $userid,
+                          );
        }
        return "Contact Author $fullname <$email>";
     } else {
@@ -4176,17 +4767,14 @@ sub cpan_file    {
 #-> sub CPAN::Module::cpan_version ;
 sub cpan_version {
     my $self = shift;
-    $self->{'CPAN_VERSION'} = 'undef'
-       unless defined $self->{'CPAN_VERSION'}; # I believe this is
-                                                # always a bug in the
-                                                # index and should be
-                                                # reported as such,
-                                                # but usually I find
-                                                # out such an error
-                                                # and do not want to
-                                                # provoke too many
-                                                # bugreports
-    $self->{'CPAN_VERSION'};
+
+    $self->{RO}{CPAN_VERSION} = 'undef'
+       unless defined $self->{RO}{CPAN_VERSION};
+    # I believe this is always a bug in the index and should be reported
+    # as such, but usually I find out such an error and do not want to
+    # provoke too many bugreports
+
+    $self->{RO}{CPAN_VERSION};
 }
 
 #-> sub CPAN::Module::force ;
@@ -4198,7 +4786,9 @@ sub force {
 #-> sub CPAN::Module::rematein ;
 sub rematein {
     my($self,$meth) = @_;
-    $self->debug($self->id) if $CPAN::DEBUG;
+    $CPAN::Frontend->myprint(sprintf("Running %s for module %s\n",
+                                     $meth,
+                                     $self->id));
     my $cpan_file = $self->cpan_file;
     if ($cpan_file eq "N/A" || $cpan_file =~ /^Contact Author/){
       $CPAN::Frontend->mywarn(sprintf qq{
@@ -4206,7 +4796,7 @@ sub rematein {
 
   Either the module has not yet been uploaded to CPAN, or it is
   temporary unavailable. Please contact the author to find out
-  more about the status. Try ``i %s''.
+  more about the status. Try 'i %s'.
 },
                              $self->id,
                              $self->id,
@@ -4215,8 +4805,9 @@ sub rematein {
     }
     my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
     $pack->called_for($self->id);
-    $pack->force if exists $self->{'force_update'};
+    $pack->force($meth) if exists $self->{'force_update'};
     $pack->$meth();
+    $pack->unforce if $pack->can("unforce") && exists $self->{'force_update'};
     delete $self->{'force_update'};
 }
 
@@ -4229,9 +4820,16 @@ sub cvs_import { shift->rematein('cvs_import') }
 #-> sub CPAN::Module::get ;
 sub get    { shift->rematein('get',@_); }
 #-> sub CPAN::Module::make ;
-sub make   { shift->rematein('make') }
+sub make   {
+    my $self = shift;
+    $self->rematein('make');
+}
 #-> sub CPAN::Module::test ;
-sub test   { shift->rematein('test') }
+sub test   {
+    my $self = shift;
+    $self->{badtestcnt} ||= 0;
+    $self->rematein('test',@_);
+}
 #-> sub CPAN::Module::uptodate ;
 sub uptodate {
     my($self) = @_;
@@ -4245,9 +4843,11 @@ sub uptodate {
     local($^W)=0;
     if ($inst_file
        &&
-       $have >= $latest
+       ! CPAN::Version->vgt($latest, $have)
        ) {
-      return 1;
+        CPAN->debug("returning uptodate. inst_file[$inst_file] ".
+                    "latest[$latest] have[$have]") if $CPAN::DEBUG;
+        return 1;
     }
     return;
 }
@@ -4304,14 +4904,49 @@ sub inst_version {
     my($self) = @_;
     my $parsefile = $self->inst_file or return;
     local($^W) = 0 if $] < 5.00303 && $ExtUtils::MakeMaker::VERSION < 5.38;
-    # warn "HERE";
-    my $have = MM->parse_version($parsefile) || "undef";
+    my $have;
+
+    # there was a bug in 5.6.0 that let lots of unini warnings out of
+    # parse_version. Fixed shortly after 5.6.0 by PMQS. We can remove
+    # the following workaround after 5.6.1 is out.
+    local($SIG{__WARN__}) =  sub { my $w = shift;
+                                   return if $w =~ /uninitialized/i;
+                                   warn $w;
+                                 };
+
+    $have = MM->parse_version($parsefile) || "undef";
+    $have =~ s/^ //; # since the %vd hack these two lines here are needed
+    $have =~ s/ $//; # trailing whitespace happens all the time
+
+    # My thoughts about why %vd processing should happen here
+
+    # Alt1 maintain it as string with leading v:
+    # read index files     do nothing
+    # compare it           use utility for compare
+    # print it             do nothing
+
+    # Alt2 maintain it as what is is
+    # read index files     convert
+    # compare it           use utility because there's still a ">" vs "gt" issue
+    # print it             use CPAN::Version for print
+
+    # Seems cleaner to hold it in memory as a string starting with a "v"
+
+    # If the author of this module made a mistake and wrote a quoted
+    # "v1.13" instead of v1.13, we simply leave it at that with the
+    # effect that *we* will treat it like a v-tring while the rest of
+    # perl won't. Seems sensible when we consider that any action we
+    # could take now would just add complexity.
+
+    $have = CPAN::Version->readable($have);
+
     $have =~ s/\s*//g; # stringify to float around floating point issues
-    $have;
+    $have; # no stringify needed, \s* above matches always
 }
 
 package CPAN::Tarzip;
 
+# CPAN::Tarzip::gzip
 sub gzip {
   my($class,$read,$write) = @_;
   if ($CPAN::META->has_inst("Compress::Zlib")) {
@@ -4326,10 +4961,12 @@ sub gzip {
     $fhw->close;
     return 1;
   } else {
-    system("$CPAN::Config->{'gzip'} -c $read > $write")==0;
+    system("$CPAN::Config->{gzip} -c $read > $write")==0;
   }
 }
 
+
+# CPAN::Tarzip::gunzip
 sub gunzip {
   my($class,$read,$write) = @_;
   if ($CPAN::META->has_inst("Compress::Zlib")) {
@@ -4346,26 +4983,43 @@ sub gunzip {
     $fhw->close;
     return 1;
   } else {
-    system("$CPAN::Config->{'gzip'} -dc $read > $write")==0;
+    system("$CPAN::Config->{gzip} -dc $read > $write")==0;
   }
 }
 
+
+# CPAN::Tarzip::gtest
 sub gtest {
   my($class,$read) = @_;
-  if ($CPAN::META->has_inst("Compress::Zlib")) {
-    my($buffer);
+  # After I had reread the documentation in zlib.h, I discovered that
+  # uncompressed files do not lead to an gzerror (anymore?).
+  if ( $CPAN::META->has_inst("Compress::Zlib") ) {
+    my($buffer,$len);
+    $len = 0;
     my $gz = Compress::Zlib::gzopen($read, "rb")
-       or $CPAN::Frontend->mydie("Cannot open $read: $!\n");
-    1 while $gz->gzread($buffer) > 0 ;
-    $CPAN::Frontend->mydie("Error reading from $read: $!\n")
-       if $gz->gzerror != Compress::Zlib::Z_STREAM_END();
-    $gz->gzclose() ;
-    return 1;
+       or $CPAN::Frontend->mydie(sprintf("Cannot gzopen %s: %s\n",
+                                          $read,
+                                          $Compress::Zlib::gzerrno));
+    while ($gz->gzread($buffer) > 0 ){
+        $len += length($buffer);
+        $buffer = "";
+    }
+    my $err = $gz->gzerror;
+    my $success = ! $err || $err == Compress::Zlib::Z_STREAM_END();
+    if ($len == -s $read){
+        $success = 0;
+        CPAN->debug("hit an uncompressed file") if $CPAN::DEBUG;
+    }
+    $gz->gzclose();
+    CPAN->debug("err[$err]success[$success]") if $CPAN::DEBUG;
+    return $success;
   } else {
-    return system("$CPAN::Config->{'gzip'} -dt $read")==0;
+      return system("$CPAN::Config->{gzip} -dt $read")==0;
   }
 }
 
+
+# CPAN::Tarzip::TIEHANDLE
 sub TIEHANDLE {
   my($class,$file) = @_;
   my $ret;
@@ -4375,7 +5029,7 @@ sub TIEHANDLE {
        die "Could not gzopen $file";
     $ret = bless {GZ => $gz}, $class;
   } else {
-    my $pipe = "$CPAN::Config->{'gzip'} --decompress --stdout $file |";
+    my $pipe = "$CPAN::Config->{gzip} --decompress --stdout $file |";
     my $fh = FileHandle->new($pipe) or die "Could pipe[$pipe]: $!";
     binmode $fh;
     $ret = bless {FH => $fh}, $class;
@@ -4383,6 +5037,8 @@ sub TIEHANDLE {
   $ret;
 }
 
+
+# CPAN::Tarzip::READLINE
 sub READLINE {
   my($self) = @_;
   if (exists $self->{GZ}) {
@@ -4397,6 +5053,8 @@ sub READLINE {
   }
 }
 
+
+# CPAN::Tarzip::READ
 sub READ {
   my($self,$ref,$length,$offset) = @_;
   die "read with offset not implemented" if defined $offset;
@@ -4410,55 +5068,76 @@ sub READ {
   }
 }
 
+
+# CPAN::Tarzip::DESTROY
 sub DESTROY {
-  my($self) = @_;
-  if (exists $self->{GZ}) {
-    my $gz = $self->{GZ};
-    $gz->gzclose();
-  } else {
-    my $fh = $self->{FH};
-    $fh->close if defined $fh;
-  }
-  undef $self;
+    my($self) = @_;
+    if (exists $self->{GZ}) {
+        my $gz = $self->{GZ};
+        $gz->gzclose() if defined $gz; # hard to say if it is allowed
+                                       # to be undef ever. AK, 2000-09
+    } else {
+        my $fh = $self->{FH};
+        $fh->close if defined $fh;
+    }
+    undef $self;
 }
 
+
+# CPAN::Tarzip::untar
 sub untar {
   my($class,$file) = @_;
-  # had to disable, because version 0.07 seems to be buggy
-  if (MM->maybe_command($CPAN::Config->{'gzip'})
+  if (0) { # makes changing order easier
+  } elsif (MM->maybe_command($CPAN::Config->{gzip})
       &&
       MM->maybe_command($CPAN::Config->{'tar'})) {
-    my $system = "$CPAN::Config->{'gzip'} --decompress --stdout " .
-      "< $file | $CPAN::Config->{tar} xvf -";
+    my($system);
+    my $is_compressed = $class->gtest($file);
+    if ($is_compressed) {
+        $system = "$CPAN::Config->{gzip} --decompress --stdout " .
+            "< $file | $CPAN::Config->{tar} xvf -";
+    } else {
+        $system = "$CPAN::Config->{tar} xvf $file";
+    }
     if (system($system) != 0) {
-      # people find the most curious tar binaries that cannot handle
-      # pipes
-      my $system = "$CPAN::Config->{'gzip'} --decompress $file";
-      if (system($system)==0) {
-       $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
-      } else {
-       $CPAN::Frontend->mydie(
-                              qq{Couldn\'t uncompress $file\n}
-                             );
-      }
-      $file =~ s/\.gz\z//;
-      $system = "$CPAN::Config->{tar} xvf $file";
-      $CPAN::Frontend->myprint(qq{Using Tar:$system:\n});
-      if (system($system)==0) {
-       $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
-      } else {
-       $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
-      }
-      return 1;
+        # people find the most curious tar binaries that cannot handle
+        # pipes
+        if ($is_compressed) {
+            (my $ungzf = $file) =~ s/\.gz(?!\n)\Z//;
+            if (CPAN::Tarzip->gunzip($file, $ungzf)) {
+                $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n});
+            } else {
+                $CPAN::Frontend->mydie(qq{Couldn\'t uncompress $file\n});
+            }
+            $file = $ungzf;
+        }
+        $system = "$CPAN::Config->{tar} xvf $file";
+        $CPAN::Frontend->myprint(qq{Using Tar:$system:\n});
+        if (system($system)==0) {
+            $CPAN::Frontend->myprint(qq{Untarred $file successfully\n});
+        } else {
+            $CPAN::Frontend->mydie(qq{Couldn\'t untar $file\n});
+        }
+        return 1;
     } else {
-      return 1;
+        return 1;
     }
   } elsif ($CPAN::META->has_inst("Archive::Tar")
       &&
       $CPAN::META->has_inst("Compress::Zlib") ) {
     my $tar = Archive::Tar->new($file,1);
-    $tar->extract($tar->list_files); # I'm pretty sure we have nothing
-                                     # that isn't compressed
+    my $af; # archive file
+    my @af;
+    for $af ($tar->list_files) {
+        if ($af =~ m!^(/|\.\./)!) {
+            $CPAN::Frontend->mydie("ALERT: Archive contains ".
+                                   "illegal member [$af]");
+        }
+        $CPAN::Frontend->myprint("$af\n");
+        push @af, $af;
+        return if $CPAN::Signal;
+    }
+    $tar->extract(@af);
 
     ExtUtils::MM_MacOS::convert_files([$tar->list_files], 1)
         if ($^O eq 'MacOS');
@@ -4473,6 +5152,119 @@ is available. Can\'t continue.
   }
 }
 
+sub unzip {
+    my($class,$file) = @_;
+    if ($CPAN::META->has_inst("Archive::Zip")) {
+        # blueprint of the code from Archive::Zip::Tree::extractTree();
+        my $zip = Archive::Zip->new();
+        my $status;
+        $status = $zip->read($file);
+        die "Read of file[$file] failed\n" if $status != Archive::Zip::AZ_OK();
+        $CPAN::META->debug("Successfully read file[$file]") if $CPAN::DEBUG;
+        my @members = $zip->members();
+        for my $member ( @members ) {
+            my $af = $member->fileName();
+            if ($af =~ m!^(/|\.\./)!) {
+                $CPAN::Frontend->mydie("ALERT: Archive contains ".
+                                       "illegal member [$af]");
+            }
+            my $status = $member->extractToFileNamed( $af );
+            $CPAN::META->debug("af[$af]status[$status]") if $CPAN::DEBUG;
+            die "Extracting of file[$af] from zipfile[$file] failed\n" if
+                $status != Archive::Zip::AZ_OK();
+            return if $CPAN::Signal;
+        }
+        return 1;
+    } else {
+        my $unzip = $CPAN::Config->{unzip} or
+            $CPAN::Frontend->mydie("Cannot unzip, no unzip program available");
+        my @system = ($unzip, $file);
+        return system(@system) == 0;
+    }
+}
+
+
+package CPAN::Version;
+# CPAN::Version::vcmp courtesy Jost Krieger
+sub vcmp {
+  my($self,$l,$r) = @_;
+  local($^W) = 0;
+  CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
+
+  return 0 if $l eq $r; # short circuit for quicker success
+
+  if ($l=~/^v/ <=> $r=~/^v/) {
+      for ($l,$r) {
+          next if /^v/;
+          $_ = $self->float2vv($_);
+      }
+  }
+
+  return
+      ($l ne "undef") <=> ($r ne "undef") ||
+          ($] >= 5.006 &&
+           $l =~ /^v/ &&
+           $r =~ /^v/ &&
+           $self->vstring($l) cmp $self->vstring($r)) ||
+               $l <=> $r ||
+                   $l cmp $r;
+}
+
+sub vgt {
+  my($self,$l,$r) = @_;
+  $self->vcmp($l,$r) > 0;
+}
+
+sub vstring {
+  my($self,$n) = @_;
+  $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]";
+  pack "U*", split /\./, $n;
+}
+
+# vv => visible vstring
+sub float2vv {
+    my($self,$n) = @_;
+    my($rev) = int($n);
+    $rev ||= 0;
+    my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits so that
+                                          # architecture cannot
+                                          # influnce
+    $mantissa ||= 0;
+    $mantissa .= "0" while length($mantissa)%3;
+    my $ret = "v" . $rev;
+    while ($mantissa) {
+        $mantissa =~ s/(\d{1,3})// or
+            die "Panic: length>0 but not a digit? mantissa[$mantissa]";
+        $ret .= ".".int($1);
+    }
+    # warn "n[$n]ret[$ret]";
+    $ret;
+}
+
+sub readable {
+  my($self,$n) = @_;
+  $n =~ /^([\w\-\+\.]+)/;
+
+  return $1 if defined $1 && length($1)>0;
+  # if the first user reaches version v43, he will be treated as "+".
+  # We'll have to decide about a new rule here then, depending on what
+  # will be the prevailing versioning behavior then.
+
+  if ($] < 5.006) { # or whenever v-strings were introduced
+    # we get them wrong anyway, whatever we do, because 5.005 will
+    # have already interpreted 0.2.4 to be "0.24". So even if he
+    # indexer sends us something like "v0.2.4" we compare wrongly.
+
+    # And if they say v1.2, then the old perl takes it as "v12"
+
+    $CPAN::Frontend->mywarn("Suspicious version string seen [$n]");
+    return $n;
+  }
+  my $better = sprintf "v%vd", $n;
+  CPAN->debug("n[$n] better[$better]") if $CPAN::DEBUG;
+  return $better;
+}
+
 package CPAN;
 
 1;
@@ -4584,10 +5376,10 @@ also is run unconditionally. But for
 
 CPAN checks if an install is actually needed for it and prints
 I<module up to date> in the case that the distribution file containing
-the module doesnE<39>t need to be updated.
+the module doesn't need to be updated.
 
 CPAN also keeps track of what it has done within the current session
-and doesnE<39>t try to build a package a second time regardless if it
+and doesn't try to build a package a second time regardless if it
 succeeded or not. The C<force> command takes as a first argument the
 method to invoke (currently: C<make>, C<test>, or C<install>) and executes the
 command from scratch.
@@ -4659,7 +5451,7 @@ installation. You start on one architecture with the help of a Bundle
 file produced earlier. CPAN installs the whole Bundle for you, but
 when you try to repeat the job on the second architecture, CPAN
 responds with a C<"Foo up to date"> message for all modules. So you
-invoke CPAN's recompile on the second architecture and youE<39>re done.
+invoke CPAN's recompile on the second architecture and you're done.
 
 Another popular use for C<recompile> is to act as a rescue in case your
 perl breaks binary compatibility. If one of the modules that CPAN uses
@@ -4704,7 +5496,7 @@ so you would have to say
 The first example will be driven by an object of the class
 CPAN::Module, the second by an object of class CPAN::Distribution.
 
-=head2 ProgrammerE<39>s interface
+=head2 Programmer's interface
 
 If you do not enter the shell, the available shell commands are both
 available as methods (C<CPAN::Shell-E<gt>install(...)>) and as
@@ -4749,8 +5541,11 @@ functionalities that are available in the shell.
        print "No VERSION in ", $mod->id, "\n";
     }
 
+    # find out which distribution on CPAN contains a module:
+    print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file
+
 Or if you want to write a cronjob to watch The CPAN, you could list
-all modules that need updating:
+all modules that need updating. First a quick and dirty way:
 
     perl -e 'use CPAN; CPAN::Shell->r;'
 
@@ -4880,17 +5675,18 @@ enthusiasm).
 
 =head2 Debugging
 
-The debugging of this module is pretty difficult, because we have
+The debugging of this module is a bit complex, because we have
 interferences of the software producing the indices on CPAN, of the
 mirroring process on CPAN, of packaging, of configuration, of
 synchronicity, and of bugs within CPAN.pm.
 
-In interactive mode you can try "o debug" which will list options for
-debugging the various parts of the package. The output may not be very
-useful for you as it's just a by-product of my own testing, but if you
-have an idea which part of the package may have a bug, it's sometimes
-worth to give it a try and send me more specific output. You should
-know that "o debug" has built-in completion support.
+For code debugging in interactive mode you can try "o debug" which
+will list options for debugging the various parts of the code. You
+should know that "o debug" has built-in completion support.
+
+For data debugging there is the C<dump> command which takes the same
+arguments as make/test/install and outputs the object's Data::Dumper
+dump.
 
 =head2 Floppy, Zip, Offline Mode
 
@@ -4918,7 +5714,10 @@ defined:
   build_cache        size of cache for directories to build modules
   build_dir          locally accessible directory to build modules
   index_expire       after this many days refetch index files
+  cache_metadata     use serializer to cache metadata
   cpan_home          local directory reserved for this package
+  dontload_hash      anonymous hash: modules in the keys will not be
+                     loaded by the CPAN::has_inst() routine
   gzip              location of external program gzip
   inactivity_timeout breaks interactive Makefile.PLs after this
                      many seconds inactivity. Set to 0 to never break.
@@ -4973,7 +5772,8 @@ works like the corresponding perl commands.
 =head2 Note on urllist parameter's format
 
 urllist parameters are URLs according to RFC 1738. We do a little
-guessing if your URL is not compliant, but if you have problems with file URLs, please try the correct format. Either:
+guessing if your URL is not compliant, but if you have problems with
+file URLs, please try the correct format. Either:
 
     file://localhost/whatever/ftp/pub/CPAN/
 
@@ -5048,7 +5848,13 @@ unattained.
 =head1 WORKING WITH CPAN.pm BEHIND FIREWALLS
 
 Thanks to Graham Barr for contributing the following paragraphs about
-the interaction between perl, and various firewall configurations.
+the interaction between perl, and various firewall configurations. For
+further informations on firewalls, it is recommended to consult the
+documentation that comes with the ncftp program. If you are unable to
+go through the firewall with a simple Perl setup, it is very likely
+that you can configure ncftp so that it works for your firewall.
+
+=head2 Three basic types of firewalls
 
 Firewalls can be categorized into three basic types.
 
@@ -5091,7 +5897,7 @@ There are two that I can think off.
 =item SOCKS
 
 If you are using a SOCKS firewall you will need to compile perl and link
-it with the SOCKS library, this is what is normally called a ``socksified''
+it with the SOCKS library, this is what is normally called a 'socksified'
 perl. With this executable you will be able to connect to servers outside
 the firewall as if it is not there.
 
@@ -5105,12 +5911,120 @@ special compiling is need as you can access hosts directly.
 
 =back
 
+=head2 Configuring lynx or ncftp for going through a firewall
+
+If you can go through your firewall with e.g. lynx, presumably with a
+command such as
+
+    /usr/local/bin/lynx -pscott:tiger
+
+then you would configure CPAN.pm with the command
+
+    o conf lynx "/usr/local/bin/lynx -pscott:tiger"
+
+That's all. Similarly for ncftp or ftp, you would configure something
+like
+
+    o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"
+
+Your milage may vary...
+
+=head1 FAQ
+
+=over
+
+=item 1) I installed a new version of module X but CPAN keeps saying,
+      I have the old version installed
+
+Most probably you B<do> have the old version installed. This can
+happen if a module installs itself into a different directory in the
+@INC path than it was previously installed. This is not really a
+CPAN.pm problem, you would have the same problem when installing the
+module manually. The easiest way to prevent this behaviour is to add
+the argument C<UNINST=1> to the C<make install> call, and that is why
+many people add this argument permanently by configuring
+
+  o conf make_install_arg UNINST=1
+
+=item 2) So why is UNINST=1 not the default?
+
+Because there are people who have their precise expectations about who
+may install where in the @INC path and who uses which @INC array. In
+fine tuned environments C<UNINST=1> can cause damage.
+
+=item 3) When I install bundles or multiple modules with one command
+      there is too much output to keep track of
+
+You may want to configure something like
+
+  o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
+  o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"
+
+so that STDOUT is captured in a file for later inspection.
+
+
+=item 4) I am not root, how can I install a module in a personal
+      directory?
+
+You will most probably like something like this:
+
+  o conf makepl_arg "LIB=~/myperl/lib \
+                    INSTALLMAN1DIR=~/myperl/man/man1 \
+                    INSTALLMAN3DIR=~/myperl/man/man3"
+  install Sybase::Sybperl
+
+You can make this setting permanent like all C<o conf> settings with
+C<o conf commit>.
+
+You will have to add ~/myperl/man to the MANPATH environment variable
+and also tell your perl programs to look into ~/myperl/lib, e.g. by
+including
+
+  use lib "$ENV{HOME}/myperl/lib";
+
+or setting the PERL5LIB environment variable.
+
+Another thing you should bear in mind is that the UNINST parameter
+should never be set if you are not root.
+
+=item 5) How to get a package, unwrap it, and make a change before
+      building it?
+
+  look Sybase::Sybperl
+
+=item 6) I installed a Bundle and had a couple of fails. When I
+      retried, everything resolved nicely. Can this be fixed to work
+      on first try?
+
+The reason for this is that CPAN does not know the dependencies of all
+modules when it starts out. To decide about the additional items to
+install, it just uses data found in the generated Makefile. An
+undetected missing piece breaks the process. But it may well be that
+your Bundle installs some prerequisite later than some depending item
+and thus your second try is able to resolve everything. Please note,
+CPAN.pm does not know the dependency tree in advance and cannot sort
+the queue of things to install in a topologically correct order. It
+resolves perfectly well IFF all modules declare the prerequisites
+correctly with the PREREQ_PM attribute to MakeMaker. For bundles which
+fail and you need to install often, it is recommended sort the Bundle
+definition file manually. It is planned to improve the metadata
+situation for dependencies on CPAN in general, but this will still
+take some time.
+
+=item 7) In our intranet we have many modules for internal use. How
+      can I integrate these modules with CPAN.pm but without uploading
+      the modules to CPAN?
+
+Have a look at the CPAN::Site module.
+
+=back
+
 =head1 BUGS
 
 We should give coverage for B<all> of the CPAN and not just the PAUSE
 part, right? In this discussion CPAN and PAUSE have become equal --
-but they are not. PAUSE is authors/ and modules/. CPAN is PAUSE plus
-the clpa/, doc/, misc/, ports/, src/, scripts/.
+but they are not. PAUSE is authors/, modules/ and scripts/. CPAN is 
+PAUSE plus the clpa/, doc/, misc/, ports/, and src/.
 
 Future development should be directed towards a better integration of
 the other parts.
index 0e795da..9f8366e 100644 (file)
@@ -16,7 +16,7 @@ use FileHandle ();
 use File::Basename ();
 use File::Path ();
 use vars qw($VERSION);
-$VERSION = substr q$Revision: 1.38 $, 10;
+$VERSION = substr q$Revision: 1.46 $, 10;
 
 =head1 NAME
 
@@ -149,7 +149,7 @@ next question.
     print qq{
 
 How big should the disk cache be for keeping the build directories
-with all the intermediate files?
+with all the intermediate files\?
 
 };
 
@@ -174,6 +174,20 @@ disable the cache scanning with 'never'.
     } while ($ans ne 'atstart' && $ans ne 'never');
     $CPAN::Config->{scan_cache} = $ans;
 
+    print qq{
+
+To considerably speed up the initial CPAN shell startup, it is
+possible to use Storable to create a cache of metadata. If Storable
+is not available, the normal index mechanism will be used.
+
+};
+
+    defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
+    do {
+        $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
+    } while ($ans !~ /^\s*[yn]/i);
+    $CPAN::Config->{cache_metadata} = ($ans =~ /^\s*y/i ? 1 : 0);
+
     #
     # prerequisites_policy
     # Do we follow PREREQ_PM?
@@ -188,7 +202,7 @@ policy to one of the three values.
 
 };
 
-    $default = $CPAN::Config->{prerequisites_policy} || 'follow';
+    $default = $CPAN::Config->{prerequisites_policy} || 'ask';
     do {
       $ans =
          prompt("Policy on building prerequisites (follow, ask or ignore)?",
@@ -361,7 +375,8 @@ sub conf_sites {
     File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
   }
   my $loopcount = 0;
-  while () {
+  local $^T = time;
+  while ($mby) {
     if ( ! -f $mby ){
       print qq{You have no $mby
   I\'m trying to fetch one
@@ -383,6 +398,7 @@ sub conf_sites {
     }
   }
   read_mirrored_by($mby);
+  bring_your_own();
 }
 
 sub find_exe {
@@ -424,7 +440,7 @@ sub picklist {
 }
 
 sub read_mirrored_by {
-    my($local) = @_;
+    my $local = shift or return;
     my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
     my $fh = FileHandle->new;
     $fh->open($local) or die "Couldn't open $local: $!";
@@ -512,25 +528,33 @@ http: -- that host a CPAN mirror.
 
     @urls = picklist (\@urls, $prompt, $default);
     foreach (@urls) { s/ \(.*\)//; }
-    %seen = map (($_ => 1), @urls);
+    push @{$CPAN::Config->{urllist}}, @urls;
+}
 
+sub bring_your_own {
+    my %seen = map (($_ => 1), @{$CPAN::Config->{urllist}});
+    my($ans,@urls);
     do {
-        $ans = prompt ("Enter another URL or RETURN to quit:", "");
+       my $prompt = "Enter another URL or RETURN to quit:";
+       unless (%seen) {
+           $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
+
+Please enter your CPAN site:};
+       }
+        $ans = prompt ($prompt, "");
 
         if ($ans) {
-            $ans =~ s|/?$|/|; # has to end with one slash
+            $ans =~ s|/?\z|/|; # has to end with one slash
             $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
             if ($ans =~ /^\w+:\/./) {
-               push @urls, $ans 
-                  unless $seen{$ans};
-            }
-            else {
+               push @urls, $ans unless $seen{$ans}++;
+            } else {
                 print qq{"$ans" doesn\'t look like an URL at first sight.
 I\'ll ignore it for now.  You can add it to $INC{'CPAN/MyConfig.pm'}
 later if you\'re sure it\'s right.\n};
             }
         }
-    } while $ans;
+    } while $ans || !%seen;
 
     push @{$CPAN::Config->{urllist}}, @urls;
     # xxx delete or comment these out when you're happy that it works
index 63eddac..ac1fb47 100644 (file)
@@ -168,8 +168,7 @@ sub struct {
     $cnt = 0;
     foreach $name (@methods){
         if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) {
-            warnings::warn "function '$name' already defined, overrides struct accessor method"
-                if warnings::enabled();
+            warnings::warnif("function '$name' already defined, overrides struct accessor method");
         }
         else {
             $pre = $pst = $cmt = $sel = '';
index d86428c..7279591 100644 (file)
@@ -66,30 +66,38 @@ kept up to date if all packages which use chdir import it from Cwd.
 
 =cut
 
-## use strict;
+use strict;
 
 use Carp;
 
-$VERSION = '2.03';
+our $VERSION = '2.03';
 
-require Exporter;
-@ISA = qw(Exporter);
-@EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
-@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
+use base qw/ Exporter /;
+our @EXPORT = qw(cwd getcwd fastcwd fastgetcwd);
+our @EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath);
 
 
 # The 'natural and safe form' for UNIX (pwd may be setuid root)
 
 sub _backtick_pwd {
-    my $cwd;
-    chop($cwd = `pwd`);
+    my $cwd = `pwd`;
+    # `pwd` may fail e.g. if the disk is full
+    chomp($cwd) if defined $cwd;
     $cwd;
 }
 
 # Since some ports may predefine cwd internally (e.g., NT)
 # we take care not to override an existing definition for cwd().
 
-*cwd = \&_backtick_pwd unless defined &cwd;
+unless(defined &cwd) {
+    # The pwd command is not available in some chroot(2)'ed environments
+    if(grep { -x "$_/pwd" } split(':', $ENV{PATH})) {
+       *cwd = \&_backtick_pwd;
+    }
+    else {
+       *cwd = \&getcwd;
+    }
+}
 
 
 # By Brandon S. Allbery
@@ -156,7 +164,7 @@ sub fastcwd {
 my $chdir_init = 0;
 
 sub chdir_init {
-    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos') {
+    if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') {
        my($dd,$di) = stat('.');
        my($pd,$pi) = stat($ENV{'PWD'});
        if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) {
@@ -164,10 +172,12 @@ sub chdir_init {
        }
     }
     else {
-       $ENV{'PWD'} = cwd();
+       my $wd = cwd();
+       $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32';
+       $ENV{'PWD'} = $wd;
     }
     # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar)
-    if ($ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
+    if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) {
        my($pd,$pi) = stat($2);
        my($dd,$di) = stat($1);
        if (defined $pd and defined $dd and $di == $pi and $dd == $pd) {
@@ -178,11 +188,17 @@ sub chdir_init {
 }
 
 sub chdir {
-    my $newdir = shift || '';  # allow for no arg (chdir to HOME dir)
-    $newdir =~ s|///*|/|g;
+    my $newdir = @? ? shift : '';      # allow for no arg (chdir to HOME dir)
+    $newdir =~ s|///*|/|g unless $^O eq 'MSWin32';
     chdir_init() unless $chdir_init;
     return 0 unless CORE::chdir $newdir;
-    if ($^O eq 'VMS') { return $ENV{'PWD'} = $ENV{'DEFAULT'} }
+    if ($^O eq 'VMS') {
+       return $ENV{'PWD'} = $ENV{'DEFAULT'}
+    }
+    elsif ($^O eq 'MSWin32') {
+       $ENV{'PWD'} = Win32::GetFullPathName($newdir);
+       return 1;
+    }
 
     if ($newdir =~ m#^/#s) {
        $ENV{'PWD'} = $newdir;
@@ -200,46 +216,70 @@ sub chdir {
     1;
 }
 
+# Taken from Cwd.pm It is really getcwd with an optional
+# parameter instead of '.'
+#
 
-# By Jeff "japhy" Pinyan (07/23/2000)
-#   usage:  abs_path(PATHNAME)
-# see the docs
-
-sub abs_path {
-  my $base = @_ ? $_[0] : ".";
-  my $path = "";
-  my $file;
-
-  do {
-    my @devino = (stat($base))[0,1] or
-      carp("stat($base): $!"), return;
-
-    $base .= "/..";
+sub abs_path
+{
+    my $start = @_ ? shift : '.';
+    my($dotdots, $cwd, @pst, @cst, $dir, @tst);
 
-    opendir PREV, $base or carp("opendir($base): $!"), return;
-    while (defined($file = readdir PREV)) {
-      next if $file eq "." or $file eq "..";
-      my @entry = (lstat("$base/$file"))[0,1] or
-        carp("lstat($base/$file): $!"), return;
-      last if $devino[0] == $entry[0] and $devino[1] == $entry[1];
+    unless (@cst = stat( $start ))
+    {
+       carp "stat($start): $!";
+       return '';
     }
-    closedir PREV;
-
-    $path = (defined $file and $file) . "/$path";
-  } while defined $file;
-
-  length($path) > 1 and chop $path;
-  return $path;
+    $cwd = '';
+    $dotdots = $start;
+    do
+    {
+       $dotdots .= '/..';
+       @pst = @cst;
+       unless (opendir(PARENT, $dotdots))
+       {
+           carp "opendir($dotdots): $!";
+           return '';
+       }
+       unless (@cst = stat($dotdots))
+       {
+           carp "stat($dotdots): $!";
+           closedir(PARENT);
+           return '';
+       }
+       if ($pst[0] == $cst[0] && $pst[1] == $cst[1])
+       {
+           $dir = undef;
+       }
+       else
+       {
+           do
+           {
+               unless (defined ($dir = readdir(PARENT)))
+               {
+                   carp "readdir($dotdots): $!";
+                   closedir(PARENT);
+                   return '';
+               }
+               $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir"))
+           }
+           while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] ||
+                  $tst[1] != $pst[1]);
+       }
+       $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ;
+       closedir(PARENT);
+    } while (defined $dir);
+    chop($cwd) unless $cwd eq '/'; # drop the trailing /
+    $cwd;
 }
 
-
 # added function alias for those of us more
 # used to the libc function.  --tchrist 27-Jan-00
 *realpath = \&abs_path;
 
 sub fast_abs_path {
     my $cwd = getcwd();
-    my $path = shift || '.';
+    my $path = @_ ? shift : '.';
     CORE::chdir($path) || croak "Cannot chdir to $path:$!";
     my $realpath = getcwd();
     CORE::chdir($cwd)  || croak "Cannot chdir back to $cwd:$!";
@@ -308,12 +348,17 @@ sub _qnx_cwd {
 }
 
 sub _qnx_abs_path {
-    my $path = shift || '.';
+    my $path = @_ ? shift : '.';
     my $realpath=`/usr/bin/fullpath -t $path`;
     chop $realpath;
     return $realpath;
 }
 
+sub _epoc_cwd {
+    $ENV{'PWD'} = EPOC::getcwd();
+    return $ENV{'PWD'};
+}
+
 {
     no warnings;       # assignments trigger 'subroutine redefined' warning
 
@@ -362,6 +407,12 @@ sub _qnx_abs_path {
         *fastcwd       = \&cwd;
         *abs_path      = \&fast_abs_path;
     }
+    elsif ($^O eq 'epoc') {
+        *getcwd        = \&_epoc_cwd;
+        *fastgetcwd    = \&_epoc_cwd;
+        *fastcwd       = \&_epoc_cwd;
+        *abs_path      = \&fast_abs_path;
+    }
 }
 
 # package main; eval join('',<DATA>) || die $@;        # quick test
index bccc76c..aec4013 100644 (file)
@@ -177,7 +177,7 @@ Creates directory, including any parent directories.
 
 sub mkpath
 {
- File::Path::mkpath([expand_wildcards()],1,0777);
+ File::Path::mkpath([expand_wildcards()],0,0777);
 }
 
 =item test_f file
index b649b6b..c4167a3 100644 (file)
@@ -193,7 +193,7 @@ sub ldopts {
     @path = $path ? split(/:/, $path) : @INC;
 
     push(@potential_libs, @link_args)    if scalar @link_args;
-    push(@potential_libs, $Config{libs}) if defined $std;
+    push(@potential_libs, $Config{perllibs}) if defined $std;
 
     push(@mods, static_ext()) if $std;
 
@@ -484,7 +484,7 @@ B<xsinit()> uses the xsi_* functions to generate most of it's code.
 =head1 EXAMPLES
 
 For examples on how to use B<ExtUtils::Embed> for building C/C++ applications
-with embedded perl, see the eg/ directory and L<perlembed>.
+with embedded perl, see L<perlembed>.
 
 =head1 SEE ALSO
 
index 36c7221..92db8c9 100644 (file)
@@ -16,6 +16,28 @@ my $splitchar = $^O eq 'VMS' ? '|' : ($^O eq 'os2' || $^O eq 'dos') ? ';' : ':';
 my @PERL_ENV_LIB = split $splitchar, defined $ENV{'PERL5LIB'} ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
 my $Inc_uninstall_warn_handler;
 
+# install relative to here
+
+my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT};
+
+use File::Spec;
+
+sub install_rooted_file {
+    if (defined $INSTALL_ROOT) {
+       MY->catfile($INSTALL_ROOT, $_[0]);
+    } else {
+       $_[0];
+    }
+}
+
+sub install_rooted_dir {
+    if (defined $INSTALL_ROOT) {
+       MY->catdir($INSTALL_ROOT, $_[0]);
+    } else {
+       $_[0];
+    }
+}
+
 #our(@EXPORT, @ISA, $Is_VMS);
 #use strict;
 
@@ -55,8 +77,9 @@ sub install {
        opendir DIR, $source_dir_or_file or next;
        for (readdir DIR) {
            next if $_ eq "." || $_ eq ".." || $_ eq ".exists";
-           if (-w $hash{$source_dir_or_file} ||
-               mkpath($hash{$source_dir_or_file})) {
+               my $targetdir = install_rooted_dir($hash{$source_dir_or_file});
+           if (-w $targetdir ||
+               mkpath($targetdir)) {
                last;
            } else {
                warn "Warning: You do not have permissions to " .
@@ -66,7 +89,8 @@ sub install {
        }
        closedir DIR;
     }
-    $packlist->read($pack{"read"}) if (-f $pack{"read"});
+    my $tmpfile = install_rooted_file($pack{"read"});
+    $packlist->read($tmpfile) if (-f $tmpfile);
     my $cwd = cwd();
 
     my($source);
@@ -80,11 +104,13 @@ sub install {
        #October 1997: we want to install .pm files into archlib if
        #there are any files in arch. So we depend on having ./blib/arch
        #hardcoded here.
-       my $targetroot = $hash{$source};
+
+       my $targetroot = install_rooted_dir($hash{$source});
+
        if ($source eq "blib/lib" and
            exists $hash{"blib/arch"} and
            directory_not_empty("blib/arch")) {
-           $targetroot = $hash{"blib/arch"};
+           $targetroot = install_rooted_dir($hash{"blib/arch"});
             print "Files found in blib/arch: installing files in blib/lib into architecture dependent library tree\n";
        }
        chdir($source) or next;
@@ -93,8 +119,9 @@ sub install {
                          $atime,$mtime,$ctime,$blksize,$blocks) = stat;
            return unless -f _;
            return if $_ eq ".exists";
-           my $targetdir = MY->catdir($targetroot,$File::Find::dir);
-           my $targetfile = MY->catfile($targetdir,$_);
+           my $targetdir  = MY->catdir($targetroot, $File::Find::dir);
+           my $origfile   = $_;
+           my $targetfile = MY->catfile($targetdir, $_);
 
            my $diff = 0;
            if ( -f $targetfile && -s _ == $size) {
@@ -129,16 +156,16 @@ sub install {
            } else {
                inc_uninstall($_,$File::Find::dir,$verbose,0); # nonono set to 0
            }
-           $packlist->{$targetfile}++;
+           $packlist->{$origfile}++;
 
        }, ".");
        chdir($cwd) or Carp::croak("Couldn't chdir to $cwd: $!");
     }
     if ($pack{'write'}) {
-       $dir = dirname($pack{'write'});
+       $dir = install_rooted_dir(dirname($pack{'write'}));
        mkpath($dir,0,0755);
        print "Writing $pack{'write'}\n";
-       $packlist->write($pack{'write'});
+       $packlist->write(install_rooted_file($pack{'write'}));
     }
 }
 
@@ -289,18 +316,20 @@ sub add {
 }
 
 sub DESTROY {
-    my $self = shift;
-    my($file,$i,$plural);
-    foreach $file (sort keys %$self) {
-       $plural = @{$self->{$file}} > 1 ? "s" : "";
-       print "## Differing version$plural of $file found. You might like to\n";
-       for (0..$#{$self->{$file}}) {
-           print "rm ", $self->{$file}[$_], "\n";
-           $i++;
+       unless(defined $INSTALL_ROOT) {
+               my $self = shift;
+               my($file,$i,$plural);
+               foreach $file (sort keys %$self) {
+               $plural = @{$self->{$file}} > 1 ? "s" : "";
+               print "## Differing version$plural of $file found. You might like to\n";
+               for (0..$#{$self->{$file}}) {
+                       print "rm ", $self->{$file}[$_], "\n";
+                       $i++;
+               }
+               }
+               $plural = $i>1 ? "all those files" : "this file";
+               print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
        }
-    }
-    $plural = $i>1 ? "all those files" : "this file";
-    print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
 }
 
 1;
index 640978a..b22363b 100644 (file)
@@ -17,18 +17,18 @@ sub ext {
 
 sub _unix_os2_ext {
     my($self,$potential_libs, $verbose) = @_;
-    if ($^O =~ 'os2' and $Config{libs}) { 
+    if ($^O =~ 'os2' and $Config{perllibs}) { 
        # Dynamic libraries are not transitive, so we may need including
        # the libraries linked against perl.dll again.
 
        $potential_libs .= " " if $potential_libs;
-       $potential_libs .= $Config{libs};
+       $potential_libs .= $Config{perllibs};
     }
     return ("", "", "", "") unless $potential_libs;
     warn "Potential libraries are '$potential_libs':\n" if $verbose;
 
     my($so)   = $Config{'so'};
-    my($libs) = $Config{'libs'};
+    my($libs) = $Config{'perllibs'};
     my $Config_libext = $Config{lib_ext} || ".a";
 
 
@@ -198,7 +198,7 @@ sub _win32_ext {
     my $BC             = 1 if $cc =~ /^bcc/i;
     my $GC             = 1 if $cc =~ /^gcc/i;
     my $so             = $Config{'so'};
-    my $libs           = $Config{'libs'};
+    my $libs           = $Config{'perllibs'};
     my $libpth         = $Config{'libpth'};
     my $libext         = $Config{'lib_ext'} || ".lib";
 
@@ -342,7 +342,7 @@ sub _vms_ext {
                  $self->{CCFLAS}   || $Config{'ccflags'};
   @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
               . 'PerlShr/Share' );
-  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libs'});
+  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
   push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'});
   # In general, we pass through the basic libraries from %Config unchanged.
   # The one exception is that if we're building in the Perl source tree, and
@@ -628,7 +628,7 @@ Unix-OS/2 version in several respects:
 =item *
 
 If C<$potential_libs> is empty, the return value will be empty.
-Otherwise, the libraries specified by C<$Config{libs}> (see Config.pm)
+Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
 will be appended to the list of C<$potential_libs>.  The libraries
 will be searched for in the directories specified in C<$potential_libs>,
 C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
@@ -672,7 +672,7 @@ Entries in C<$potential_libs> beginning with a colon and followed by
 alphanumeric characters are treated as flags.  Unknown flags will be ignored.
 
 An entry that matches C</:nodefault/i> disables the appending of default
-libraries found in C<$Config{libs}> (this should be only needed very rarely).
+libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
 
 An entry that matches C</:nosearch/i> disables all searching for
 the libraries specified after it.  Translation of C<-Lfoo> and
@@ -682,7 +682,7 @@ valid files or directories.
 
 An entry that matches C</:search/i> reenables searching for
 the libraries specified after it.  You can put it at the end to
-enable searching for default libraries specified by C<$Config{libs}>.
+enable searching for default libraries specified by C<$Config{perllibs}>.
 
 =item *
 
index 8e337d9..52862c5 100644 (file)
@@ -305,8 +305,8 @@ sub cflags {
     $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
     $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
 
-    @cflags{qw(cc ccflags optimize large split shellflags)}
-       = @Config{qw(cc ccflags optimize large split shellflags)};
+    @cflags{qw(cc ccflags optimize shellflags)}
+       = @Config{qw(cc ccflags optimize shellflags)};
     my($optdebug) = "";
 
     $cflags{shellflags} ||= '';
@@ -341,16 +341,12 @@ sub cflags {
          optimize=\"$cflags{optimize}\"
          perltype=\"$cflags{perltype}\"
          optdebug=\"$cflags{optdebug}\"
-         large=\"$cflags{large}\"
-         split=\"$cflags{'split'}\"
          eval '$prog'
          echo cc=\$cc
          echo ccflags=\$ccflags
          echo optimize=\$optimize
          echo perltype=\$perltype
          echo optdebug=\$optdebug
-         echo large=\$large
-         echo split=\$split
          `;
        my($line);
        foreach $line (@o){
@@ -368,7 +364,7 @@ sub cflags {
        $cflags{optimize} = $optdebug;
     }
 
-    for (qw(ccflags optimize perltype large split)) {
+    for (qw(ccflags optimize perltype)) {
        $cflags{$_} =~ s/^\s+//;
        $cflags{$_} =~ s/\s+/ /g;
        $cflags{$_} =~ s/\s+$//;
@@ -411,8 +407,6 @@ sub cflags {
 CCFLAGS = $self->{CCFLAGS}
 OPTIMIZE = $self->{OPTIMIZE}
 PERLTYPE = $self->{PERLTYPE}
-LARGE = $self->{LARGE}
-SPLIT = $self->{SPLIT}
 MPOLLUTE = $pollute
 };
 
@@ -483,7 +477,7 @@ sub const_cccmd {
     return '' unless $self->needs_linking();
     return $self->{CONST_CCCMD} =
        q{CCCMD = $(CC) -c $(INC) $(CCFLAGS) $(OPTIMIZE) \\
-       $(PERLTYPE) $(LARGE) $(SPLIT) $(MPOLLUTE) $(DEFINE_VERSION) \\
+       $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
        $(XS_DEFINE_VERSION)};
 }
 
@@ -812,7 +806,7 @@ DIST_DEFAULT = $dist_default
 
 =item dist_basics (o)
 
-Defines the targets distclean, distcheck, skipcheck, manifest.
+Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
 
 =cut
 
@@ -840,6 +834,11 @@ manifest :
        $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \\
                -e mkmanifest
 };
+
+    push @m, q{
+veryclean : realclean
+       $(RM_F) *~ *.orig */*~ */*.orig
+};
     join "", @m;
 }
 
@@ -1071,13 +1070,7 @@ $(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)/.exists
     }
     $ldfrom = "-all $ldfrom -none" if ($^O eq 'dec_osf');
 
-    # Brain dead solaris linker does not use LD_RUN_PATH?
-    # This fixes dynamic extensions which need shared libs
-    my $ldrun = '';
-    $ldrun = join ' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}
-       if ($^O eq 'solaris');
-
-    # The IRIX linker also doesn't use LD_RUN_PATH
+    # The IRIX linker doesn't use LD_RUN_PATH
     $ldrun = qq{-rpath "$self->{LD_RUN_PATH}"}
        if ($^O eq 'irix' && $self->{LD_RUN_PATH});
 
@@ -1147,9 +1140,9 @@ in these dirs:
 @$dirs
 ";
     }
-    foreach $dir (@$dirs){
-       next unless defined $dir; # $self->{PERL_SRC} may be undefined
-       foreach $name (@$names){
+    foreach $name (@$names){
+       foreach $dir (@$dirs){
+           next unless defined $dir; # $self->{PERL_SRC} may be undefined
            my ($abs, $val);
            if ($self->file_name_is_absolute($name)) { # /foo/bar
                $abs = $name;
@@ -2371,7 +2364,7 @@ $(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
 
     # The front matter of the linkcommand...
     $linkcmd = join ' ', "\$(CC)",
-           grep($_, @Config{qw(large split ldflags ccdlflags)});
+           grep($_, @Config{qw(ldflags ccdlflags)});
     $linkcmd =~ s/\s+/ /g;
     $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
 
@@ -2454,7 +2447,7 @@ MAP_PERLINC   = @{$perlinc || []}
 MAP_STATIC    = ",
 join(" \\\n\t", reverse sort keys %static), "
 
-MAP_PRELIBS   = $Config::Config{libs} $Config::Config{cryptlib}
+MAP_PRELIBS   = $Config::Config{perllibs} $Config::Config{cryptlib}
 ";
 
     if (defined $libperl) {
@@ -2499,11 +2492,6 @@ MAP_LIBPERL = $libperl
     # SUNOS ld does not take the full path to a shared library
     my $llibperl = ($libperl)?'$(MAP_LIBPERL)':'-lperl';
 
-    # Brain dead solaris linker does not use LD_RUN_PATH?
-    # This fixes dynamic extensions which need shared libs
-    my $ldfrom = ($^O eq 'solaris')?
-           join(' ', map "-R$_", split /:/, $self->{LD_RUN_PATH}):'';
-
 push @m, "
 \$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
        \$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) $ldfrom \$(MAP_STATIC) $llibperl `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
@@ -3173,9 +3161,11 @@ form Foo/Bar and replaces the slash with C<::>. Returns the replacement.
 sub replace_manpage_separator {
     my($self,$man) = @_;
        if ($^O eq 'uwin') {
-               $man =~ s,/+,.,g;
+           $man =~ s,/+,.,g;
+       } elsif ($Is_Dos) {
+           $man =~ s,/+,__,g;
        } else {
-               $man =~ s,/+,::,g;
+           $man =~ s,/+,::,g;
        }
     $man;
 }
@@ -3494,7 +3484,7 @@ WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \\
 -e 'print "Please make sure the two installations are not conflicting\n";'
 
 UNINST=0
-VERBINST=1
+VERBINST=0
 
 MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \
 -e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');"
index d21a56a..d966c7d 100644 (file)
@@ -1890,6 +1890,7 @@ $(OBJECT) : $(PERL_INC)iperlsys.h
 # We do NOT just update config.h because that is not sufficient.
 # An out of date config.h is not fatal but complains loudly!
 $(PERL_INC)config.h : $(PERL_SRC)config.sh
+       $(NOOP)
 
 $(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
        $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
index 8bb3fc8..28b7053 100644 (file)
@@ -238,7 +238,7 @@ sub cp {
 
 sub ln {
     my ($srcFile, $dstFile) = @_;
-    return &cp if $Is_VMS;
+    return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
     link($srcFile, $dstFile);
     local($_) = $dstFile; # chmod a+r,go-w+X (except "X" only applies to u=x)
     my $mode= 0444 | (stat)[2] & 0700;
index 0260678..9961f2d 100644 (file)
@@ -225,13 +225,13 @@ T_U_CHAR
 T_FLOAT
        sv_setnv($arg, (double)$var);
 T_NV
-       sv_setnv($arg, (double)$var);
+       sv_setnv($arg, (NV)$var);
 T_DOUBLE
        sv_setnv($arg, (double)$var);
 T_PV
        sv_setpv((SV*)$arg, $var);
 T_PTR
-       sv_setiv($arg, (IV)$var);
+       sv_setiv($arg, PTR2IV($var));
 T_PTRREF
        sv_setref_pv($arg, Nullch, (void*)$var);
 T_REF_IV_REF
index e6cf786..8d1d783 100644 (file)
@@ -221,7 +221,7 @@ File::Copy - Copy files or filehandles
        use POSIX;
        use File::Copy cp;
 
-       $n=FileHandle->new("/dev/null","r");
+       $n = FileHandle->new("/a/file","r");
        cp($n,"x");'
 
 =head1 DESCRIPTION
index a9f190c..6e6e462 100644 (file)
@@ -42,6 +42,22 @@ Reports the name of a directory only AFTER all its entries
 have been reported.  Entry point finddepth() is a shortcut for
 specifying C<{ bydepth => 1 }> in the first argument of find().
 
+=item C<preprocess>
+
+The value should be a code reference.  This code reference is used to
+preprocess a directory; it is called after readdir() but before the loop that
+calls the wanted() function.  It is called with a list of strings and is
+expected to return a list of strings.  The code can be used to sort the
+strings alphabetically, numerically, or to filter out directory entries based
+on their name alone.
+
+=item C<postprocess>
+
+The value should be a code reference.  It is invoked just before leaving the
+current directory.  It is called in void context with no arguments.  The name
+of the current directory is in $File::Find::dir.  This hook is handy for
+summarizing a directory, such as calculating its disk usage.
+
 =item C<follow>
 
 Causes symbolic links to be followed. Since directory trees with symbolic
@@ -55,7 +71,7 @@ If either I<follow> or I<follow_fast> is in effect:
 
 =item *
 
-It is guarantueed that an I<lstat> has been called before the user's
+It is guaranteed that an I<lstat> has been called before the user's
 I<wanted()> function is called. This enables fast file checks involving S< _>.
 
 =item *
@@ -67,11 +83,10 @@ pathname of the file with all symbolic links resolved
 
 =item C<follow_fast>
 
-This is similar to I<follow> except that it may report some files
-more than once. It does detect cycles however.
-Since only symbolic links have to be hashed, this is
-much cheaper both in space and time.
-If processing a file more than once (by the user's I<wanted()> function)
+This is similar to I<follow> except that it may report some files more
+than once.  It does detect cycles, however.  Since only symbolic links
+have to be hashed, this is much cheaper both in space and time.  If
+processing a file more than once (by the user's I<wanted()> function)
 is worse than just taking time, the option I<follow> should be used.
 
 =item C<follow_skip>
@@ -97,14 +112,14 @@ C<$_> will be the same as C<$File::Find::name>.
 If find is used in taint-mode (-T command line switch or if EUID != UID
 or if EGID != GID) then internally directory names have to be untainted
 before they can be cd'ed to. Therefore they are checked against a regular
-expression I<untaint_pattern>. Note, that all names passed to the
+expression I<untaint_pattern>.  Note that all names passed to the
 user's I<wanted()> function are still tainted. 
 
 =item C<untaint_pattern>
 
 See above. This should be set using the C<qr> quoting operator.
 The default is set to  C<qr|^([-+@\w./]+)$|>. 
-Note that the paranthesis which are vital.
+Note that the parantheses are vital.
 
 =item C<untaint_skip>
 
@@ -116,15 +131,15 @@ are skipped. The default is to 'die' in such a case.
 The wanted() function does whatever verifications you want.
 C<$File::Find::dir> contains the current directory name, and C<$_> the
 current filename within that directory.  C<$File::Find::name> contains
-the complete pathname to the file. You are chdir()'d to C<$File::Find::dir> when
-the function is called, unless C<no_chdir> was specified.
-When <follow> or <follow_fast> are in effect there is also a
-C<$File::Find::fullname>.
-The function may set C<$File::Find::prune> to prune the tree
-unless C<bydepth> was specified.
-Unless C<follow> or C<follow_fast> is specified, for compatibility
-reasons (find.pl, find2perl) there are in addition the following globals
-available: C<$File::Find::topdir>, C<$File::Find::topdev>, C<$File::Find::topino>,
+the complete pathname to the file. You are chdir()'d to
+C<$File::Find::dir> when the function is called, unless C<no_chdir>
+was specified.  When <follow> or <follow_fast> are in effect, there is
+also a C<$File::Find::fullname>.  The function may set
+C<$File::Find::prune> to prune the tree unless C<bydepth> was
+specified.  Unless C<follow> or C<follow_fast> is specified, for
+compatibility reasons (find.pl, find2perl) there are in addition the
+following globals available: C<$File::Find::topdir>,
+C<$File::Find::topdev>, C<$File::Find::topino>,
 C<$File::Find::topmode> and C<$File::Find::topnlink>.
 
 This library is useful for the C<find2perl> tool, which when fed,
@@ -161,7 +176,7 @@ module.
 
 =head1 CAVEAT
 
-Be aware that the option to follow symblic links can be dangerous.
+Be aware that the option to follow symbolic links can be dangerous.
 Depending on the structure of the directory tree (including symbolic
 links to directories) you might traverse a given (physical) directory
 more than once (only if C<follow_fast> is in effect). 
@@ -183,7 +198,8 @@ require File::Basename;
 
 my %SLnkSeen;
 my ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow,
-    $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat);
+    $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat,
+    $pre_process, $post_process);
 
 sub contract_name {
     my ($cdir,$fn) = @_;
@@ -282,6 +298,8 @@ sub _find_opt {
     my $cwd_untainted = $cwd;
     $wanted_callback  = $wanted->{wanted};
     $bydepth          = $wanted->{bydepth};
+    $pre_process      = $wanted->{preprocess};
+    $post_process     = $wanted->{postprocess};
     $no_chdir         = $wanted->{no_chdir};
     $full_check       = $wanted->{follow};
     $follow           = $full_check || $wanted->{follow_fast};
@@ -464,6 +482,8 @@ sub _find_dir($$$) {
        }
        @filenames = readdir DIR;
        closedir(DIR);
+       @filenames = &$pre_process(@filenames) if $pre_process;
+       push @Stack,[$CdLvl,$dir_name,"",-2]   if $post_process;
 
        if ($nlink == 2 && !$avoid_nlink) {
            # This dir has no subdirectories.
@@ -518,7 +538,11 @@ sub _find_dir($$$) {
            }
            $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel");
            $dir_pref = "$dir_name/";
-            if ( $nlink < 0 ) {  # must be finddepth, report dirname now
+           if ( $nlink == -2 ) {
+               $name = $dir = $p_dir;
+               $_ = ".";
+               &$post_process;         # End-of-directory processing
+            } elsif ( $nlink < 0 ) {  # must be finddepth, report dirname now
                 $name = $dir_name;
                 if ( substr($name,-2) eq '/.' ) {
                   $name =~ s|/\.$||;
index aac8b7a..a351044 100644 (file)
@@ -4,6 +4,40 @@ package File::Temp;
 
 File::Temp - return name and handle of a temporary file safely
 
+=begin __INTERNALS
+
+=head1 PORTABILITY
+
+This module is designed to be portable across operating systems
+and it currently supports Unix, VMS, DOS, OS/2 and Windows. When
+porting to a new OS there are generally three main issues
+that have to be solved:
+
+=over 4
+
+=item *
+
+Can the OS unlink an open file? If it can't then the
+C<_can_unlink_opened_file> method should be modified.
+
+=item *
+
+Are the return values from C<stat> reliable? By default all the
+return values from C<stat> are compared when unlinking a temporary
+file using the filename and the handle. Operating systems other than
+unix do not always have valid entries in all fields. If C<unlink0> fails
+then the C<stat> comparison should be modified accordingly.
+
+=item *
+
+Security. Systems that can not support a test for the sticky bit
+on a directory can not use the MEDIUM and HIGH security tests.
+The C<_can_do_level> method should be modified accordingly.
+
+=back
+
+=end __INTERNALS
+
 =head1 SYNOPSIS
 
   use File::Temp qw/ tempfile tempdir /; 
@@ -61,12 +95,12 @@ filehandle of a temporary file.  The tempdir() function can
 be used to create a temporary directory.
 
 The security aspect of temporary file creation is emphasized such that
-a filehandle and filename are returned together.  This helps guarantee that 
-a race condition can not occur where the temporary file is created by another process 
-between checking for the existence of the file and its
-opening.  Additional security levels are provided to check, for 
-example, that the sticky bit is set on world writable directories.
-See L<"safe_level"> for more information.
+a filehandle and filename are returned together.  This helps guarantee
+that a race condition can not occur where the temporary file is
+created by another process between checking for the existence of the
+file and its opening.  Additional security levels are provided to
+check, for example, that the sticky bit is set on world writable
+directories.  See L<"safe_level"> for more information.
 
 For compatibility with popular C library functions, Perl implementations of
 the mkstemp() family of functions are provided. These are, mkstemp(),
@@ -91,8 +125,9 @@ use File::Spec 0.8;
 use File::Path qw/ rmtree /;
 use Fcntl 1.03;
 use Errno qw( EEXIST ENOENT ENOTDIR EINVAL );
+require VMS::Stdio if $^O eq 'VMS';
 
-# Need the Symbol package if we are running older perl 
+# Need the Symbol package if we are running older perl
 require Symbol if $] < 5.006;
 
 
@@ -131,7 +166,7 @@ Exporter::export_tags('POSIX','mktemp');
 
 # Version number 
 
-$VERSION = '0.09';
+$VERSION = '0.10';
 
 # This is a list of characters that can be used in random filenames
 
@@ -162,12 +197,25 @@ use constant HIGH     => 2;
 
 my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR;
 
-for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/) {
+for my $oflag (qw/ FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT /) {
   my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
   no strict 'refs';
   $OPENFLAGS |= $bit if eval { $bit = &$func(); 1 };
 }
 
+# On some systems the O_TEMPORARY flag can be used to tell the OS
+# to automatically remove the file when it is closed. This is fine
+# in most cases but not if tempfile is called with UNLINK=>0 and
+# the filename is requested -- in the case where the filename is to
+# be passed to another routine. This happens on windows. We overcome
+# this by using a second open flags variable
+
+my $OPENTEMPFLAGS = $OPENFLAGS;
+for my $oflag (qw/ TEMPORARY /) {
+  my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
+  no strict 'refs';
+  $OPENTEMPFLAGS |= $bit if eval { $bit = &$func(); 1 };
+}
 
 
 # INTERNAL ROUTINES - not to be used outside of package
@@ -190,7 +238,13 @@ for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/) {
 #             default is 0
 #   "suffixlen" => number of characters at end of PATH to be ignored.
 #                  default is 0.
+#   "unlink_on_close" => indicates that, if possible,  the OS should remove
+#                        the file as soon as it is closed. Usually indicates
+#                        use of the O_TEMPORARY flag to sysopen. 
+#                        Usually irrelevant on unix
+
 # "open" and "mkdir" can not both be true
+# "unlink_on_close" is not used when "mkdir" is true.
 
 # The default options are equivalent to mktemp().
 
@@ -214,6 +268,7 @@ sub _gettemp {
                 "open" => 0,
                 "mkdir" => 0,
                 "suffixlen" => 0,
+                "unlink_on_close" => 0,
                );
 
   # Read the template
@@ -285,6 +340,7 @@ sub _gettemp {
 
       if ($^O eq 'VMS') {  # need volume to avoid relative dir spec
         $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]);
+        $parent = 'sys$disk:[]' if $parent eq '';
       } else {
 
        # Put it back together without the last one
@@ -338,21 +394,6 @@ sub _gettemp {
   }
 
 
-  # Calculate the flags that we wish to use for the sysopen
-  # Some of these are not always available
-#  my $openflags;
-#  if ($options{"open"}) {
-    # Default set
-#    $openflags = O_CREAT | O_EXCL | O_RDWR;
-
-#    for my $oflag (qw/FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT TEMPORARY/) {
-#        my ($bit, $func) = (0, "Fcntl::O_" . $oflag);
-#        no strict 'refs';
-#        $openflags |= $bit if eval { $bit = &$func(); 1 };
-#    }
-
-#  }
-
   # Now try MAX_TRIES time to open the file
   for (my $i = 0; $i < MAX_TRIES; $i++) {
 
@@ -377,7 +418,18 @@ sub _gettemp {
       umask(066);
 
       # Attempt to open the file
-      if ( sysopen($fh, $path, $OPENFLAGS, 0600) ) {
+      my $open_success = undef;
+      if ( $^O eq 'VMS' and $options{"unlink_on_close"} ) {
+        # make it auto delete on close by setting FAB$V_DLT bit
+       $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt');
+       $open_success = $fh;
+      } else {
+       my $flags = ( $options{"unlink_on_close"} ?
+                     $OPENTEMPFLAGS :
+                     $OPENFLAGS );
+       $open_success = sysopen($fh, $path, $flags, 0600);
+      }
+      if ( $open_success ) {
 
        # Reset umask
        umask($umask);
@@ -557,8 +609,12 @@ sub _is_safe {
   # Check to see whether owner is neither superuser (or a system uid) nor me
   # Use the real uid from the $< variable
   # UID is in [4]
-  if ( $info[4] > File::Temp->top_system_uid() && $info[4] != $<) {
-    carp "Directory owned neither by root nor the current user";
+  if ($info[4] > File::Temp->top_system_uid() && $info[4] != $<) {
+
+    Carp::cluck(sprintf "uid=$info[4] topuid=%s \$<=$< path='$path'",
+               File::Temp->top_system_uid());
+
+    carp "Directory owned neither by root nor the current user.";
     return 0;
   }
 
@@ -657,7 +713,7 @@ sub _is_verysafe {
 
 sub _can_unlink_opened_file {
 
-  if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS') {
+  if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos') {
     return 0;
   } else {
     return 1;
@@ -681,7 +737,7 @@ sub _can_do_level {
   return 1 if $level == STANDARD;
 
   # Currently, the systems that can do HIGH or MEDIUM are identical
-  if ( $^O eq 'MSWin32' || $^O eq 'os2') {
+  if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos') {
     return 0;
   } else {
     return 1;
@@ -703,7 +759,7 @@ sub _can_do_level {
 #   - isdir      (flag to indicate that we are being given a directory)
 #                 [and hence no filehandle]
 
-# Status is not referred to since all the magic is done with and END block
+# Status is not referred to since all the magic is done with an END block
 
 {
   # Will set up two lexical variables to contain all the files to be
@@ -758,10 +814,12 @@ sub _can_do_level {
       if (-d $fname) {
 
        # Directory exists so store it
+       # first on VMS turn []foo into [.foo] for rmtree
+       $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS';
        push (@dirs_to_unlink, $fname);
 
       } else {
-       carp "Request to remove directory $fname could not be completed since it does not exists!\n";
+       carp "Request to remove directory $fname could not be completed since it does not exist!\n";
       }
 
     } else {
@@ -818,6 +876,13 @@ But see the WARNING at the end.
 Translates the template as before except that a directory name
 is specified.
 
+  ($fh, $filename) = tempfile($template, UNLINK => 1);
+
+Return the filename and filehandle as before except that the file is
+automatically removed when the program exits. Default is for the file
+to be removed if a file handle is requested and to be kept if the
+filename is requested.
+
 If the template is not specified, a template is always
 automatically generated. This temporary file is placed in tmpdir()
 (L<File::Spec>) unless a directory is specified explicitly with the 
@@ -844,6 +909,8 @@ if warnings are turned on. Consider using the tmpnam()
 and mktemp() functions described elsewhere in this document
 if opening the file is not required.
 
+Options can be combined as required.
+
 =cut
 
 sub tempfile {
@@ -854,9 +921,9 @@ sub tempfile {
   # Default options
   my %options = (
                 "DIR"    => undef,  # Directory prefix
-                "SUFFIX" => '',      # Template suffix
-                "UNLINK" => 0,      # Unlink file on exit
-                "OPEN"   => 1,      # Do not open file
+                "SUFFIX" => '',     # Template suffix
+                "UNLINK" => 0,      # Do not unlink file on exit
+                "OPEN"   => 1,      # Open file
                );
 
   # Check to see whether we have an odd or even number of arguments
@@ -873,6 +940,12 @@ sub tempfile {
 
   }
 
+  if ($options{"DIR"} and $^O eq 'VMS') {
+
+      # on VMS turn []foo into [.foo] for concatenation
+      $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"});
+  }
+
   # Construct the template
 
   # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc
@@ -909,8 +982,9 @@ sub tempfile {
   my ($fh, $path);
   croak "Error in tempfile() using $template"
     unless (($fh, $path) = _gettemp($template,
-                                   "open" => $options{'OPEN'}, 
+                                   "open" => $options{'OPEN'},
                                    "mkdir"=> 0 ,
+                                   "unlink_on_close" => $options{'UNLINK'},
                                    "suffixlen" => length($options{'SUFFIX'}),
                                   ) );
 
@@ -1023,8 +1097,9 @@ sub tempdir  {
     if ($options{'TMPDIR'} || $options{'DIR'}) {
 
       # Strip parent directory from the filename
-      # 
+      #
       # There is no filename at the end
+      $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS';
       my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1);
 
       # Last directory is then our template
@@ -1033,7 +1108,7 @@ sub tempdir  {
       # Prepend the supplied directory or temp dir
       if ($options{"DIR"}) {
 
-       $template = File::Spec->catfile($options{"DIR"}, $template);
+        $template = File::Spec->catdir($options{"DIR"}, $template);
 
       } elsif ($options{TMPDIR}) {
 
@@ -1314,7 +1389,7 @@ exits. No access to the filename is provided.
 
 sub tmpfile {
 
-  # Simply call tmpnam() in an array context
+  # Simply call tmpnam() in a list context
   my ($fh, $file) = tmpnam();
 
   # Make sure file is removed when filehandle is closed
@@ -1402,8 +1477,8 @@ the time the end block is executed since the deferred removal may not
 have access to the filehandle).
 
 Additionally, on Windows NT not all the fields returned by stat() can
-be compared. For example, the C<dev> and C<rdev> fields seem to be different
-and also. Also, it seems that the size of the file returned by stat()
+be compared. For example, the C<dev> and C<rdev> fields seem to be
+different.  Also, it seems that the size of the file returned by stat()
 does not always agree, with C<stat(FH)> being more accurate than
 C<stat(filename)>, presumably because of caching issues even when
 using autoflush (this is usually overcome by waiting a while after
@@ -1456,6 +1531,10 @@ sub unlink0 {
     @okstat = (1,2,3,4,5,7,8,9,10);
   } elsif ($^O eq 'os2') {
     @okstat = (0, 2..$#fh);
+  } elsif ($^O eq 'VMS') { # device and file ID are sufficient
+    @okstat = (0, 1);
+  } elsif ($^O eq 'dos') {
+     @okstat = (0,2..7,11..$#fh);
   }
 
   # Now compare each entry explicitly by number
@@ -1483,7 +1562,9 @@ sub unlink0 {
     print "Link count = $fh[3] \n" if $DEBUG;
 
     # Make sure that the link count is zero
-    return ( $fh[3] == 0 ? 1 : 0);
+    # - Cygwin provides deferred unlinking, however,
+    #   on Win9x the link count remains 1
+    return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0);
 
   } else {
     _deferred_unlink($fh, $path, 0);
@@ -1653,7 +1734,7 @@ descriptor before passing it to another process.
 =head1 HISTORY
 
 Originally began life in May 1999 as an XS interface to the system
-mkstemp() function. In March 2000, the mkstemp() code was
+mkstemp() function. In March 2000, the OpenBSD mkstemp() code was
 translated to Perl for total control of the code's
 security checking, to ensure the presence of the function regardless of
 operating system and to help with portability.
index 34c3475..5eb3a89 100644 (file)
@@ -238,12 +238,12 @@ See L<perlfunc/printf>.
 =item $fh->getline
 
 This works like <$fh> described in L<perlop/"I/O Operators">
-except that it's more readable and can be safely called in an
-array context but still returns just one line.
+except that it's more readable and can be safely called in a
+list context but still returns just one line.
 
 =item $fh->getlines
 
-This works like <$fh> when called in an array context to
+This works like <$fh> when called in a list context to
 read all the remaining lines in a file, except that it's more readable.
 It will also croak() if accidentally called in a scalar context.
 
index f474c7c..2bb0548 100644 (file)
@@ -2,12 +2,12 @@
 
 package Getopt::Long;
 
-# RCS Status      : $Id: GetoptLong.pl,v 2.24 2000-03-14 21:28:52+01 jv Exp $
+# RCS Status      : $Id: GetoptLong.pl,v 2.25 2000-08-28 21:45:17+02 jv Exp $
 # Author          : Johan Vromans
 # Created On      : Tue Sep 11 15:00:12 1990
 # Last Modified By: Johan Vromans
-# Last Modified On: Tue Mar 14 21:28:40 2000
-# Update Count    : 721
+# Last Modified On: Mon Jul 31 21:21:13 2000
+# Update Count    : 739
 # Status          : Released
 
 ################ Copyright ################
@@ -36,7 +36,7 @@ BEGIN {
     require 5.004;
     use Exporter ();
     use vars     qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-    $VERSION     = "2.23";
+    $VERSION     = 2.24;
 
     @ISA         = qw(Exporter);
     @EXPORT      = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER);
@@ -52,7 +52,7 @@ use vars qw($error $debug $major_version $minor_version);
 use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order
            $passthrough);
 # Official invisible variables.
-use vars qw($genprefix $caller);
+use vars qw($genprefix $caller $gnu_compat);
 
 # Public subroutines.
 sub Configure (@);
@@ -89,6 +89,27 @@ sub ConfigDefaults () {
     $error = 0;                        # error tally
     $ignorecase = 1;           # ignore case when matching options
     $passthrough = 0;          # leave unrecognized options alone
+    $gnu_compat = 0;           # require --opt=val if value is optional
+}
+
+# Override import.
+sub import {
+    my $pkg = shift;           # package
+    my @syms = ();             # symbols to import
+    my @config = ();           # configuration
+    my $dest = \@syms;         # symbols first
+    for ( @_ ) {
+       if ( $_ eq ':config' ) {
+           $dest = \@config;   # config next
+           next;
+       }
+       push (@$dest, $_);      # push
+    }
+    # Hide one level and call super.
+    local $Exporter::ExportLevel = 1;
+    $pkg->SUPER::import(@syms);
+    # And configure.
+    Configure (@config) if @config;
 }
 
 ################ Initialization ################
@@ -100,6 +121,87 @@ sub ConfigDefaults () {
 
 ConfigDefaults();
 
+################ OO Interface ################
+
+package Getopt::Long::Parser;
+
+# NOTE: The object oriented routines use $error for thread locking.
+my $_lock = sub {
+    lock ($Getopt::Long::error) if $] >= 5.005
+};
+
+# Store a copy of the default configuration. Since ConfigDefaults has
+# just been called, what we get from Configure is the default.
+my $default_config = do {
+    &$_lock;
+    Getopt::Long::Configure ()
+};
+
+sub new {
+    my $that = shift;
+    my $class = ref($that) || $that;
+    my %atts = @_;
+
+    # Register the callers package.
+    my $self = { caller => (caller)[0] };
+
+    bless ($self, $class);
+
+    # Process config attributes.
+    if ( defined $atts{config} ) {
+       &$_lock;
+       my $save = Getopt::Long::Configure ($default_config, @{$atts{config}});
+       $self->{settings} = Getopt::Long::Configure ($save);
+       delete ($atts{config});
+    }
+    # Else use default config.
+    else {
+       $self->{settings} = $default_config;
+    }
+
+    if ( %atts ) {             # Oops
+       Getopt::Long::Croak(__PACKAGE__.": unhandled attributes: ".
+                           join(" ", sort(keys(%atts))));
+    }
+
+    $self;
+}
+
+sub configure {
+    my ($self) = shift;
+
+    &$_lock;
+
+    # Restore settings, merge new settings in.
+    my $save = Getopt::Long::Configure ($self->{settings}, @_);
+
+    # Restore orig config and save the new config.
+    $self->{settings} = Configure ($save);
+}
+
+sub getoptions {
+    my ($self) = shift;
+
+    &$_lock;
+
+    # Restore config settings.
+    my $save = Getopt::Long::Configure ($self->{settings});
+
+    # Call main routine.
+    my $ret = 0;
+    $Getopt::Long::caller = $self->{caller};
+    eval { $ret = Getopt::Long::GetOptions (@_); };
+
+    # Restore saved settings.
+    Getopt::Long::Configure ($save);
+
+    # Handle errors and return value.
+    die ($@) if $@;
+    return $ret;
+}
+
+package Getopt::Long;
+
 ################ Package return ################
 
 1;
@@ -108,12 +210,12 @@ __END__
 
 ################ AutoLoading subroutines ################
 
-# RCS Status      : $Id: GetoptLongAl.pl,v 2.27 2000-03-17 09:07:26+01 jv Exp $
+# RCS Status      : $Id: GetoptLongAl.pl,v 2.29 2000-08-28 21:56:18+02 jv Exp $
 # Author          : Johan Vromans
 # Created On      : Fri Mar 27 11:50:30 1998
 # Last Modified By: Johan Vromans
-# Last Modified On: Fri Mar 17 09:00:09 2000
-# Update Count    : 55
+# Last Modified On: Fri Jul 28 19:12:29 2000
+# Update Count    : 97
 # Status          : Released
 
 sub GetOptions {
@@ -137,13 +239,14 @@ sub GetOptions {
     print STDERR ("GetOpt::Long $Getopt::Long::VERSION ",
                  "called from package \"$pkg\".",
                  "\n  ",
-                 'GetOptionsAl $Revision: 2.27 $ ',
+                 'GetOptionsAl $Revision: 2.29 $ ',
                  "\n  ",
                  "ARGV: (@ARGV)",
                  "\n  ",
                  "autoabbrev=$autoabbrev,".
                  "bundling=$bundling,",
                  "getopt_compat=$getopt_compat,",
+                 "gnu_compat=$gnu_compat,",
                  "order=$order,",
                  "\n  ",
                  "ignorecase=$ignorecase,",
@@ -200,7 +303,7 @@ sub GetOptions {
            next;
        }
 
-       # Match option spec. Allow '?' as an alias.
+       # Match option spec. Allow '?' as an alias only.
        if ( $opt !~ /^((\w+[-\w]*)(\|(\?|\w[-\w]*)?)*)?([!~+]|[=:][infse][@%]?)?$/ ) {
            $error .= "Error in option spec: \"$opt\"\n";
            next;
@@ -208,14 +311,22 @@ sub GetOptions {
        my ($o, $c, $a) = ($1, $5);
        $c = '' unless defined $c;
 
+       # $linko keeps track of the primary name the user specified.
+       # This name will be used for the internal or external linkage.
+       # In other words, if the user specifies "FoO|BaR", it will
+       # match any case combinations of 'foo' and 'bar', but if a global
+       # variable needs to be set, it will be $opt_FoO in the exact case
+       # as specified.
+       my $linko;
+
        if ( ! defined $o ) {
            # empty -> '-' option
-           $opctl{$o = ''} = $c;
+           $opctl{$linko = $o = ''} = $c;
        }
        else {
            # Handle alias names
            my @o =  split (/\|/, $o);
-           my $linko = $o = $o[0];
+           $linko = $o = $o[0];
            # Force an alias if the option name is not locase.
            $a = $o unless $o eq lc($o);
            $o = lc ($o)
@@ -254,18 +365,18 @@ sub GetOptions {
                    $a = $_;
                }
            }
-           $o = $linko;
        }
 
        # If no linkage is supplied in the @optionlist, copy it from
        # the userlinkage if available.
        if ( defined $userlinkage ) {
            unless ( @optionlist > 0 && ref($optionlist[0]) ) {
-               if ( exists $userlinkage->{$o} && ref($userlinkage->{$o}) ) {
-                   print STDERR ("=> found userlinkage for \"$o\": ",
-                                 "$userlinkage->{$o}\n")
+               if ( exists $userlinkage->{$linko} &&
+                    ref($userlinkage->{$linko}) ) {
+                   print STDERR ("=> found userlinkage for \"$linko\": ",
+                                 "$userlinkage->{$linko}\n")
                        if $debug;
-                   unshift (@optionlist, $userlinkage->{$o});
+                   unshift (@optionlist, $userlinkage->{$linko});
                }
                else {
                    # Do nothing. Being undefined will be handled later.
@@ -276,13 +387,13 @@ sub GetOptions {
 
        # Copy the linkage. If omitted, link to global variable.
        if ( @optionlist > 0 && ref($optionlist[0]) ) {
-           print STDERR ("=> link \"$o\" to $optionlist[0]\n")
+           print STDERR ("=> link \"$linko\" to $optionlist[0]\n")
                if $debug;
            if ( ref($optionlist[0]) =~ /^(SCALAR|CODE)$/ ) {
-               $linkage{$o} = shift (@optionlist);
+               $linkage{$linko} = shift (@optionlist);
            }
            elsif ( ref($optionlist[0]) =~ /^(ARRAY)$/ ) {
-               $linkage{$o} = shift (@optionlist);
+               $linkage{$linko} = shift (@optionlist);
                $opctl{$o} .= '@'
                  if $opctl{$o} ne '' and $opctl{$o} !~ /\@$/;
                $bopctl{$o} .= '@'
@@ -290,7 +401,7 @@ sub GetOptions {
                    $bopctl{$o} ne '' and $bopctl{$o} !~ /\@$/;
            }
            elsif ( ref($optionlist[0]) =~ /^(HASH)$/ ) {
-               $linkage{$o} = shift (@optionlist);
+               $linkage{$linko} = shift (@optionlist);
                $opctl{$o} .= '%'
                  if $opctl{$o} ne '' and $opctl{$o} !~ /\%$/;
                $bopctl{$o} .= '%'
@@ -304,22 +415,22 @@ sub GetOptions {
        else {
            # Link to global $opt_XXX variable.
            # Make sure a valid perl identifier results.
-           my $ov = $o;
+           my $ov = $linko;
            $ov =~ s/\W/_/g;
            if ( $c =~ /@/ ) {
-               print STDERR ("=> link \"$o\" to \@$pkg","::opt_$ov\n")
+               print STDERR ("=> link \"$linko\" to \@$pkg","::opt_$ov\n")
                    if $debug;
-               eval ("\$linkage{\$o} = \\\@".$pkg."::opt_$ov;");
+               eval ("\$linkage{\$linko} = \\\@".$pkg."::opt_$ov;");
            }
            elsif ( $c =~ /%/ ) {
-               print STDERR ("=> link \"$o\" to \%$pkg","::opt_$ov\n")
+               print STDERR ("=> link \"$linko\" to \%$pkg","::opt_$ov\n")
                    if $debug;
-               eval ("\$linkage{\$o} = \\\%".$pkg."::opt_$ov;");
+               eval ("\$linkage{\$linko} = \\\%".$pkg."::opt_$ov;");
            }
            else {
-               print STDERR ("=> link \"$o\" to \$$pkg","::opt_$ov\n")
+               print STDERR ("=> link \"$linko\" to \$$pkg","::opt_$ov\n")
                    if $debug;
-               eval ("\$linkage{\$o} = \\\$".$pkg."::opt_$ov;");
+               eval ("\$linkage{\$linko} = \\\$".$pkg."::opt_$ov;");
            }
        }
     }
@@ -382,7 +493,11 @@ sub GetOptions {
            next unless defined $opt;
 
            if ( defined $arg ) {
-               $opt = $aliases{$opt} if defined $aliases{$opt};
+               if ( defined $aliases{$opt} ) {
+                   print STDERR ("=> alias \"$opt\" -> \"$aliases{$opt}\"\n")
+                     if $debug;
+                   $opt = $aliases{$opt};
+               }
 
                if ( defined $linkage{$opt} ) {
                    print STDERR ("=> ref(\$L{$opt}) -> ",
@@ -646,7 +761,7 @@ sub FindOption ($$$$$$$) {
     }
     # Apparently valid.
     $opt = $tryopt;
-    print STDERR ("=> found \"$type\" for ", $opt, "\n") if $debug;
+    print STDERR ("=> found \"$type\" for \"", $opt, "\"\n") if $debug;
 
     #### Determine argument status ####
 
@@ -675,7 +790,16 @@ sub FindOption ($$$$$$$) {
     ($mand, $type, $dsttype, $key) = $type =~ /^(.)(.)([@%]?)$/;
 
     # Check if there is an option argument available.
-    if ( defined $optarg ? ($optarg eq '')
+    if ( $gnu_compat ) {
+       return (1, $opt, $optarg, $dsttype, $incr, $key)
+         if defined $optarg;
+       return (1, $opt, $type eq "s" ? '' : 0, $dsttype, $incr, $key)
+         if $mand eq ':';
+    }
+
+    # Check if there is an option argument available.
+    if ( defined $optarg
+        ? ($optarg eq '')
         : !(defined $rest || @ARGV > 0) ) {
        # Complain if this option needs an argument.
        if ( $mand eq "=" ) {
@@ -684,10 +808,7 @@ sub FindOption ($$$$$$$) {
            $error++;
            undef $opt;
        }
-       if ( $mand eq ":" ) {
-           $arg = $type eq "s" ? '' : 0;
-       }
-       return (1, $opt,$arg,$dsttype,$incr,$key);
+       return (1, $opt, $type eq "s" ? '' : 0, $dsttype, $incr, $key);
     }
 
     # Get (possibly optional) argument.
@@ -795,12 +916,12 @@ sub Configure (@) {
     my $prevconfig =
       [ $error, $debug, $major_version, $minor_version,
        $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
-       $passthrough, $genprefix ];
+       $gnu_compat, $passthrough, $genprefix ];
 
     if ( ref($options[0]) eq 'ARRAY' ) {
        ( $error, $debug, $major_version, $minor_version,
          $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order,
-         $passthrough, $genprefix ) = @{shift(@options)};
+         $gnu_compat, $passthrough, $genprefix ) = @{shift(@options)};
     }
 
     my $opt;
@@ -811,8 +932,13 @@ sub Configure (@) {
            $action = 0;
            $try = $+;
        }
-       if ( $try eq 'default' or $try eq 'defaults' ) {
-           ConfigDefaults () if $action;
+       if ( ($try eq 'default' or $try eq 'defaults') && $action ) {
+           ConfigDefaults ();
+       }
+       elsif ( ($try eq 'posix_default' or $try eq 'posix_defaults') ) {
+           local $ENV{POSIXLY_CORRECT};
+           $ENV{POSIXLY_CORRECT} = 1 if $action;
+           ConfigDefaults ();
        }
        elsif ( $try eq 'auto_abbrev' or $try eq 'autoabbrev' ) {
            $autoabbrev = $action;
@@ -820,6 +946,17 @@ sub Configure (@) {
        elsif ( $try eq 'getopt_compat' ) {
            $getopt_compat = $action;
        }
+       elsif ( $try eq 'gnu_getopt' ) {
+           if ( $action ) {
+               $gnu_compat = 1;
+               $bundling = 1;
+               $getopt_compat = 0;
+               $permute = 1;
+           }
+       }
+       elsif ( $try eq 'gnu_compat' ) {
+           $gnu_compat = $action;
+       }
        elsif ( $try eq 'ignorecase' or $try eq 'ignore_case' ) {
            $ignorecase = $action;
        }
@@ -841,14 +978,14 @@ sub Configure (@) {
        elsif ( $try eq 'pass_through' or $try eq 'passthrough' ) {
            $passthrough = $action;
        }
-       elsif ( $try =~ /^prefix=(.+)$/ ) {
+       elsif ( $try =~ /^prefix=(.+)$/ && $action ) {
            $genprefix = $1;
            # Turn into regexp. Needs to be parenthesized!
            $genprefix = "(" . quotemeta($genprefix) . ")";
            eval { '' =~ /$genprefix/; };
            Croak ("Getopt::Long: invalid pattern \"$genprefix\"") if $@;
        }
-       elsif ( $try =~ /^prefix_pattern=(.+)$/ ) {
+       elsif ( $try =~ /^prefix_pattern=(.+)$/ && $action ) {
            $genprefix = $1;
            # Parenthesize if needed.
            $genprefix = "(" . $genprefix . ")"
@@ -930,7 +1067,7 @@ could use the more descriptive C<--long>. To distinguish between a
 bundle of single-character options and a long one, two dashes are used
 to precede the option name. Early implementations of long options used
 a plus C<+> instead. Also, option values could be specified either
-like 
+like
 
     --size=24
 
@@ -943,7 +1080,7 @@ The C<+> form is now obsolete and strongly deprecated.
 =head1 Getting Started with Getopt::Long
 
 Getopt::Long is the Perl5 successor of C<newgetopt.pl>. This was
-the firs Perl module that provided support for handling the new style
+the first Perl module that provided support for handling the new style
 of command line options, hence the name Getopt::Long. This module
 also supports single-character options and bundling. In this case, the
 options are restricted to alphabetic characters only, and the
@@ -1166,11 +1303,11 @@ requires a least C<--hea> and C<--hei> for the head and height options.
 =head2 Summary of Option Specifications
 
 Each option specifier consists of two parts: the name specification
-and the argument specification. 
+and the argument specification.
 
 The name specification contains the name of the option, optionally
 followed by a list of alternative names separated by vertical bar
-characters. 
+characters.
 
     length           option name is "length"
     length|size|l     name is "length", aliases are "size" and "l"
@@ -1243,6 +1380,24 @@ considered an option on itself.
 
 =head1 Advanced Possibilities
 
+=head2 Object oriented interface
+
+Getopt::Long can be used in an object oriented way as well:
+
+    use Getopt::Long;
+    $p = new Getopt::Long::Parser;
+    $p->configure(...configuration options...);
+    if ($p->getoptions(...options descriptions...)) ...
+
+Configuration options can be passed to the constructor:
+
+    $p = new Getopt::Long::Parser
+             config => [...configuration options...];
+
+For thread safety, each method call will acquire an exclusive lock to
+the Getopt::Long module. So don't call these methods from a callback
+routine!
+
 =head2 Documentation and help texts
 
 Getopt::Long encourages the use of Pod::Usage to produce help
@@ -1365,7 +1520,7 @@ options,
 
     -vax
 
-would set C<a>, C<v> and C<x>, but 
+would set C<a>, C<v> and C<x>, but
 
     --vax
 
@@ -1423,8 +1578,8 @@ When applied to the following command line:
 
     arg1 --width=72 arg2 --width=60 arg3
 
-This will call 
-C<process("arg1")> while C<$width> is C<80>, 
+This will call
+C<process("arg1")> while C<$width> is C<80>,
 C<process("arg2")> while C<$width> is C<72>, and
 C<process("arg3")> while C<$width> is C<60>.
 
@@ -1436,10 +1591,15 @@ L<Configuring Getopt::Long>.
 
 Getopt::Long can be configured by calling subroutine
 Getopt::Long::Configure(). This subroutine takes a list of quoted
-strings, each specifying a configuration option to be set, e.g.
-C<ignore_case>, or reset, e.g. C<no_ignore_case>. Case does not
+strings, each specifying a configuration option to be enabled, e.g.
+C<ignore_case>, or disabled, e.g. C<no_ignore_case>. Case does not
 matter. Multiple calls to Configure() are possible.
 
+Alternatively, as of version 2.24, the configuration options may be
+passed together with the C<use> statement:
+
+    use Getopt::Long qw(:config no_ignore_case bundling);
+
 The following options are available:
 
 =over 12
@@ -1449,34 +1609,53 @@ The following options are available:
 This option causes all configuration options to be reset to their
 default values.
 
+=item posix_default
+
+This option causes all configuration options to be reset to their
+default values as if the environment variable POSIXLY_CORRECT had
+been set.
+
 =item auto_abbrev
 
 Allow option names to be abbreviated to uniqueness.
-Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is reset.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<auto_abbrev> is disabled.
 
 =item getopt_compat
 
 Allow C<+> to start options.
-Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case C<getopt_compat> is reset.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<getopt_compat> is disabled.
+
+=item gnu_compat
+
+C<gnu_compat> controls whether C<--opt=> is allowed, and what it should
+do. Without C<gnu_compat>, C<--opt=> gives an error. With C<gnu_compat>,
+C<--opt=> will give option C<opt> and empty value.
+This is the way GNU getopt_long() does it.
+
+=item gnu_getopt
+
+This is a short way of setting C<gnu_compat> C<bundling> C<permute>
+C<no_getopt_compat>. With C<gnu_getopt>, command line handling should be
+fully compatible with GNU getopt_long().
 
 =item require_order
 
 Whether command line arguments are allowed to be mixed with options.
-Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case C<require_order> is reset.
+Default is disabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<require_order> is enabled.
 
 See also C<permute>, which is the opposite of C<require_order>.
 
 =item permute
 
 Whether command line arguments are allowed to be mixed with options.
-Default is set unless environment variable
-POSIXLY_CORRECT has been set, in which case C<permute> is reset.
+Default is enabled unless environment variable
+POSIXLY_CORRECT has been set, in which case C<permute> is disabled.
 Note that C<permute> is the opposite of C<require_order>.
 
-If C<permute> is set, this means that 
+If C<permute> is enabled, this means that
 
     --foo arg1 --bar arg2 arg3
 
@@ -1493,7 +1672,7 @@ processed. The only exception is when C<--> is used:
 will call the call-back routine for arg1 and arg2, and terminate
 GetOptions() leaving C<"arg2"> in C<@ARGV>.
 
-If C<require_order> is set, options processing
+If C<require_order> is enabled, options processing
 terminates when the first non-option is encountered.
 
     --foo arg1 --bar arg2 arg3
@@ -1502,40 +1681,40 @@ is equivalent to
 
     --foo -- arg1 --bar arg2 arg3
 
-=item bundling (default: reset)
+=item bundling (default: disabled)
 
-Setting this option will allow single-character options to be bundled.
+Enabling this option will allow single-character options to be bundled.
 To distinguish bundles from long option names, long options I<must> be
 introduced with C<--> and single-character options (and bundles) with
 C<->.
 
-Note: resetting C<bundling> also resets C<bundling_override>.
+Note: disabling C<bundling> also disables C<bundling_override>.
 
-=item bundling_override (default: reset)
+=item bundling_override (default: disabled)
 
-If C<bundling_override> is set, bundling is enabled as with
-C<bundling> but now long option names override option bundles. 
+If C<bundling_override> is enabled, bundling is enabled as with
+C<bundling> but now long option names override option bundles.
 
-Note: resetting C<bundling_override> also resets C<bundling>.
+Note: disabling C<bundling_override> also disables C<bundling>.
 
 B<Note:> Using option bundling can easily lead to unexpected results,
 especially when mixing long options and bundles. Caveat emptor.
 
-=item ignore_case  (default: set)
+=item ignore_case  (default: enabled)
 
-If set, case is ignored when matching long option names. Single
+If enabled, case is ignored when matching long option names. Single
 character options will be treated case-sensitive.
 
-Note: resetting C<ignore_case> also resets C<ignore_case_always>.
+Note: disabling C<ignore_case> also disables C<ignore_case_always>.
 
-=item ignore_case_always (default: reset)
+=item ignore_case_always (default: disabled)
 
 When bundling is in effect, case is ignored on single-character
-options also. 
+options also.
 
-Note: resetting C<ignore_case_always> also resets C<ignore_case>.
+Note: disabling C<ignore_case_always> also disables C<ignore_case>.
 
-=item pass_through (default: reset)
+=item pass_through (default: disabled)
 
 Options that are unknown, ambiguous or supplied with an invalid option
 value are passed through in C<@ARGV> instead of being flagged as
@@ -1543,7 +1722,7 @@ errors. This makes it possible to write wrapper scripts that process
 only part of the user supplied command line arguments, and pass the
 remaining options to some other program.
 
-This can be very confusing, especially when C<permute> is also set.
+This can be very confusing, especially when C<permute> is also enabled.
 
 =item prefix
 
@@ -1556,9 +1735,9 @@ A Perl pattern that identifies the strings that introduce options.
 Default is C<(--|-|\+)> unless environment variable
 POSIXLY_CORRECT has been set, in which case it is C<(--|-)>.
 
-=item debug (default: reset)
+=item debug (default: disabled)
 
-Enable copious debugging output.
+Enable debugging output.
 
 =back
 
@@ -1569,11 +1748,10 @@ signalled using die() and will terminate the calling program unless
 the call to Getopt::Long::GetOptions() was embedded in C<eval { ...
 }>, or die() was trapped using C<$SIG{__DIE__}>.
 
-A return value of 1 (true) indicates success.
-
-A return status of 0 (false) indicates that the function detected one
-or more errors during option parsing. These errors are signalled using
-warn() and can be trapped with C<$SIG{__WARN__}>.
+GetOptions returns true to indicate success.
+It returns false when the function detected one or more errors during
+option parsing. These errors are signalled using warn() and can be
+trapped with C<$SIG{__WARN__}>.
 
 Errors that can't happen are signalled using Carp::croak().
 
@@ -1629,21 +1807,44 @@ Now the command line may look like:
 Note that to terminate options processing still requires a double dash
 C<-->.
 
-GetOptions() will not interpret a leading C<"<>"> as option starters
-if the next argument is a reference. To force C<"<"> and C<">"> as
-option starters, use C<"><">. Confusing? Well, B<using a starter
+GetOptions() will not interpret a leading C<< "<>" >> as option starters
+if the next argument is a reference. To force C<< "<" >> and C<< ">" >> as
+option starters, use C<< "><" >>. Confusing? Well, B<using a starter
 argument is strongly deprecated> anyway.
 
 =head2 Configuration variables
 
 Previous versions of Getopt::Long used variables for the purpose of
-configuring. Although manipulating these variables still work, it
-is strongly encouraged to use the new C<config> routine. Besides, it
-is much easier.
+configuring. Although manipulating these variables still work, it is
+strongly encouraged to use the C<Configure> routine that was introduced
+in version 2.17. Besides, it is much easier.
+
+=head1 Trouble Shooting
+
+=head2 Warning: Ignoring '!' modifier for short option
+
+This warning is issued when the '!' modifier is applied to a short
+(one-character) option and bundling is in effect. E.g.,
+
+    Getopt::Long::Configure("bundling");
+    GetOptions("foo|f!" => \$foo);
+
+Note that older Getopt::Long versions did not issue a warning, because
+the '!' modifier was applied to the first name only. This bug was
+fixed in 2.22.
+
+Solution: separate the long and short names and apply the '!' to the
+long names only, e.g.,
+
+    GetOptions("foo!" => \$foo, "f" => \$foo);
+
+=head2 GetOptions does not return a false result when an option is not supplied
+
+That's why they're called 'options'.
 
 =head1 AUTHOR
 
-Johan Vromans E<lt>jvromans@squirrel.nlE<gt>
+Johan Vromans <jvromans@squirrel.nl>
 
 =head1 COPYRIGHT AND DISCLAIMER
 
@@ -1660,7 +1861,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 If you do not have a copy of the GNU General Public License write to
-the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, 
+the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
 MA 02139, USA.
 
 =cut
index d8d643c..74a023e 100644 (file)
@@ -4,6 +4,7 @@ use Math::BigInt;
 
 use Exporter;  # just for use to be happy
 @ISA = (Exporter);
+$VERSION = '0.01';     # never had version before
 
 use overload
 '+'    =>      sub {new Math::BigFloat &fadd},
@@ -85,6 +86,7 @@ sub fnorm { #(string) return fnum_str
 # normalize number -- for internal use
 sub norm { #(mantissa, exponent) return fnum_str
     local($_, $exp) = @_;
+       $exp = 0 unless defined $exp;
     if ($_ eq 'NaN') {
        'NaN';
     } else {
@@ -174,12 +176,14 @@ sub round { #(int_str, int_str, int_str) return int_str
     } else {
        local($cmp) = Math::BigInt::bcmp(Math::BigInt::bmul($r,'+2'),$base);
        if ( $cmp < 0 ||
-                ($cmp == 0 &&
-                 ( $rnd_mode eq 'zero'                             ||
+                ($cmp == 0 &&                                          (
+                  ($rnd_mode eq 'zero'                            ) ||
                   ($rnd_mode eq '-inf' && (substr($q,$[,1) eq '+')) ||
                   ($rnd_mode eq '+inf' && (substr($q,$[,1) eq '-')) ||
-                  ($rnd_mode eq 'even' && $q =~ /[24680]$/)        ||
-                  ($rnd_mode eq 'odd'  && $q =~ /[13579]$/)        )) ) {
+                  ($rnd_mode eq 'even' && $q =~ /[13579]$/        ) ||
+                  ($rnd_mode eq 'odd'  && $q =~ /[24680]$/        )    )
+                 ) 
+               ) {
            $q;                     # round down
        } else {
            Math::BigInt::badd($q, ((substr($q,$[,1) eq '-') ? '-1' : '+1'));
@@ -244,9 +248,17 @@ sub fcmp #(fnum_str, fnum_str) return cond_code
        if ($xm eq '+0' || $ym eq '+0') {
            return $xm <=> $ym;
        }
-       ord($y) <=> ord($x)
-       || ($xe <=> $ye) * (substr($x,$[,1).'1')
-       || Math::BigInt::cmp($xm,$ym);
+       if ( $xe < $ye )        # adjust the exponents to be equal
+       {
+               $ym .= '0' x ($ye - $xe);
+               $ye = $xe;
+       }
+       elsif ( $ye < $xe )     # same here
+       {
+               $xm .= '0' x ($xe - $ye);
+               $xe = $ye;
+       }
+       return Math::BigInt::cmp($xm,$ym);
     }
 }
 
index a43969c..808e552 100644 (file)
@@ -1,4 +1,5 @@
 package Math::BigInt;
+$VERSION='0.01';
 
 use overload
 '+'    =>      sub {new Math::BigInt &badd},
index e5434f4..e7a071a 100644 (file)
@@ -7,15 +7,18 @@
 
 package Math::Complex;
 
-$VERSION = "1.30";
-
 our($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $Inf);
 
+$VERSION = 1.31;
+
 BEGIN {
-    my $e = $!;
-    $Inf = CORE::exp(CORE::exp(30)); # We do want an arithmetic overflow.
-    $! = $e; # Clear ERANGE.
-    undef $Inf unless $Inf =~ /^inf(?:inity)?$/i; # Inf INF inf Infinity
+    unless ($^O eq 'unicosmk') {
+        my $e = $!;
+       # We do want an arithmetic overflow.
+        eval '$Inf = CORE::exp(CORE::exp(30))';
+        $! = $e; # Clear ERANGE.
+        undef $Inf unless $Inf =~ /^inf(?:inity)?$/i; # Inf INF inf Infinity
+    }
     $Inf = "Inf" if !defined $Inf || !($Inf > 0); # Desperation.
 }
 
@@ -1250,23 +1253,15 @@ sub display_format {
                my %obj = %{$self->{display_format}};
                @display_format{keys %obj} = values %obj;
            }
-           if (@_ == 1) {
-               $display_format{style} = shift;
-           } else {
-               my %new = @_;
-               @display_format{keys %new} = values %new;
-           }
-       } else {                                # Called as a class method
-           if (@_ = 1) {
-               $display_format{style} = $self;
-           } else {
-               my %new = @_;
-               @display_format{keys %new} = values %new;
-           }
-           undef $self;
+       }
+       if (@_ == 1) {
+           $display_format{style} = shift;
+       } else {
+           my %new = @_;
+           @display_format{keys %new} = values %new;
        }
 
-       if (defined $self) {
+       if (ref $self) { # Called as an object method
            $self->{display_format} = { %display_format };
            return
                wantarray ?
@@ -1274,6 +1269,7 @@ sub display_format {
                    $self->{display_format}->{style};
        }
 
+        # Called as a class method
        %DISPLAY_FORMAT = %display_format;
        return
            wantarray ?
@@ -1393,11 +1389,11 @@ sub stringify_polar {
 
        $t -= int(CORE::abs($t) / pit2) * pit2;
 
-       if ($format{polar_pretty_print}) {
+       if ($format{polar_pretty_print} && $t) {
            my ($a, $b);
            for $a (2..9) {
                $b = $t * $a / pi;
-               if (int($b) == $b) {
+               if ($b =~ /^-?\d+$/) {
                    $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
                    $theta = "${b}pi/$a";
                    last;
index 492706c..b28f150 100644 (file)
@@ -36,14 +36,15 @@ my @rdlcnv = qw(cartesian_to_cylindrical
 
 %EXPORT_TAGS = ('radial' => [ @rdlcnv ]);
 
-sub pi2 () { 2 * pi }          # use constant generates warning
-sub pip2 () { pi / 2 }         # use constant generates warning
-use constant DR   => pi2/360;
-use constant RD   => 360/pi2;
-use constant DG   => 400/360;
-use constant GD   => 360/400;
-use constant RG   => 400/pi2;
-use constant GR   => pi2/400;
+sub pi2  () { 2 * pi }
+sub pip2 () { pi / 2 }
+
+sub DR  () { pi2/360 }
+sub RD  () { 360/pi2 }
+sub DG  () { 400/360 }
+sub GD  () { 360/400 }
+sub RG  () { 400/pi2 }
+sub GR  () { pi2/400 }
 
 #
 # Truncating remainder.
@@ -58,17 +59,23 @@ sub remt ($$) {
 # Angle conversions.
 #
 
-sub rad2deg ($)  { remt(RD * $_[0], 360) }
+sub rad2rad($)     { remt($_[0], pi2) }
+
+sub deg2deg($)     { remt($_[0], 360) }
+
+sub grad2grad($)   { remt($_[0], 400) }
 
-sub deg2rad ($)  { remt(DR * $_[0], pi2) }
+sub rad2deg ($;$)  { my $d = RD * $_[0]; $_[1] ? $d : deg2deg($d) }
 
-sub grad2deg ($) { remt(GD * $_[0], 360) }
+sub deg2rad ($;$)  { my $d = DR * $_[0]; $_[1] ? $d : rad2rad($d) }
 
-sub deg2grad ($) { remt(DG * $_[0], 400) }
+sub grad2deg ($;$) { my $d = GD * $_[0]; $_[1] ? $d : deg2deg($d) }
 
-sub rad2grad ($) { remt(RG * $_[0], 400) }
+sub deg2grad ($;$) { my $d = DG * $_[0]; $_[1] ? $d : grad2grad($d) }
 
-sub grad2rad ($) { remt(GR * $_[0], pi2) }
+sub rad2grad ($;$) { my $d = RG * $_[0]; $_[1] ? $d : grad2grad($d) }
+
+sub grad2rad ($;$) { my $d = GR * $_[0]; $_[1] ? $d : rad2rad($d) }
 
 sub cartesian_to_spherical {
     my ( $x, $y, $z ) = @_;
@@ -280,6 +287,14 @@ and the imaginary part of approximately C<-1.317>.
        $gradians = rad2grad($radians);
 
 The full circle is 2 I<pi> radians or I<360> degrees or I<400> gradians.
+The result is by default wrapped to be inside the [0, {2pi,360,400}[ circle.
+If you don't want this, supply a true second argument:
+
+       $zillions_of_radians  = deg2rad($zillions_of_degrees, 1);
+       $negative_degrees     = rad2deg($negative_radians, 1);
+
+You can also do the wrapping explicitly by rad2rad(), deg2deg(), and
+grad2grad().
 
 =head1 RADIAL COORDINATE CONVERSIONS
 
index 334af78..6aad940 100644 (file)
@@ -5,7 +5,7 @@ use 5.005_64;
 our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
 BEGIN { 
     use Exporter   ();
-    @EXPORT      = qw(getprotobyname getprotobynumber getprotoent);
+    @EXPORT      = qw(getprotobyname getprotobynumber getprotoent getproto);
     @EXPORT_OK   = qw( $p_name @p_aliases $p_proto );
     %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
 }
index ae32677..37ed68f 100644 (file)
@@ -10,7 +10,7 @@
 package Pod::Checker;
 
 use vars qw($VERSION);
-$VERSION = 1.098;  ## Current version of this package
+$VERSION = 1.2;  ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 use Pod::ParseUtils; ## for hyperlinks and lists
@@ -44,7 +44,8 @@ This function can take a hash of options:
 
 =item B<-warnings> =E<gt> I<val>
 
-Turn warnings on/off. See L<"Warnings">.
+Turn warnings on/off. I<val> is usually 1 for on, but higher values
+trigger additional warnings. See L<"Warnings">.
 
 =back
 
@@ -212,11 +213,15 @@ There is some whitespace on a seemingly empty line. POD is very sensitive
 to such things, so this is flagged. B<vi> users switch on the B<list>
 option to avoid this problem.
 
+=begin _disabled_
+
 =item * file does not start with =head
 
 The file starts with a different POD directive than head.
 This is most probably something you do not want.
 
+=end _disabled_
+
 =item * No numeric argument for =over
 
 The C<=over> command is supposed to have a numeric argument (the
@@ -243,7 +248,8 @@ type of the I<first> C<=item> determines the type of the list.
 
 Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>>
 can potentially cause errors as they could be misinterpreted as
-markup commands.
+markup commands. This is only printed when the -warnings level is
+greater than 1.
 
 =item * Unknown entity
 
@@ -273,11 +279,41 @@ The NAME section (C<=head1 NAME>) should consist of a single paragraph
 with the script/module name, followed by a dash `-' and a very short
 description of what the thing is good for.
 
-=item * Hyperlinks
+=back
+
+=head2 Hyperlinks
+
+There are some warnings wrt. malformed hyperlinks.
+
+=over 4
+
+=item * collapsing newlines to blanks
+
+A hyperlink LE<lt>...E<gt> spans more than one line. This may indicate
+and error.
 
-There are some warnings wrt. hyperlinks:
-Leading/trailing whitespace, newlines in hyperlinks,
-brackets C<()>.
+=item * ignoring leading/trailing whitespace in link
+
+There is whitespace at the beginning or the end of the contents of 
+LE<lt>...E<gt>.
+
+=item * (section) in '$page' deprecated
+
+There is a section detected in the page name of LE<lt>...E<gt>, e.g.
+C<LE<gt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only.
+Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able
+to expand this to appropriate code. For links to (builtin) functions,
+please say C<LE<lt>perlfunc/mkdirE<gt>>, without ().
+
+=item * alternative text/node '%s' contains non-escaped | or /
+
+The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
+Although the hyperlink parser does its best to determine which "/" is
+text and which is a delimiter in case of doubt, one ought to escape
+these literal characters like this:
+
+  /     E<sol>
+  |     E<verbar>
 
 =back
 
@@ -307,7 +343,6 @@ use strict;
 use Carp;
 use Exporter;
 use Pod::Parser;
-require VMS::Filespec if $^O eq 'VMS';
 
 use vars qw(@ISA @EXPORT);
 @ISA = qw(Pod::Parser);
@@ -471,7 +506,6 @@ sub podchecker( $ ; $ % ) {
 
     ## Now create a pod checker
     my $checker = new Pod::Checker(%options);
-    $checker->parseopts(-process_cut_cmd => 1, -warnings => 1);
 
     ## Now check the pod document for errors
     $checker->parse_from_file($infile, $outfile);
@@ -486,6 +520,27 @@ sub podchecker( $ ; $ % ) {
 ## Method definitions begin here
 ##-------------------------------
 
+##################################
+
+=over 4
+
+=item C<Pod::Checker-E<gt>new( %options )>
+
+Return a reference to a new Pod::Checker object that inherits from
+Pod::Parser and is used for calling the required methods later. The
+following options are recognized:
+
+C<-warnings =E<gt> num>
+  Print warnings if C<num> is true. The higher the value of C<num>,
+the more warnings are printed. Currently there are only levels 1 and 2.
+
+C<-quiet =E<gt> num>
+  If C<num> is true, do not print any errors/warnings. This is useful
+when Pod::Checker is used to munge POD code into plain text from within
+POD formatters.
+
+=cut
+
 ## sub new {
 ##     my $this = shift;
 ##     my $class = ref($this) || $this;
@@ -501,7 +556,9 @@ sub initialize {
     ## Initialize number of errors, and setup an error function to
     ## increment this number and then print to the designated output.
     $self->{_NUM_ERRORS} = 0;
-    $self->errorsub('poderror'); # set the error handling subroutine
+    $self->{-quiet} ||= 0;
+    # set the error handling subroutine
+    $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
     $self->{_commands} = 0; # total number of POD commands encountered
     $self->{_list_stack} = []; # stack for nested lists
     $self->{_have_begin} = ''; # stores =begin
@@ -511,12 +568,11 @@ sub initialize {
     # print warnings?
     $self->{-warnings} = 1 unless(defined $self->{-warnings});
     $self->{_current_head1} = ''; # the current =head1 block
+    $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings});
 }
 
 ##################################
 
-=over 4
-
 =item C<$checker-E<gt>poderror( @args )>
 
 =item C<$checker-E<gt>poderror( {%opts}, @args )>
@@ -547,7 +603,6 @@ The error level, should be 'WARNING' or 'ERROR'.
 sub poderror {
     my $self = shift;
     my %opts = (ref $_[0]) ? %{shift()} : ();
-    $opts{-file} = VMS::Filespec::unixify($opts{-file}) if (exists($opts{-file}) && $^O eq 'VMS');
 
     ## Retrieve options
     chomp( my $msg  = ($opts{-msg} || "")."@_" );
@@ -562,7 +617,7 @@ sub poderror {
     ## Increment error count and print message "
     ++($self->{_NUM_ERRORS}) 
         if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
-    my $out_fh = $self->output_handle();
+    my $out_fh = $self->output_handle() || \*STDERR;
     print $out_fh ($severity, $msg, $line, $file, "\n")
       if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
 }
@@ -672,7 +727,6 @@ sub end_pod {
     ## print the number of errors found
     my $self   = shift;
     my $infile = $self->input_file();
-    $infile = VMS::Filespec::unixify($infile) if $^O eq 'VMS';
     my $out_fh = $self->output_handle();
 
     if(@{$self->{_list_stack}}) {
@@ -691,12 +745,15 @@ sub end_pod {
     my %nodes;
     foreach($self->node()) {
         $nodes{$_} = 1;
-        if(/^(\S+)\s+/) {
+        if(/^(\S+)\s+\S/) {
             # we have more than one word. Use the first as a node, too.
             # This is used heavily in perlfunc.pod
             $nodes{$1} ||= 2; # derived node
         }
     }
+    foreach($self->idx()) {
+        $nodes{$_} = 3; # index node
+    }
     foreach($self->hyperlink()) {
         my ($line,$link) = @$_;
         # _TODO_ what if there is a link to the page itself by the name,
@@ -746,14 +803,17 @@ sub command {
        $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR',
                          -msg => "Unknown command '$cmd'" });
     }
-    else {
-        # found a valid command
-        if(!$self->{_commands}++ && $cmd !~ /^head/) {
-            $self->poderror({ -line => $line, -file => $file,
-                 -severity => 'WARNING', 
-                 -msg => "file does not start with =head" });
-        }
-        ## check syntax of particular command
+    else { # found a valid command
+        $self->{_commands}++; # delete this line if below is enabled again
+
+        ##### following check disabled due to strong request
+        #if(!$self->{_commands}++ && $cmd !~ /^head/) {
+        #    $self->poderror({ -line => $line, -file => $file,
+        #         -severity => 'WARNING', 
+        #         -msg => "file does not start with =head" });
+        #}
+
+        # check syntax of particular command
         if($cmd eq 'over') {
             # check for argument
             $arg = $self->interpolate_and_check($paragraph, $line,$file);
@@ -1005,12 +1065,13 @@ sub _check_ptree {
         unless(ref) {
             my $count;
             # count the unescaped angle brackets
+            # complain only when warning level is greater than 1
             my $i = $_;
             if($count = $i =~ tr/<>/<>/) {
                 $self->poderror({ -line => $line, -file => $file,
                      -severity => 'WARNING', 
                      -msg => "$count unescaped <> in paragraph" })
-                if($self->{-warnings});
+                if($self->{-warnings} && $self->{-warnings}>1);
             }
             $text .= $i;
             next;
index 8de197b..516a624 100644 (file)
@@ -13,8 +13,9 @@
 package Pod::Find;
 
 use vars qw($VERSION);
-$VERSION = 0.12;   ## Current version of this package
-require  5.005;    ## requires this Perl version or later
+$VERSION = 0.21;   ## Current version of this package
+require  5.005;   ## requires this Perl version or later
+use Carp;
 
 #############################################################################
 
@@ -32,12 +33,38 @@ Pod::Find - find POD documents in directory trees
 
   print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n";
 
+  $location = pod_where( { -inc => 1 }, "Pod::Find" );
+
 =head1 DESCRIPTION
 
-B<Pod::Find> provides a function B<pod_find> that searches for POD
-documents in a given set of files and directories. It returns a hash
-with the file names as keys and the POD name as value. The POD name
-is derived from the file name and its position in the directory tree.
+B<Pod::Find> provides a set of functions to locate POD files.  Note that
+no function is exported by default to avoid pollution of your namespace,
+so be sure to specify them in the B<use> statement if you need them:
+
+  use Pod::Find qw(pod_find);
+
+=cut
+
+use strict;
+#use diagnostics;
+use Exporter;
+use File::Spec;
+use File::Find;
+use Cwd;
+
+use vars qw(@ISA @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod);
+
+# package global variables
+my $SIMPLIFY_RX;
+
+=head2 C<pod_find( { %opts } , @directories )>
+
+The function B<pod_find> searches for POD documents in a given set of
+files and/or directories. It returns a hash with the file names as keys
+and the POD name as value. The POD name is derived from the file name
+and its position in the directory tree.
 
 E.g. when searching in F<$HOME/perl5lib>, the file
 F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>,
@@ -51,73 +78,39 @@ A warning is printed if more than one POD file with the same POD name
 is found, e.g. F<CPAN.pm> in different directories. This usually
 indicates duplicate occurrences of modules in the I<@INC> search path.
 
-The function B<simplify_name> is equivalent to B<basename>, but also
-strips Perl-like extensions (.pm, .pl, .pod) and extensions like
-F<.bat>, F<.cmd> on Win32 and OS/2, respectively.
-
-Note that neither B<pod_find> nor B<simplify_name> are exported by
-default so be sure to specify them in the B<use> statement if you need
-them:
-
-  use Pod::Find qw(pod_find simplify_name);
-
-=head1 OPTIONS
-
-The first argument for B<pod_find> may be a hash reference with options.
-The rest are either directories that are searched recursively or files.
-The POD names of files are the plain basenames with any Perl-like extension
-(.pm, .pl, .pod) stripped.
+B<OPTIONS> The first argument for B<pod_find> may be a hash reference
+with options. The rest are either directories that are searched
+recursively or files.  The POD names of files are the plain basenames
+with any Perl-like extension (.pm, .pl, .pod) stripped.
 
 =over 4
 
-=item B<-verbose>
+=item C<-verbose =E<gt> 1>
 
 Print progress information while scanning.
 
-=item B<-perl>
+=item C<-perl =E<gt> 1>
 
 Apply Perl-specific heuristics to find the correct PODs. This includes
 stripping Perl-like extensions, omitting subdirectories that are numeric
 but do I<not> match the current Perl interpreter's version id, suppressing
 F<site_perl> as a module hierarchy name etc.
 
-=item B<-script>
+=item C<-script =E<gt> 1>
 
 Search for PODs in the current Perl interpreter's installation 
 B<scriptdir>. This is taken from the local L<Config|Config> module.
 
-=item B<-inc>
+=item C<-inc =E<gt> 1>
 
 Search for PODs in the current Perl interpreter's I<@INC> paths. This
-automatically considers paths specified in the C<PERL5LIB> environment.
+automatically considers paths specified in the C<PERL5LIB> environment
+as this is prepended to I<@INC> by the Perl interpreter itself.
 
 =back
 
-=head1 AUTHOR
-
-Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>,
-heavily borrowing code from Nick Ing-Simmons' PodToHtml.
-
-=head1 SEE ALSO
-
-L<Pod::Parser>, L<Pod::Checker>
-
 =cut
 
-use strict;
-#use diagnostics;
-use Exporter;
-use File::Spec;
-use File::Find;
-use Cwd;
-
-use vars qw(@ISA @EXPORT_OK $VERSION);
-@ISA = qw(Exporter);
-@EXPORT_OK = qw(&pod_find &simplify_name);
-
-# package global variables
-my $SIMPLIFY_RX;
-
 # return a hash of the POD files found
 # first argument may be a hashref (options),
 # rest is a list of directories to search recursively
@@ -167,7 +160,9 @@ sub pod_find
             $try = File::Spec->catfile($pwd,$try);
         }
         # simplify path
-        $try = File::Spec->canonpath($try);
+        # on VMS canonpath will vmsify:[the.path], but File::Find::find
+        # wants /unixy/paths
+        $try = File::Spec->canonpath($try) if ($^O ne 'VMS');
         my $name;
         if(-f $try) {
             if($name = _check_and_extract_name($try, $opts{-verbose})) {
@@ -222,27 +217,14 @@ sub _check_and_extract_name {
 
     # check extension or executable flag
     # this involves testing the .bat extension on Win32!
-    unless($file =~ /\.(pod|pm|plx?)\z/i || (-f $file && -x _ && -T _)) {
-        return undef;
+    unless(-f $file && -T _ && ($file =~ /\.(pod|pm|plx?)\z/i || -x _ )) {
+      return undef;
     }
 
-    # check for one line of POD
-    unless(open(POD,"<$file")) {
-        warn "Error: $file is unreadable: $!\n";
-        return undef;
-    }
-    local $/ = undef;
-    my $pod = <POD>;
-    close(POD);
-    unless($pod =~ /\n=(head\d|pod|over|item)\b/) {
-        warn "No POD in $file, skipping.\n"
-            if($verbose);
-        return;
-    }
-    undef $pod;
+    return undef unless contains_pod($file,$verbose);
 
     # strip non-significant path components
-    # _TODO_ what happens on e.g. Win32?
+    # TODO what happens on e.g. Win32?
     my $name = $file;
     if(defined $root_rx) {
         $name =~ s!$root_rx!!s;
@@ -256,6 +238,14 @@ sub _check_and_extract_name {
     $name;
 }
 
+=head2 C<simplify_name( $str )>
+
+The function B<simplify_name> is equivalent to B<basename>, but also
+strips Perl-like extensions (.pm, .pl, .pod) and extensions like
+F<.bat>, F<.cmd> on Win32 and OS/2, respectively.
+
+=cut
+
 # basic simplification of the POD name:
 # basename & strip extension
 sub simplify_name {
@@ -274,5 +264,180 @@ sub _simplify {
     $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /win|os2/i);
 }
 
+# contribution from Tim Jenness <t.jenness@jach.hawaii.edu>
+
+=head2 C<pod_where( { %opts }, $pod )>
+
+Returns the location of a pod document given a search directory
+and a module (e.g. C<File::Find>) or script (e.g. C<perldoc>) name.
+
+Options:
+
+=over 4
+
+=item C<-inc =E<gt> 1>
+
+Search @INC for the pod and also the C<scriptdir> defined in the
+L<Config|Config> module.
+
+=item C<-dirs =E<gt> [ $dir1, $dir2, ... ]>
+
+Reference to an array of search directories. These are searched in order
+before looking in C<@INC> (if B<-inc>). Current directory is used if
+none are specified.
+
+=item C<-verbose =E<gt> 1>
+
+List directories as they are searched
+
+=back
+
+Returns the full path of the first occurence to the file.
+Package names (eg 'A::B') are automatically converted to directory
+names in the selected directory. (eg on unix 'A::B' is converted to
+'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the
+search automatically if required.
+
+A subdirectory F<pod/> is also checked if it exists in any of the given
+search directories. This ensures that e.g. L<perlfunc|perlfunc> is
+found.
+
+It is assumed that if a module name is supplied, that that name
+matches the file name. Pods are not opened to check for the 'NAME'
+entry.
+
+A check is made to make sure that the file that is found does 
+contain some pod documentation.
+
+=cut
+
+sub pod_where {
+
+  # default options
+  my %options = (
+         '-inc' => 0,
+         '-verbose' => 0,
+         '-dirs' => [ '.' ],
+        );
+
+  # Check for an options hash as first argument
+  if (defined $_[0] && ref($_[0]) eq 'HASH') {
+    my $opt = shift;
+
+    # Merge default options with supplied options
+    %options = (%options, %$opt);
+  }
+
+  # Check usage
+  carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_));
+
+  # Read argument
+  my $pod = shift;
+
+  # Split on :: and then join the name together using File::Spec
+  my @parts = split (/::/, $pod);
+
+  # Get full directory list
+  my @search_dirs = @{ $options{'-dirs'} };
+
+  if ($options{'-inc'}) {
+
+    require Config;
+
+    # Add @INC
+    push (@search_dirs, @INC) if $options{'-inc'};
+
+    # Add location of pod documentation for perl man pages (eg perlfunc)
+    # This is a pod directory in the private install tree
+    #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'},
+    #                                  'pod');
+    #push (@search_dirs, $perlpoddir)
+    #  if -d $perlpoddir;
+
+    # Add location of binaries such as pod2text
+    push (@search_dirs, $Config::Config{'scriptdir'})
+      if -d $Config::Config{'scriptdir'};
+  }
+
+  # Loop over directories
+  Dir: foreach my $dir ( @search_dirs ) {
+
+    # Don't bother if cant find the directory
+    if (-d $dir) {
+      warn "Looking in directory $dir\n" 
+        if $options{'-verbose'};
+
+      # Now concatenate this directory with the pod we are searching for
+      my $fullname = File::Spec->catfile($dir, @parts);
+      warn "Filename is now $fullname\n"
+        if $options{'-verbose'};
+
+      # Loop over possible extensions
+      foreach my $ext ('', '.pod', '.pm', '.pl') {
+        my $fullext = $fullname . $ext;
+        if (-f $fullext && 
+         contains_pod($fullext, $options{'-verbose'}) ) {
+          warn "FOUND: $fullext\n" if $options{'-verbose'};
+          return $fullext;
+        }
+      }
+    } else {
+      warn "Directory $dir does not exist\n"
+        if $options{'-verbose'};
+      next Dir;
+    }
+    if(-d File::Spec->catdir($dir,'pod')) {
+      $dir = File::Spec->catdir($dir,'pod');
+      redo Dir;
+    }
+  }
+  # No match;
+  return undef;
+}
+
+=head2 C<contains_pod( $file , $verbose )>
+
+Returns true if the supplied filename (not POD module) contains some pod
+information.
+
+=cut
+
+sub contains_pod {
+  my $file = shift;
+  my $verbose = 0;
+  $verbose = shift if @_;
+
+  # check for one line of POD
+  unless(open(POD,"<$file")) {
+    warn "Error: $file is unreadable: $!\n";
+    return undef;
+  }
+  
+  local $/ = undef;
+  my $pod = <POD>;
+  close(POD) || die "Error closing $file: $!\n";
+  unless($pod =~ /\n=(head\d|pod|over|item)\b/s) {
+    warn "No POD in $file, skipping.\n"
+      if($verbose);
+    return 0;
+  }
+
+  return 1;
+}
+
+=head1 AUTHOR
+
+Marek Rouchal E<lt>marek@saftsack.fs.uni-bayreuth.deE<gt>,
+heavily borrowing code from Nick Ing-Simmons' PodToHtml.
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> provided
+C<pod_where> and C<contains_pod>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Checker>, L<perldoc>
+
+=cut
+
 1;
 
index 03cbf71..44619d5 100644 (file)
@@ -296,7 +296,7 @@ values      HASH    return a list of the values in a hash
 vec    Binary  test or set particular bits in a string
 wait   Process wait for any child process to die
 waitpid        Process wait for  a particular child process to die
-wantarray      Misc,Flow       get list vs array context of current subroutine call
+wantarray      Misc,Flow       get void vs scalar vs list context of current subroutine call
 warn   I/O     print debugging info
 write  I/O     print a picture record
 y///   String  transliterate a string
index 346495f..f70a42b 100644 (file)
@@ -893,6 +893,10 @@ sub scan_dir {
            $pages{$_}  = "" unless defined $pages{$_};
            $pages{$_} .= "$dir/$_.pod:";
            push(@pods, "$dir/$_.pod");
+       } elsif (/\.html\z/) {                              # .html
+           s/\.html\z//;
+           $pages{$_}  = "" unless defined $pages{$_};
+           $pages{$_} .= "$dir/$_.pod:";
        } elsif (/\.pm\z/) {                                # .pm
            s/\.pm\z//;
            $pages{$_}  = "" unless defined $pages{$_};
index 849182b..352373b 100644 (file)
@@ -11,7 +11,7 @@
 package Pod::InputObjects;
 
 use vars qw($VERSION);
-$VERSION = 1.12;  ## Current version of this package
+$VERSION = 1.13;  ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 #############################################################################
@@ -42,7 +42,7 @@ are defined:
 
 =begin __PRIVATE__
 
-=item B<Pod::InputSource>
+=item package B<Pod::InputSource>
 
 An object corresponding to a source of POD input text. It is mostly a
 wrapper around a filehandle or C<IO::Handle>-type object (or anything
@@ -51,23 +51,23 @@ additional information relevant to the parsing of PODs.
 
 =end __PRIVATE__
 
-=item B<Pod::Paragraph>
+=item package B<Pod::Paragraph>
 
 An object corresponding to a paragraph of POD input text. It may be a
 plain paragraph, a verbatim paragraph, or a command paragraph (see
 L<perlpod>).
 
-=item B<Pod::InteriorSequence>
+=item package B<Pod::InteriorSequence>
 
 An object corresponding to an interior sequence command from the POD
 input text (see L<perlpod>).
 
-=item B<Pod::ParseTree>
+=item package B<Pod::ParseTree>
 
 An object corresponding to a tree of parsed POD text. Each "node" in
 a parse-tree (or I<ptree>) is either a text-string or a reference to
 a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree
-in they order in which they were parsed from  left-to-right.
+in the order in which they were parsed from left-to-right.
 
 =back
 
@@ -232,7 +232,7 @@ It has the following methods/attributes:
 
 ##---------------------------------------------------------------------------
 
-=head2 B<new()>
+=head2 Pod::Paragraph-E<gt>B<new()>
 
         my $pod_para1 = Pod::Paragraph->new(-text => $text);
         my $pod_para2 = Pod::Paragraph->new(-name => $cmd,
@@ -284,7 +284,7 @@ sub new {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<cmd_name()>
+=head2 $pod_para-E<gt>B<cmd_name()>
 
         my $para_cmd = $pod_para->cmd_name();
 
@@ -303,7 +303,7 @@ sub cmd_name {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<text()>
+=head2 $pod_para-E<gt>B<text()>
 
         my $para_text = $pod_para->text();
 
@@ -318,7 +318,7 @@ sub text {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<raw_text()>
+=head2 $pod_para-E<gt>B<raw_text()>
 
         my $raw_pod_para = $pod_para->raw_text();
 
@@ -335,7 +335,7 @@ sub raw_text {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<cmd_prefix()>
+=head2 $pod_para-E<gt>B<cmd_prefix()>
 
         my $prefix = $pod_para->cmd_prefix();
 
@@ -351,7 +351,7 @@ sub cmd_prefix {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<cmd_separator()>
+=head2 $pod_para-E<gt>B<cmd_separator()>
 
         my $separator = $pod_para->cmd_separator();
 
@@ -367,7 +367,7 @@ sub cmd_separator {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<parse_tree()>
+=head2 $pod_para-E<gt>B<parse_tree()>
 
         my $ptree = $pod_parser->parse_text( $pod_para->text() );
         $pod_para->parse_tree( $ptree );
@@ -387,13 +387,13 @@ sub parse_tree {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<file_line()>
+=head2 $pod_para-E<gt>B<file_line()>
 
         my ($filename, $line_number) = $pod_para->file_line();
         my $position = $pod_para->file_line();
 
 Returns the current filename and line number for the paragraph
-object.  If called in an array context, it returns a list of two
+object.  If called in a list context, it returns a list of two
 elements: first the filename, then the line number. If called in
 a scalar context, it returns a string containing the filename, followed
 by a colon (':'), followed by the line number.
@@ -423,7 +423,7 @@ It has the following methods/attributes:
 
 ##---------------------------------------------------------------------------
 
-=head2 B<new()>
+=head2 Pod::InteriorSequence-E<gt>B<new()>
 
         my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd
                                                   -ldelim => $delimiter);
@@ -497,7 +497,7 @@ sub new {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<cmd_name()>
+=head2 $pod_seq-E<gt>B<cmd_name()>
 
         my $seq_cmd = $pod_seq->cmd_name();
 
@@ -546,7 +546,7 @@ sub _unset_child2parent_links {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<prepend()>
+=head2 $pod_seq-E<gt>B<prepend()>
 
         $pod_seq->prepend($text);
         $pod_seq1->prepend($pod_seq2);
@@ -565,7 +565,7 @@ sub prepend {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<append()>
+=head2 $pod_seq-E<gt>B<append()>
 
         $pod_seq->append($text);
         $pod_seq1->append($pod_seq2);
@@ -584,7 +584,7 @@ sub append {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<nested()>
+=head2 $pod_seq-E<gt>B<nested()>
 
         $outer_seq = $pod_seq->nested || print "not nested";
 
@@ -602,7 +602,7 @@ sub nested {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<raw_text()>
+=head2 $pod_seq-E<gt>B<raw_text()>
 
         my $seq_raw_text = $pod_seq->raw_text();
 
@@ -623,7 +623,7 @@ sub raw_text {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<left_delimiter()>
+=head2 $pod_seq-E<gt>B<left_delimiter()>
 
         my $ldelim = $pod_seq->left_delimiter();
 
@@ -642,7 +642,7 @@ sub left_delimiter {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<right_delimiter()>
+=head2 $pod_seq-E<gt>B<right_delimiter()>
 
 The rightmost delimiter beginning the argument text to the interior
 sequence (should be ">").
@@ -659,7 +659,7 @@ sub right_delimiter {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<parse_tree()>
+=head2 $pod_seq-E<gt>B<parse_tree()>
 
         my $ptree = $pod_parser->parse_text($paragraph_text);
         $pod_seq->parse_tree( $ptree );
@@ -680,13 +680,13 @@ sub parse_tree {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<file_line()>
+=head2 $pod_seq-E<gt>B<file_line()>
 
         my ($filename, $line_number) = $pod_seq->file_line();
         my $position = $pod_seq->file_line();
 
 Returns the current filename and line number for the interior sequence
-object.  If called in an array context, it returns a list of two
+object.  If called in a list context, it returns a list of two
 elements: first the filename, then the line number. If called in
 a scalar context, it returns a string containing the filename, followed
 by a colon (':'), followed by the line number.
@@ -701,7 +701,7 @@ sub file_line {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<DESTROY()>
+=head2 Pod::InteriorSequence::B<DESTROY()>
 
 This method performs any necessary cleanup for the interior-sequence.
 If you override this method then it is B<imperative> that you invoke
@@ -738,7 +738,7 @@ itself contain a parse-tree (since interior sequences may be nested).
 
 ##---------------------------------------------------------------------------
 
-=head2 B<new()>
+=head2 Pod::ParseTree-E<gt>B<new()>
 
         my $ptree1 = Pod::ParseTree->new;
         my $ptree2 = new Pod::ParseTree;
@@ -766,7 +766,7 @@ sub new {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<top()>
+=head2 $ptree-E<gt>B<top()>
 
         my $top_node = $ptree->top();
         $ptree->top( $top_node );
@@ -794,7 +794,7 @@ sub top {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<children()>
+=head2 $ptree-E<gt>B<children()>
 
 This method gets/sets the children of the top node in the parse-tree.
 If no arguments are given, it returns the list (array) of children
@@ -814,7 +814,7 @@ sub children {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<prepend()>
+=head2 $ptree-E<gt>B<prepend()>
 
 This method prepends the given text or parse-tree to the current parse-tree.
 If the first item on the parse-tree is text and the argument is also text,
@@ -842,7 +842,7 @@ sub prepend {
 
 ##---------------------------------------------------------------------------
 
-=head2 B<append()>
+=head2 $ptree-E<gt>B<append()>
 
 This method appends the given text or parse-tree to the current parse-tree.
 If the last item on the parse-tree is text and the argument is also text,
@@ -866,7 +866,7 @@ sub append {
    }
 }
 
-=head2 B<raw_text()>
+=head2 $ptree-E<gt>B<raw_text()>
 
         my $ptree_raw_text = $ptree->raw_text();
 
@@ -902,7 +902,7 @@ sub _set_child2parent_links {
     ## nothing to do, Pod::ParseTrees cant have parent pointers
 }
 
-=head2 B<DESTROY()>
+=head2 Pod::ParseTree::B<DESTROY()>
 
 This method performs any necessary cleanup for the parse-tree.
 If you override this method then it is B<imperative>
index 8adb589..c909d21 100644 (file)
@@ -36,7 +36,7 @@ use Carp;
 
 use vars qw/ $VERSION %HTML_Escapes @LatexSections /;
 
-$VERSION = '0.52';
+$VERSION = '0.53';
 
 # Definitions of =headN -> latex mapping
 @LatexSections = (qw/
@@ -57,6 +57,8 @@ $VERSION = '0.52';
     'lt'        =>      '$<$',    #   ' left chevron, less-than
     'gt'        =>      '$>$',    #   ' right chevron, greater-than
     'quot'      =>      '"',      #   double quote
+    'sol'       =>      '/',
+    'verbar'    =>      '$|$',
 
     "Aacute"    =>      "\\'{A}",       #   capital A, acute accent
     "aacute"    =>      "\\'{a}",       #   small a, acute accent
@@ -675,7 +677,7 @@ pushed onto this stack. When the list context ends, it
 is popped from the stack. The array will be empty if no
 lists are active.
 
-Returns array of list information in array context
+Returns array of list information in list context
 Returns array ref in scalar context
 
 =cut
@@ -952,6 +954,9 @@ sub verbatim {
     # Clean trailing space
     $paragraph =~ s/\s+$//;
 
+    # Clean tabs
+    $paragraph =~ s/\t/        /g;
+
     $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n");
   }
 }
@@ -1248,7 +1253,7 @@ sub add_item {
     $paragraph =~ s/^\s+//;
 
     my $type;
-    if ($paragraph eq '*') {
+    if (substr($paragraph, 0,1) eq '*') {
       $type = 'itemize';
     } elsif ($paragraph =~ /^\d/) {
       $type = 'enumerate';
@@ -1264,10 +1269,21 @@ sub add_item {
   my $type = $self->lists->[-1]->type;
 
   if ($type eq 'description') {
+    # Handle long items - long items do not wrap
+    if (length($paragraph) < 40) {
+      # A real description list item
+      $self->_output("\\item[$paragraph] \\mbox{}");
+    } else {
+      # The item is now simply bold text
+      $self->_output(qq{\\item \\textbf{$paragraph}});
+    }
 
-    $self->_output("\\item[$paragraph] \\mbox{}");
   } else {
-    $self->_output('\item ');
+    # If the item was '* Something' we still need to write
+    # out the something
+    my $extra_info = $paragraph;
+    $extra_info =~ s/^\*\s*//;
+    $self->_output("\\item $extra_info");
   }
 
   # Store the item name in the object. Required so that 
@@ -1392,6 +1408,8 @@ Special characters and the C<latex> equivalents are:
   &     \&
   \     $\backslash$
   ^     \^{}
+  ~     \~{}
+  |     $|$
 
 =cut
 
@@ -1412,6 +1430,12 @@ sub _replace_special_chars {
   # Replace ^ characters with \^{} so that $^F works okay
   $paragraph =~ s/(\^)/\\$1\{\}/g;
 
+  # Replace tilde (~) with \texttt{\~{}}
+  $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g;
+
+  # Replace | with $|$
+  $paragraph =~ s'\|'$|$'g;
+
   # Now add the dollars around each \backslash
   $paragraph =~ s/(\\backslash)/\$$1\$/g;
 
@@ -1560,7 +1584,7 @@ under the same terms as Perl itself.
 
 =head1 REVISION
 
-$Id: LaTeX.pm,v 1.4 2000/05/16 01:26:55 timj Exp $
+$Id: LaTeX.pm,v 1.6 2000/08/21 09:05:03 timj Exp $
 
 =end __PRIVATE__
 
index 439b22c..0fdb6d0 100644 (file)
@@ -1,5 +1,5 @@
 # Pod::Man -- Convert POD data to formatted *roff input.
-# $Id: Man.pm,v 1.4 2000/04/26 04:03:41 eagle Exp $
+# $Id: Man.pm,v 1.8 2000/10/10 02:14:31 eagle Exp $
 #
 # Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
 #
@@ -38,7 +38,7 @@ use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
 # Perl core and too many things could munge CVS magic revision strings.
 # This number should ideally be the same as the CVS revision in podlators,
 # however.
-$VERSION = 1.04;
+$VERSION = 1.08;
 
 
 ############################################################################
@@ -47,8 +47,10 @@ $VERSION = 1.04;
 
 # The following is the static preamble which starts all *roff output we
 # generate.  It's completely static except for the font to use as a
-# fixed-width font, which is designed by @CFONT@.  $PREAMBLE should
-# therefore be run through s/\@CFONT\@/<font>/g before output.
+# fixed-width font, which is designed by @CFONT@, and the left and right
+# quotes to use for C<> text, designated by @LQOUTE@ and @RQUOTE@.
+# $PREAMBLE should therefore be run through s/\@CFONT\@/<font>/g before
+# output.
 $PREAMBLE = <<'----END OF PREAMBLE----';
 .de Sh \" Subsection heading
 .br
@@ -93,8 +95,8 @@ $PREAMBLE = <<'----END OF PREAMBLE----';
 .    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
 .    ds L" ""
 .    ds R" ""
-.    ds C` `
-.    ds C' '
+.    ds C` @LQUOTE@
+.    ds C' @RQUOTE@
 'br\}
 .el\{\
 .    ds -- \|\(em\|
@@ -183,7 +185,8 @@ $PREAMBLE = <<'----END OF PREAMBLE----';
 .\}
 .rm #[ #] #H #V #F C
 ----END OF PREAMBLE----
-                                   
+#`# for cperl-mode
+
 # This table is taken nearly verbatim from Tom Christiansen's pod2man.  It
 # assumes that the standard preamble has already been printed, since that's
 # what defines all of the accent marks.  Note that some of these are quoted
@@ -194,7 +197,7 @@ $PREAMBLE = <<'----END OF PREAMBLE----';
     'lt'        =>    '<',      # left chevron, less-than
     'gt'        =>    '>',      # right chevron, greater-than
     'quot'      =>    '"',      # double quote
-    'sol'       =>    '/',      # solidus
+    'sol'       =>    '/',      # solidus (forward slash)
     'verbar'    =>    '|',      # vertical bar
 
     'Aacute'    =>    "A\\*'",  # capital A, acute accent
@@ -275,7 +278,7 @@ sub protect {
     s/^([.\'\\])/\\&$1/mg;
     $_;
 }
-                    
+
 # Given a command and a single argument that may or may not contain double
 # quotes, handle double-quote formatting for it.  If there are no double
 # quotes, just return the command followed by the argument in double quotes.
@@ -306,7 +309,7 @@ sub switchquotes {
 # Translate a font string into an escape.
 sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] }
 
-                    
+
 ############################################################################
 # Initialization
 ############################################################################
@@ -325,7 +328,8 @@ sub initialize {
     for (qw/fixed fixedbold fixeditalic fixedbolditalic/) {
         if (defined $$self{$_}) {
             if (length ($$self{$_}) < 1 || length ($$self{$_}) > 2) {
-                croak "roff font should be 1 or 2 chars, not `$$self{$_}'";
+                croak qq(roff font should be 1 or 2 chars,)
+                    . qq( not "$$self{$_}");
             }
         } else {
             $$self{$_} = '';
@@ -370,16 +374,35 @@ sub initialize {
         $$self{$_} =~ s/\"/\"\"/g if $$self{$_};
     }
 
+    # Figure out what quotes we'll be using for C<> text.
+    $$self{quotes} ||= '"';
+    if ($$self{quotes} eq 'none') {
+        $$self{LQUOTE} = $$self{RQUOTE} = '';
+    } elsif (length ($$self{quotes}) == 1) {
+        $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
+    } elsif ($$self{quotes} =~ /^(.)(.)$/
+             || $$self{quotes} =~ /^(..)(..)$/) {
+        $$self{LQUOTE} = $1;
+        $$self{RQUOTE} = $2;
+    } else {
+        croak qq(Invalid quote specification "$$self{quotes}");
+    }
+
+    # Double the first quote; note that this should not be s///g as two
+    # double quotes is represented in *roff as three double quotes, not
+    # four.  Weird, I know.
+    $$self{LQUOTE} =~ s/\"/\"\"/;
+    $$self{RQUOTE} =~ s/\"/\"\"/;
+
     $$self{INDENT}  = 0;        # Current indentation level.
     $$self{INDENTS} = [];       # Stack of indentations.
     $$self{INDEX}   = [];       # Index keys waiting to be printed.
+    $$self{ITEMS}   = 0;        # The number of consecutive =items.
 
     $self->SUPER::initialize;
 }
 
-# For each document we process, output the preamble first.  Note that the
-# fixed width font is a global default; once we interpolate it into the
-# PREAMBLE, it ain't ever changing.  Maybe fix this later.
+# For each document we process, output the preamble first.
 sub begin_pod {
     my $self = shift;
 
@@ -425,15 +448,18 @@ sub begin_pod {
     }
 
     # Now, print out the preamble and the title.
-    $PREAMBLE =~ s/\@CFONT\@/$$self{fixed}/;
-    chomp $PREAMBLE;
+    local $_ = $PREAMBLE;
+    s/\@CFONT\@/$$self{fixed}/;
+    s/\@LQUOTE\@/$$self{LQUOTE}/;
+    s/\@RQUOTE\@/$$self{RQUOTE}/;
+    chomp $_;
     print { $self->output_handle } <<"----END OF HEADER----";
 .\\" Automatically generated by Pod::Man version $VERSION
 .\\" @{[ scalar localtime ]}
 .\\"
 .\\" Standard preamble:
 .\\" ======================================================================
-$PREAMBLE
+$_
 .\\" ======================================================================
 .\\"
 .IX Title "$name $section"
@@ -460,9 +486,19 @@ sub command {
     my $self = shift;
     my $command = shift;
     return if $command eq 'pod';
-    return if ($$self{EXCLUDE} && $command ne 'end');
-    $command = 'cmd_' . $command;
-    $self->$command (@_);
+   return if ($$self{EXCLUDE} && $command ne 'end');
+    if ($self->can ('cmd_' . $command)) {
+        $command = 'cmd_' . $command;
+        $self->$command (@_);
+     } else {
+        my ($text, $line, $paragraph) = @_;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
+        $text =~ s/\n+\z//;
+        $text = " $text" if ($text =~ /^\S/);
+        warn qq($file:$line: Unknown command paragraph "=$command$text"\n);
+        return;
+    }
 }
 
 # Called for a verbatim paragraph.  Gets the paragraph, the line number, and
@@ -479,7 +515,7 @@ sub verbatim {
     1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
     s/\\/\\e/g;
     s/^(\s*\S)/'\&' . $1/gme;
-    $self->makespace if $$self{NEEDSPACE};
+    $self->makespace;
     $self->output (".Vb $lines\n$_.Ve\n");
     $$self{NEEDSPACE} = 0;
 }
@@ -505,7 +541,7 @@ sub textblock {
           >
           (
               ,?\s+(and\s+)?    # Allow lots of them, conjuncted.
-              L<  
+              L<
                   /
                   ( [:\w]+ ( \(\) )? )
               >
@@ -531,7 +567,7 @@ sub textblock {
     # scalars as well as scalars and does the right thing with them.
     $text = $self->parse ($text, @_);
     $text =~ s/\n\s*$/\n/;
-    $self->makespace if $$self{NEEDSPACE};
+    $self->makespace;
     $self->output (protect $self->mapfonts ($text));
     $self->outindex;
     $$self{NEEDSPACE} = 1;
@@ -591,7 +627,7 @@ sub sequence {
         my $tmp = $self->buildlink ($_);
         return bless \ "$tmp", 'Pod::Man::String';
     }
-                         
+
     # Whitespace protection replaces whitespace with "\ ".
     if ($command eq 'S') {
         s/\s+/\\ /g;
@@ -621,6 +657,10 @@ sub cmd_head1 {
     local $_ = $self->parse (@_);
     s/\s+$//;
     s/\\s-?\d//g;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
     $self->output (switchquotes ('.SH', $self->mapfonts ($_)));
     $self->outindex (($_ eq 'NAME') ? () : ('Header', $_));
     $$self{NEEDSPACE} = 0;
@@ -631,6 +671,10 @@ sub cmd_head2 {
     my $self = shift;
     local $_ = $self->parse (@_);
     s/\s+$//;
+    if ($$self{ITEMS} > 1) {
+        $$self{ITEMS} = 0;
+        $self->output (".PD\n");
+    }
     $self->output (switchquotes ('.Sh', $self->mapfonts ($_)));
     $self->outindex ('Subsection', $_);
     $$self{NEEDSPACE} = 0;
@@ -685,7 +729,7 @@ sub cmd_item {
     my $index;
     if (/\w/ && !/^\w[.\)]\s*$/) {
         $index = $_;
-        $index =~ s/^\s*[-*+o.]?\s*//;
+        $index =~ s/^\s*[-*+o.]?(?:\s+|\Z)//;
     }
     s/^\*(\s|\Z)/\\\(bu$1/;
     if ($$self{WEIRDINDENT}) {
@@ -693,9 +737,11 @@ sub cmd_item {
         $$self{WEIRDINDENT} = 0;
     }
     $_ = $self->mapfonts ($_);
+    $self->output (".PD 0\n") if ($$self{ITEMS} == 1);
     $self->output (switchquotes ('.Ip', $_, $$self{INDENT}));
     $self->outindex ($index ? ('Item', $index) : ());
     $$self{NEEDSPACE} = 0;
+    $$self{ITEMS}++;
 }
 
 # Begin a block for a particular translator.  Setting VERBATIM triggers
@@ -828,7 +874,7 @@ sub parse {
     $self->parse_text ({ -expand_seq   => 'sequence',
                          -expand_ptree => 'collapse' }, @_);
 }
-    
+
 # Takes a parse tree and a flag saying whether or not to treat it as literal
 # text (not call guesswork on it), and returns the concatenation of all of
 # the text strings in that parse tree.  If the literal flag isn't true,
@@ -942,7 +988,10 @@ sub guesswork {
 # Make vertical whitespace.
 sub makespace {
     my $self = shift;
-    $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n");
+    $self->output (".PD\n") if ($$self{ITEMS} > 1);
+    $$self{ITEMS} = 0;
+    $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n")
+        if $$self{NEEDSPACE};
 }
 
 # Output any pending index entries, and optionally an index entry given as
@@ -1103,6 +1152,18 @@ Pod::Man doesn't assume you have this, and defaults to CB.  Some systems
 (such as Solaris) have this font available as CX.  Only matters for troff(1)
 output.
 
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text (but the font is still changed for troff
+output).
+
 =item release
 
 Set the centered footer.  By default, this is the version of Perl you run
@@ -1139,7 +1200,7 @@ details.
 
 =over 4
 
-=item roff font should be 1 or 2 chars, not `%s'
+=item roff font should be 1 or 2 chars, not "%s"
 
 (F) You specified a *roff font (using C<fixed>, C<fixedbold>, etc.) that
 wasn't either one or two characters.  Pod::Man doesn't support *roff fonts
@@ -1152,6 +1213,16 @@ versions of nroff(1) and troff(1) don't either).
 unable to parse.  You should never see this error message; it probably
 indicates a bug in Pod::Man.
 
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid.  A quote specification must be one, two, or four characters long.
+
+=item %s:%d: Unknown command paragraph "%s".
+
+(W) The POD source contained a non-standard command paragraph (something of
+the form C<=command args>) that Pod::Man didn't know about.  It was ignored.
+
 =item Unknown escape EE<lt>%sE<gt>
 
 (W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Man didn't
@@ -1162,6 +1233,11 @@ know about.  C<EE<lt>%sE<gt>> was printed verbatim in the output.
 (W) The POD source contained a non-standard interior sequence (something of
 the form C<XE<lt>E<gt>>) that Pod::Man didn't know about.  It was ignored.
 
+=item %s: Unknown command paragraph "%s" on line %d.
+
+(W) The POD source contained a non-standard command paragraph (something of
+the form C<=command args>) that Pod::Man didn't know about. It was ignored.
+
 =item Unmatched =back
 
 (W) Pod::Man encountered a C<=back> command that didn't correspond to an
index 2cb8cdc..6703a7f 100644 (file)
@@ -10,7 +10,7 @@
 package Pod::ParseUtils;
 
 use vars qw($VERSION);
-$VERSION = 0.2;    ## Current version of this package
+$VERSION = 0.22;   ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 =head1 NAME
@@ -49,7 +49,7 @@ The following methods are available:
 
 =over 4
 
-=item new()
+=item Pod::List-E<gt>new()
 
 Create a new list object. Properties may be specified through a hash
 reference like this:
@@ -79,7 +79,7 @@ sub initialize {
     $self->{-type} ||= '';
 }
 
-=item file()
+=item $list-E<gt>file()
 
 Without argument, retrieves the file name the list is in. This must
 have been set before by either specifying B<-file> in the B<new()>
@@ -92,7 +92,7 @@ sub file {
    return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
 }
 
-=item start()
+=item $list-E<gt>start()
 
 Without argument, retrieves the line number where the list started.
 This must have been set before by either specifying B<-start> in the
@@ -106,7 +106,7 @@ sub start {
    return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};
 }
 
-=item indent()
+=item $list-E<gt>indent()
 
 Without argument, retrieves the indent level of the list as specified
 in C<=over n>. This must have been set before by either specifying
@@ -120,7 +120,7 @@ sub indent {
    return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};
 }
 
-=item type()
+=item $list-E<gt>type()
 
 Without argument, retrieves the list type, which can be an arbitrary value,
 e.g. C<OL>, C<UL>, ... when thinking the HTML way.
@@ -135,7 +135,7 @@ sub type {
    return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
 }
 
-=item rx()
+=item $list-E<gt>rx()
 
 Without argument, retrieves a regular expression for simplifying the 
 individual item strings once the list type has been determined. Usage:
@@ -152,7 +152,7 @@ sub rx {
    return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};
 }
 
-=item item()
+=item $list-E<gt>item()
 
 Without argument, retrieves the array of the items in this list.
 The items may be represented by any scalar.
@@ -172,7 +172,7 @@ sub item {
     }
 }
 
-=item parent()
+=item $list-E<gt>parent()
 
 Without argument, retrieves information about the parent holding this
 list, which is represented as an arbitrary scalar.
@@ -188,7 +188,7 @@ sub parent {
    return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};
 }
 
-=item tag()
+=item $list-E<gt>tag()
 
 Without argument, retrieves information about the list tag, which can be
 any scalar.
@@ -227,7 +227,7 @@ used to construct hyperlinks.
 
 =over 4
 
-=item new()
+=item Pod::Hyperlink-E<gt>new()
 
 The B<new()> method can either be passed a set of key/value pairs or a single
 scalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An object
@@ -269,10 +269,14 @@ sub initialize {
     $self->{_warnings} = [];
 }
 
-=item parse($string)
+=item $link-E<gt>parse($string)
 
 This method can be used to (re)parse a (new) hyperlink, i.e. the contents
 of a C<LE<lt>...E<gt>> sequence. The result is stored in the current object.
+Warnings are stored in the B<warnings> property.
+E.g. sections like C<LE<lt>open(2)E<gt>> are deprected, as they do not point
+to Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpage
+section can simply be dropped.
 
 =cut
 
@@ -280,7 +284,7 @@ sub parse {
     my $self = shift;
     local($_) = $_[0];
     # syntax check the link and extract destination
-    my ($alttext,$page,$node,$type) = ('','','','');
+    my ($alttext,$page,$node,$type) = (undef,'','','');
 
     $self->{_warnings} = [];
 
@@ -308,25 +312,24 @@ sub parse {
     # problem: a lot of people use (), or (1) or the like to indicate
     # man page sections. But this collides with L<func()> that is supposed
     # to point to an internal funtion...
-    # I would like the following better, here and below:
-    #if(m!^(\w+(?:::\w+)*)$!) {
-    my $page_rx = '[\w.]+(?:::[\w.]+)*';
+    my $page_rx = '[\w.]+(?:::[\w.]+)*(?:[(](?:\d\w*|)[)]|)';
+    # page name only
     if(m!^($page_rx)$!o) {
         $page = $1;
         $type = 'page';
     }
     # alttext, page and "section"
-    elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$!o) {
         ($alttext, $page, $node) = ($1, $2, $3);
         $type = 'section';
     }
     # alttext and page
-    elsif(m!^(.+?)\s*[|]\s*($page_rx)$!o) {
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)$!o) {
         ($alttext, $page) = ($1, $2);
         $type = 'page';
     }
     # alttext and "section"
-    elsif(m!^(.+?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
+    elsif(m!^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$!) {
         ($alttext, $node) = ($1,$2);
         $type = 'section';
     }
@@ -356,16 +359,16 @@ sub parse {
         $type = 'hyperlink';
     }
     # alttext, page and item
-    elsif(m!^(.+?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
+    elsif(m!^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$!o) {
         ($alttext, $page, $node) = ($1, $2, $3);
         $type = 'item';
     }
     # alttext and item
-    elsif(m!^(.+?)\s*[|]\s*/(.+)$!) {
+    elsif(m!^(.*?)\s*[|]\s*/(.+)$!) {
         ($alttext, $node) = ($1,$2);
     }
     # nonstandard: alttext and hyperlink
-    elsif(m!^(.+?)\s*[|]\s*((?:http|ftp|mailto|news):.+)$!) {
+    elsif(m!^(.*?)\s*[|]\s*((?:http|ftp|mailto|news):.+)$!) {
         ($alttext, $node) = ($1,$2);
         $type = 'hyperlink';
     }
@@ -377,9 +380,19 @@ sub parse {
     # collapse whitespace in nodes
     $node =~ s/\s+/ /gs;
 
-    #if($page =~ /[(]\w*[)]$/) {
-    #    $self->warning("section in '$page' deprecated");
-    #}
+    # empty alternative text expands to node name
+    if(defined $alttext) {
+        if(!length($alttext)) {
+          $alttext = $node | $page;
+        }
+    }
+    else {
+        $alttext = '';
+    }
+
+    if($page =~ /[(]\w*[)]$/) {
+        $self->warning("(section) in '$page' deprecated");
+    }
     if($node =~ m:[|/]:) {
         $self->warning("node '$node' contains non-escaped | or /");
     }
@@ -435,7 +448,7 @@ sub _construct_text {
     }
 }
 
-=item markup($string)
+=item $link-E<gt>markup($string)
 
 Set/retrieve the textual value of the link. This string contains special
 markers C<PE<lt>E<gt>> and C<QE<lt>E<gt>> that should be expanded by the
@@ -450,7 +463,7 @@ sub markup {
     return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup};
 }
 
-=item text()
+=item $link-E<gt>text()
 
 This method returns the textual representation of the hyperlink as above,
 but without markers (read only). Depending on the link type this is one of
@@ -469,7 +482,7 @@ sub text {
     $_[0]->{_text};
 }
 
-=item warning()
+=item $link-E<gt>warning()
 
 After parsing, this method returns any warnings encountered during the
 parsing process.
@@ -486,7 +499,9 @@ sub warning {
     return @{$self->{_warnings}};
 }
 
-=item line(), file()
+=item $link-E<gt>file()
+
+=item $link-E<gt>line()
 
 Just simple slots for storing information about the line and the file
 the link was encountered in. Has to be filled in manually.
@@ -503,7 +518,7 @@ sub file {
     return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
 }
 
-=item page()
+=item $link-E<gt>page()
 
 This method sets or returns the POD page this link points to.
 
@@ -518,7 +533,7 @@ sub page {
     $_[0]->{-page};
 }
 
-=item node()
+=item $link-E<gt>node()
 
 As above, but the destination node text of the link.
 
@@ -533,7 +548,7 @@ sub node {
     $_[0]->{-node};
 }
 
-=item alttext()
+=item $link-E<gt>alttext()
 
 Sets or returns an alternative text specified in the link.
 
@@ -548,7 +563,7 @@ sub alttext {
     $_[0]->{-alttext};
 }
 
-=item type()
+=item $link-E<gt>type()
 
 The node type, either C<section> or C<item>. As an unofficial type,
 there is also C<hyperlink>, derived from e.g. C<LE<lt>http://perl.comE<gt>>
@@ -560,7 +575,7 @@ sub type {
     return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
 }
 
-=item link()
+=item $link-E<gt>link()
 
 Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>.
 
@@ -620,7 +635,7 @@ The following methods are available:
 
 =over 4
 
-=item new()
+=item Pod::Cache-E<gt>new()
 
 Create a new cache object. This object can hold an arbitrary number of
 POD documents of class Pod::Cache::Item.
@@ -635,7 +650,7 @@ sub new {
     return $self;
 }
 
-=item item()
+=item $cache-E<gt>item()
 
 Add a new item to the cache. Without arguments, this method returns a
 list of all cache elements.
@@ -654,7 +669,7 @@ sub item {
     }
 }
 
-=item find_page($name)
+=item $cache-E<gt>find_page($name)
 
 Look for a POD document named C<$name> in the cache. Returns the
 reference to the corresponding Pod::Cache::Item object or undef if
@@ -686,7 +701,7 @@ The following methods are available:
 
 =over 4
 
-=item new()
+=item Pod::Cache::Item-E<gt>new()
 
 Create a new object.
 
@@ -707,7 +722,7 @@ sub initialize {
     $self->{-nodes} = [] unless(defined $self->{-nodes});
 }
 
-=item page()
+=item $cacheitem-E<gt>page()
 
 Set/retrieve the POD document name (e.g. "Pod::Parser").
 
@@ -718,7 +733,7 @@ sub page {
    return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page};
 }
 
-=item description()
+=item $cacheitem-E<gt>description()
 
 Set/retrieve the POD short description as found in the C<=head1 NAME>
 section.
@@ -730,7 +745,7 @@ sub description {
    return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description};
 }
 
-=item path()
+=item $cacheitem-E<gt>path()
 
 Set/retrieve the POD file storage path.
 
@@ -741,7 +756,7 @@ sub path {
    return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path};
 }
 
-=item file()
+=item $cacheitem-E<gt>file()
 
 Set/retrieve the POD file name.
 
@@ -752,7 +767,7 @@ sub file {
    return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
 }
 
-=item nodes()
+=item $cacheitem-E<gt>nodes()
 
 Add a node (or a list of nodes) to the document's node list. Note that
 the order is kept, i.e. start with the first node and end with the last.
@@ -775,14 +790,12 @@ sub nodes {
     }
 }
 
-=item find_node($name)
+=item $cacheitem-E<gt>find_node($name)
 
 Look for a node or index entry named C<$name> in the object.
 Returns the unique id of the node (i.e. the second element of the array
 stored in the node arry) or undef if not found.
 
-=back
-
 =cut
 
 sub find_node {
@@ -798,7 +811,7 @@ sub find_node {
     undef;
 }
 
-=item idx()
+=item $cacheitem-E<gt>idx()
 
 Add an index entry (or a list of them) to the document's index list. Note that
 the order is kept, i.e. start with the first node and end with the last.
@@ -807,6 +820,8 @@ same order the entries have been added.
 An index entry can be any scalar, but usually is a pair of string and
 unique id.
 
+=back
+
 =cut
 
 # The POD index entries
index 48fc198..6782519 100644 (file)
@@ -10,7 +10,7 @@
 package Pod::Parser;
 
 use vars qw($VERSION);
-$VERSION = 1.12;  ## Current version of this package
+$VERSION = 1.13;  ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 #############################################################################
@@ -205,7 +205,6 @@ use strict;
 use Pod::InputObjects;
 use Carp;
 use Exporter;
-require VMS::Filespec if $^O eq 'VMS';
 BEGIN {
    if ($] < 5.6) {
       require Symbol;
@@ -783,11 +782,11 @@ sub parse_text {
     ## Iterate over all sequence starts text (NOTE: split with
     ## capturing parens keeps the delimiters)
     $_ = $text;
-    my @tokens = split /([A-Z]<(?:<+\s+)?)/;
+    my @tokens = split /([A-Z]<(?:<+\s)?)/;
     while ( @tokens ) {
         $_ = shift @tokens;
         ## Look for the beginning of a sequence
-        if ( /^([A-Z])(<(?:<+\s+)?)$/ ) {
+        if ( /^([A-Z])(<(?:<+\s)?)$/ ) {
             ## Push a new sequence onto the stack of those "in-progress"
             ($cmd, $ldelim) = ($1, $2);
             $seq = Pod::InteriorSequence->new(
@@ -848,7 +847,6 @@ sub parse_text {
     my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef;
     while (@seq_stack > 1) {
        ($cmd, $file, $line) = ($seq->name, $seq->file_line);
-       $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
        $ldelim  = $seq->ldelim;
        ($rdelim = $ldelim) =~ tr/</>/;
        $rdelim  =~ s/^(\S+)(\s*)$/$2$1/;
@@ -1081,10 +1079,9 @@ sub parse_from_filehandle {
                                      && (length $paragraph));
 
         ## Issue a warning about any non-empty blank lines
-        if (length($1) > 1 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) {
+        if (length($1) > 0 and $myOpts{'-warnings'} and ! $myData{_CUTTING}) {
             my $errorsub = $self->errorsub();
             my $file = $self->input_file();
-            $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
             my $errmsg = "*** WARNING: line containing nothing but whitespace".
                          " in paragraph at line $nlines in file $file\n";
             (ref $errorsub) and &{$errorsub}($errmsg)
index 5dd1595..d86d823 100644 (file)
@@ -10,7 +10,7 @@
 package Pod::Select;
 
 use vars qw($VERSION);
-$VERSION = 1.12;  ## Current version of this package
+$VERSION = 1.13;  ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 #############################################################################
@@ -92,7 +92,7 @@ The formal syntax of a section specification is:
 
 =over 4
 
-=item
+=item *
 
 I<head1-title-regex>/I<head2-title-regex>/...
 
@@ -160,7 +160,7 @@ The formal syntax of a range specification is:
 
 =over 4
 
-=item
+=item *
 
 /I<start-range-regex>/[../I<end-range-regex>/]
 
index 47dcee5..5a7bab8 100644 (file)
@@ -1,5 +1,5 @@
 # Pod::Text -- Convert POD data to formatted ASCII text.
-# $Id: Text.pm,v 2.4 2000/03/17 00:17:08 eagle Exp $
+# $Id: Text.pm,v 2.6 2000/10/10 02:13:17 eagle Exp $
 #
 # Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
 #
@@ -37,7 +37,7 @@ use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
 # Perl core and too many things could munge CVS magic revision strings.
 # This number should ideally be the same as the CVS revision in podlators,
 # however.
-$VERSION = 2.04;
+$VERSION = 2.06;
 
 
 ############################################################################
@@ -53,9 +53,9 @@ $VERSION = 2.04;
     'lt'        =>    '<',      # left chevron, less-than
     'gt'        =>    '>',      # right chevron, greater-than
     'quot'      =>    '"',      # double quote
-    'sol'       =>    '/',      # solidus
+    'sol'       =>    '/',      # solidus (forward slash)
     'verbar'    =>    '|',      # vertical bar
-                                 
+
     "Aacute"    =>    "\xC1",   # capital A, acute accent
     "aacute"    =>    "\xE1",   # small a, acute accent
     "Acirc"     =>    "\xC2",   # capital A, circumflex accent
@@ -82,8 +82,8 @@ $VERSION = 2.04;
     "eth"       =>    "\xF0",   # small eth, Icelandic
     "Euml"      =>    "\xCB",   # capital E, dieresis or umlaut mark
     "euml"      =>    "\xEB",   # small e, dieresis or umlaut mark
-    "Iacute"    =>    "\xCD",   # capital I, acute accent
-    "iacute"    =>    "\xED",   # small i, acute accent
+    "Iacute"    =>    "\xCC",   # capital I, acute accent
+    "iacute"    =>    "\xEC",   # small i, acute accent
     "Icirc"     =>    "\xCE",   # capital I, circumflex accent
     "icirc"     =>    "\xEE",   # small i, circumflex accent
     "Igrave"    =>    "\xCD",   # capital I, grave accent
@@ -118,7 +118,7 @@ $VERSION = 2.04;
     "Yacute"    =>    "\xDD",   # capital Y, acute accent
     "yacute"    =>    "\xFD",   # small y, acute accent
     "yuml"      =>    "\xFF",   # small y, dieresis or umlaut mark
-                                  
+
     "laquo"     =>    "\xAB",   # left pointing double angle quotation mark
     "lchevron"  =>    "\xAB",   #  synonym (backwards compatibility)
     "raquo"     =>    "\xBB",   # right pointing double angle quotation mark
@@ -172,6 +172,20 @@ sub initialize {
     $$self{sentence} = 0  unless defined $$self{sentence};
     $$self{width}    = 76 unless defined $$self{width};
 
+    # Figure out what quotes we'll be using for C<> text.
+    $$self{quotes} ||= "'";
+    if ($$self{quotes} eq 'none') {
+        $$self{LQUOTE} = $$self{RQUOTE} = '';
+    } elsif (length ($$self{quotes}) == 1) {
+        $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
+    } elsif ($$self{quotes} =~ /^(.)(.)$/
+             || $$self{quotes} =~ /^(..)(..)$/) {
+        $$self{LQUOTE} = $1;
+        $$self{RQUOTE} = $2;
+    } else {
+        croak qq(Invalid quote specification "$$self{quotes}");
+    }
+
     $$self{INDENTS}  = [];              # Stack of indentations.
     $$self{MARGIN}   = $$self{indent};  # Current left margin in spaces.
 
@@ -193,8 +207,18 @@ sub command {
     return if $command eq 'pod';
     return if ($$self{EXCLUDE} && $command ne 'end');
     $self->item ("\n") if defined $$self{ITEM};
-    $command = 'cmd_' . $command;
-    $self->$command (@_);
+    if ($self->can ('cmd_' . $command)) {
+        $command = 'cmd_' . $command;
+        $self->$command (@_);
+    } else {
+        my ($text, $line, $paragraph) = @_;
+        my $file;
+        ($file, $line) = $paragraph->file_line;
+        $text =~ s/\n+\z//;
+        $text = " $text" if ($text =~ /^\S/);
+        warn qq($file:$line: Unknown command paragraph "=$command$text"\n);
+        return;
+    }
 }
 
 # Called for a verbatim paragraph.  Gets the paragraph, the line number, and
@@ -234,7 +258,7 @@ sub textblock {
           >
           (
               ,?\s+(and\s+)?    # Allow lots of them, conjuncted.
-              L<  
+              L<
                   /
                   (
                       [:\w]+
@@ -399,7 +423,7 @@ sub cmd_end {
     my $self = shift;
     $$self{EXCLUDE} = 0;
     $$self{VERBATIM} = 0;
-}    
+}
 
 # One paragraph for a particular translator.  Ignore it unless it's intended
 # for text, in which case we treat it as a verbatim text block.
@@ -419,9 +443,11 @@ sub cmd_for {
 # The simple formatting ones.  These are here mostly so that subclasses can
 # override them and do more complicated things.
 sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
-sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
 sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
 sub seq_i { return '*' . $_[1] . '*' }
+sub seq_c {
+    return $_[0]{alt} ? "``$_[1]''" : "$_[0]{LQUOTE}$_[1]$_[0]{RQUOTE}"
+}
 
 # The complicated one.  Handle links.  Since this is plain text, we can't
 # actually make any real links, so this is all to figure out what text we
@@ -592,13 +618,14 @@ sub pod2text {
     # means we need to turn the first argument into a file handle.  Magic
     # open will handle the <&STDIN case automagically.
     if (defined $_[1]) {
+        my @fhs = @_;
         local *IN;
-        unless (open (IN, $_[0])) {
-            croak ("Can't open $_[0] for reading: $!\n");
+        unless (open (IN, $fhs[0])) {
+            croak ("Can't open $fhs[0] for reading: $!\n");
             return;
         }
-        $_[0] = \*IN;
-        return $parser->parse_from_filehandle (@_);
+        $fhs[0] = \*IN;
+        return $parser->parse_from_filehandle (@fhs);
     } else {
         return $parser->parse_from_file (@_);
     }
@@ -664,6 +691,17 @@ it's the expected formatting for manual pages; if you're formatting
 arbitrary text documents, setting this to true may result in more pleasing
 output.
 
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text.  If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text.
+
 =item sentence
 
 If set to a true value, Pod::Text will assume that each sentence ends in two
@@ -699,6 +737,16 @@ indicates a bug in Pod::Text; you should never see it.
 (F) Pod::Text was invoked via the compatibility mode pod2text() interface
 and the input file it was given could not be opened.
 
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid.  A quote specification must be one, two, or four characters long.
+
+=item %s:%d: Unknown command paragraph "%s".
+
+(W) The POD source contained a non-standard command paragraph (something of
+the form C<=command args>) that Pod::Man didn't know about.  It was ignored.
+
 =item Unknown escape: %s
 
 (W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::Text didn't
index 571588e..3886076 100644 (file)
@@ -10,7 +10,7 @@
 package Pod::Usage;
 
 use vars qw($VERSION);
-$VERSION = 1.12;  ## Current version of this package
+$VERSION = 1.14;  ## Current version of this package
 require  5.005;    ## requires this Perl version or later
 
 =head1 NAME
@@ -46,7 +46,7 @@ B<pod2usage> should be given either a single argument, or a list of
 arguments corresponding to an associative array (a "hash"). When a single
 argument is given, it should correspond to exactly one of the following:
 
-=over
+=over 4
 
 =item *
 
@@ -68,7 +68,7 @@ assumed to be a hash.  If a hash is supplied (either as a reference or
 as a list) it should contain one or more elements with the following
 keys:
 
-=over
+=over 4
 
 =item C<-message>
 
@@ -80,6 +80,9 @@ program's usage message.
 =item C<-exitval>
 
 The desired exit status to pass to the B<exit()> function.
+This should be an integer, or else the string "NOEXIT" to
+indicate that control should simply be returned without
+terminating the invoking process.
 
 =item C<-verbose>
 
@@ -129,7 +132,7 @@ Unless they are explicitly specified, the default values for the exit
 status, verbose level, and output stream to use are determined as
 follows:
 
-=over
+=over 4
 
 =item *
 
@@ -159,7 +162,7 @@ Although the above may seem a bit confusing at first, it generally does
 "the right thing" in most situations.  This determination of the default
 values to use is based upon the following typical Unix conventions:
 
-=over
+=over 4
 
 =item *
 
@@ -211,7 +214,7 @@ convenient to use as an innocent looking error message handling function:
     ## Check for too many filenames
     pod2usage("$0: Too many files given.\n")  if (@ARGV > 1);
 
-Some users however may feel that the above "economy of expression" is
+Some user's however may feel that the above "economy of expression" is
 not particularly readable nor consistent and may instead choose to do
 something more like the following:
 
@@ -395,6 +398,7 @@ with re-writing this manpage.
 use strict;
 #use diagnostics;
 use Carp;
+use Config;
 use Exporter;
 use File::Spec;
 
@@ -497,8 +501,19 @@ sub pod2usage {
     }
 
     ## Now translate the pod document and then exit with the desired status
-    $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
-    exit($opts{"-exitval"});
+    if ( $opts{"-verbose"} >= 2 
+             and  !ref($opts{"-input"})
+             and  $opts{"-output"} == \*STDOUT )
+    {
+       ## spit out the entire PODs. Might as well invoke perldoc
+       my $progpath = File::Spec->catfile($Config{bin}, "perldoc");
+       system($progpath, $opts{"-input"});
+    }
+    else {
+       $parser->parse_from_file($opts{"-input"}, $opts{"-output"});
+    }
+
+    exit($opts{"-exitval"})  unless (lc($opts{"-exitval"}) eq 'noexit');
 }
 
 ##---------------------------------------------------------------------------
index 62aa829..c2f522c 100644 (file)
@@ -1,8 +1,13 @@
 package Shell;
 use 5.005_64;
-our($capture_stderr, $VERSION);
+use strict;
+use warnings;
+our($capture_stderr, $VERSION, $AUTOLOAD);
 
-$VERSION = '0.2';
+$VERSION = '0.3';
+
+sub new { bless \$VERSION, shift } # Nothing better to bless
+sub DESTROY { }
 
 sub import {
     my $self = shift;
@@ -10,24 +15,24 @@ sub import {
     my @EXPORT;
     if (@_) {
        @EXPORT = @_;
-    }
-    else {
+    } else {
        @EXPORT = 'AUTOLOAD';
     }
-    foreach $sym (@EXPORT) {
+    foreach my $sym (@EXPORT) {
+        no strict 'refs';
         *{"${callpack}::$sym"} = \&{"Shell::$sym"};
     }
-};
+}
 
-AUTOLOAD {
+sub AUTOLOAD {
+    shift if ref $_[0] && $_[0]->isa( 'Shell' );
     my $cmd = $AUTOLOAD;
     $cmd =~ s/^.*:://;
     eval <<"*END*";
        sub $AUTOLOAD {
            if (\@_ < 1) {
                \$Shell::capture_stderr ? `$cmd 2>&1` : `$cmd`;
-           }
-           elsif ('$^O' eq 'os2') {
+           } elsif ('$^O' eq 'os2') {
                local(\*SAVEOUT, \*READ, \*WRITE);
 
                open SAVEOUT, '>&STDOUT' or die;
@@ -46,16 +51,14 @@ AUTOLOAD {
                    close READ;
                    waitpid \$pid, 0;
                    \@ret;
-               }
-               else {
+               } else {
                    local(\$/) = undef;
                    my \$ret = <READ>;
                    close READ;
                    waitpid \$pid, 0;
                    \$ret;
                }
-           }
-           else {
+           } else {
                my \$a;
                my \@arr = \@_;
                if ('$^O' eq 'MSWin32') {
@@ -74,11 +77,10 @@ AUTOLOAD {
                        s/\\\\\\\\"/\\\\\\\\"""/g;
                        \$_ = qq["\$_"] if /\\s/;
                    }
-               }
-               else {
+               } else {
                    for (\@arr) {
                        s/(['\\\\])/\\\\\$1/g;
-                       \$_ = "'\$_'";
+                       \$_ = \$_;
                    }
                }
                push \@arr, '2>&1' if \$Shell::capture_stderr;
@@ -88,8 +90,7 @@ AUTOLOAD {
                    my \@ret = <SUBPROC>;
                    close SUBPROC;      # XXX Oughta use a destructor.
                    \@ret;
-               }
-               else {
+               } else {
                    local(\$/) = undef;
                    my \$ret = <SUBPROC>;
                    close SUBPROC;
@@ -104,6 +105,7 @@ AUTOLOAD {
 }
 
 1;
+
 __END__
 
 =head1 NAME
@@ -155,10 +157,45 @@ The module now should work on Win32.
 
  Jenda
 
+There seemed to be a problem where all arguments to a shell command were
+quoted before being executed.  As in the following example:
+
+ cat('</etc/passwd');
+ ls('*.pl');
+
+really turned into:
+
+ cat '</etc/passwd'
+ ls '*.pl'
+
+instead of:
+
+  cat </etc/passwd
+  ls *.pl
+
+and of course, this is wrong.
+
+I have fixed this bug, it was brought up by Wolfgang Laun [ID 20000326.008]
+
+Casey
+
+=head2 OBJECT ORIENTED SYNTAX
+
+Shell now has an OO interface.  Good for namespace conservation 
+and shell representation.
+
+ use Shell;
+ my $sh = Shell->new;
+ print $sh->ls;
+
+Casey
+
 =head1 AUTHOR
 
 Larry Wall
 
 Changes by Jenda@Krynicky.cz and Dave Cottle <d.cottle@csc.canterbury.ac.nz>
 
+Changes and bug fixes by Casey Tweten <crt@kiski.net>
+
 =cut
index e7a2157..b61efcb 100644 (file)
@@ -1,11 +1,14 @@
 # Term::ANSIColor -- Color screen output using ANSI escape sequences.
-# $Id: ANSIColor.pm,v 1.1 1997/12/10 20:05:29 eagle Exp $
+# $Id: ANSIColor.pm,v 1.3 2000/08/06 18:28:10 eagle Exp $
 #
-# Copyright 1996, 1997 by Russ Allbery <rra@stanford.edu>
-#                     and Zenin <zenin@best.com>
+# Copyright 1996, 1997, 1998, 2000
+#   by Russ Allbery <rra@stanford.edu> and Zenin <zenin@best.com>
 #
 # This program is free software; you can redistribute it and/or modify it
 # under the same terms as Perl itself.
+#
+# Ah, September, when the sysadmins turn colors and fall off the trees....
+#                               -- Dave Van Domelen
 
 ############################################################################
 # Modules and declarations
@@ -27,8 +30,10 @@ use Exporter ();
                                  ON_GREEN ON_YELLOW ON_BLUE ON_MAGENTA
                                  ON_CYAN ON_WHITE)]);
 Exporter::export_ok_tags ('constants');
-    
-($VERSION = (split (' ', q$Revision: 1.1 $ ))[1]) =~ s/\.(\d)$/.0$1/;
+
+# Don't use the CVS revision as the version, since this module is also in
+# Perl core and too many things could munge CVS magic revision strings.
+$VERSION = 1.03;
 
 
 ############################################################################
@@ -38,6 +43,7 @@ Exporter::export_ok_tags ('constants');
 %attributes = ('clear'      => 0,
                'reset'      => 0,
                'bold'       => 1,
+               'dark'       => 2,
                'underline'  => 4,
                'underscore' => 4,
                'blink'      => 5,
@@ -92,7 +98,8 @@ sub AUTOLOAD {
         };
         goto &$AUTOLOAD;
     } else {
-        die "undefined subroutine &$AUTOLOAD called";
+        require Carp;
+        Carp::croak ("undefined subroutine &$AUTOLOAD called");
     }
 }
 
@@ -119,19 +126,28 @@ sub color {
 
 # Given a string and a set of attributes, returns the string surrounded by
 # escape codes to set those attributes and then clear them at the end of the
-# string.  If $EACHLINE is set, insert a reset before each occurrence of the
-# string $EACHLINE and the starting attribute code after the string
-# $EACHLINE, so that no attribute crosses line delimiters (this is often
-# desirable if the output is to be piped to a pager or some other program).
+# string.  The attributes can be given either as an array ref as the first
+# argument or as a list as the second and subsequent arguments.  If
+# $EACHLINE is set, insert a reset before each occurrence of the string
+# $EACHLINE and the starting attribute code after the string $EACHLINE, so
+# that no attribute crosses line delimiters (this is often desirable if the
+# output is to be piped to a pager or some other program).
 sub colored {
-    my $string = shift;
+    my ($string, @codes);
+    if (ref $_[0]) {
+        @codes = @{+shift};
+        $string = join ('', @_);
+    } else {
+        $string = shift;
+        @codes = @_;
+    }
     if (defined $EACHLINE) {
-        my $attr = color (@_);
+        my $attr = color (@codes);
         join '', 
             map { $_ && $_ ne $EACHLINE ? $attr . $_ . "\e[0m" : $_ }
                 split (/(\Q$EACHLINE\E)/, $string);
     } else {
-        color (@_) . $string . "\e[0m";
+        color (@codes) . $string . "\e[0m";
     }
 }
 
@@ -157,6 +173,7 @@ Term::ANSIColor - Color screen output using ANSI escape sequences
     print "This text is normal.\n";
     print colored ("Yellow on magenta.\n", 'yellow on_magenta');
     print "This text is normal.\n";
+    print colored ['yellow on_magenta'], "Yellow on magenta.\n";
 
     use Term::ANSIColor qw(:constants);
     print BOLD, BLUE, "This text is in bold blue.\n", RESET;
@@ -179,22 +196,30 @@ you can save it as a string, pass it to something else, send it to a file
 handle, or do anything else with it that you might care to).
 
 The recognized attributes (all of which should be fairly intuitive) are
-clear, reset, bold, underline, underscore, blink, reverse, concealed,
-black, red, green, yellow, blue, magenta, on_black, on_red, on_green,
-on_yellow, on_blue, on_magenta, on_cyan, and on_white.  Case is not
-significant.  Underline and underscore are equivalent, as are clear and
-reset, so use whichever is the most intuitive to you.  The color alone
+clear, reset, dark, bold, underline, underscore, blink, reverse,
+concealed, black, red, green, yellow, blue, magenta, on_black, on_red,
+on_green, on_yellow, on_blue, on_magenta, on_cyan, and on_white.  Case is
+not significant.  Underline and underscore are equivalent, as are clear
+and reset, so use whichever is the most intuitive to you.  The color alone
 sets the foreground color, and on_color sets the background color.
 
-Note that attributes, once set, last until they are unset (by sending the
-attribute "reset").  Be careful to do this, or otherwise your attribute will
-last after your script is done running, and people get very annoyed at
-having their prompt and typing changed to weird colors.
+Note that not all attributes are supported by all terminal types, and some
+terminals may not support any of these sequences.  Dark, blink, and
+concealed in particular are frequently not implemented.
+
+Attributes, once set, last until they are unset (by sending the attribute
+"reset").  Be careful to do this, or otherwise your attribute will last
+after your script is done running, and people get very annoyed at having
+their prompt and typing changed to weird colors.
 
 As an aid to help with this, colored() takes a scalar as the first
 argument and any number of attribute strings as the second argument and
 returns the scalar wrapped in escape codes so that the attributes will be
 set as requested before the string and reset to normal after the string.
+Alternately, you can pass a reference to an array as the first argument,
+and then the contents of that array will be taken as attributes and color
+codes and the remainder of the arguments as text to colorize.
+
 Normally, colored() just puts attribute codes at the beginning and end of
 the string, but if you set $Term::ANSIColor::EACHLINE to some string,
 that string will be considered the line delimiter and the attribute will
@@ -205,10 +230,10 @@ Normally you'll want to set $Term::ANSIColor::EACHLINE to C<"\n"> to use
 this feature.
 
 Alternately, if you import C<:constants>, you can use the constants CLEAR,
-RESET, BOLD, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED, BLACK, RED,
-GREEN, YELLOW, BLUE, MAGENTA, ON_BLACK, ON_RED, ON_GREEN, ON_YELLOW,
-ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE directly.  These are the same
-as color('attribute') and can be used if you prefer typing:
+RESET, BOLD, DARK, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED,
+BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, ON_BLACK, ON_RED, ON_GREEN,
+ON_YELLOW, ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE directly.  These are
+the same as color('attribute') and can be used if you prefer typing:
 
     print BOLD BLUE ON_WHITE "Text\n", RESET;
 
@@ -231,14 +256,14 @@ will reset the display mode afterwards, whereas:
 will not.
 
 The subroutine interface has the advantage over the constants interface in
-that only 2 soubrutines are exported into your namespace, verses 22 in the
-constants interface.  On the flip side, the constants interface has the
-advantage of better compile time error checking, since misspelled names of
-colors or attributes in calls to color() and colored() won't be caught
-until runtime whereas misspelled names of constants will be caught at
-compile time.  So, polute your namespace with almost two dozen subrutines
-that you may not even use that oftin, or risk a silly bug by mistyping an
-attribute.  Your choice, TMTOWTDI after all.
+that only two subroutines are exported into your namespace, versus
+twenty-two in the constants interface.  On the flip side, the constants
+interface has the advantage of better compile time error checking, since
+misspelled names of colors or attributes in calls to color() and colored()
+won't be caught until runtime whereas misspelled names of constants will
+be caught at compile time.  So, polute your namespace with almost two
+dozen subroutines that you may not even use that often, or risk a silly
+bug by mistyping an attribute.  Your choice, TMTOWTDI after all.
 
 =head1 DIAGNOSTICS
 
@@ -246,11 +271,11 @@ attribute.  Your choice, TMTOWTDI after all.
 
 =item Invalid attribute name %s
 
-You passed an invalid attribute name to either color() or colored().
+(F) You passed an invalid attribute name to either color() or colored().
 
-=item Identifier %s used only once: possible typo
+=item Name "%s" used only once: possible typo
 
-You probably mistyped a constant color name such as:
+(W) You probably mistyped a constant color name such as:
 
     print FOOBAR "This text is color FOOBAR\n";
 
@@ -259,7 +284,7 @@ force the next error.
 
 =item No comma allowed after filehandle
 
-You probably mistyped a constant color name such as:
+(F) You probably mistyped a constant color name such as:
 
     print FOOBAR, "This text is color FOOBAR\n";
 
@@ -267,9 +292,9 @@ Generating this fatal compile error is one of the main advantages of using
 the constants interface, since you'll immediately know if you mistype a
 color name.
 
-=item Bareword %s not allowed while "strict subs" in use
+=item Bareword "%s" not allowed while "strict subs" in use
 
-You probably mistyped a constant color name such as:
+(F) You probably mistyped a constant color name such as:
 
     $Foobar = FOOBAR . "This line should be blue\n";
 
@@ -298,6 +323,25 @@ For easier debuging, you may prefer to always use the commas when not
 setting $Term::ANSIColor::AUTORESET so that you'll get a fatal compile
 error rather than a warning.
 
+=head1 NOTES
+
+Jean Delvare provided the following table of different common terminal
+emulators and their support for the various attributes:
+
+              clear    bold     dark    under    blink   reverse  conceal
+ ------------------------------------------------------------------------
+ xterm         yes      yes      no      yes     bold      yes      yes
+ linux         yes      yes      yes    bold      yes      yes      no
+ rxvt          yes      yes      no      yes  bold/black   yes      no
+ dtterm        yes      yes      yes     yes    reverse    yes      yes
+ teraterm      yes    reverse    no      yes    rev/red    yes      no
+ aixterm      kinda   normal     no      yes      no       yes      yes
+
+Where the entry is other than yes or no, that emulator interpret the given
+attribute as something else instead.  Note that on an aixterm, clear
+doesn't reset colors; you have to explicitly set the colors back to what
+you want.  More entries in this table are welcome.
+
 =head1 AUTHORS
 
 Original idea (using constants) by Zenin (zenin@best.com), reimplemented
index c708f57..c18d381 100644 (file)
@@ -1,11 +1,10 @@
 use strict;
 package Test;
-use 5.005_64;
 use Test::Harness 1.1601 ();
 use Carp;
 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $ntest, $TestLevel); #public-ish
 our($TESTOUT, $ONFAIL, %todo, %history, $planned, @FAILDETAIL); #private-ish
-$VERSION = '1.13';
+$VERSION = '1.14';
 require Exporter;
 @ISA=('Exporter');
 @EXPORT=qw(&plan &ok &skip);
index 3079b90..d588764 100644 (file)
@@ -108,7 +108,7 @@ many people seem to prefer an I<unlikely> value like C<Z000>
 can be assigned to C<$soundex_nocode>.
 
 In scalar context C<soundex> returns the soundex code of its first
-argument, and in array context a list is returned in which each element is the 
+argument, and in list context a list is returned in which each element is the 
 soundex code for the corresponding argument passed to C<soundex> e.g.
 
   @codes = soundex qw(Mike Stok);
index eb83aae..e3b85d4 100644 (file)
@@ -8,30 +8,31 @@ our $VERSION = '1.01';
 # Pod documentation after __END__ below.
 
 sub DESTROY { }
-sub EXTEND  { }          
-sub UNSHIFT { shift->SPLICE(0,0,@_) }                 
-sub SHIFT   { shift->SPLICE(0,1) }                 
+sub EXTEND  { }
+sub UNSHIFT { scalar shift->SPLICE(0,0,@_) }
+sub SHIFT { shift->SPLICE(0,1) }
+#sub SHIFT   { (shift->SPLICE(0,1))[0] }
 sub CLEAR   { shift->STORESIZE(0) }
 
-sub PUSH 
-{  
+sub PUSH
+{
  my $obj = shift;
  my $i   = $obj->FETCHSIZE;
  $obj->STORE($i++, shift) while (@_);
 }
 
-sub POP 
+sub POP
 {
  my $obj = shift;
  my $newsize = $obj->FETCHSIZE - 1;
  my $val;
- if ($newsize >= 0) 
+ if ($newsize >= 0)
   {
    $val = $obj->FETCH($newsize);
    $obj->STORESIZE($newsize);
   }
  $val;
-}          
+}
 
 sub SPLICE
 {
@@ -46,7 +47,7 @@ sub SPLICE
    push(@result,$obj->FETCH($off+$i));
   }
  if (@_ > $len)
-  {                          
+  {
    # Move items up to make room
    my $d = @_ - $len;
    my $e = $off+$len;
@@ -59,7 +60,7 @@ sub SPLICE
   }
  elsif (@_ < $len)
   {
-   # Move items down to close the gap 
+   # Move items down to close the gap
    my $d = $len - @_;
    my $e = $off+$len;
    for (my $i=$off+$len; $i < $sz; $i++)
@@ -74,7 +75,7 @@ sub SPLICE
    $obj->STORE($off+$i,$_[$i]);
   }
  return @result;
-} 
+}
 
 sub EXISTS {
     my $pkg = ref $_[0];
@@ -91,21 +92,21 @@ use vars qw(@ISA);
 @ISA = 'Tie::Array';
 
 sub TIEARRAY  { bless [], $_[0] }
-sub FETCHSIZE { scalar @{$_[0]} }             
-sub STORESIZE { $#{$_[0]} = $_[1]-1 }  
+sub FETCHSIZE { scalar @{$_[0]} }
+sub STORESIZE { $#{$_[0]} = $_[1]-1 }
 sub STORE     { $_[0]->[$_[1]] = $_[2] }
 sub FETCH     { $_[0]->[$_[1]] }
 sub CLEAR     { @{$_[0]} = () }
-sub POP       { pop(@{$_[0]}) } 
+sub POP       { pop(@{$_[0]}) }
 sub PUSH      { my $o = shift; push(@$o,@_) }
-sub SHIFT     { shift(@{$_[0]}) } 
-sub UNSHIFT   { my $o = shift; unshift(@$o,@_) } 
+sub SHIFT     { shift(@{$_[0]}) }
+sub UNSHIFT   { my $o = shift; unshift(@$o,@_) }
 sub EXISTS    { exists $_[0]->[$_[1]] }
 sub DELETE    { delete $_[0]->[$_[1]] }
 
 sub SPLICE
 {
- my $ob  = shift;                    
+ my $ob  = shift;
  my $sz  = $ob->FETCHSIZE;
  my $off = @_ ? shift : 0;
  $off   += $sz if $off < 0;
@@ -121,16 +122,16 @@ __END__
 
 Tie::Array - base class for tied arrays
 
-=head1 SYNOPSIS  
+=head1 SYNOPSIS
 
     package NewArray;
     use Tie::Array;
     @ISA = ('Tie::Array');
 
     # mandatory methods
-    sub TIEARRAY { ... }  
-    sub FETCH { ... }     
-    sub FETCHSIZE { ... } 
+    sub TIEARRAY { ... }
+    sub FETCH { ... }
+    sub FETCHSIZE { ... }
 
     sub STORE { ... }        # mandatory if elements writeable
     sub STORESIZE { ... }    # mandatory if elements can be added/deleted
@@ -138,13 +139,13 @@ Tie::Array - base class for tied arrays
     sub DELETE { ... }       # mandatory if delete() expected to work
 
     # optional methods - for efficiency
-    sub CLEAR { ... }  
-    sub PUSH { ... } 
-    sub POP { ... } 
-    sub SHIFT { ... } 
-    sub UNSHIFT { ... } 
-    sub SPLICE { ... } 
-    sub EXTEND { ... } 
+    sub CLEAR { ... }
+    sub PUSH { ... }
+    sub POP { ... }
+    sub SHIFT { ... }
+    sub UNSHIFT { ... }
+    sub SPLICE { ... }
+    sub EXTEND { ... }
     sub DESTROY { ... }
 
     package NewStdArray;
@@ -162,7 +163,7 @@ Tie::Array - base class for tied arrays
 
 
 
-=head1 DESCRIPTION       
+=head1 DESCRIPTION
 
 This module provides methods for array-tying classes. See
 L<perltie> for a list of the functions required in order to tie an array
@@ -173,16 +174,16 @@ on the tied array, and implementations of C<PUSH>, C<POP>, C<SHIFT>,
 C<UNSHIFT>, C<SPLICE> and C<CLEAR> in terms of basic C<FETCH>, C<STORE>,
 C<FETCHSIZE>, C<STORESIZE>.
 
-The B<Tie::StdArray> package provides efficient methods required for tied arrays 
+The B<Tie::StdArray> package provides efficient methods required for tied arrays
 which are implemented as blessed references to an "inner" perl array.
-It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly 
-like standard arrays, allowing for selective overloading of methods. 
+It inherits from B<Tie::Array>, and should cause tied arrays to behave exactly
+like standard arrays, allowing for selective overloading of methods.
 
 For developers wishing to write their own tied arrays, the required methods
 are briefly defined below. See the L<perltie> section for more detailed
 descriptive, as well as example code:
 
-=over 
+=over
 
 =item TIEARRAY classname, LIST
 
@@ -190,7 +191,7 @@ The class method is invoked by the command C<tie @array, classname>. Associates
 an array instance with the specified class. C<LIST> would represent
 additional arguments (along the lines of L<AnyDBM_File> and compatriots) needed
 to complete the association. The method should return an object of a class which
-provides the methods below. 
+provides the methods below.
 
 =item STORE this, index, value
 
@@ -214,7 +215,7 @@ Sets the total number of items in the tied array associated with
 object I<this> to be I<count>. If this makes the array larger then
 class's mapping of C<undef> should be returned for new positions.
 If the array becomes smaller then entries beyond count should be
-deleted. 
+deleted.
 
 =item EXTEND this, count
 
@@ -242,7 +243,7 @@ object I<this>.
 
 Normal object destructor method.
 
-=item PUSH this, LIST 
+=item PUSH this, LIST
 
 Append elements of LIST to the array.
 
@@ -255,17 +256,17 @@ Remove last element of the array and return it.
 Remove the first element of the array (shifting other elements down)
 and return it.
 
-=item UNSHIFT this, LIST 
+=item UNSHIFT this, LIST
 
 Insert LIST elements at the beginning of the array, moving existing elements
 up to make room.
 
 =item SPLICE this, offset, length, LIST
 
-Perform the equivalent of C<splice> on the array. 
+Perform the equivalent of C<splice> on the array.
 
-I<offset> is optional and defaults to zero, negative values count back 
-from the end of the array. 
+I<offset> is optional and defaults to zero, negative values count back
+from the end of the array.
 
 I<length> is optional and defaults to rest of the array.
 
@@ -277,16 +278,15 @@ Returns a list of the original I<length> elements at I<offset>.
 
 =head1 CAVEATS
 
-There is no support at present for tied @ISA. There is a potential conflict 
+There is no support at present for tied @ISA. There is a potential conflict
 between magic entries needed to notice setting of @ISA, and those needed to
-implement 'tie'.   
+implement 'tie'.
 
 Very little consideration has been given to the behaviour of tied arrays
 when C<$[> is not default value of zero.
 
-=head1 AUTHOR 
+=head1 AUTHOR
 
 Nick Ing-Simmons E<lt>nik@tiuk.ti.comE<gt>
 
-=cut 
-
+=cut
index 588ecea..81b0792 100644 (file)
@@ -1,7 +1,7 @@
 package Tie::Handle;
 
 use 5.005_64;
-our $VERSION = '1.0';
+our $VERSION = '4.0';
 
 =head1 NAME
 
@@ -105,6 +105,15 @@ destruction of an instance.
 
 The L<perltie> section contains an example of tying handles.
 
+=head1 COMPATIBILITY
+
+This version of Tie::Handle is neither related to nor compatible with
+the Tie::Handle (3.0) module available on CPAN. It was due to an
+accident that two modules with the same name appeared. The namespace
+clash has been cleared in favor of this module that comes with the
+perl core in September 2000 and accordingly the version number has
+been bumped up to 4.0.
+
 =cut
 
 use Carp;
@@ -120,8 +129,7 @@ sub new {
 sub TIEHANDLE {
     my $pkg = shift;
     if (defined &{"{$pkg}::new"}) {
-       warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"
-           if warnings::enabled();
+       warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing");
        $pkg->new(@_);
     }
     else {
@@ -184,10 +192,10 @@ sub WRITE {
 sub CLOSE {
     my $pkg = ref $_[0];
     croak "$pkg doesn't define a CLOSE method";
-} 
+}
 
 package Tie::StdHandle; 
-our @ISA = 'Tie::Handle';       
+our @ISA = 'Tie::Handle';
 use Carp;
 
 sub TIEHANDLE 
@@ -197,7 +205,7 @@ sub TIEHANDLE
  bless $fh,$class;
  $fh->OPEN(@_) if (@_);
  return $fh;
-}         
+}
 
 sub EOF     { eof($_[0]) }
 sub TELL    { tell($_[0]) }
@@ -207,9 +215,9 @@ sub CLOSE   { close($_[0]) }
 sub BINMODE { binmode($_[0]) }
 
 sub OPEN
-{         
+{
  $_[0]->CLOSE if defined($_[0]->FILENO);
- open($_[0],$_[1]);
+ @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);
 }
 
 sub READ     { read($_[0],$_[1],$_[2]) }
@@ -217,7 +225,7 @@ sub READLINE { my $fh = $_[0]; <$fh> }
 sub GETC     { getc($_[0]) }
 
 sub WRITE
-{        
+{
  my $fh = $_[0];
  print $fh substr($_[1],0,$_[2])
 }
index c6ec3d4..2244711 100644 (file)
@@ -114,8 +114,7 @@ sub new {
 sub TIEHASH {
     my $pkg = shift;
     if (defined &{"${pkg}::new"}) {
-       warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing"
-           if warnings::enabled();
+       warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHASH is missing");
        $pkg->new(@_);
     }
     else {
index 0c67590..89ad03e 100644 (file)
@@ -91,8 +91,7 @@ sub new {
 sub TIESCALAR {
     my $pkg = shift;
     if (defined &{"{$pkg}::new"}) {
-       warnings::warn "WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing"
-           if warnings::enabled();
+       warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIESCALAR is missing");
        $pkg->new(@_);
     }
     else {
index bd1d065..64361f8 100644 (file)
@@ -43,7 +43,8 @@ yourself.
 =item Win32::DomainName()
 
 [CORE] Returns the name of the Microsoft Network domain that the
-owner of the current perl process is logged into.
+owner of the current perl process is logged into.  This function does
+B<not> work on Windows 9x.
 
 =item Win32::ExpandEnvironmentStrings(STRING)
 
index f93d615..f2f7e01 100644 (file)
@@ -38,11 +38,28 @@ The C<use bytes> pragma disables character semantics for the rest of the
 lexical scope in which it appears.  C<no bytes> can be used to reverse
 the effect of C<use bytes> within the current lexical scope.
 
-Perl normally assumes character semantics in the presence of
-character data (i.e. data that has come from a source that has
-been marked as being of a particular character encoding).
-
-To understand the implications and differences between character
+Perl normally assumes character semantics in the presence of character
+data (i.e. data that has come from a source that has been marked as
+being of a particular character encoding). When C<use bytes> is in
+effect, the encoding is temporarily ignored, and each string is treated
+as a series of bytes. 
+
+As an example, when Perl sees C<$x = chr(400)>, it encodes the character
+in UTF8 and stores it in $x. Then it is marked as character data, so,
+for instance, C<length $x> returns C<1>. However, in the scope of the
+C<bytes> pragma, $x is treated as a series of bytes - the bytes that make
+up the UTF8 encoding - and C<length $x> returns C<2>:
+
+    $x = chr(400);
+    print "Length is ", length $x, "\n";     # "Length is 1"
+    printf "Contents are %vd\n", $x;         # "Contents are 400"
+    { 
+        use bytes;
+        print "Length is ", length $x, "\n"; # "Length is 2"
+        printf "Contents are %vd\n", $x;     # "Contents are 198.144"
+    }
+
+For more on the implications and differences between character
 semantics and byte semantics, see L<perlunicode>.
 
 =head1 SEE ALSO
index 7c2209b..0ec7ec2 100644 (file)
@@ -1,5 +1,6 @@
 package charnames;
 use bytes ();          # for $bytes::hint_bits
+use warnings();
 $charnames::hint_bits = 0x20000;
 
 my $txt;
@@ -51,6 +52,13 @@ sub import {
   $^H{charnames_full} = delete $h{':full'};
   $^H{charnames_short} = delete $h{':short'};
   $^H{charnames_scripts} = [map uc, keys %h];
+  if (warnings::enabled('utf8') && @{$^H{charnames_scripts}}) {
+       $txt = do "unicode/Name.pl" unless $txt;
+    for (@{$^H{charnames_scripts}}) {
+        warnings::warn('utf8',  "No such script: '$_'") unless
+           $txt =~ m/\t\t$_ (?:CAPITAL |SMALL )?LETTER /;
+       }
+  }
 }
 
 
diff --git a/lib/chat2.pl b/lib/chat2.pl
deleted file mode 100644 (file)
index 504fa7e..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-# chat.pl: chat with a server
-#
-# This library is no longer being maintained, and is included for backward
-# compatibility with Perl 4 programs which may require it.
-#
-# In particular, this should not be used as an example of modern Perl
-# programming techniques.
-#
-# Suggested alternative: Socket
-#
-# Based on: V2.01.alpha.7 91/06/16
-# Randal L. Schwartz (was <merlyn@stonehenge.com>)
-# multihome additions by A.Macpherson@bnr.co.uk
-# allow for /dev/pts based systems by Joe Doupnik <JRD@CC.USU.EDU>
-
-package chat;
-
-require 'sys/socket.ph';
-
-if( defined( &main'PF_INET ) ){
-       $pf_inet = &main'PF_INET;
-       $sock_stream = &main'SOCK_STREAM;
-       local($name, $aliases, $proto) = getprotobyname( 'tcp' );
-       $tcp_proto = $proto;
-}
-else {
-       # XXX hardwired $PF_INET, $SOCK_STREAM, 'tcp'
-       # but who the heck would change these anyway? (:-)
-       $pf_inet = 2;
-       $sock_stream = 1;
-       $tcp_proto = 6;
-}
-
-
-$sockaddr = 'S n a4 x8';
-chop($thishost = `hostname`);
-
-# *S = symbol for current I/O, gets assigned *chatsymbol....
-$next = "chatsymbol000000"; # next one
-$nextpat = "^chatsymbol"; # patterns that match next++, ++, ++, ++
-
-
-## $handle = &chat'open_port("server.address",$port_number);
-## opens a named or numbered TCP server
-
-sub open_port { ## public
-       local($server, $port) = @_;
-
-       local($serveraddr,$serverproc);
-
-       # We may be multi-homed, start with 0, fixup once connexion is made
-       $thisaddr = "\0\0\0\0" ;
-       $thisproc = pack($sockaddr, 2, 0, $thisaddr);
-
-       *S = ++$next;
-       if ($server =~ /^(\d+)+\.(\d+)\.(\d+)\.(\d+)$/) {
-               $serveraddr = pack('C4', $1, $2, $3, $4);
-       } else {
-               local(@x) = gethostbyname($server);
-               return undef unless @x;
-               $serveraddr = $x[4];
-       }
-       $serverproc = pack($sockaddr, 2, $port, $serveraddr);
-       unless (socket(S, $pf_inet, $sock_stream, $tcp_proto)) {
-               ($!) = ($!, close(S)); # close S while saving $!
-               return undef;
-       }
-       unless (bind(S, $thisproc)) {
-               ($!) = ($!, close(S)); # close S while saving $!
-               return undef;
-       }
-       unless (connect(S, $serverproc)) {
-               ($!) = ($!, close(S)); # close S while saving $!
-               return undef;
-       }
-# We opened with the local address set to ANY, at this stage we know
-# which interface we are using.  This is critical if our machine is
-# multi-homed, with IP forwarding off, so fix-up.
-       local($fam,$lport);
-       ($fam,$lport,$thisaddr) = unpack($sockaddr, getsockname(S));
-       $thisproc = pack($sockaddr, 2, 0, $thisaddr);
-# end of post-connect fixup
-       select((select(S), $| = 1)[0]);
-       $next; # return symbol for switcharound
-}
-
-## ($host, $port, $handle) = &chat'open_listen([$port_number]);
-## opens a TCP port on the current machine, ready to be listened to
-## if $port_number is absent or zero, pick a default port number
-## process must be uid 0 to listen to a low port number
-
-sub open_listen { ## public
-
-       *S = ++$next;
-       local($thisport) = shift || 0;
-       local($thisproc_local) = pack($sockaddr, 2, $thisport, $thisaddr);
-       local(*NS) = "__" . time;
-       unless (socket(NS, $pf_inet, $sock_stream, $tcp_proto)) {
-               ($!) = ($!, close(NS));
-               return undef;
-       }
-       unless (bind(NS, $thisproc_local)) {
-               ($!) = ($!, close(NS));
-               return undef;
-       }
-       unless (listen(NS, 1)) {
-               ($!) = ($!, close(NS));
-               return undef;
-       }
-       select((select(NS), $| = 1)[0]);
-       local($family, $port, @myaddr) =
-               unpack("S n C C C C x8", getsockname(NS));
-       $S{"needs_accept"} = *NS; # so expect will open it
-       (@myaddr, $port, $next); # returning this
-}
-
-## $handle = &chat'open_proc("command","arg1","arg2",...);
-## opens a /bin/sh on a pseudo-tty
-
-sub open_proc { ## public
-       local(@cmd) = @_;
-
-       *S = ++$next;
-       local(*TTY) = "__TTY" . time;
-       local($pty,$tty) = &_getpty(S,TTY);
-       die "Cannot find a new pty" unless defined $pty;
-       $pid = fork;
-       die "Cannot fork: $!" unless defined $pid;
-       unless ($pid) {
-               close STDIN; close STDOUT; close STDERR;
-               setpgrp(0,$$);
-               if (open(DEVTTY, "/dev/tty")) {
-                   ioctl(DEVTTY,0x20007471,0);         # XXX s/b &TIOCNOTTY
-                   close DEVTTY;
-               }
-               open(STDIN,"<&TTY");
-               open(STDOUT,">&TTY");
-               open(STDERR,">&STDOUT");
-               die "Oops" unless fileno(STDERR) == 2;  # sanity
-               close(S);
-               exec @cmd;
-               die "Cannot exec @cmd: $!";
-       }
-       close(TTY);
-       $next; # return symbol for switcharound
-}
-
-# $S is the read-ahead buffer
-
-## $return = &chat'expect([$handle,] $timeout_time,
-##     $pat1, $body1, $pat2, $body2, ... )
-## $handle is from previous &chat'open_*().
-## $timeout_time is the time (either relative to the current time, or
-## absolute, ala time(2)) at which a timeout event occurs.
-## $pat1, $pat2, and so on are regexs which are matched against the input
-## stream.  If a match is found, the entire matched string is consumed,
-## and the corresponding body eval string is evaled.
-##
-## Each pat is a regular-expression (probably enclosed in single-quotes
-## in the invocation).  ^ and $ will work, respecting the current value of $*.
-## If pat is 'TIMEOUT', the body is executed if the timeout is exceeded.
-## If pat is 'EOF', the body is executed if the process exits before
-## the other patterns are seen.
-##
-## Pats are scanned in the order given, so later pats can contain
-## general defaults that won't be examined unless the earlier pats
-## have failed.
-##
-## The result of eval'ing body is returned as the result of
-## the invocation.  Recursive invocations are not thought
-## through, and may work only accidentally. :-)
-##
-## undef is returned if either a timeout or an eof occurs and no
-## corresponding body has been defined.
-## I/O errors of any sort are treated as eof.
-
-$nextsubname = "expectloop000000"; # used for subroutines
-
-sub expect { ## public
-       if ($_[0] =~ /$nextpat/) {
-               *S = shift;
-       }
-       local($endtime) = shift;
-
-       local($timeout,$eof) = (1,1);
-       local($caller) = caller;
-       local($rmask, $nfound, $timeleft, $thisbuf);
-       local($cases, $pattern, $action, $subname);
-       $endtime += time if $endtime < 600_000_000;
-
-       if (defined $S{"needs_accept"}) { # is it a listen socket?
-               local(*NS) = $S{"needs_accept"};
-               delete $S{"needs_accept"};
-               $S{"needs_close"} = *NS;
-               unless(accept(S,NS)) {
-                       ($!) = ($!, close(S), close(NS));
-                       return undef;
-               }
-               select((select(S), $| = 1)[0]);
-       }
-
-       # now see whether we need to create a new sub:
-
-       unless ($subname = $expect_subname{$caller,@_}) {
-               # nope.  make a new one:
-               $expect_subname{$caller,@_} = $subname = $nextsubname++;
-
-               $cases .= <<"EDQ"; # header is funny to make everything elsif's
-sub $subname {
-       LOOP: {
-               if (0) { ; }
-EDQ
-               while (@_) {
-                       ($pattern,$action) = splice(@_,0,2);
-                       if ($pattern =~ /^eof$/i) {
-                               $cases .= <<"EDQ";
-               elsif (\$eof) {
-                       package $caller;
-                       $action;
-               }
-EDQ
-                               $eof = 0;
-                       } elsif ($pattern =~ /^timeout$/i) {
-                       $cases .= <<"EDQ";
-               elsif (\$timeout) {
-                       package $caller;
-                       $action;
-               }
-EDQ
-                               $timeout = 0;
-                       } else {
-                               $pattern =~ s#/#\\/#g;
-                       $cases .= <<"EDQ";
-               elsif (\$S =~ /$pattern/) {
-                       \$S = \$';
-                       package $caller;
-                       $action;
-               }
-EDQ
-                       }
-               }
-               $cases .= <<"EDQ" if $eof;
-               elsif (\$eof) {
-                       undef;
-               }
-EDQ
-               $cases .= <<"EDQ" if $timeout;
-               elsif (\$timeout) {
-                       undef;
-               }
-EDQ
-               $cases .= <<'ESQ';
-               else {
-                       $rmask = "";
-                       vec($rmask,fileno(S),1) = 1;
-                       ($nfound, $rmask) =
-                               select($rmask, undef, undef, $endtime - time);
-                       if ($nfound) {
-                               $nread = sysread(S, $thisbuf, 1024);
-                               if ($nread > 0) {
-                                       $S .= $thisbuf;
-                               } else {
-                                       $eof++, redo LOOP; # any error is also eof
-                               }
-                       } else {
-                               $timeout++, redo LOOP; # timeout
-                       }
-                       redo LOOP;
-               }
-       }
-}
-ESQ
-               eval $cases; die "$cases:\n$@" if $@;
-       }
-       $eof = $timeout = 0;
-       do $subname();
-}
-
-## &chat'print([$handle,] @data)
-## $handle is from previous &chat'open().
-## like print $handle @data
-
-sub print { ## public
-       if ($_[0] =~ /$nextpat/) {
-               *S = shift;
-       }
-
-       local $out = join $, , @_;
-       syswrite(S, $out, length $out);
-       if( $chat'debug ){
-               print STDERR "printed:";
-               print STDERR @_;
-       }
-}
-
-## &chat'close([$handle,])
-## $handle is from previous &chat'open().
-## like close $handle
-
-sub close { ## public
-       if ($_[0] =~ /$nextpat/) {
-               *S = shift;
-       }
-       close(S);
-       if (defined $S{"needs_close"}) { # is it a listen socket?
-               local(*NS) = $S{"needs_close"};
-               delete $S{"needs_close"};
-               close(NS);
-       }
-}
-
-## @ready_handles = &chat'select($timeout, @handles)
-## select()'s the handles with a timeout value of $timeout seconds.
-## Returns an array of handles that are ready for I/O.
-## Both user handles and chat handles are supported (but beware of
-## stdio's buffering for user handles).
-
-sub select { ## public
-       local($timeout) = shift;
-       local(@handles) = @_;
-       local(%handlename) = ();
-       local(%ready) = ();
-       local($caller) = caller;
-       local($rmask) = "";
-       for (@handles) {
-               if (/$nextpat/o) { # one of ours... see if ready
-                       local(*SYM) = $_;
-                       if (length($SYM)) {
-                               $timeout = 0; # we have a winner
-                               $ready{$_}++;
-                       }
-                       $handlename{fileno($_)} = $_;
-               } else {
-                       $handlename{fileno(/'/ ? $_ : "$caller\'$_")} = $_;
-               }
-       }
-       for (sort keys %handlename) {
-               vec($rmask, $_, 1) = 1;
-       }
-       select($rmask, undef, undef, $timeout);
-       for (sort keys %handlename) {
-               $ready{$handlename{$_}}++ if vec($rmask,$_,1);
-       }
-       sort keys %ready;
-}
-
-# ($pty,$tty) = $chat'_getpty(PTY,TTY):
-# internal procedure to get the next available pty.
-# opens pty on handle PTY, and matching tty on handle TTY.
-# returns undef if can't find a pty.
-# Modify "/dev/pty" to "/dev/pts" for Dell Unix v2.2 (aka SVR4.04). Joe Doupnik.
-
-sub _getpty { ## private
-       local($_PTY,$_TTY) = @_;
-       $_PTY =~ s/^([^']+)$/(caller)[$[]."'".$1/e;
-       $_TTY =~ s/^([^']+)$/(caller)[$[]."'".$1/e;
-       local($pty, $tty, $kind);
-       if( -e "/dev/pts000" ){         ## mods by Joe Doupnik Dec 1992
-               $kind = "pts";          ## SVR4 Streams
-       } else {
-               $kind = "pty";          ## BSD Clist stuff
-       }
-       for $bank (112..127) {
-               next unless -e sprintf("/dev/$kind%c0", $bank);
-               for $unit (48..57) {
-                       $pty = sprintf("/dev/$kind%c%c", $bank, $unit);
-                       open($_PTY,"+>$pty") || next;
-                       select((select($_PTY), $| = 1)[0]);
-                       ($tty = $pty) =~ s/pty/tty/;
-                       open($_TTY,"+>$tty") || next;
-                       select((select($_TTY), $| = 1)[0]);
-                       system "stty nl>$tty";
-                       return ($pty,$tty);
-               }
-       }
-       undef;
-}
-
-1;
index ac45810..37ff99d 100644 (file)
@@ -172,8 +172,7 @@ sub import {
        if ($fno and $fno != $next) {
            require Carp;
             if ($fno < $fattr->[0]) {
-                warnings::warn("Hides field '$f' in base class") 
-                   if warnings::enabled();
+                warnings::warnif("Hides field '$f' in base class") ;
             } else {
                 Carp::croak("Field name '$f' already in use");
             }
index 2595819..4a50b8f 100644 (file)
@@ -16,41 +16,50 @@ sub Getopts {
     local($argumentative) = @_;
     local(@args,$_,$first,$rest);
     local($errs) = 0;
+    local($[) = 0;
 
     @args = split( / */, $argumentative );
     while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
-       ($first,$rest) = ($1,$2);
-       $pos = index($argumentative,$first);
-       if($pos >= 0) {
-           if($pos < $#args && $args[$pos+1] eq ':') {
-               shift(@ARGV);
-               if($rest eq '') {
-                   ++$errs unless @ARGV;
-                   $rest = shift(@ARGV);
-               }
-               ${"opt_$first"} = $rest;
-           }
-           else {
-               ${"opt_$first"} = 1;
-               if($rest eq '') {
-                   shift(@ARGV);
+               ($first,$rest) = ($1,$2);
+               $pos = index($argumentative,$first);
+               if($pos >= $[) {
+                       if($args[$pos+1] eq ':') {
+                               shift(@ARGV);
+                               if($rest eq '') {
+                                       ++$errs unless(@ARGV);
+                                       $rest = shift(@ARGV);
+                               }
+                               eval "
+                               push(\@opt_$first, \$rest);
+                               if(\$opt_$first eq '') {
+                                       \$opt_$first = \$rest;
+                               }
+                               else {
+                                       \$opt_$first .= ' ' . \$rest;
+                               }
+                               ";
+                       }
+                       else {
+                               eval "\$opt_$first = 1";
+                               if($rest eq '') {
+                                       shift(@ARGV);
+                               }
+                               else {
+                                       $ARGV[0] = "-$rest";
+                               }
+                       }
                }
                else {
-                   $ARGV[0] = "-$rest";
+                       print STDERR "Unknown option: $first\n";
+                       ++$errs;
+                       if($rest ne '') {
+                               $ARGV[0] = "-$rest";
+                       }
+                       else {
+                               shift(@ARGV);
+                       }
                }
-           }
-       }
-       else {
-           print STDERR "Unknown option: $first\n";
-           ++$errs;
-           if($rest ne '') {
-               $ARGV[0] = "-$rest";
-           }
-           else {
-               shift(@ARGV);
-           }
        }
-    }
     $errs == 0;
 }
 
index 0d2a73b..bb02106 100644 (file)
@@ -23,7 +23,8 @@ print "Extracting $file (with variable substitutions)\n";
 print OUT <<"!GROK!THIS!";
 package lib;
 
-use 5.005_64;
+# THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL.
+# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD.
 
 my \$archname = "$Config_archname";
 my \$ver = "$Config_ver";
@@ -56,6 +57,7 @@ sub import {
         }
        # Put a corresponding archlib directory infront of $_ if it
        # looks like $_ has an archlib directory below it.
+       unshift(@INC, "$_/$archname") if -d "$_/$archname/auto";
        unshift(@INC, "$_/$ver") if -d "$_/$ver";
        unshift(@INC, "$_/$ver/$archname") if -d "$_/$ver/$archname";
     }
@@ -73,6 +75,8 @@ sub unimport {
     foreach (@_) {
        ++$names{$_};
        ++$names{"$_/$archname"} if -d "$_/$archname/auto";
+       ++$names{"$_/$ver"} if -d "$_/$ver";
+       ++$names{"$_/$ver/$archname"} if -d "$_/$ver/$archname";
     }
 
     # Remove ALL instances of each named directory.
index ba96bc9..2b0b99d 100644 (file)
@@ -106,7 +106,7 @@ sub mycan {                         # Real can would leave stubs.
 }
 
 %constants = (
-             'integer'   =>  0x1000, 
+             'integer'   =>  0x1000,
              'float'     =>  0x2000,
              'binary'    =>  0x4000,
              'q'         =>  0x8000,
@@ -127,11 +127,29 @@ sub mycan {                               # Real can would leave stubs.
         dereferencing    => '${} @{} %{} &{} *{}',
         special          => 'nomethod fallback =');
 
+use warnings::register;
 sub constant {
   # Arguments: what, sub
   while (@_) {
-    $^H{$_[0]} = $_[1];
-    $^H |= $constants{$_[0]} | $overload::hint_bits;
+    if (@_ == 1) {
+        warnings::warnif ("Odd number of arguments for overload::constant");
+        last;
+    }
+    elsif (!exists $constants {$_ [0]}) {
+        warnings::warnif ("`$_[0]' is not an overloadable type");
+    }
+    elsif (!ref $_ [1] || "$_[1]" !~ /CODE\(0x[\da-f]+\)$/) {
+        # Can't use C<ref $_[1] eq "CODE"> above as code references can be
+        # blessed, and C<ref> would return the package the ref is blessed into.
+        if (warnings::enabled) {
+            $_ [1] = "undef" unless defined $_ [1];
+            warnings::warn ("`$_[1]' is not a code reference");
+        }
+    }
+    else {
+        $^H{$_[0]} = $_[1];
+        $^H |= $constants{$_[0]} | $overload::hint_bits;
+    }
     shift, shift;
   }
 }
@@ -149,7 +167,7 @@ sub remove_constant {
 
 __END__
 
-=head1 NAME 
+=head1 NAME
 
 overload - Package for overloading perl operations
 
@@ -157,7 +175,7 @@ overload - Package for overloading perl operations
 
     package SomeThing;
 
-    use overload 
+    use overload
        '+' => \&myadd,
        '-' => \&mysub;
        # etc
@@ -179,12 +197,12 @@ The compilation directive
 
     package Number;
     use overload
-       "+" => \&add, 
+       "+" => \&add,
        "*=" => "muas";
 
 declares function Number::add() for addition, and method muas() in
 the "class" C<Number> (or one of its base classes)
-for the assignment form C<*=> of multiplication.  
+for the assignment form C<*=> of multiplication.
 
 Arguments of this directive come in (key, value) pairs.  Legal values
 are values legal inside a C<&{ ... }> call, so the name of a
@@ -279,20 +297,20 @@ if C<+=> is not overloaded.
 =back
 
 B<Warning.>  Due to the presense of assignment versions of operations,
-routines which may be called in assignment context may create 
-self-referential structures.  Currently Perl will not free self-referential 
+routines which may be called in assignment context may create
+self-referential structures.  Currently Perl will not free self-referential
 structures until cycles are C<explicitly> broken.  You may get problems
 when traversing your structures too.
 
-Say, 
+Say,
 
   use overload '+' => sub { bless [ \$_[0], \$_[1] ] };
 
 is asking for trouble, since for code C<$obj += $foo> the subroutine
-is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj, 
+is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj,
 \$foo]>.  If using such a subroutine is an important optimization, one
 can overload C<+=> explicitly by a non-"optimized" version, or switch
-to non-optimized version if C<not defined $_[2]> (see 
+to non-optimized version if C<not defined $_[2]> (see
 L<Calling Conventions for Binary Operations>).
 
 Even if no I<explicit> assignment-variants of operators are present in
@@ -365,6 +383,11 @@ be used instead.  C<bool> is used in the flow control operators
 return any arbitrary Perl value.  If the corresponding operation for this value
 is overloaded too, that operation will be called again with this value.
 
+As a special case if the overload returns the object itself then it will
+be used directly. An overloaded conversion returning the object is
+probably a bug, because you're likely to get something that looks like
+C<YourPackage=HASH(0x8172b34)>.
+
 =item * I<Iteration>
 
     "<>"
@@ -382,6 +405,12 @@ If not overloaded, the argument will be dereferenced I<as is>, thus
 should be of correct type.  These functions should return a reference
 of correct type, or another object with overloaded dereferencing.
 
+As a special case if the overload returns the object itself then it
+will be used directly (provided it is the correct type).
+
+The dereference operators must be specified explicitly they will not be passed to
+"nomethod".
+
 =item * I<Special>
 
     "nomethod", "fallback", "=",
@@ -464,11 +493,16 @@ the last one is used.  Say, C<1-$a> can be equivalent to
 if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the
 C<use overload> directive.
 
+The C<"nomethod"> mechanism is I<not> used for the dereference operators
+( ${} @{} %{} &{} *{} ).
+
+
 If some operation cannot be resolved, and there is no function
 assigned to C<"nomethod">, then an exception will be raised via die()--
 unless C<"fallback"> was specified as a key in C<use overload> directive.
 
-=head2 Fallback 
+
+=head2 Fallback
 
 The key C<"fallback"> governs what to do if a method for a particular
 operation is not found.  Three different cases are possible depending on
@@ -492,7 +526,7 @@ present.
 =item * defined, but FALSE
 
 No autogeneration is tried.  Perl tries to call
-C<"nomethod"> value, and if this is missing, raises an exception. 
+C<"nomethod"> value, and if this is missing, raises an exception.
 
 =back
 
@@ -510,7 +544,7 @@ This operation is called in the situations when a mutator is applied
 to a reference that shares its object with some other reference, such
 as
 
-       $a=$b; 
+       $a=$b;
        ++$a;
 
 To make this change $a and not change $b, a copy of C<$$a> is made,
@@ -521,7 +555,7 @@ done if C<++> is expressed via a method for C<'++'> or C<'+='> (or
 C<nomethod>).  Note that if this operation is expressed via C<'+'>
 a nonmutator, i.e., as in
 
-       $a=$b; 
+       $a=$b;
        $a=$a+1;
 
 then C<$a> does not reference a new copy of C<$$a>, since $$a does not
@@ -535,15 +569,15 @@ string copy if the object is a plain scalar.
 
 =item B<Example>
 
-The actually executed code for 
+The actually executed code for
 
-       $a=$b; 
+       $a=$b;
         Something else which does not modify $a or $b....
        ++$a;
 
 may be
 
-       $a=$b; 
+       $a=$b;
         Something else which does not modify $a or $b....
        $a = $a->clone(undef,"");
         $a->incr(undef,"");
@@ -570,7 +604,7 @@ substitutions are possible for the following operations:
 C<$a+=$b> can use the method for C<"+"> if the method for C<"+=">
 is not defined.
 
-=item I<Conversion operations> 
+=item I<Conversion operations>
 
 String, numeric, and boolean conversion are calculated in terms of one
 another if not all of them are defined.
@@ -597,7 +631,7 @@ string or numerical conversion.
 
 can be expressed in terms of string conversion.
 
-=item I<Comparison operations> 
+=item I<Comparison operations>
 
 can be expressed in terms of its "spaceship" counterpart: either
 C<E<lt>=E<gt>> or C<cmp>:
@@ -705,20 +739,20 @@ to overload constant pieces of regular expressions.
 
 The corresponding values are references to functions which take three arguments:
 the first one is the I<initial> string form of the constant, the second one
-is how Perl interprets this constant, the third one is how the constant is used.  
+is how Perl interprets this constant, the third one is how the constant is used.
 Note that the initial string form does not
-contain string delimiters, and has backslashes in backslash-delimiter 
+contain string delimiters, and has backslashes in backslash-delimiter
 combinations stripped (thus the value of delimiter is not relevant for
-processing of this string).  The return value of this function is how this 
+processing of this string).  The return value of this function is how this
 constant is going to be interpreted by Perl.  The third argument is undefined
 unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote
 context (comes from strings, regular expressions, and single-quote HERE
-documents), it is C<tr> for arguments of C<tr>/C<y> operators, 
+documents), it is C<tr> for arguments of C<tr>/C<y> operators,
 it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise.
 
 Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>,
 it is expected that overloaded constant strings are equipped with reasonable
-overloaded catenation operator, otherwise absurd results will result.  
+overloaded catenation operator, otherwise absurd results will result.
 Similarly, negative numbers are considered as negations of positive constants.
 
 Note that it is probably meaningless to call the functions overload::constant()
@@ -732,7 +766,7 @@ From these methods they may be called as
          overload::constant integer => sub {Math::BigInt->new(shift)};
        }
 
-B<BUGS> Currently overloaded-ness of constants does not propagate 
+B<BUGS> Currently overloaded-ness of constants does not propagate
 into C<eval '...'>.
 
 =head1 IMPLEMENTATION
@@ -774,7 +808,7 @@ packages acquire a magic during the next C<bless>ing into the
 package. This magic is three-words-long for packages without
 overloading, and carries the cache table if the package is overloaded.
 
-Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is 
+Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is
 carried out before any operation that can imply an assignment to the
 object $a (or $b) refers to, like C<$a++>.  You can override this
 behavior by defining your own copy constructor (see L<"Copy Constructor">).
@@ -785,8 +819,8 @@ to be changed are constant (but this is not enforced).
 =head1 Metaphor clash
 
 One may wonder why the semantic of overloaded C<=> is so counter intuitive.
-If it I<looks> counter intuitive to you, you are subject to a metaphor 
-clash.  
+If it I<looks> counter intuitive to you, you are subject to a metaphor
+clash.
 
 Here is a Perl object metaphor:
 
@@ -805,10 +839,10 @@ that $a and $b are separate entities.
 
 The difference is not relevant in the absence of mutators.  After
 a Perl-way assignment an operation which mutates the data referenced by $a
-would change the data referenced by $b too.  Effectively, after 
+would change the data referenced by $b too.  Effectively, after
 C<$a = $b> values of $a and $b become I<indistinguishable>.
 
-On the other hand, anyone who has used algebraic notation knows the 
+On the other hand, anyone who has used algebraic notation knows the
 expressive power of the arithmetic metaphor.  Overloading works hard
 to enable this metaphor while preserving the Perlian way as far as
 possible.  Since it is not not possible to freely mix two contradicting
@@ -817,7 +851,7 @@ far as all the mutators are called via overloaded access only>.  The
 way it is done is described in L<Copy Constructor>.
 
 If some mutator methods are directly applied to the overloaded values,
-one may need to I<explicitly unlink> other values which references the 
+one may need to I<explicitly unlink> other values which references the
 same value:
 
     $a = new Data 23;
@@ -841,7 +875,7 @@ However, it would not make
 preserve "objectness" of $a.  But Perl I<has> a way to make assignments
 to an object do whatever you want.  It is just not the overload, but
 tie()ing interface (see L<perlfunc/tie>).  Adding a FETCH() method
-which returns the object itself, and STORE() method which changes the 
+which returns the object itself, and STORE() method which changes the
 value of the object, one can reproduce the arithmetic metaphor in its
 completeness, at least for variables which were tie()d from the start.
 
@@ -878,16 +912,15 @@ numeric value.)  This prints:
 =head2 Two-face references
 
 Suppose you want to create an object which is accessible as both an
-array reference, and a hash reference, similar to the builtin
-L<array-accessible-as-a-hash|perlref/"Pseudo-hashes: Using an array as
-a hash"> builtin Perl type.  Let us make it better than the builtin
-type, there will be no restriction that you cannot use the index 0 of
-your array.
+array reference and a hash reference, similar to the
+L<pseudo-hash|perlref/"Pseudo-hashes: Using an array as a hash">
+builtin Perl type.  Let's make it better than a pseudo-hash by
+allowing index 0 to be treated as a normal element.
 
   package two_refs;
   use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
-  sub new { 
-    my $p = shift; 
+  sub new {
+    my $p = shift;
     bless \ [@_], $p;
   }
   sub gethash {
@@ -901,13 +934,13 @@ your array.
   my %fields;
   my $i = 0;
   $fields{$_} = $i++ foreach qw{zero one two three};
-  sub STORE { 
+  sub STORE {
     my $self = ${shift()};
     my $key = $fields{shift()};
     defined $key or die "Out of band access";
     $$self->[$key] = shift;
   }
-  sub FETCH { 
+  sub FETCH {
     my $self = ${shift()};
     my $key = $fields{shift()};
     defined $key or die "Out of band access";
@@ -940,7 +973,7 @@ overloaded dereference operator).  Here is one possible fetching routine:
   sub access_hash {
     my ($self, $key) = (shift, shift);
     my $class = ref $self;
-    bless $self, 'overload::dummy'; # Disable overloading of %{} 
+    bless $self, 'overload::dummy'; # Disable overloading of %{}
     my $out = $self->{$key};
     bless $self, $class;       # Restore overloading
     $out;
@@ -952,8 +985,8 @@ level of indirection which allows a non-circular structure of references:
   package two_refs1;
   use overload '%{}' => sub { ${shift()}->[1] },
                '@{}' => sub { ${shift()}->[0] };
-  sub new { 
-    my $p = shift; 
+  sub new {
+    my $p = shift;
     my $a = [@_];
     my %h;
     tie %h, $p, $a;
@@ -970,13 +1003,13 @@ level of indirection which allows a non-circular structure of references:
   my %fields;
   my $i = 0;
   $fields{$_} = $i++ foreach qw{zero one two three};
-  sub STORE { 
+  sub STORE {
     my $a = ${shift()};
     my $key = $fields{shift()};
     defined $key or die "Out of band access";
     $a->[$key] = shift;
   }
-  sub FETCH { 
+  sub FETCH {
     my $a = ${shift()};
     my $key = $fields{shift()};
     defined $key or die "Out of band access";
@@ -986,7 +1019,7 @@ level of indirection which allows a non-circular structure of references:
 Now if $baz is overloaded like this, then C<$bar> is a reference to a
 reference to the intermediate array, which keeps a reference to an
 actual array, and the access hash.  The tie()ing object for the access
-hash is also a reference to a reference to the actual array, so 
+hash is also a reference to a reference to the actual array, so
 
 =over
 
@@ -1061,7 +1094,7 @@ Add a pretty-printer method to the module F<symbolic.pm>:
     $a = $a->pretty if ref $a;
     $b = $b->pretty if ref $b;
     "[$meth $a $b]";
-  } 
+  }
 
 Now one can finish the script by
 
@@ -1082,7 +1115,7 @@ look for an overloaded operator C<"">.  Thus it is enough to use
     $a = 'u' unless defined $a;
     $b = 'u' unless defined $b;
     "[$meth $a $b]";
-  } 
+  }
 
 Now one can change the last line of the script to
 
@@ -1093,7 +1126,7 @@ which outputs
   side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
 
 and one can inspect the value in debugger using all the possible
-methods.  
+methods.
 
 Something is is still amiss: consider the loop variable $cnt of the
 script.  It was a number, not an object.  We cannot make this value of
@@ -1127,9 +1160,9 @@ slightly modified str()):
     } else {
       "[$meth $a]";
     }
-  } 
-  my %subr = ( n => sub {$_[0]}, 
-              sqrt => sub {sqrt $_[0]}, 
+  }
+  my %subr = ( n => sub {$_[0]},
+              sqrt => sub {sqrt $_[0]},
               '-' => sub {shift() - shift()},
               '+' => sub {shift() + shift()},
               '/' => sub {shift() / shift()},
@@ -1138,7 +1171,7 @@ slightly modified str()):
             );
   sub num {
     my ($meth, $a, $b) = @{+shift};
-    my $subr = $subr{$meth} 
+    my $subr = $subr{$meth}
       or die "Do not know how to ($meth) in symbolic";
     $a = $a->num if ref $a eq __PACKAGE__;
     $b = $b->num if ref $b eq __PACKAGE__;
@@ -1207,7 +1240,7 @@ deep only, so recursive copying is not needed):
     bless [@$self], ref $self;
   }
 
-To make C<++> and C<--> work, we need to implement actual mutators, 
+To make C<++> and C<--> work, we need to implement actual mutators,
 either directly, or in C<nomethod>.  We continue to do things inside
 C<nomethod>, thus add
 
@@ -1216,7 +1249,7 @@ C<nomethod>, thus add
       return $obj;
     }
 
-after the first line of wrap().  This is not a most effective 
+after the first line of wrap().  This is not a most effective
 implementation, one may consider
 
   sub inc { $_[0] = bless ['++', shift, 1]; }
@@ -1239,8 +1272,8 @@ As a final remark, note that one can fill %subr by
   $subr{'++'} = $subr{'+'};
   $subr{'--'} = $subr{'-'};
 
-This finishes implementation of a primitive symbolic calculator in 
-50 lines of Perl code.  Since the numeric values of subexpressions 
+This finishes implementation of a primitive symbolic calculator in
+50 lines of Perl code.  Since the numeric values of subexpressions
 are not cached, the calculator is very slow.
 
 Here is the answer for the exercise: In the case of str(), we need no
@@ -1266,9 +1299,9 @@ until the value is I<used>.
 
 To see it in action, add a method
 
-  sub STORE { 
-    my $obj = shift; 
-    $#$obj = 1; 
+  sub STORE {
+    my $obj = shift;
+    $#$obj = 1;
     @$obj->[0,1] = ('=', shift);
   }
 
@@ -1337,6 +1370,27 @@ key (in fact a presence of this method shows that this package has
 overloading enabled, and it is what is used by the C<Overloaded>
 function of module C<overload>).
 
+The module might issue the following warnings:
+
+=over 4
+
+=item Odd number of arguments for overload::constant
+
+(W) The call to overload::constant contained an odd number of arguments.
+The arguments should come in pairs.
+
+=item `%s' is not an overloadable type
+
+(W) You tried to overload a constant type the overload package is unaware of.
+
+=item `%s' is not a code reference
+
+(W) The second (fourth, sixth, ...) argument of overload::constant needs
+to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=back
+
 =head1 BUGS
 
 Because it is used for overloading, the per-package hash %OVERLOAD now
@@ -1348,12 +1402,12 @@ C<fallback> is present (possibly undefined). This may create
 interesting effects if some package is not overloaded, but inherits
 from two overloaded packages.
 
-Relation between overloading and tie()ing is broken.  Overloading is 
+Relation between overloading and tie()ing is broken.  Overloading is
 triggered or not basing on the I<previous> class of tie()d value.
 
-This happens because the presence of overloading is checked too early, 
+This happens because the presence of overloading is checked too early,
 before any tie()d access is attempted.  If the FETCH()ed class of the
-tie()d value does not change, a simple workaround is to access the value 
+tie()d value does not change, a simple workaround is to access the value
 immediately after tie()ing, so that after this call the I<previous> class
 coincides with the current one.
 
index cc6a405..fb6d683 100644 (file)
@@ -426,7 +426,7 @@ if ($notty) {
                                  PeerAddr => $remoteport,
                                  Proto    => 'tcp',
                                );
-    if (!$OUT) { die "Could not create socket to connect to remote host."; }
+    if (!$OUT) { die "Unable to connect to remote host: $remoteport\n"; }
     $IN = $OUT;
   }
   else {
@@ -617,7 +617,7 @@ EOP
                            next CMD;
                        } 
                    }
-                   $cmd =~ /^q$/ && ($exiting = 1) && exit 0;
+                   $cmd =~ /^q$/ && ($fall_off_end = 1) && exit $?;
                    $cmd =~ /^h$/ && do {
                        print_help($help);
                        next CMD; };
@@ -899,9 +899,9 @@ EOP
                        print $OUT "Will stop on load of `@{[join '\', `', sort keys %break_on_load]}'.\n";
                        next CMD; };
                    $cmd =~ /^b\b\s*(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ && do {
-                       my $cond = $3 || '1';
+                       my $cond = length $3 ? $3 : '1';
                        my ($subname, $break) = ($2, $1 eq 'postpone');
-                       $subname =~ s/\'/::/;
+                       $subname =~ s/\'/::/g;
                        $subname = "${'package'}::" . $subname
                          unless $subname =~ /::/;
                        $subname = "main".$subname if substr($subname,0,2) eq "::";
@@ -910,8 +910,8 @@ EOP
                        next CMD; };
                    $cmd =~ /^b\b\s*([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ && do {
                        $subname = $1;
-                       $cond = $2 || '1';
-                       $subname =~ s/\'/::/;
+                       $cond = length $2 ? $2 : '1';
+                       $subname =~ s/\'/::/g;
                        $subname = "${'package'}::" . $subname
                          unless $subname =~ /::/;
                        $subname = "main".$subname if substr($subname,0,2) eq "::";
@@ -931,7 +931,7 @@ EOP
                        next CMD; };
                    $cmd =~ /^b\b\s*(\d*)\s*(.*)/ && do {
                        $i = $1 || $line;
-                       $cond = $2 || '1';
+                       $cond = length $2 ? $2 : '1';
                        if ($dbline[$i] == 0) {
                            print $OUT "Line $i not breakable.\n";
                        } else {
@@ -941,8 +941,12 @@ EOP
                        next CMD; };
                    $cmd =~ /^d\b\s*(\d*)/ && do {
                        $i = $1 || $line;
-                       $dbline{$i} =~ s/^[^\0]*//;
-                       delete $dbline{$i} if $dbline{$i} eq '';
+                        if ($dbline[$i] == 0) {
+                            print $OUT "Line $i not breakable.\n";
+                        } else {
+                           $dbline{$i} =~ s/^[^\0]*//;
+                           delete $dbline{$i} if $dbline{$i} eq '';
+                        }
                        next CMD; };
                    $cmd =~ /^A$/ && do {
                      print $OUT "Deleting all actions...\n";
@@ -1426,7 +1430,7 @@ EOP
                $piped= "";
            }
        }                       # CMD:
-       $exiting = 1 unless defined $cmd;
+       $fall_off_end = 1 unless defined $cmd; # Emulate `q' on EOF
        foreach $evalarg (@$post) {
          &eval;
        }
@@ -1507,6 +1511,7 @@ sub eval {
        local $otrace = $trace;
        local $osingle = $single;
        local $od = $^D;
+       { ($evalarg) = $evalarg =~ /(.*)/s; }
        @res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug
        $trace = $otrace;
        $single = $osingle;
@@ -2160,8 +2165,8 @@ B<W>              Delete all watch-expressions.
 B<V> [I<pkg> [I<vars>]]        List some (default all) variables in package (default current).
                Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
 B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\".
-B<x> I<expr>           Evals expression in array context, dumps the result.
-B<m> I<expr>           Evals expression in array context, prints methods callable
+B<x> I<expr>           Evals expression in list context, dumps the result.
+B<m> I<expr>           Evals expression in list context, prints methods callable
                on the first element of the result.
 B<m> I<class>          Prints methods callable via the given class.
 
@@ -2256,7 +2261,7 @@ I<Debugger controls:>                        B<L>           List break/watch/act
   B<|>[B<|>]I<db_cmd>  Send output to pager        B<$psh>\[B<$psh>\] I<syscmd> Run cmd in a subprocess
   B<q> or B<^D>     Quit                         B<R>        Attempt a restart
 I<Data Examination:>         B<expr>     Execute perl code, also see: B<s>,B<n>,B<t> I<expr>
-  B<x>|B<m> I<expr>    Evals expr in array context, dumps the result or lists methods.
+  B<x>|B<m> I<expr>    Evals expr in list context, dumps the result or lists methods.
   B<p> I<expr> Print expression (uses script's current package).
   B<S> [[B<!>]I<pat>]  List subroutine names [not] matching pattern
   B<V> [I<Pk> [I<Vars>]]       List Variables in Package.  Vars can be ~pattern or !pattern.
@@ -2679,10 +2684,11 @@ sub end_report {
 }
 
 END {
-  $finished = $inhibit_exit;   # So that some keys may be disabled.
+  $finished = 1 if $inhibit_exit;      # So that some keys may be disabled.
+  $fall_off_end = 1 unless $inhibit_exit;
   # Do not stop in at_exit() and destructors on exit:
-  $DB::single = !$exiting && !$runnonstop;
-  DB::fake::at_exit() unless $exiting or $runnonstop;
+  $DB::single = !$fall_off_end && !$runnonstop;
+  DB::fake::at_exit() unless $fall_off_end or $runnonstop;
 }
 
 package DB::fake;
index 70c439b..f0dbb1c 100644 (file)
@@ -34,7 +34,7 @@ use warnings::register;
 $host = 'localhost' unless $host;      # set $syslog'host to change
 
 if ($] >= 5 && warnings::enabled()) {
-    warnings::warn "You should 'use Sys::Syslog' instead; continuing";
+    warnings::warn("You should 'use Sys::Syslog' instead; continuing");
 } 
 
 require 'syslog.ph';
index 06da956..f295a2d 100644 (file)
@@ -22,7 +22,7 @@ sub Tgetent {
     local($TERM) = @_;
     local($TERMCAP,$_,$entry,$loop,$field);
 
-    warn "Tgetent: no ospeed set" unless $ospeed;
+    # warn "Tgetent: no ospeed set" unless $ospeed;
     foreach $key (keys %TC) {
        delete $TC{$key};
     }
index fd5ed8a..2ad1871 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0622   0625    R
@@ -12,10 +12,9 @@ return <<'END';
 0633   063a    D
 0640           C
 0641   0647    D
-0648   0649    R
-064a           D
-0671           U
-0672   0673    R
+0648           R
+0649   064a    D
+0671   0673    R
 0674           U
 0675   0677    R
 0678   0687    D
index 61f30d4..1581a04 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0622   0623    ALEF
@@ -27,8 +27,7 @@ return <<'END';
 0647           HEH
 0648           WAW
 0649   064a    YEH
-0671           <no shaping>
-0672   0673    ALEF
+0671   0673    ALEF
 0674           <no shaping>
 0675           ALEF
 0676   0677    WAW
index 6092d62..9b60290 100644 (file)
@@ -1,5 +1,32 @@
-# Unicode; Schematic Name; Link; Link Group
+# ArabicShaping-3.txt
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# This file defines the shaping classes for Arabic and Syriac
+# positional shaping, repeating in machine readable form the
+# information printed in Tables 8-6, 8-7, 8-8, 8-10, 8-11, and
+# 8-13 of The Unicode Standard, Version 3.0.
+#
+# See sections 8.2 and 8.3 of The Unicode Standard, Version 3.0
+# for more information.
+#
+# Each line contains four fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+#   form, of an Arabic or Syriac character.
+# The second field gives a short schematic name for that character,
+#   abbreviated from the normative Unicode character name.
+# The third field defines the joining type: R right-joining, 
+#   D dual-joining, U non-joining
+# The fourth field defines the joining group.
+#
+# #############################################################
+# Unicode; Schematic Name; Joining Type; Joining Group
+
 # Arabic characters
+
 0622; MADDA ON ALEF; R; ALEF
 0623; HAMZA ON ALEF; R; ALEF
 0624; HAMZA ON WAW; R; WAW
@@ -34,9 +61,9 @@
 0646; NOON; D; NOON
 0647; HEH; D; HEH
 0648; WAW; R; WAW
-0649; ALEF MAKSURA; R; YEH
+0649; ALEF MAKSURA; D; YEH
 064A; YEH; D; YEH
-0671; HAMZAT WASL ON ALEF; U; <no shaping>
+0671; HAMZAT WASL ON ALEF; R; ALEF
 0672; WAVY HAMZA ON ALEF; R; ALEF
 0673; WAVY HAMZA UNDER ALEF; R; ALEF
 0674; HIGH HAMZA; U; <no shaping>
 06FA; SEEN WITH DOT BELOW AND 3 DOTS ABOVE; D; SEEN
 06FB; DAD WITH DOT BELOW; D; SAD
 06FC; GHAIN WITH DOT BELOW; D; AIN
+
 # Syriac characters
+
 0710; ALAPH; R; ALAPH
 0712; BETH; D; BETH
 0713; GAMAL; D; GAMAL
diff --git a/lib/unicode/BidiMirr.txt b/lib/unicode/BidiMirr.txt
new file mode 100644 (file)
index 0000000..8ac5be9
--- /dev/null
@@ -0,0 +1,238 @@
+# BidiMirroring-1.txt
+# 
+# This file is an informative supplement to the UnicodeData file. It
+# lists characters that have the mirrored property
+# where there is another Unicode character that typically has a glyph
+# that is the mirror image of the original character's glyph.
+# The repertoire covered by the file is Unicode 3.0.1.
+# 
+# The file contains a list of lines with mappings from one code point
+# to another one for character-based mirroring.
+# Note that for "real" mirroring, a rendering engine needs to select
+# appropriate alternative glyphs, and that many Unicode characters do not
+# have a mirror-image Unicode character.
+# 
+# Each mapping line contains two fields, separated by a semicolon (';').
+# Each of the two fields contains a code point represented as a
+# variable-length hexadecimal value with 4 to 6 digits.
+# A comment indicates where the characters are "BEST FIT" mirroring.
+# 
+# Code points with the "mirrored" property but no appropriate mirrors are
+# listed as comments at the end of the file.
+# 
+# For information on bidi mirroring, see UTR #21: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/reports/tr9/
+# 
+# Please address any comments to <errata@unicode.org>.
+# Note that this is an archival address: messages will be checked,
+# but do not expect an immediate response.
+# 
+# This file was originally created by Markus Scherer
+# 
+# ############################################################
+
+0028; 0029 # LEFT PARENTHESIS
+0029; 0028 # RIGHT PARENTHESIS
+003C; 003E # LESS-THAN SIGN
+003E; 003C # GREATER-THAN SIGN
+005B; 005D # LEFT SQUARE BRACKET
+005D; 005B # RIGHT SQUARE BRACKET
+007B; 007D # LEFT CURLY BRACKET
+007D; 007B # RIGHT CURLY BRACKET
+00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+2045; 2046 # LEFT SQUARE BRACKET WITH QUILL
+2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL
+207D; 207E # SUPERSCRIPT LEFT PARENTHESIS
+207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS
+208D; 208E # SUBSCRIPT LEFT PARENTHESIS
+208E; 208D # SUBSCRIPT RIGHT PARENTHESIS
+2208; 220B # ELEMENT OF
+2209; 220C # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY EQUAL TO
+2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254; 2255 # COLON EQUALS
+2255; 2254 # EQUALS COLON
+2264; 2265 # LESS-THAN OR EQUAL TO
+2265; 2264 # GREATER-THAN OR EQUAL TO
+2266; 2267 # LESS-THAN OVER EQUAL TO
+2267; 2266 # GREATER-THAN OVER EQUAL TO
+2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+226A; 226B # MUCH LESS-THAN
+226B; 226A # MUCH GREATER-THAN
+226E; 226F # [BEST FIT] NOT LESS-THAN
+226F; 226E # [BEST FIT] NOT GREATER-THAN
+2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276; 2277 # LESS-THAN OR GREATER-THAN
+2277; 2276 # GREATER-THAN OR LESS-THAN
+2278; 2279 # NEITHER LESS-THAN NOR GREATER-THAN
+2279; 2278 # NEITHER GREATER-THAN NOR LESS-THAN
+227A; 227B # PRECEDES
+227B; 227A # SUCCEEDS
+227C; 227D # PRECEDES OR EQUAL TO
+227D; 227C # SUCCEEDS OR EQUAL TO
+227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO
+227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+2280; 2281 # [BEST FIT] DOES NOT PRECEDE
+2281; 2280 # [BEST FIT] DOES NOT SUCCEED
+2282; 2283 # SUBSET OF
+2283; 2282 # SUPERSET OF
+2284; 2285 # [BEST FIT] NOT A SUBSET OF
+2285; 2284 # [BEST FIT] NOT A SUPERSET OF
+2286; 2287 # SUBSET OF OR EQUAL TO
+2287; 2286 # SUPERSET OF OR EQUAL TO
+2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+228F; 2290 # SQUARE IMAGE OF
+2290; 228F # SQUARE ORIGINAL OF
+2291; 2292 # SQUARE IMAGE OF OR EQUAL TO
+2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO
+22A2; 22A3 # RIGHT TACK
+22A3; 22A2 # LEFT TACK
+22B0; 22B1 # PRECEDES UNDER RELATION
+22B1; 22B0 # SUCCEEDS UNDER RELATION
+22B2; 22B3 # NORMAL SUBGROUP OF
+22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP
+22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO
+22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6; 22B7 # ORIGINAL OF
+22B7; 22B6 # IMAGE OF
+22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB; 22CC # LEFT SEMIDIRECT PRODUCT
+22CC; 22CB # RIGHT SEMIDIRECT PRODUCT
+22CD; 2243 # REVERSED TILDE EQUALS
+22D0; 22D1 # DOUBLE SUBSET
+22D1; 22D0 # DOUBLE SUPERSET
+22D6; 22D7 # LESS-THAN WITH DOT
+22D7; 22D6 # GREATER-THAN WITH DOT
+22D8; 22D9 # VERY MUCH LESS-THAN
+22D9; 22D8 # VERY MUCH GREATER-THAN
+22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC; 22DD # EQUAL TO OR LESS-THAN
+22DD; 22DC # EQUAL TO OR GREATER-THAN
+22DE; 22DF # EQUAL TO OR PRECEDES
+22DF; 22DE # EQUAL TO OR SUCCEEDS
+22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF
+22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS
+22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS
+2308; 2309 # LEFT CEILING
+2309; 2308 # RIGHT CEILING
+230A; 230B # LEFT FLOOR
+230B; 230A # RIGHT FLOOR
+2329; 232A # LEFT-POINTING ANGLE BRACKET
+232A; 2329 # RIGHT-POINTING ANGLE BRACKET
+3008; 3009 # LEFT ANGLE BRACKET
+3009; 3008 # RIGHT ANGLE BRACKET
+300A; 300B # LEFT DOUBLE ANGLE BRACKET
+300B; 300A # RIGHT DOUBLE ANGLE BRACKET
+300C; 300D # [BEST FIT] LEFT CORNER BRACKET
+300D; 300C # [BEST FIT] RIGHT CORNER BRACKET
+300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET
+300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET
+3010; 3011 # LEFT BLACK LENTICULAR BRACKET
+3011; 3010 # RIGHT BLACK LENTICULAR BRACKET
+3014; 3015 # [BEST FIT] LEFT TORTOISE SHELL BRACKET
+3015; 3014 # [BEST FIT] RIGHT TORTOISE SHELL BRACKET
+3016; 3017 # LEFT WHITE LENTICULAR BRACKET
+3017; 3016 # RIGHT WHITE LENTICULAR BRACKET
+3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET
+3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET
+301A; 301B # LEFT WHITE SQUARE BRACKET
+301B; 301A # RIGHT WHITE SQUARE BRACKET
+
+# The following characters have no appropriate mirroring character
+
+# 2201; COMPLEMENT
+# 2202; PARTIAL DIFFERENTIAL
+# 2203; THERE EXISTS
+# 2204; THERE DOES NOT EXIST
+# 2211; N-ARY SUMMATION
+# 2215; DIVISION SLASH
+# 2216; SET MINUS
+# 221A; SQUARE ROOT
+# 221B; CUBE ROOT
+# 221C; FOURTH ROOT
+# 221D; PROPORTIONAL TO
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 2226; NOT PARALLEL TO
+# 222B; INTEGRAL
+# 222C; DOUBLE INTEGRAL
+# 222D; TRIPLE INTEGRAL
+# 222E; CONTOUR INTEGRAL
+# 222F; SURFACE INTEGRAL
+# 2230; VOLUME INTEGRAL
+# 2231; CLOCKWISE INTEGRAL
+# 2232; CLOCKWISE CONTOUR INTEGRAL
+# 2233; ANTICLOCKWISE CONTOUR INTEGRAL
+# 2239; EXCESS
+# 223B; HOMOTHETIC
+# 223E; INVERTED LAZY S
+# 223F; SINE WAVE
+# 2240; WREATH PRODUCT
+# 2241; NOT TILDE
+# 2242; MINUS TILDE
+# 2244; NOT ASYMPTOTICALLY EQUAL TO
+# 2245; APPROXIMATELY EQUAL TO
+# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+# 2248; ALMOST EQUAL TO
+# 2249; NOT ALMOST EQUAL TO
+# 224A; ALMOST EQUAL OR EQUAL TO
+# 224B; TRIPLE TILDE
+# 224C; ALL EQUAL TO
+# 225F; QUESTIONED EQUAL TO
+# 2260; NOT EQUAL TO
+# 2262; NOT IDENTICAL TO
+# 228C; MULTISET
+# 2298; CIRCLED DIVISION SLASH
+# 22A6; ASSERTION
+# 22A7; MODELS
+# 22A8; TRUE
+# 22A9; FORCES
+# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE
+# 22AB; DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+# 22AC; DOES NOT PROVE
+# 22AD; NOT TRUE
+# 22AE; DOES NOT FORCE
+# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+# 22B8; MULTIMAP
+# 22BE; RIGHT ANGLE WITH ARC
+# 22BF; RIGHT TRIANGLE
+# 2320; TOP HALF INTEGRAL
+# 2321; BOTTOM HALF INTEGRAL
index 73898b8..3cc2d0a 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   0008    BN
@@ -635,4 +635,6 @@ ffe5        ffe6    ET
 ffe8   ffee    ON
 fff9   fffb    BN
 fffc   fffd    ON
+f0000  ffffd   L
+100000 10fffd  L
 END
index ee680b7..2b5bfce 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   007F    Basic Latin
diff --git a/lib/unicode/CaseFold.txt b/lib/unicode/CaseFold.txt
new file mode 100644 (file)
index 0000000..6529c41
--- /dev/null
@@ -0,0 +1,821 @@
+# CaseFolding-2.txt
+#
+# Case Folding Properties
+#
+# This file is a supplement to the UnicodeData file.
+# It provides a case folding mapping generated from the Unicode Character Database.
+# If all characters are mapped according to this mapping, then
+# case differences (according to UnicodeData.txt and SpecialCasing.txt)
+# are eliminated.
+#
+# For information on case folding, see 
+# UTR #21 Case Mappings, at http://www.unicode.org/unicode/reports/tr21/
+#
+# These are informative character properties.
+#
+# Send comments to mark@unicode.org
+#
+# ================================================================================
+# Format
+# ================================================================================
+# The entries in this file are in the following machine-readable format:
+#
+# <code>; <status>; <mapping>; # <name>
+#
+# The status is:
+#   L (for Lowercase) if the case mapping matches the standard 1-1 lowercase mapping
+#   E (for exception) if it does not.
+#
+# The mapping may consist of multiple characters.
+# If so, they are separated by spaces.
+#
+# =================================================================
+
+0041; L; 0061; #LATIN CAPITAL LETTER A
+0042; L; 0062; #LATIN CAPITAL LETTER B
+0043; L; 0063; #LATIN CAPITAL LETTER C
+0044; L; 0064; #LATIN CAPITAL LETTER D
+0045; L; 0065; #LATIN CAPITAL LETTER E
+0046; L; 0066; #LATIN CAPITAL LETTER F
+0047; L; 0067; #LATIN CAPITAL LETTER G
+0048; L; 0068; #LATIN CAPITAL LETTER H
+0049; L; 0069; #LATIN CAPITAL LETTER I
+004A; L; 006A; #LATIN CAPITAL LETTER J
+004B; L; 006B; #LATIN CAPITAL LETTER K
+004C; L; 006C; #LATIN CAPITAL LETTER L
+004D; L; 006D; #LATIN CAPITAL LETTER M
+004E; L; 006E; #LATIN CAPITAL LETTER N
+004F; L; 006F; #LATIN CAPITAL LETTER O
+0050; L; 0070; #LATIN CAPITAL LETTER P
+0051; L; 0071; #LATIN CAPITAL LETTER Q
+0052; L; 0072; #LATIN CAPITAL LETTER R
+0053; L; 0073; #LATIN CAPITAL LETTER S
+0054; L; 0074; #LATIN CAPITAL LETTER T
+0055; L; 0075; #LATIN CAPITAL LETTER U
+0056; L; 0076; #LATIN CAPITAL LETTER V
+0057; L; 0077; #LATIN CAPITAL LETTER W
+0058; L; 0078; #LATIN CAPITAL LETTER X
+0059; L; 0079; #LATIN CAPITAL LETTER Y
+005A; L; 007A; #LATIN CAPITAL LETTER Z
+00B5; E; 03BC; #MICRO SIGN
+00C0; L; 00E0; #LATIN CAPITAL LETTER A WITH GRAVE
+00C1; L; 00E1; #LATIN CAPITAL LETTER A WITH ACUTE
+00C2; L; 00E2; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+00C3; L; 00E3; #LATIN CAPITAL LETTER A WITH TILDE
+00C4; L; 00E4; #LATIN CAPITAL LETTER A WITH DIAERESIS
+00C5; L; 00E5; #LATIN CAPITAL LETTER A WITH RING ABOVE
+00C6; L; 00E6; #LATIN CAPITAL LETTER AE
+00C7; L; 00E7; #LATIN CAPITAL LETTER C WITH CEDILLA
+00C8; L; 00E8; #LATIN CAPITAL LETTER E WITH GRAVE
+00C9; L; 00E9; #LATIN CAPITAL LETTER E WITH ACUTE
+00CA; L; 00EA; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+00CB; L; 00EB; #LATIN CAPITAL LETTER E WITH DIAERESIS
+00CC; L; 00EC; #LATIN CAPITAL LETTER I WITH GRAVE
+00CD; L; 00ED; #LATIN CAPITAL LETTER I WITH ACUTE
+00CE; L; 00EE; #LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+00CF; L; 00EF; #LATIN CAPITAL LETTER I WITH DIAERESIS
+00D0; L; 00F0; #LATIN CAPITAL LETTER ETH
+00D1; L; 00F1; #LATIN CAPITAL LETTER N WITH TILDE
+00D2; L; 00F2; #LATIN CAPITAL LETTER O WITH GRAVE
+00D3; L; 00F3; #LATIN CAPITAL LETTER O WITH ACUTE
+00D4; L; 00F4; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+00D5; L; 00F5; #LATIN CAPITAL LETTER O WITH TILDE
+00D6; L; 00F6; #LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8; L; 00F8; #LATIN CAPITAL LETTER O WITH STROKE
+00D9; L; 00F9; #LATIN CAPITAL LETTER U WITH GRAVE
+00DA; L; 00FA; #LATIN CAPITAL LETTER U WITH ACUTE
+00DB; L; 00FB; #LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+00DC; L; 00FC; #LATIN CAPITAL LETTER U WITH DIAERESIS
+00DD; L; 00FD; #LATIN CAPITAL LETTER Y WITH ACUTE
+00DE; L; 00FE; #LATIN CAPITAL LETTER THORN
+00DF; E; 0073 0073;    #LATIN SMALL LETTER SHARP S
+0100; L; 0101; #LATIN CAPITAL LETTER A WITH MACRON
+0102; L; 0103; #LATIN CAPITAL LETTER A WITH BREVE
+0104; L; 0105; #LATIN CAPITAL LETTER A WITH OGONEK
+0106; L; 0107; #LATIN CAPITAL LETTER C WITH ACUTE
+0108; L; 0109; #LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+010A; L; 010B; #LATIN CAPITAL LETTER C WITH DOT ABOVE
+010C; L; 010D; #LATIN CAPITAL LETTER C WITH CARON
+010E; L; 010F; #LATIN CAPITAL LETTER D WITH CARON
+0110; L; 0111; #LATIN CAPITAL LETTER D WITH STROKE
+0112; L; 0113; #LATIN CAPITAL LETTER E WITH MACRON
+0114; L; 0115; #LATIN CAPITAL LETTER E WITH BREVE
+0116; L; 0117; #LATIN CAPITAL LETTER E WITH DOT ABOVE
+0118; L; 0119; #LATIN CAPITAL LETTER E WITH OGONEK
+011A; L; 011B; #LATIN CAPITAL LETTER E WITH CARON
+011C; L; 011D; #LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+011E; L; 011F; #LATIN CAPITAL LETTER G WITH BREVE
+0120; L; 0121; #LATIN CAPITAL LETTER G WITH DOT ABOVE
+0122; L; 0123; #LATIN CAPITAL LETTER G WITH CEDILLA
+0124; L; 0125; #LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+0126; L; 0127; #LATIN CAPITAL LETTER H WITH STROKE
+0128; L; 0129; #LATIN CAPITAL LETTER I WITH TILDE
+012A; L; 012B; #LATIN CAPITAL LETTER I WITH MACRON
+012C; L; 012D; #LATIN CAPITAL LETTER I WITH BREVE
+012E; L; 012F; #LATIN CAPITAL LETTER I WITH OGONEK
+0130; L; 0069; #LATIN CAPITAL LETTER I WITH DOT ABOVE
+0131; E; 0069; #LATIN SMALL LETTER DOTLESS I
+0132; L; 0133; #LATIN CAPITAL LIGATURE IJ
+0134; L; 0135; #LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+0136; L; 0137; #LATIN CAPITAL LETTER K WITH CEDILLA
+0139; L; 013A; #LATIN CAPITAL LETTER L WITH ACUTE
+013B; L; 013C; #LATIN CAPITAL LETTER L WITH CEDILLA
+013D; L; 013E; #LATIN CAPITAL LETTER L WITH CARON
+013F; L; 0140; #LATIN CAPITAL LETTER L WITH MIDDLE DOT
+0141; L; 0142; #LATIN CAPITAL LETTER L WITH STROKE
+0143; L; 0144; #LATIN CAPITAL LETTER N WITH ACUTE
+0145; L; 0146; #LATIN CAPITAL LETTER N WITH CEDILLA
+0147; L; 0148; #LATIN CAPITAL LETTER N WITH CARON
+0149; E; 02BC 006E;    #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+014A; L; 014B; #LATIN CAPITAL LETTER ENG
+014C; L; 014D; #LATIN CAPITAL LETTER O WITH MACRON
+014E; L; 014F; #LATIN CAPITAL LETTER O WITH BREVE
+0150; L; 0151; #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0152; L; 0153; #LATIN CAPITAL LIGATURE OE
+0154; L; 0155; #LATIN CAPITAL LETTER R WITH ACUTE
+0156; L; 0157; #LATIN CAPITAL LETTER R WITH CEDILLA
+0158; L; 0159; #LATIN CAPITAL LETTER R WITH CARON
+015A; L; 015B; #LATIN CAPITAL LETTER S WITH ACUTE
+015C; L; 015D; #LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+015E; L; 015F; #LATIN CAPITAL LETTER S WITH CEDILLA
+0160; L; 0161; #LATIN CAPITAL LETTER S WITH CARON
+0162; L; 0163; #LATIN CAPITAL LETTER T WITH CEDILLA
+0164; L; 0165; #LATIN CAPITAL LETTER T WITH CARON
+0166; L; 0167; #LATIN CAPITAL LETTER T WITH STROKE
+0168; L; 0169; #LATIN CAPITAL LETTER U WITH TILDE
+016A; L; 016B; #LATIN CAPITAL LETTER U WITH MACRON
+016C; L; 016D; #LATIN CAPITAL LETTER U WITH BREVE
+016E; L; 016F; #LATIN CAPITAL LETTER U WITH RING ABOVE
+0170; L; 0171; #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0172; L; 0173; #LATIN CAPITAL LETTER U WITH OGONEK
+0174; L; 0175; #LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+0176; L; 0177; #LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+0178; L; 00FF; #LATIN CAPITAL LETTER Y WITH DIAERESIS
+0179; L; 017A; #LATIN CAPITAL LETTER Z WITH ACUTE
+017B; L; 017C; #LATIN CAPITAL LETTER Z WITH DOT ABOVE
+017D; L; 017E; #LATIN CAPITAL LETTER Z WITH CARON
+017F; E; 0073; #LATIN SMALL LETTER LONG S
+0181; L; 0253; #LATIN CAPITAL LETTER B WITH HOOK
+0182; L; 0183; #LATIN CAPITAL LETTER B WITH TOPBAR
+0184; L; 0185; #LATIN CAPITAL LETTER TONE SIX
+0186; L; 0254; #LATIN CAPITAL LETTER OPEN O
+0187; L; 0188; #LATIN CAPITAL LETTER C WITH HOOK
+0189; L; 0256; #LATIN CAPITAL LETTER AFRICAN D
+018A; L; 0257; #LATIN CAPITAL LETTER D WITH HOOK
+018B; L; 018C; #LATIN CAPITAL LETTER D WITH TOPBAR
+018E; L; 01DD; #LATIN CAPITAL LETTER REVERSED E
+018F; L; 0259; #LATIN CAPITAL LETTER SCHWA
+0190; L; 025B; #LATIN CAPITAL LETTER OPEN E
+0191; L; 0192; #LATIN CAPITAL LETTER F WITH HOOK
+0193; L; 0260; #LATIN CAPITAL LETTER G WITH HOOK
+0194; L; 0263; #LATIN CAPITAL LETTER GAMMA
+0196; L; 0269; #LATIN CAPITAL LETTER IOTA
+0197; L; 0268; #LATIN CAPITAL LETTER I WITH STROKE
+0198; L; 0199; #LATIN CAPITAL LETTER K WITH HOOK
+019C; L; 026F; #LATIN CAPITAL LETTER TURNED M
+019D; L; 0272; #LATIN CAPITAL LETTER N WITH LEFT HOOK
+019F; L; 0275; #LATIN CAPITAL LETTER O WITH MIDDLE TILDE
+01A0; L; 01A1; #LATIN CAPITAL LETTER O WITH HORN
+01A2; L; 01A3; #LATIN CAPITAL LETTER OI
+01A4; L; 01A5; #LATIN CAPITAL LETTER P WITH HOOK
+01A6; L; 0280; #LATIN LETTER YR
+01A7; L; 01A8; #LATIN CAPITAL LETTER TONE TWO
+01A9; L; 0283; #LATIN CAPITAL LETTER ESH
+01AC; L; 01AD; #LATIN CAPITAL LETTER T WITH HOOK
+01AE; L; 0288; #LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
+01AF; L; 01B0; #LATIN CAPITAL LETTER U WITH HORN
+01B1; L; 028A; #LATIN CAPITAL LETTER UPSILON
+01B2; L; 028B; #LATIN CAPITAL LETTER V WITH HOOK
+01B3; L; 01B4; #LATIN CAPITAL LETTER Y WITH HOOK
+01B5; L; 01B6; #LATIN CAPITAL LETTER Z WITH STROKE
+01B7; L; 0292; #LATIN CAPITAL LETTER EZH
+01B8; L; 01B9; #LATIN CAPITAL LETTER EZH REVERSED
+01BC; L; 01BD; #LATIN CAPITAL LETTER TONE FIVE
+01C4; L; 01C6; #LATIN CAPITAL LETTER DZ WITH CARON
+01C5; L; 01C6; #LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+01C7; L; 01C9; #LATIN CAPITAL LETTER LJ
+01C8; L; 01C9; #LATIN CAPITAL LETTER L WITH SMALL LETTER J
+01CA; L; 01CC; #LATIN CAPITAL LETTER NJ
+01CB; L; 01CC; #LATIN CAPITAL LETTER N WITH SMALL LETTER J
+01CD; L; 01CE; #LATIN CAPITAL LETTER A WITH CARON
+01CF; L; 01D0; #LATIN CAPITAL LETTER I WITH CARON
+01D1; L; 01D2; #LATIN CAPITAL LETTER O WITH CARON
+01D3; L; 01D4; #LATIN CAPITAL LETTER U WITH CARON
+01D5; L; 01D6; #LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+01D7; L; 01D8; #LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+01D9; L; 01DA; #LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+01DB; L; 01DC; #LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+01DE; L; 01DF; #LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+01E0; L; 01E1; #LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+01E2; L; 01E3; #LATIN CAPITAL LETTER AE WITH MACRON
+01E4; L; 01E5; #LATIN CAPITAL LETTER G WITH STROKE
+01E6; L; 01E7; #LATIN CAPITAL LETTER G WITH CARON
+01E8; L; 01E9; #LATIN CAPITAL LETTER K WITH CARON
+01EA; L; 01EB; #LATIN CAPITAL LETTER O WITH OGONEK
+01EC; L; 01ED; #LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+01EE; L; 01EF; #LATIN CAPITAL LETTER EZH WITH CARON
+01F0; E; 006A 030C;    #LATIN SMALL LETTER J WITH CARON
+01F1; L; 01F3; #LATIN CAPITAL LETTER DZ
+01F2; L; 01F3; #LATIN CAPITAL LETTER D WITH SMALL LETTER Z
+01F4; L; 01F5; #LATIN CAPITAL LETTER G WITH ACUTE
+01F6; L; 0195; #LATIN CAPITAL LETTER HWAIR
+01F7; L; 01BF; #LATIN CAPITAL LETTER WYNN
+01F8; L; 01F9; #LATIN CAPITAL LETTER N WITH GRAVE
+01FA; L; 01FB; #LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+01FC; L; 01FD; #LATIN CAPITAL LETTER AE WITH ACUTE
+01FE; L; 01FF; #LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+0200; L; 0201; #LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+0202; L; 0203; #LATIN CAPITAL LETTER A WITH INVERTED BREVE
+0204; L; 0205; #LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+0206; L; 0207; #LATIN CAPITAL LETTER E WITH INVERTED BREVE
+0208; L; 0209; #LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+020A; L; 020B; #LATIN CAPITAL LETTER I WITH INVERTED BREVE
+020C; L; 020D; #LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+020E; L; 020F; #LATIN CAPITAL LETTER O WITH INVERTED BREVE
+0210; L; 0211; #LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+0212; L; 0213; #LATIN CAPITAL LETTER R WITH INVERTED BREVE
+0214; L; 0215; #LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+0216; L; 0217; #LATIN CAPITAL LETTER U WITH INVERTED BREVE
+0218; L; 0219; #LATIN CAPITAL LETTER S WITH COMMA BELOW
+021A; L; 021B; #LATIN CAPITAL LETTER T WITH COMMA BELOW
+021C; L; 021D; #LATIN CAPITAL LETTER YOGH
+021E; L; 021F; #LATIN CAPITAL LETTER H WITH CARON
+0222; L; 0223; #LATIN CAPITAL LETTER OU
+0224; L; 0225; #LATIN CAPITAL LETTER Z WITH HOOK
+0226; L; 0227; #LATIN CAPITAL LETTER A WITH DOT ABOVE
+0228; L; 0229; #LATIN CAPITAL LETTER E WITH CEDILLA
+022A; L; 022B; #LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+022C; L; 022D; #LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+022E; L; 022F; #LATIN CAPITAL LETTER O WITH DOT ABOVE
+0230; L; 0231; #LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+0232; L; 0233; #LATIN CAPITAL LETTER Y WITH MACRON
+0345; E; 03B9; #COMBINING GREEK YPOGEGRAMMENI
+0386; L; 03AC; #GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388; L; 03AD; #GREEK CAPITAL LETTER EPSILON WITH TONOS
+0389; L; 03AE; #GREEK CAPITAL LETTER ETA WITH TONOS
+038A; L; 03AF; #GREEK CAPITAL LETTER IOTA WITH TONOS
+038C; L; 03CC; #GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E; L; 03CD; #GREEK CAPITAL LETTER UPSILON WITH TONOS
+038F; L; 03CE; #GREEK CAPITAL LETTER OMEGA WITH TONOS
+0390; E; 03B9 0308 0301;       #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+0391; L; 03B1; #GREEK CAPITAL LETTER ALPHA
+0392; L; 03B2; #GREEK CAPITAL LETTER BETA
+0393; L; 03B3; #GREEK CAPITAL LETTER GAMMA
+0394; L; 03B4; #GREEK CAPITAL LETTER DELTA
+0395; L; 03B5; #GREEK CAPITAL LETTER EPSILON
+0396; L; 03B6; #GREEK CAPITAL LETTER ZETA
+0397; L; 03B7; #GREEK CAPITAL LETTER ETA
+0398; L; 03B8; #GREEK CAPITAL LETTER THETA
+0399; L; 03B9; #GREEK CAPITAL LETTER IOTA
+039A; L; 03BA; #GREEK CAPITAL LETTER KAPPA
+039B; L; 03BB; #GREEK CAPITAL LETTER LAMDA
+039C; L; 03BC; #GREEK CAPITAL LETTER MU
+039D; L; 03BD; #GREEK CAPITAL LETTER NU
+039E; L; 03BE; #GREEK CAPITAL LETTER XI
+039F; L; 03BF; #GREEK CAPITAL LETTER OMICRON
+03A0; L; 03C0; #GREEK CAPITAL LETTER PI
+03A1; L; 03C1; #GREEK CAPITAL LETTER RHO
+03A3; E; 03C2; #GREEK CAPITAL LETTER SIGMA
+03A4; L; 03C4; #GREEK CAPITAL LETTER TAU
+03A5; L; 03C5; #GREEK CAPITAL LETTER UPSILON
+03A6; L; 03C6; #GREEK CAPITAL LETTER PHI
+03A7; L; 03C7; #GREEK CAPITAL LETTER CHI
+03A8; L; 03C8; #GREEK CAPITAL LETTER PSI
+03A9; L; 03C9; #GREEK CAPITAL LETTER OMEGA
+03AA; L; 03CA; #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+03AB; L; 03CB; #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+03B0; E; 03C5 0308 0301;       #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03C2; L; 03C2; #GREEK SMALL LETTER FINAL SIGMA
+03C3; E; 03C2; #GREEK SMALL LETTER SIGMA
+03D0; E; 03B2; #GREEK BETA SYMBOL
+03D1; E; 03B8; #GREEK THETA SYMBOL
+03D5; E; 03C6; #GREEK PHI SYMBOL
+03D6; E; 03C0; #GREEK PI SYMBOL
+03DA; L; 03DB; #GREEK LETTER STIGMA
+03DC; L; 03DD; #GREEK LETTER DIGAMMA
+03DE; L; 03DF; #GREEK LETTER KOPPA
+03E0; L; 03E1; #GREEK LETTER SAMPI
+03E2; L; 03E3; #COPTIC CAPITAL LETTER SHEI
+03E4; L; 03E5; #COPTIC CAPITAL LETTER FEI
+03E6; L; 03E7; #COPTIC CAPITAL LETTER KHEI
+03E8; L; 03E9; #COPTIC CAPITAL LETTER HORI
+03EA; L; 03EB; #COPTIC CAPITAL LETTER GANGIA
+03EC; L; 03ED; #COPTIC CAPITAL LETTER SHIMA
+03EE; L; 03EF; #COPTIC CAPITAL LETTER DEI
+03F0; E; 03BA; #GREEK KAPPA SYMBOL
+03F1; E; 03C1; #GREEK RHO SYMBOL
+03F2; E; 03C2; #GREEK LUNATE SIGMA SYMBOL
+0400; L; 0450; #CYRILLIC CAPITAL LETTER IE WITH GRAVE
+0401; L; 0451; #CYRILLIC CAPITAL LETTER IO
+0402; L; 0452; #CYRILLIC CAPITAL LETTER DJE
+0403; L; 0453; #CYRILLIC CAPITAL LETTER GJE
+0404; L; 0454; #CYRILLIC CAPITAL LETTER UKRAINIAN IE
+0405; L; 0455; #CYRILLIC CAPITAL LETTER DZE
+0406; L; 0456; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+0407; L; 0457; #CYRILLIC CAPITAL LETTER YI
+0408; L; 0458; #CYRILLIC CAPITAL LETTER JE
+0409; L; 0459; #CYRILLIC CAPITAL LETTER LJE
+040A; L; 045A; #CYRILLIC CAPITAL LETTER NJE
+040B; L; 045B; #CYRILLIC CAPITAL LETTER TSHE
+040C; L; 045C; #CYRILLIC CAPITAL LETTER KJE
+040D; L; 045D; #CYRILLIC CAPITAL LETTER I WITH GRAVE
+040E; L; 045E; #CYRILLIC CAPITAL LETTER SHORT U
+040F; L; 045F; #CYRILLIC CAPITAL LETTER DZHE
+0410; L; 0430; #CYRILLIC CAPITAL LETTER A
+0411; L; 0431; #CYRILLIC CAPITAL LETTER BE
+0412; L; 0432; #CYRILLIC CAPITAL LETTER VE
+0413; L; 0433; #CYRILLIC CAPITAL LETTER GHE
+0414; L; 0434; #CYRILLIC CAPITAL LETTER DE
+0415; L; 0435; #CYRILLIC CAPITAL LETTER IE
+0416; L; 0436; #CYRILLIC CAPITAL LETTER ZHE
+0417; L; 0437; #CYRILLIC CAPITAL LETTER ZE
+0418; L; 0438; #CYRILLIC CAPITAL LETTER I
+0419; L; 0439; #CYRILLIC CAPITAL LETTER SHORT I
+041A; L; 043A; #CYRILLIC CAPITAL LETTER KA
+041B; L; 043B; #CYRILLIC CAPITAL LETTER EL
+041C; L; 043C; #CYRILLIC CAPITAL LETTER EM
+041D; L; 043D; #CYRILLIC CAPITAL LETTER EN
+041E; L; 043E; #CYRILLIC CAPITAL LETTER O
+041F; L; 043F; #CYRILLIC CAPITAL LETTER PE
+0420; L; 0440; #CYRILLIC CAPITAL LETTER ER
+0421; L; 0441; #CYRILLIC CAPITAL LETTER ES
+0422; L; 0442; #CYRILLIC CAPITAL LETTER TE
+0423; L; 0443; #CYRILLIC CAPITAL LETTER U
+0424; L; 0444; #CYRILLIC CAPITAL LETTER EF
+0425; L; 0445; #CYRILLIC CAPITAL LETTER HA
+0426; L; 0446; #CYRILLIC CAPITAL LETTER TSE
+0427; L; 0447; #CYRILLIC CAPITAL LETTER CHE
+0428; L; 0448; #CYRILLIC CAPITAL LETTER SHA
+0429; L; 0449; #CYRILLIC CAPITAL LETTER SHCHA
+042A; L; 044A; #CYRILLIC CAPITAL LETTER HARD SIGN
+042B; L; 044B; #CYRILLIC CAPITAL LETTER YERU
+042C; L; 044C; #CYRILLIC CAPITAL LETTER SOFT SIGN
+042D; L; 044D; #CYRILLIC CAPITAL LETTER E
+042E; L; 044E; #CYRILLIC CAPITAL LETTER YU
+042F; L; 044F; #CYRILLIC CAPITAL LETTER YA
+0460; L; 0461; #CYRILLIC CAPITAL LETTER OMEGA
+0462; L; 0463; #CYRILLIC CAPITAL LETTER YAT
+0464; L; 0465; #CYRILLIC CAPITAL LETTER IOTIFIED E
+0466; L; 0467; #CYRILLIC CAPITAL LETTER LITTLE YUS
+0468; L; 0469; #CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
+046A; L; 046B; #CYRILLIC CAPITAL LETTER BIG YUS
+046C; L; 046D; #CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
+046E; L; 046F; #CYRILLIC CAPITAL LETTER KSI
+0470; L; 0471; #CYRILLIC CAPITAL LETTER PSI
+0472; L; 0473; #CYRILLIC CAPITAL LETTER FITA
+0474; L; 0475; #CYRILLIC CAPITAL LETTER IZHITSA
+0476; L; 0477; #CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+0478; L; 0479; #CYRILLIC CAPITAL LETTER UK
+047A; L; 047B; #CYRILLIC CAPITAL LETTER ROUND OMEGA
+047C; L; 047D; #CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
+047E; L; 047F; #CYRILLIC CAPITAL LETTER OT
+0480; L; 0481; #CYRILLIC CAPITAL LETTER KOPPA
+048C; L; 048D; #CYRILLIC CAPITAL LETTER SEMISOFT SIGN
+048E; L; 048F; #CYRILLIC CAPITAL LETTER ER WITH TICK
+0490; L; 0491; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+0492; L; 0493; #CYRILLIC CAPITAL LETTER GHE WITH STROKE
+0494; L; 0495; #CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
+0496; L; 0497; #CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
+0498; L; 0499; #CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
+049A; L; 049B; #CYRILLIC CAPITAL LETTER KA WITH DESCENDER
+049C; L; 049D; #CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
+049E; L; 049F; #CYRILLIC CAPITAL LETTER KA WITH STROKE
+04A0; L; 04A1; #CYRILLIC CAPITAL LETTER BASHKIR KA
+04A2; L; 04A3; #CYRILLIC CAPITAL LETTER EN WITH DESCENDER
+04A4; L; 04A5; #CYRILLIC CAPITAL LIGATURE EN GHE
+04A6; L; 04A7; #CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
+04A8; L; 04A9; #CYRILLIC CAPITAL LETTER ABKHASIAN HA
+04AA; L; 04AB; #CYRILLIC CAPITAL LETTER ES WITH DESCENDER
+04AC; L; 04AD; #CYRILLIC CAPITAL LETTER TE WITH DESCENDER
+04AE; L; 04AF; #CYRILLIC CAPITAL LETTER STRAIGHT U
+04B0; L; 04B1; #CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+04B2; L; 04B3; #CYRILLIC CAPITAL LETTER HA WITH DESCENDER
+04B4; L; 04B5; #CYRILLIC CAPITAL LIGATURE TE TSE
+04B6; L; 04B7; #CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
+04B8; L; 04B9; #CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
+04BA; L; 04BB; #CYRILLIC CAPITAL LETTER SHHA
+04BC; L; 04BD; #CYRILLIC CAPITAL LETTER ABKHASIAN CHE
+04BE; L; 04BF; #CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
+04C1; L; 04C2; #CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+04C3; L; 04C4; #CYRILLIC CAPITAL LETTER KA WITH HOOK
+04C7; L; 04C8; #CYRILLIC CAPITAL LETTER EN WITH HOOK
+04CB; L; 04CC; #CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
+04D0; L; 04D1; #CYRILLIC CAPITAL LETTER A WITH BREVE
+04D2; L; 04D3; #CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+04D4; L; 04D5; #CYRILLIC CAPITAL LIGATURE A IE
+04D6; L; 04D7; #CYRILLIC CAPITAL LETTER IE WITH BREVE
+04D8; L; 04D9; #CYRILLIC CAPITAL LETTER SCHWA
+04DA; L; 04DB; #CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+04DC; L; 04DD; #CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+04DE; L; 04DF; #CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+04E0; L; 04E1; #CYRILLIC CAPITAL LETTER ABKHASIAN DZE
+04E2; L; 04E3; #CYRILLIC CAPITAL LETTER I WITH MACRON
+04E4; L; 04E5; #CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+04E6; L; 04E7; #CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+04E8; L; 04E9; #CYRILLIC CAPITAL LETTER BARRED O
+04EA; L; 04EB; #CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+04EC; L; 04ED; #CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+04EE; L; 04EF; #CYRILLIC CAPITAL LETTER U WITH MACRON
+04F0; L; 04F1; #CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+04F2; L; 04F3; #CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+04F4; L; 04F5; #CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+04F8; L; 04F9; #CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+0531; L; 0561; #ARMENIAN CAPITAL LETTER AYB
+0532; L; 0562; #ARMENIAN CAPITAL LETTER BEN
+0533; L; 0563; #ARMENIAN CAPITAL LETTER GIM
+0534; L; 0564; #ARMENIAN CAPITAL LETTER DA
+0535; L; 0565; #ARMENIAN CAPITAL LETTER ECH
+0536; L; 0566; #ARMENIAN CAPITAL LETTER ZA
+0537; L; 0567; #ARMENIAN CAPITAL LETTER EH
+0538; L; 0568; #ARMENIAN CAPITAL LETTER ET
+0539; L; 0569; #ARMENIAN CAPITAL LETTER TO
+053A; L; 056A; #ARMENIAN CAPITAL LETTER ZHE
+053B; L; 056B; #ARMENIAN CAPITAL LETTER INI
+053C; L; 056C; #ARMENIAN CAPITAL LETTER LIWN
+053D; L; 056D; #ARMENIAN CAPITAL LETTER XEH
+053E; L; 056E; #ARMENIAN CAPITAL LETTER CA
+053F; L; 056F; #ARMENIAN CAPITAL LETTER KEN
+0540; L; 0570; #ARMENIAN CAPITAL LETTER HO
+0541; L; 0571; #ARMENIAN CAPITAL LETTER JA
+0542; L; 0572; #ARMENIAN CAPITAL LETTER GHAD
+0543; L; 0573; #ARMENIAN CAPITAL LETTER CHEH
+0544; L; 0574; #ARMENIAN CAPITAL LETTER MEN
+0545; L; 0575; #ARMENIAN CAPITAL LETTER YI
+0546; L; 0576; #ARMENIAN CAPITAL LETTER NOW
+0547; L; 0577; #ARMENIAN CAPITAL LETTER SHA
+0548; L; 0578; #ARMENIAN CAPITAL LETTER VO
+0549; L; 0579; #ARMENIAN CAPITAL LETTER CHA
+054A; L; 057A; #ARMENIAN CAPITAL LETTER PEH
+054B; L; 057B; #ARMENIAN CAPITAL LETTER JHEH
+054C; L; 057C; #ARMENIAN CAPITAL LETTER RA
+054D; L; 057D; #ARMENIAN CAPITAL LETTER SEH
+054E; L; 057E; #ARMENIAN CAPITAL LETTER VEW
+054F; L; 057F; #ARMENIAN CAPITAL LETTER TIWN
+0550; L; 0580; #ARMENIAN CAPITAL LETTER REH
+0551; L; 0581; #ARMENIAN CAPITAL LETTER CO
+0552; L; 0582; #ARMENIAN CAPITAL LETTER YIWN
+0553; L; 0583; #ARMENIAN CAPITAL LETTER PIWR
+0554; L; 0584; #ARMENIAN CAPITAL LETTER KEH
+0555; L; 0585; #ARMENIAN CAPITAL LETTER OH
+0556; L; 0586; #ARMENIAN CAPITAL LETTER FEH
+0587; E; 0565 0582;    #ARMENIAN SMALL LIGATURE ECH YIWN
+1E00; L; 1E01; #LATIN CAPITAL LETTER A WITH RING BELOW
+1E02; L; 1E03; #LATIN CAPITAL LETTER B WITH DOT ABOVE
+1E04; L; 1E05; #LATIN CAPITAL LETTER B WITH DOT BELOW
+1E06; L; 1E07; #LATIN CAPITAL LETTER B WITH LINE BELOW
+1E08; L; 1E09; #LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+1E0A; L; 1E0B; #LATIN CAPITAL LETTER D WITH DOT ABOVE
+1E0C; L; 1E0D; #LATIN CAPITAL LETTER D WITH DOT BELOW
+1E0E; L; 1E0F; #LATIN CAPITAL LETTER D WITH LINE BELOW
+1E10; L; 1E11; #LATIN CAPITAL LETTER D WITH CEDILLA
+1E12; L; 1E13; #LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+1E14; L; 1E15; #LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+1E16; L; 1E17; #LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+1E18; L; 1E19; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+1E1A; L; 1E1B; #LATIN CAPITAL LETTER E WITH TILDE BELOW
+1E1C; L; 1E1D; #LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+1E1E; L; 1E1F; #LATIN CAPITAL LETTER F WITH DOT ABOVE
+1E20; L; 1E21; #LATIN CAPITAL LETTER G WITH MACRON
+1E22; L; 1E23; #LATIN CAPITAL LETTER H WITH DOT ABOVE
+1E24; L; 1E25; #LATIN CAPITAL LETTER H WITH DOT BELOW
+1E26; L; 1E27; #LATIN CAPITAL LETTER H WITH DIAERESIS
+1E28; L; 1E29; #LATIN CAPITAL LETTER H WITH CEDILLA
+1E2A; L; 1E2B; #LATIN CAPITAL LETTER H WITH BREVE BELOW
+1E2C; L; 1E2D; #LATIN CAPITAL LETTER I WITH TILDE BELOW
+1E2E; L; 1E2F; #LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+1E30; L; 1E31; #LATIN CAPITAL LETTER K WITH ACUTE
+1E32; L; 1E33; #LATIN CAPITAL LETTER K WITH DOT BELOW
+1E34; L; 1E35; #LATIN CAPITAL LETTER K WITH LINE BELOW
+1E36; L; 1E37; #LATIN CAPITAL LETTER L WITH DOT BELOW
+1E38; L; 1E39; #LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+1E3A; L; 1E3B; #LATIN CAPITAL LETTER L WITH LINE BELOW
+1E3C; L; 1E3D; #LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+1E3E; L; 1E3F; #LATIN CAPITAL LETTER M WITH ACUTE
+1E40; L; 1E41; #LATIN CAPITAL LETTER M WITH DOT ABOVE
+1E42; L; 1E43; #LATIN CAPITAL LETTER M WITH DOT BELOW
+1E44; L; 1E45; #LATIN CAPITAL LETTER N WITH DOT ABOVE
+1E46; L; 1E47; #LATIN CAPITAL LETTER N WITH DOT BELOW
+1E48; L; 1E49; #LATIN CAPITAL LETTER N WITH LINE BELOW
+1E4A; L; 1E4B; #LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+1E4C; L; 1E4D; #LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+1E4E; L; 1E4F; #LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+1E50; L; 1E51; #LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+1E52; L; 1E53; #LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+1E54; L; 1E55; #LATIN CAPITAL LETTER P WITH ACUTE
+1E56; L; 1E57; #LATIN CAPITAL LETTER P WITH DOT ABOVE
+1E58; L; 1E59; #LATIN CAPITAL LETTER R WITH DOT ABOVE
+1E5A; L; 1E5B; #LATIN CAPITAL LETTER R WITH DOT BELOW
+1E5C; L; 1E5D; #LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+1E5E; L; 1E5F; #LATIN CAPITAL LETTER R WITH LINE BELOW
+1E60; L; 1E61; #LATIN CAPITAL LETTER S WITH DOT ABOVE
+1E62; L; 1E63; #LATIN CAPITAL LETTER S WITH DOT BELOW
+1E64; L; 1E65; #LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+1E66; L; 1E67; #LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+1E68; L; 1E69; #LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+1E6A; L; 1E6B; #LATIN CAPITAL LETTER T WITH DOT ABOVE
+1E6C; L; 1E6D; #LATIN CAPITAL LETTER T WITH DOT BELOW
+1E6E; L; 1E6F; #LATIN CAPITAL LETTER T WITH LINE BELOW
+1E70; L; 1E71; #LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+1E72; L; 1E73; #LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+1E74; L; 1E75; #LATIN CAPITAL LETTER U WITH TILDE BELOW
+1E76; L; 1E77; #LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+1E78; L; 1E79; #LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+1E7A; L; 1E7B; #LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+1E7C; L; 1E7D; #LATIN CAPITAL LETTER V WITH TILDE
+1E7E; L; 1E7F; #LATIN CAPITAL LETTER V WITH DOT BELOW
+1E80; L; 1E81; #LATIN CAPITAL LETTER W WITH GRAVE
+1E82; L; 1E83; #LATIN CAPITAL LETTER W WITH ACUTE
+1E84; L; 1E85; #LATIN CAPITAL LETTER W WITH DIAERESIS
+1E86; L; 1E87; #LATIN CAPITAL LETTER W WITH DOT ABOVE
+1E88; L; 1E89; #LATIN CAPITAL LETTER W WITH DOT BELOW
+1E8A; L; 1E8B; #LATIN CAPITAL LETTER X WITH DOT ABOVE
+1E8C; L; 1E8D; #LATIN CAPITAL LETTER X WITH DIAERESIS
+1E8E; L; 1E8F; #LATIN CAPITAL LETTER Y WITH DOT ABOVE
+1E90; L; 1E91; #LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+1E92; L; 1E93; #LATIN CAPITAL LETTER Z WITH DOT BELOW
+1E94; L; 1E95; #LATIN CAPITAL LETTER Z WITH LINE BELOW
+1E96; E; 0068 0331;    #LATIN SMALL LETTER H WITH LINE BELOW
+1E97; E; 0074 0308;    #LATIN SMALL LETTER T WITH DIAERESIS
+1E98; E; 0077 030A;    #LATIN SMALL LETTER W WITH RING ABOVE
+1E99; E; 0079 030A;    #LATIN SMALL LETTER Y WITH RING ABOVE
+1E9A; E; 0061 02BE;    #LATIN SMALL LETTER A WITH RIGHT HALF RING
+1E9B; E; 1E61; #LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0; L; 1EA1; #LATIN CAPITAL LETTER A WITH DOT BELOW
+1EA2; L; 1EA3; #LATIN CAPITAL LETTER A WITH HOOK ABOVE
+1EA4; L; 1EA5; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+1EA6; L; 1EA7; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+1EA8; L; 1EA9; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+1EAA; L; 1EAB; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+1EAC; L; 1EAD; #LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+1EAE; L; 1EAF; #LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+1EB0; L; 1EB1; #LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+1EB2; L; 1EB3; #LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+1EB4; L; 1EB5; #LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+1EB6; L; 1EB7; #LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+1EB8; L; 1EB9; #LATIN CAPITAL LETTER E WITH DOT BELOW
+1EBA; L; 1EBB; #LATIN CAPITAL LETTER E WITH HOOK ABOVE
+1EBC; L; 1EBD; #LATIN CAPITAL LETTER E WITH TILDE
+1EBE; L; 1EBF; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+1EC0; L; 1EC1; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+1EC2; L; 1EC3; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+1EC4; L; 1EC5; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+1EC6; L; 1EC7; #LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+1EC8; L; 1EC9; #LATIN CAPITAL LETTER I WITH HOOK ABOVE
+1ECA; L; 1ECB; #LATIN CAPITAL LETTER I WITH DOT BELOW
+1ECC; L; 1ECD; #LATIN CAPITAL LETTER O WITH DOT BELOW
+1ECE; L; 1ECF; #LATIN CAPITAL LETTER O WITH HOOK ABOVE
+1ED0; L; 1ED1; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+1ED2; L; 1ED3; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+1ED4; L; 1ED5; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+1ED6; L; 1ED7; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+1ED8; L; 1ED9; #LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+1EDA; L; 1EDB; #LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+1EDC; L; 1EDD; #LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+1EDE; L; 1EDF; #LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+1EE0; L; 1EE1; #LATIN CAPITAL LETTER O WITH HORN AND TILDE
+1EE2; L; 1EE3; #LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+1EE4; L; 1EE5; #LATIN CAPITAL LETTER U WITH DOT BELOW
+1EE6; L; 1EE7; #LATIN CAPITAL LETTER U WITH HOOK ABOVE
+1EE8; L; 1EE9; #LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+1EEA; L; 1EEB; #LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+1EEC; L; 1EED; #LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+1EEE; L; 1EEF; #LATIN CAPITAL LETTER U WITH HORN AND TILDE
+1EF0; L; 1EF1; #LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+1EF2; L; 1EF3; #LATIN CAPITAL LETTER Y WITH GRAVE
+1EF4; L; 1EF5; #LATIN CAPITAL LETTER Y WITH DOT BELOW
+1EF6; L; 1EF7; #LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+1EF8; L; 1EF9; #LATIN CAPITAL LETTER Y WITH TILDE
+1F08; L; 1F00; #GREEK CAPITAL LETTER ALPHA WITH PSILI
+1F09; L; 1F01; #GREEK CAPITAL LETTER ALPHA WITH DASIA
+1F0A; L; 1F02; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+1F0B; L; 1F03; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+1F0C; L; 1F04; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+1F0D; L; 1F05; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+1F0E; L; 1F06; #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+1F0F; L; 1F07; #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+1F18; L; 1F10; #GREEK CAPITAL LETTER EPSILON WITH PSILI
+1F19; L; 1F11; #GREEK CAPITAL LETTER EPSILON WITH DASIA
+1F1A; L; 1F12; #GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+1F1B; L; 1F13; #GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+1F1C; L; 1F14; #GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+1F1D; L; 1F15; #GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F28; L; 1F20; #GREEK CAPITAL LETTER ETA WITH PSILI
+1F29; L; 1F21; #GREEK CAPITAL LETTER ETA WITH DASIA
+1F2A; L; 1F22; #GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+1F2B; L; 1F23; #GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+1F2C; L; 1F24; #GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+1F2D; L; 1F25; #GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+1F2E; L; 1F26; #GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+1F2F; L; 1F27; #GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+1F38; L; 1F30; #GREEK CAPITAL LETTER IOTA WITH PSILI
+1F39; L; 1F31; #GREEK CAPITAL LETTER IOTA WITH DASIA
+1F3A; L; 1F32; #GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+1F3B; L; 1F33; #GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+1F3C; L; 1F34; #GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+1F3D; L; 1F35; #GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+1F3E; L; 1F36; #GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+1F3F; L; 1F37; #GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+1F48; L; 1F40; #GREEK CAPITAL LETTER OMICRON WITH PSILI
+1F49; L; 1F41; #GREEK CAPITAL LETTER OMICRON WITH DASIA
+1F4A; L; 1F42; #GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+1F4B; L; 1F43; #GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+1F4C; L; 1F44; #GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+1F4D; L; 1F45; #GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50; E; 03C5 0313;    #GREEK SMALL LETTER UPSILON WITH PSILI
+1F52; E; 03C5 0313 0300;       #GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+1F54; E; 03C5 0313 0301;       #GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+1F56; E; 03C5 0313 0342;       #GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+1F59; L; 1F51; #GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B; L; 1F53; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D; L; 1F55; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F; L; 1F57; #GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F68; L; 1F60; #GREEK CAPITAL LETTER OMEGA WITH PSILI
+1F69; L; 1F61; #GREEK CAPITAL LETTER OMEGA WITH DASIA
+1F6A; L; 1F62; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+1F6B; L; 1F63; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+1F6C; L; 1F64; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+1F6D; L; 1F65; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+1F6E; L; 1F66; #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+1F6F; L; 1F67; #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+1F80; E; 1F00 03B9;    #GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+1F81; E; 1F01 03B9;    #GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+1F82; E; 1F02 03B9;    #GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F83; E; 1F03 03B9;    #GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F84; E; 1F04 03B9;    #GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F85; E; 1F05 03B9;    #GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F86; E; 1F06 03B9;    #GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F87; E; 1F07 03B9;    #GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F88; E; 1F00 03B9;    #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+1F89; E; 1F01 03B9;    #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+1F8A; E; 1F02 03B9;    #GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F8B; E; 1F03 03B9;    #GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F8C; E; 1F04 03B9;    #GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F8D; E; 1F05 03B9;    #GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F8E; E; 1F06 03B9;    #GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F8F; E; 1F07 03B9;    #GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1F90; E; 1F20 03B9;    #GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+1F91; E; 1F21 03B9;    #GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+1F92; E; 1F22 03B9;    #GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1F93; E; 1F23 03B9;    #GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1F94; E; 1F24 03B9;    #GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1F95; E; 1F25 03B9;    #GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1F96; E; 1F26 03B9;    #GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1F97; E; 1F27 03B9;    #GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1F98; E; 1F20 03B9;    #GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+1F99; E; 1F21 03B9;    #GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+1F9A; E; 1F22 03B9;    #GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1F9B; E; 1F23 03B9;    #GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1F9C; E; 1F24 03B9;    #GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1F9D; E; 1F25 03B9;    #GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1F9E; E; 1F26 03B9;    #GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1F9F; E; 1F27 03B9;    #GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FA0; E; 1F60 03B9;    #GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+1FA1; E; 1F61 03B9;    #GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+1FA2; E; 1F62 03B9;    #GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+1FA3; E; 1F63 03B9;    #GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+1FA4; E; 1F64 03B9;    #GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+1FA5; E; 1F65 03B9;    #GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+1FA6; E; 1F66 03B9;    #GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+1FA7; E; 1F67 03B9;    #GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+1FA8; E; 1F60 03B9;    #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+1FA9; E; 1F61 03B9;    #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+1FAA; E; 1F62 03B9;    #GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+1FAB; E; 1F63 03B9;    #GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+1FAC; E; 1F64 03B9;    #GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+1FAD; E; 1F65 03B9;    #GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+1FAE; E; 1F66 03B9;    #GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+1FAF; E; 1F67 03B9;    #GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+1FB2; E; 1F70 03B9;    #GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+1FB3; E; 03B1 03B9;    #GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+1FB4; E; 03AC 03B9;    #GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6; E; 03B1 0342;    #GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+1FB7; E; 03B1 0342 03B9;       #GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FB8; L; 1FB0; #GREEK CAPITAL LETTER ALPHA WITH VRACHY
+1FB9; L; 1FB1; #GREEK CAPITAL LETTER ALPHA WITH MACRON
+1FBA; L; 1F70; #GREEK CAPITAL LETTER ALPHA WITH VARIA
+1FBB; L; 1F71; #GREEK CAPITAL LETTER ALPHA WITH OXIA
+1FBC; E; 03B1 03B9;    #GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE; E; 03B9; #GREEK PROSGEGRAMMENI
+1FC2; E; 1F74 03B9;    #GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+1FC3; E; 03B7 03B9;    #GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+1FC4; E; 03AE 03B9;    #GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6; E; 03B7 0342;    #GREEK SMALL LETTER ETA WITH PERISPOMENI
+1FC7; E; 03B7 0342 03B9;       #GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FC8; L; 1F72; #GREEK CAPITAL LETTER EPSILON WITH VARIA
+1FC9; L; 1F73; #GREEK CAPITAL LETTER EPSILON WITH OXIA
+1FCA; L; 1F74; #GREEK CAPITAL LETTER ETA WITH VARIA
+1FCB; L; 1F75; #GREEK CAPITAL LETTER ETA WITH OXIA
+1FCC; E; 03B7 03B9;    #GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD2; E; 03B9 0308 0300;       #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+1FD3; E; 03B9 0308 0301;       #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6; E; 03B9 0342;    #GREEK SMALL LETTER IOTA WITH PERISPOMENI
+1FD7; E; 03B9 0308 0342;       #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+1FD8; L; 1FD0; #GREEK CAPITAL LETTER IOTA WITH VRACHY
+1FD9; L; 1FD1; #GREEK CAPITAL LETTER IOTA WITH MACRON
+1FDA; L; 1F76; #GREEK CAPITAL LETTER IOTA WITH VARIA
+1FDB; L; 1F77; #GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE2; E; 03C5 0308 0300;       #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+1FE3; E; 03C5 0308 0301;       #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
+1FE4; E; 03C1 0313;    #GREEK SMALL LETTER RHO WITH PSILI
+1FE6; E; 03C5 0342;    #GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+1FE7; E; 03C5 0308 0342;       #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+1FE8; L; 1FE0; #GREEK CAPITAL LETTER UPSILON WITH VRACHY
+1FE9; L; 1FE1; #GREEK CAPITAL LETTER UPSILON WITH MACRON
+1FEA; L; 1F7A; #GREEK CAPITAL LETTER UPSILON WITH VARIA
+1FEB; L; 1F7B; #GREEK CAPITAL LETTER UPSILON WITH OXIA
+1FEC; L; 1FE5; #GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2; E; 1F7C 03B9;    #GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+1FF3; E; 03C9 03B9;    #GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+1FF4; E; 03CE 03B9;    #GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6; E; 03C9 0342;    #GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+1FF7; E; 03C9 0342 03B9;       #GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+1FF8; L; 1F78; #GREEK CAPITAL LETTER OMICRON WITH VARIA
+1FF9; L; 1F79; #GREEK CAPITAL LETTER OMICRON WITH OXIA
+1FFA; L; 1F7C; #GREEK CAPITAL LETTER OMEGA WITH VARIA
+1FFB; L; 1F7D; #GREEK CAPITAL LETTER OMEGA WITH OXIA
+1FFC; E; 03C9 03B9;    #GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+2126; L; 03C9; #OHM SIGN
+212A; L; 006B; #KELVIN SIGN
+212B; L; 00E5; #ANGSTROM SIGN
+2160; L; 2170; #ROMAN NUMERAL ONE
+2161; L; 2171; #ROMAN NUMERAL TWO
+2162; L; 2172; #ROMAN NUMERAL THREE
+2163; L; 2173; #ROMAN NUMERAL FOUR
+2164; L; 2174; #ROMAN NUMERAL FIVE
+2165; L; 2175; #ROMAN NUMERAL SIX
+2166; L; 2176; #ROMAN NUMERAL SEVEN
+2167; L; 2177; #ROMAN NUMERAL EIGHT
+2168; L; 2178; #ROMAN NUMERAL NINE
+2169; L; 2179; #ROMAN NUMERAL TEN
+216A; L; 217A; #ROMAN NUMERAL ELEVEN
+216B; L; 217B; #ROMAN NUMERAL TWELVE
+216C; L; 217C; #ROMAN NUMERAL FIFTY
+216D; L; 217D; #ROMAN NUMERAL ONE HUNDRED
+216E; L; 217E; #ROMAN NUMERAL FIVE HUNDRED
+216F; L; 217F; #ROMAN NUMERAL ONE THOUSAND
+24B6; L; 24D0; #CIRCLED LATIN CAPITAL LETTER A
+24B7; L; 24D1; #CIRCLED LATIN CAPITAL LETTER B
+24B8; L; 24D2; #CIRCLED LATIN CAPITAL LETTER C
+24B9; L; 24D3; #CIRCLED LATIN CAPITAL LETTER D
+24BA; L; 24D4; #CIRCLED LATIN CAPITAL LETTER E
+24BB; L; 24D5; #CIRCLED LATIN CAPITAL LETTER F
+24BC; L; 24D6; #CIRCLED LATIN CAPITAL LETTER G
+24BD; L; 24D7; #CIRCLED LATIN CAPITAL LETTER H
+24BE; L; 24D8; #CIRCLED LATIN CAPITAL LETTER I
+24BF; L; 24D9; #CIRCLED LATIN CAPITAL LETTER J
+24C0; L; 24DA; #CIRCLED LATIN CAPITAL LETTER K
+24C1; L; 24DB; #CIRCLED LATIN CAPITAL LETTER L
+24C2; L; 24DC; #CIRCLED LATIN CAPITAL LETTER M
+24C3; L; 24DD; #CIRCLED LATIN CAPITAL LETTER N
+24C4; L; 24DE; #CIRCLED LATIN CAPITAL LETTER O
+24C5; L; 24DF; #CIRCLED LATIN CAPITAL LETTER P
+24C6; L; 24E0; #CIRCLED LATIN CAPITAL LETTER Q
+24C7; L; 24E1; #CIRCLED LATIN CAPITAL LETTER R
+24C8; L; 24E2; #CIRCLED LATIN CAPITAL LETTER S
+24C9; L; 24E3; #CIRCLED LATIN CAPITAL LETTER T
+24CA; L; 24E4; #CIRCLED LATIN CAPITAL LETTER U
+24CB; L; 24E5; #CIRCLED LATIN CAPITAL LETTER V
+24CC; L; 24E6; #CIRCLED LATIN CAPITAL LETTER W
+24CD; L; 24E7; #CIRCLED LATIN CAPITAL LETTER X
+24CE; L; 24E8; #CIRCLED LATIN CAPITAL LETTER Y
+24CF; L; 24E9; #CIRCLED LATIN CAPITAL LETTER Z
+FB00; E; 0066 0066;    #LATIN SMALL LIGATURE FF
+FB01; E; 0066 0069;    #LATIN SMALL LIGATURE FI
+FB02; E; 0066 006C;    #LATIN SMALL LIGATURE FL
+FB03; E; 0066 0066 0069;       #LATIN SMALL LIGATURE FFI
+FB04; E; 0066 0066 006C;       #LATIN SMALL LIGATURE FFL
+FB05; E; 0073 0074;    #LATIN SMALL LIGATURE LONG S T
+FB06; E; 0073 0074;    #LATIN SMALL LIGATURE ST
+FB13; E; 0574 0576;    #ARMENIAN SMALL LIGATURE MEN NOW
+FB14; E; 0574 0565;    #ARMENIAN SMALL LIGATURE MEN ECH
+FB15; E; 0574 056B;    #ARMENIAN SMALL LIGATURE MEN INI
+FB16; E; 057E 0576;    #ARMENIAN SMALL LIGATURE VEW NOW
+FB17; E; 0574 056D;    #ARMENIAN SMALL LIGATURE MEN XEH
+FF21; L; FF41; #FULLWIDTH LATIN CAPITAL LETTER A
+FF22; L; FF42; #FULLWIDTH LATIN CAPITAL LETTER B
+FF23; L; FF43; #FULLWIDTH LATIN CAPITAL LETTER C
+FF24; L; FF44; #FULLWIDTH LATIN CAPITAL LETTER D
+FF25; L; FF45; #FULLWIDTH LATIN CAPITAL LETTER E
+FF26; L; FF46; #FULLWIDTH LATIN CAPITAL LETTER F
+FF27; L; FF47; #FULLWIDTH LATIN CAPITAL LETTER G
+FF28; L; FF48; #FULLWIDTH LATIN CAPITAL LETTER H
+FF29; L; FF49; #FULLWIDTH LATIN CAPITAL LETTER I
+FF2A; L; FF4A; #FULLWIDTH LATIN CAPITAL LETTER J
+FF2B; L; FF4B; #FULLWIDTH LATIN CAPITAL LETTER K
+FF2C; L; FF4C; #FULLWIDTH LATIN CAPITAL LETTER L
+FF2D; L; FF4D; #FULLWIDTH LATIN CAPITAL LETTER M
+FF2E; L; FF4E; #FULLWIDTH LATIN CAPITAL LETTER N
+FF2F; L; FF4F; #FULLWIDTH LATIN CAPITAL LETTER O
+FF30; L; FF50; #FULLWIDTH LATIN CAPITAL LETTER P
+FF31; L; FF51; #FULLWIDTH LATIN CAPITAL LETTER Q
+FF32; L; FF52; #FULLWIDTH LATIN CAPITAL LETTER R
+FF33; L; FF53; #FULLWIDTH LATIN CAPITAL LETTER S
+FF34; L; FF54; #FULLWIDTH LATIN CAPITAL LETTER T
+FF35; L; FF55; #FULLWIDTH LATIN CAPITAL LETTER U
+FF36; L; FF56; #FULLWIDTH LATIN CAPITAL LETTER V
+FF37; L; FF57; #FULLWIDTH LATIN CAPITAL LETTER W
+FF38; L; FF58; #FULLWIDTH LATIN CAPITAL LETTER X
+FF39; L; FF59; #FULLWIDTH LATIN CAPITAL LETTER Y
+FF3A; L; FF5A; #FULLWIDTH LATIN CAPITAL LETTER Z
+
+
index bffd116..9c81514 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   001f    Cc
@@ -1503,4 +1503,6 @@ ffe9      ffec    Sm
 ffed   ffee    So
 fff9   fffb    Cf
 fffc   fffd    So
+f0000  ffffd   Co
+100000 10fffd  Co
 END
index a409498..628b9c6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0300   0314    230
index 5ea46af..53f8467 100644 (file)
@@ -1,3 +1,5 @@
+# CompositionExclusions-2.txt
+#
 # Composition Exclusions
 # This file lists the characters from the UTR #15 Composition Exclusion Table.
 #
@@ -133,8 +135,8 @@ FB4E # HEBREW LETTER PE WITH RAFE
 # (4) Non-Starter Decompositions
 # These characters can be derived from the UnicodeData file
 # by including all characters whose canonical decomposition consists
-# of a sequence of characters, the first of which has a canonical
-# class of zero.
+# of a sequence of characters, the first of which has a non-zero
+# combining class.
 # These characters are simply quoted here for reference.
 
 # 0344 COMBINING GREEK DIALYTIKA TONOS
index ecc30b2..1fe29cd 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a0           <noBreak> 0020
index c42e944..a85b9ca 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FB00   FB4F
index 5010ab7..5fbbbfa 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0600   06FF
index 6edd74d..62521bb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FB50   FDFF
index 9640739..6b2d447 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FE70   FEFE
index 19b74ac..d4736a7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0530   058F
index 7ce4418..a7ef468 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2190   21FF
index 39987f1..36d6456 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   007F
index c0a47d3..07dc6ac 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0980   09FF
index e96e64f..495629b 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2580   259F
index 5535606..3dbf73a 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3100   312F
index d0ee43a..f2ca6de 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 31A0   31BF
index d580199..a3cd897 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2500   257F
index e5c9e4c..58afc05 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2800   28FF
index 07ab8ed..793520f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3300   33FF
index 122ccd7..a9ba270 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FE30   FE4F
index 59c8e5d..d841bc5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 F900   FAFF
index d4c0c82..2d13707 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2E80   2EFF
index 24ecc37..ca525ae 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3000   303F
index 351cf74..729f4c6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 4E00   9FFF
index 012f54c..e92f091 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3400   4DB5
index 10cae1a..1e9ad74 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 13A0   13FF
index a32f974..d3a45d4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0300   036F
index 100471b..4f0a573 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FE20   FE2F
index f45e7e0..9dde706 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 20D0   20FF
index 77a759f..78113e8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2400   243F
index 567ae97..8cbc160 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 20A0   20CF
index 9ca104c..f057731 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0400   04FF
index 61372b5..c99eff1 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0900   097F
index 0f820ca..1bbb102 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2700   27BF
index de52aa8..46b4cf5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2460   24FF
index e4de0e0..da5a7a1 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3200   32FF
index 13c3090..5b472c4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1200   137F
index 81c7699..aa82c30 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2000   206F
index 170422d..6cf8ea7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 25A0   25FF
index 773ed15..493f570 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 10A0   10FF
index ff753d1..ac4bbee 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0370   03FF
index b8f02e7..acd43be 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1F00   1FFF
index ff6c650..0e3c8e9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0A80   0AFF
index b888df6..32ff239 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0A00   0A7F
index e452653..fd3ba32 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FF00   FFEF
index c15379f..744e572 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3130   318F
index c329b54..a1d1c67 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1100   11FF
index 7d91a36..80cd4a4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 AC00   D7A3
index abe7b9e..2e29a28 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0590   05FF
index 6ed7ac9..0e1320d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 DB80   DBFF
index 924a0c9..6acc6c4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 D800   DB7F
index 7a65302..5905fe9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3040   309F
index 20906d6..5365373 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0250   02AF
index 4baae88..dafb5b4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2FF0   2FFF
index 57d6bd2..9ad03a6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3190   319F
index d26fd6c..165398c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2F00   2FDF
index 109197a..a679445 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0C80   0CFF
index 93bd5a0..2976d25 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 30A0   30FF
index f3e8685..6a85224 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1780   17FF
index 41ff11f..fdddd86 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0E80   0EFF
index 1b252eb..6a901fb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0080   00FF
index b8be987..a042350 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0100   017F
index b9aff43..b7106c6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0180   024F
index d309e90..e17cc3d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1E00   1EFF
index 1768740..c2249a7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2100   214F
index 752b264..025bd13 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 DC00   DFFF
index 8fb57cd..5a01d40 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0D00   0D7F
index 055f19e..8b45e18 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2200   22FF
index 9dcdd26..cc5b02f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2600   26FF
index 370c00f..a1058a0 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2300   23FF
index 394014d..98a4914 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1800   18AF
index 4b3f318..3aa2f41 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1000   109F
index d33ece0..2a606a6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2150   218F
index e097d90..de320a9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1680   169F
index be1d981..7f0aff8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2440   245F
index 5a680f6..771a245 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0B00   0B7F
index 0c118f4..0b0c004 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 E000   F8FF
index 0bd42df..52ca7aa 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 16A0   16FF
index 37e007c..5a892fd 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0D80   0DFF
index 736415e..148e6e8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FE50   FE6F
index 6e9cdf0..0e31fea 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 02B0   02FF
index f9f730f..03f69a3 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 FFF0   FFFD
index efcec0b..b0f90cd 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2070   209F
index 7c81fb6..f85f1a9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0700   074F
index e65ed2f..71fa923 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0B80   0BFF
index d5ed236..ff09b1e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0C00   0C7F
index 361bd4d..f88768c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0780   07BF
index 3376de4..e77c0c5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0E00   0E7F
index 50837ad..35436b3 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0F00   0FFF
index ad4eb27..83c6a78 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1400   167F
index f25c695..7350871 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 A490   A4CF
index f4e3a8b..baa038e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 A000   A48F
index 63f95ae..1434a55 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   007f
index 203860b..94f9a5c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 90020b8..de5046f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a
index e04f2f5..a8d43b8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 061b   
index 4a71ae5..4519c6d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0660   0669
index e4ba165..33bdb45 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 000a   
index 795a4a9..75b8871 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   0008
index f8d037d..e217653 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002c   
index d63270a..113de87 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 5a1a36a..d1cd305 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002f   
index 5e7af2b..0a66fa8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0023   0025
index 8dc4ca8..a08d8b8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a
@@ -320,4 +320,6 @@ ffc2        ffc7
 ffca   ffcf
 ffd2   ffd7
 ffda   ffdc
+f0000  ffffd
+100000 10fffd
 END
index ef2a6e4..2570421 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 202a   
index e9958c4..721a223 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 202d   
index 191bc05..a5c3af4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0300   034e
index bde00ff..ec0f18f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   0022
index 4a3eedd..20e3d9d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 202c   
index fccc1f6..9f776ae 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 05be   
index d789246..eaf7ab7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 202b   
index fcb81ac..8974dd9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 202e   
index b28b331..ac2655d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0009   
index 25d8b8f..ebd24e5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 000c   
index 0db83c4..51e4ede 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   001f
@@ -15,4 +15,6 @@ dc00  dfff
 e000   f8ff
 feff   
 fff9   fffb
+f0000  ffffd
+100000 10fffd
 END
index d7184e3..6b97adc 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   001f
index 896c3e6..cef5ac4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 070f   
index 3c68615..fb75e87 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0220   0221
@@ -356,4 +356,18 @@ ffd8       ffd9
 ffdd   ffdf
 ffe7
 ffef   fff8
+10000  1fffd
+20000  2fffd
+30000  3fffd
+40000  4fffd
+50000  5fffd
+60000  6fffd
+70000  7fffd
+80000  8fffd
+90000  9fffd
+a0000  afffd
+b0000  bfffd
+c0000  cfffd
+d0000  dfffd
+e0000  efffd
 END
index 0db83c4..51e4ede 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   001f
@@ -15,4 +15,6 @@ dc00  dfff
 e000   f8ff
 feff   
 fff9   fffb
+f0000  ffffd
+100000 10fffd
 END
index c456d33..d077fd2 100644 (file)
@@ -1,6 +1,8 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 e000   f8ff
+f0000  ffffd
+100000 10fffd
 END
index 8888fb5..33e1dac 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 d800   db7f
index 4c47b28..82c9edc 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2460   2473
index 75d2569..5ae2b6a 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a8   
index 33fbf6a..3c81bcc 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fb51   
index c72234b..7feff18 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2102   
index fc2dd67..abac9d9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00bc   00be
index 2c9cf47..8778a75 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fb55   
index 0145b7d..c6d7802 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fb54   
index cc8541e..e4e24f7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fb50   
index 9417de1..7887452 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 ff61   ffbe
index 1fd9e87..18c0105 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a0   
index f6c8069..3a37931 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fe50   fe52
index b55fdd9..f27993d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3300   3357
index 98c4dfa..f709a22 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2080   208e
index 865a26d..1e6a0c5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00aa   
index 5d55483..33b9feb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fe30   fe44
index 09dae19..afe1e06 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3000   
index c5a59f6..57c167b 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00c0   00c5
index 43d34fc..940d956 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a0   
index 2ab8156..259bb89 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 156f171..40d3506 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   007e
index c32f830..bfe2c27 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a
index a15f760..297f5cf 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a1   
index c705dc8..c1fc416 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0023   
index 527e4c8..a1410da 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2014   
index 053369b..93ec04e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0009   
index 5d3952a..b9bc7e8 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 02c8   
index 2c314fb..17bb551 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 000c   
index 95f8b80..8da9eba 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 fffc   
index a73130a..353c594 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0029   
index 3d0f347..87c7833 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   0008
index c61a527..2548269 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 000d   
index d847092..173bf58 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   
index b03a627..49bb985 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a0   
index 6989bc8..71e5886 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002d   
index 0b1cc84..6e6100c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1100   1159
index 825198d..1758673 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2024   2026
index afa01a8..32dcfb0 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002c   
index dcb5490..9b845ae 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 000a   
index af9f337..b7ff279 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0e5a   0e5b
index 5c55d22..eb51418 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index a7dee37..90f1809 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0028   
index cdfb56e..07f7bf7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0025   
index c2d20da..03466c9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0024   
index 46a6ee3..35dac98 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0022   
index bae4ced..4539e09 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0e01   0e30
index 8888fb5..33e1dac 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 d800   db7f
index e786a0c..2153e12 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0020   
index d2a33ae..ce65fe1 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002f   
index ec287c4..c3b32ac 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 END
index 96d8e99..63c9dcf 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 200b   
index 2814794..03dafcc 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0061   007a
index 4380afe..23a3c55 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 02b0   02b8
index 78fab4c..d82c6bb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 01bb   
index 2814794..03dafcc 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0061   007a
index 809c37a..b19755c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 01c5   
index 8dde274..07dee48 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a
index 9367775..e3ef7f3 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0300   034e
index 937d8d4..a76d66c 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0903   
index 00f446d..23ef860 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0488   0489
index e2c55a6..d324f50 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0028   0029
index aba40af..803e038 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0300   034e
index 1291f27..8667e77 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 2ab8156..259bb89 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 8f1af46..bdeefd5 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2160   2183
index 6a57dc5..13cac3b 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00b2   00b3
index 8fd1e8e..97330ec 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   0023
index 342efac..e14874d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 005f   
index 58997ca..b4a2ffb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002d   
index 8879191..2b5bd3e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0029   
index 166c64b..b27a4f6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00bb   
index 7f2243d..dbbae44 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00ab   
index e6b8b02..849ee17 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   0023
index 9560586..c3adba6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0020   007e
index a7dee37..90f1809 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0028   
index 9e8684d..9e088ba 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0021   0023
index 8851766..a304e17 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0024   
index 5776bd6..adeb3e4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0024   
index b5f6e59..52f88ae 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 005e   
index ae9424c..540da63 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 002b   
index 4e9dfc2..3caf617 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 00a6   00a7
index 701329f..1625dce 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0009   000d
index be11078..6a3fc47 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1203   
index 45d6692..6d1bd6d 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 140b   
index a8b03d4..83134b6 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1402   
index b70d793..e639bd0 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 141c   
index e2a1601..fb8b08e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1205   
index b3c3e60..d762748 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1204   
index 0a22f78..9f8ff07 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1408   
index f80790c..29bc70f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1202   
index 4516d7a..2dcd49f 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1404   
index 215463f..d7d90c7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 3093   
index a0a6f7d..2c795f0 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1206   
index 1228053..27c8032 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1406   1407
index c458382..117d981 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1201   
index b6e76f8..e5a39ed 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1200   
index 9bb529e..39e94ca 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 120f   
index 5f3b784..cd560eb 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1419   141b
index 3ad968c..4272b89 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 124d   
index 9e32c0e..c4c5ba9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 124c   
index c4bccb5..d316029 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 15d9   
index 4cd6c67..c914b07 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 124a   
index bd68aea..c990e43 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1410   1411
index 7676564..a73cbdd 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1412   1413
index 0ab766a..6e92f85 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1414   1416
index 76af7ae..d165f41 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 15d6   
index 8bd8849..6a06ae9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 1248   
index 4fda655..16f8752 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a
index 2f13b38..1c76c60 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index e556825..b26a3b4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039
index 22a9792..03416c0 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0020   
index 0989e1d..5f127ce 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2028   
index 3b23446..4e38303 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 2029   
index db18055..56cf9e4 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0020   
index 6910ab9..ea288f0 100644 (file)
@@ -1,69 +1,91 @@
-#Value; Short Name; Unicode Name
-U+1100; G; HANGUL CHOSEONG KIYEOK
-U+1101; GG; HANGUL CHOSEONG SSANGKIYEOK
-U+1102; N; HANGUL CHOSEONG NIEUN
-U+1103; D; HANGUL CHOSEONG TIKEUT
-U+1104; DD; HANGUL CHOSEONG SSANGTIKEUT
-U+1105; R; HANGUL CHOSEONG RIEUL
-U+1106; M; HANGUL CHOSEONG MIEUM
-U+1107; B; HANGUL CHOSEONG PIEUP
-U+1108; BB; HANGUL CHOSEONG SSANGPIEUP
-U+1109; S; HANGUL CHOSEONG SIOS
-U+110A; SS; HANGUL CHOSEONG SSANGSIOS
-U+110B; ; HANGUL CHOSEONG IEUNG
-U+110C; J; HANGUL CHOSEONG CIEUC
-U+110D; JJ; HANGUL CHOSEONG SSANGCIEUC
-U+110E; C; HANGUL CHOSEONG CHIEUCH
-U+110F; K; HANGUL CHOSEONG KHIEUKH
-U+1110; T; HANGUL CHOSEONG THIEUTH
-U+1111; P; HANGUL CHOSEONG PHIEUPH
-U+1112; H; HANGUL CHOSEONG HIEUH
-U+1161; A; HANGUL JUNGSEONG A
-U+1162; AE; HANGUL JUNGSEONG AE
-U+1163; YA; HANGUL JUNGSEONG YA
-U+1164; YAE; HANGUL JUNGSEONG YAE
-U+1165; EO; HANGUL JUNGSEONG EO
-U+1166; E; HANGUL JUNGSEONG E
-U+1167; YEO; HANGUL JUNGSEONG YEO
-U+1168; YE; HANGUL JUNGSEONG YE
-U+1169; O; HANGUL JUNGSEONG O
-U+116A; WA; HANGUL JUNGSEONG WA
-U+116B; WAE; HANGUL JUNGSEONG WAE
-U+116C; OE; HANGUL JUNGSEONG OE
-U+116D; YO; HANGUL JUNGSEONG YO
-U+116E; U; HANGUL JUNGSEONG U
-U+116F; WEO; HANGUL JUNGSEONG WEO
-U+1170; WE; HANGUL JUNGSEONG WE
-U+1171; WI; HANGUL JUNGSEONG WI
-U+1172; YU; HANGUL JUNGSEONG YU
-U+1173; EU; HANGUL JUNGSEONG EU
-U+1174; YI; HANGUL JUNGSEONG YI
-U+1175; I; HANGUL JUNGSEONG I
-U+11A8; G; HANGUL JONGSEONG KIYEOK
-U+11A9; GG; HANGUL JONGSEONG SSANGKIYEOK
-U+11AA; GS; HANGUL JONGSEONG KIYEOK-SIOS
-U+11AB; N; HANGUL JONGSEONG NIEUN
-U+11AC; NJ; HANGUL JONGSEONG NIEUN-CIEUC
-U+11AD; NH; HANGUL JONGSEONG NIEUN-HIEUH
-U+11AE; D; HANGUL JONGSEONG TIKEUT
-U+11AF; L; HANGUL JONGSEONG RIEUL
-U+11B0; LG; HANGUL JONGSEONG RIEUL-KIYEOK
-U+11B1; LM; HANGUL JONGSEONG RIEUL-MIEUM
-U+11B2; LB; HANGUL JONGSEONG RIEUL-PIEUP
-U+11B3; LS; HANGUL JONGSEONG RIEUL-SIOS
-U+11B4; LT; HANGUL JONGSEONG RIEUL-THIEUTH
-U+11B5; LP; HANGUL JONGSEONG RIEUL-PHIEUPH
-U+11B6; LH; HANGUL JONGSEONG RIEUL-HIEUH
-U+11B7; M; HANGUL JONGSEONG MIEUM
-U+11B8; B; HANGUL JONGSEONG PIEUP
-U+11B9; BS; HANGUL JONGSEONG PIEUP-SIOS
-U+11BA; S; HANGUL JONGSEONG SIOS
-U+11BB; SS; HANGUL JONGSEONG SSANGSIOS
-U+11BC; NG; HANGUL JONGSEONG IEUNG
-U+11BD; J; HANGUL JONGSEONG CIEUC
-U+11BE; C; HANGUL JONGSEONG CHIEUCH
-U+11BF; K; HANGUL JONGSEONG KHIEUKH
-U+11C0; T; HANGUL JONGSEONG THIEUTH
-U+11C1; P; HANGUL JONGSEONG PHIEUPH
-U+11C2; H; HANGUL JONGSEONG HIEUH
+# Jamo-3.txt
+#
+# This file is a normative contributory data file in the
+# Unicode Character Database.
+#
+# This file defines the Jamo Short Name property, repeating
+# in machine readable form the information printed in Table 4-4
+# of The Unicode Standard, Version 3.0.
+#
+# See sections 3.11 and 4.4 of The Unicode Standard, Version 3.0
+# for more information.
+#
+# Each line contains two fields, separated by a semicolon.
+#
+# The first field gives the code point, in 4-digit hexadecimal
+# form, of a combining jamo character that participates in
+# the algorithmic determination Hangul syllable character names.
+# The second field gives the Jamo Short Name as a one-, two-,
+# or three-character ASCII string (or in one case, for U+110B,
+# the null string).
+#
+# #############################################################
+1100; G   # HANGUL CHOSEONG KIYEOK
+1101; GG  # HANGUL CHOSEONG SSANGKIYEOK
+1102; N   # HANGUL CHOSEONG NIEUN
+1103; D   # HANGUL CHOSEONG TIKEUT
+1104; DD  # HANGUL CHOSEONG SSANGTIKEUT
+1105; R   # HANGUL CHOSEONG RIEUL
+1106; M   # HANGUL CHOSEONG MIEUM
+1107; B   # HANGUL CHOSEONG PIEUP
+1108; BB  # HANGUL CHOSEONG SSANGPIEUP
+1109; S   # HANGUL CHOSEONG SIOS
+110A; SS  # HANGUL CHOSEONG SSANGSIOS
+110B;     # HANGUL CHOSEONG IEUNG
+110C; J   # HANGUL CHOSEONG CIEUC
+110D; JJ  # HANGUL CHOSEONG SSANGCIEUC
+110E; C   # HANGUL CHOSEONG CHIEUCH
+110F; K   # HANGUL CHOSEONG KHIEUKH
+1110; T   # HANGUL CHOSEONG THIEUTH
+1111; P   # HANGUL CHOSEONG PHIEUPH
+1112; H   # HANGUL CHOSEONG HIEUH
+1161; A   # HANGUL JUNGSEONG A
+1162; AE  # HANGUL JUNGSEONG AE
+1163; YA  # HANGUL JUNGSEONG YA
+1164; YAE # HANGUL JUNGSEONG YAE
+1165; EO  # HANGUL JUNGSEONG EO
+1166; E   # HANGUL JUNGSEONG E
+1167; YEO # HANGUL JUNGSEONG YEO
+1168; YE  # HANGUL JUNGSEONG YE
+1169; O   # HANGUL JUNGSEONG O
+116A; WA  # HANGUL JUNGSEONG WA
+116B; WAE # HANGUL JUNGSEONG WAE
+116C; OE  # HANGUL JUNGSEONG OE
+116D; YO  # HANGUL JUNGSEONG YO
+116E; U   # HANGUL JUNGSEONG U
+116F; WEO # HANGUL JUNGSEONG WEO
+1170; WE  # HANGUL JUNGSEONG WE
+1171; WI  # HANGUL JUNGSEONG WI
+1172; YU  # HANGUL JUNGSEONG YU
+1173; EU  # HANGUL JUNGSEONG EU
+1174; YI  # HANGUL JUNGSEONG YI
+1175; I   # HANGUL JUNGSEONG I
+11A8; G   # HANGUL JONGSEONG KIYEOK
+11A9; GG  # HANGUL JONGSEONG SSANGKIYEOK
+11AA; GS  # HANGUL JONGSEONG KIYEOK-SIOS
+11AB; N   # HANGUL JONGSEONG NIEUN
+11AC; NJ  # HANGUL JONGSEONG NIEUN-CIEUC
+11AD; NH  # HANGUL JONGSEONG NIEUN-HIEUH
+11AE; D   # HANGUL JONGSEONG TIKEUT
+11AF; L   # HANGUL JONGSEONG RIEUL
+11B0; LG  # HANGUL JONGSEONG RIEUL-KIYEOK
+11B1; LM  # HANGUL JONGSEONG RIEUL-MIEUM
+11B2; LB  # HANGUL JONGSEONG RIEUL-PIEUP
+11B3; LS  # HANGUL JONGSEONG RIEUL-SIOS
+11B4; LT  # HANGUL JONGSEONG RIEUL-THIEUTH
+11B5; LP  # HANGUL JONGSEONG RIEUL-PHIEUPH
+11B6; LH  # HANGUL JONGSEONG RIEUL-HIEUH
+11B7; M   # HANGUL JONGSEONG MIEUM
+11B8; B   # HANGUL JONGSEONG PIEUP
+11B9; BS  # HANGUL JONGSEONG PIEUP-SIOS
+11BA; S   # HANGUL JONGSEONG SIOS
+11BB; SS  # HANGUL JONGSEONG SSANGSIOS
+11BC; NG  # HANGUL JONGSEONG IEUNG
+11BD; J   # HANGUL JONGSEONG CIEUC
+11BE; C   # HANGUL JONGSEONG CHIEUCH
+11BF; K   # HANGUL JONGSEONG KHIEUKH
+11C0; T   # HANGUL JONGSEONG THIEUTH
+11C1; P   # HANGUL JONGSEONG PHIEUPH
+11C2; H   # HANGUL JONGSEONG HIEUH
 
index 760bcba..19cd429 100644 (file)
@@ -1,72 +1,72 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
-1100           G
-1101           GG
-1102           N
-1103           D
-1104           DD
-1105           R
-1106           M
-1107           B
-1108           BB
-1109           S
-110a           SS
-110b           
-110c           J
-110d           JJ
-110e           C
-110f           K
-1110           T
-1111           P
-1112           H
-1161           A
-1162           AE
-1163           YA
-1164           YAE
-1165           EO
-1166           E
-1167           YEO
-1168           YE
-1169           O
-116a           WA
-116b           WAE
-116c           OE
-116d           YO
-116e           U
-116f           WEO
-1170           WE
-1171           WI
-1172           YU
-1173           EU
-1174           YI
-1175           I
-11a8           G
-11a9           GG
-11aa           GS
-11ab           N
-11ac           NJ
-11ad           NH
-11ae           D
-11af           L
-11b0           LG
-11b1           LM
-11b2           LB
-11b3           LS
-11b4           LT
-11b5           LP
-11b6           LH
-11b7           M
-11b8           B
-11b9           BS
-11ba           S
-11bb           SS
-11bc           NG
-11bd           J
-11be           C
-11bf           K
-11c0           T
-11c1           P
-11c2           H
+1100           G   # HANGUL CHOSEONG KIYEOK
+1101           GG  # HANGUL CHOSEONG SSANGKIYEOK
+1102           N   # HANGUL CHOSEONG NIEUN
+1103           D   # HANGUL CHOSEONG TIKEUT
+1104           DD  # HANGUL CHOSEONG SSANGTIKEUT
+1105           R   # HANGUL CHOSEONG RIEUL
+1106           M   # HANGUL CHOSEONG MIEUM
+1107           B   # HANGUL CHOSEONG PIEUP
+1108           BB  # HANGUL CHOSEONG SSANGPIEUP
+1109           S   # HANGUL CHOSEONG SIOS
+110a           SS  # HANGUL CHOSEONG SSANGSIOS
+110b           # HANGUL CHOSEONG IEUNG
+110c           J   # HANGUL CHOSEONG CIEUC
+110d           JJ  # HANGUL CHOSEONG SSANGCIEUC
+110e           C   # HANGUL CHOSEONG CHIEUCH
+110f           K   # HANGUL CHOSEONG KHIEUKH
+1110           T   # HANGUL CHOSEONG THIEUTH
+1111           P   # HANGUL CHOSEONG PHIEUPH
+1112           H   # HANGUL CHOSEONG HIEUH
+1161           A   # HANGUL JUNGSEONG A
+1162           AE  # HANGUL JUNGSEONG AE
+1163           YA  # HANGUL JUNGSEONG YA
+1164           YAE # HANGUL JUNGSEONG YAE
+1165           EO  # HANGUL JUNGSEONG EO
+1166           E   # HANGUL JUNGSEONG E
+1167           YEO # HANGUL JUNGSEONG YEO
+1168           YE  # HANGUL JUNGSEONG YE
+1169           O   # HANGUL JUNGSEONG O
+116a           WA  # HANGUL JUNGSEONG WA
+116b           WAE # HANGUL JUNGSEONG WAE
+116c           OE  # HANGUL JUNGSEONG OE
+116d           YO  # HANGUL JUNGSEONG YO
+116e           U   # HANGUL JUNGSEONG U
+116f           WEO # HANGUL JUNGSEONG WEO
+1170           WE  # HANGUL JUNGSEONG WE
+1171           WI  # HANGUL JUNGSEONG WI
+1172           YU  # HANGUL JUNGSEONG YU
+1173           EU  # HANGUL JUNGSEONG EU
+1174           YI  # HANGUL JUNGSEONG YI
+1175           I   # HANGUL JUNGSEONG I
+11a8           G   # HANGUL JONGSEONG KIYEOK
+11a9           GG  # HANGUL JONGSEONG SSANGKIYEOK
+11aa           GS  # HANGUL JONGSEONG KIYEOK-SIOS
+11ab           N   # HANGUL JONGSEONG NIEUN
+11ac           NJ  # HANGUL JONGSEONG NIEUN-CIEUC
+11ad           NH  # HANGUL JONGSEONG NIEUN-HIEUH
+11ae           D   # HANGUL JONGSEONG TIKEUT
+11af           L   # HANGUL JONGSEONG RIEUL
+11b0           LG  # HANGUL JONGSEONG RIEUL-KIYEOK
+11b1           LM  # HANGUL JONGSEONG RIEUL-MIEUM
+11b2           LB  # HANGUL JONGSEONG RIEUL-PIEUP
+11b3           LS  # HANGUL JONGSEONG RIEUL-SIOS
+11b4           LT  # HANGUL JONGSEONG RIEUL-THIEUTH
+11b5           LP  # HANGUL JONGSEONG RIEUL-PHIEUPH
+11b6           LH  # HANGUL JONGSEONG RIEUL-HIEUH
+11b7           M   # HANGUL JONGSEONG MIEUM
+11b8           B   # HANGUL JONGSEONG PIEUP
+11b9           BS  # HANGUL JONGSEONG PIEUP-SIOS
+11ba           S   # HANGUL JONGSEONG SIOS
+11bb           SS  # HANGUL JONGSEONG SSANGSIOS
+11bc           NG  # HANGUL JONGSEONG IEUNG
+11bd           J   # HANGUL JONGSEONG CIEUC
+11be           C   # HANGUL JONGSEONG CHIEUCH
+11bf           K   # HANGUL JONGSEONG KHIEUKH
+11c0           T   # HANGUL JONGSEONG THIEUTH
+11c1           P   # HANGUL JONGSEONG PHIEUPH
+11c2           H   # HANGUL JONGSEONG HIEUH
 END
index ef8979f..f5c4c56 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0000   001f    <control>
@@ -10549,4 +10549,6 @@ fffa            INTERLINEAR ANNOTATION SEPARATOR
 fffb           INTERLINEAR ANNOTATION TERMINATOR
 fffc           OBJECT REPLACEMENT CHARACTER
 fffd           REPLACEMENT CHARACTER
+f0000  ffffd   <Plane 15 Private Use, First>
+100000 10fffd  <Plane 16 Private Use, First>
 END
index b0e054a..1f5c2c8 100644 (file)
@@ -1,7 +1,8 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
+0030           0
 0031           1
 0032           2
 0033           3
@@ -17,6 +18,7 @@ return <<'END';
 00bc           1/4
 00bd           1/2
 00be           3/4
+0660           0
 0661           1
 0662           2
 0663           3
@@ -26,6 +28,7 @@ return <<'END';
 0667           7
 0668           8
 0669           9
+06f0           0
 06f1           1
 06f2           2
 06f3           3
@@ -35,6 +38,7 @@ return <<'END';
 06f7           7
 06f8           8
 06f9           9
+0966           0
 0967           1
 0968           2
 0969           3
@@ -44,6 +48,7 @@ return <<'END';
 096d           7
 096e           8
 096f           9
+09e6           0
 09e7           1
 09e8           2
 09e9           3
@@ -58,6 +63,7 @@ return <<'END';
 09f6           3
 09f7           4
 09f9           16
+0a66           0
 0a67           1
 0a68           2
 0a69           3
@@ -67,6 +73,7 @@ return <<'END';
 0a6d           7
 0a6e           8
 0a6f           9
+0ae6           0
 0ae7           1
 0ae8           2
 0ae9           3
@@ -76,6 +83,7 @@ return <<'END';
 0aed           7
 0aee           8
 0aef           9
+0b66           0
 0b67           1
 0b68           2
 0b69           3
@@ -97,6 +105,7 @@ return <<'END';
 0bf0           10
 0bf1           100
 0bf2           1000
+0c66           0
 0c67           1
 0c68           2
 0c69           3
@@ -106,6 +115,7 @@ return <<'END';
 0c6d           7
 0c6e           8
 0c6f           9
+0ce6           0
 0ce7           1
 0ce8           2
 0ce9           3
@@ -115,6 +125,7 @@ return <<'END';
 0ced           7
 0cee           8
 0cef           9
+0d66           0
 0d67           1
 0d68           2
 0d69           3
@@ -124,6 +135,7 @@ return <<'END';
 0d6d           7
 0d6e           8
 0d6f           9
+0e50           0
 0e51           1
 0e52           2
 0e53           3
@@ -133,6 +145,7 @@ return <<'END';
 0e57           7
 0e58           8
 0e59           9
+0ed0           0
 0ed1           1
 0ed2           2
 0ed3           3
@@ -142,6 +155,7 @@ return <<'END';
 0ed7           7
 0ed8           8
 0ed9           9
+0f20           0
 0f21           1
 0f22           2
 0f23           3
@@ -151,6 +165,17 @@ return <<'END';
 0f27           7
 0f28           8
 0f29           9
+0f2a           1/2
+0f2b           3/2
+0f2c           5/2
+0f2d           7/2
+0f2e           9/2
+0f2f           11/2
+0f30           13/2
+0f31           15/2
+0f32           17/2
+0f33           -1/2
+1040           0
 1041           1
 1042           2
 1043           3
@@ -183,6 +208,7 @@ return <<'END';
 16ee           17
 16ef           18
 16f0           19
+17e0           0
 17e1           1
 17e2           2
 17e3           3
@@ -192,6 +218,7 @@ return <<'END';
 17e7           7
 17e8           8
 17e9           9
+1810           0
 1811           1
 1812           2
 1813           3
@@ -201,12 +228,14 @@ return <<'END';
 1817           7
 1818           8
 1819           9
+2070           0
 2074           4
 2075           5
 2076           6
 2077           7
 2078           8
 2079           9
+2080           0
 2081           1
 2082           2
 2083           3
@@ -322,6 +351,7 @@ return <<'END';
 2499           18
 249a           19
 249b           20
+24ea           0
 2776           1
 2777           2
 2778           3
@@ -352,6 +382,7 @@ return <<'END';
 2791           8
 2792           9
 2793           10
+3007           0
 3021           1
 3022           2
 3023           3
@@ -364,6 +395,20 @@ return <<'END';
 3038           10
 3039           20
 303a           30
+3192           1
+3193           2
+3194           3
+3195           4
+3220           1
+3221           2
+3222           3
+3223           4
+3224           5
+3225           6
+3226           7
+3227           8
+3228           9
+3229           10
 3280           1
 3281           2
 3282           3
@@ -374,6 +419,7 @@ return <<'END';
 3287           8
 3288           9
 3289           10
+ff10           0
 ff11           1
 ff12           2
 ff13           3
similarity index 97%
rename from lib/unicode/Props.txt
rename to lib/unicode/PropList.txt
index b3548e1..e47f127 100644 (file)
@@ -1,4 +1,4 @@
-Property dump: UnicodeData-3.0.0.txt
+Property dump: UnicodeData-3.0.1.txt
 
 *******************************************
 
@@ -192,89 +192,6 @@ FF61..FF65  (5 chars)
 
 *******************************************
 
-Property dump for: 0x00800000 (Delimiter)
-
-0000
-0009..000D  (5 chars)
-001C..0023  (8 chars)
-0028..0029  (2 chars)
-002C
-002E..002F  (2 chars)
-003A..003B  (2 chars)
-003F
-005B..005D  (3 chars)
-007B..007D  (3 chars)
-0085
-00A0..00A1  (2 chars)
-00A6..00A7  (2 chars)
-00AB
-00B6
-00BB
-00BF
-037E
-0387
-055C..055E  (3 chars)
-0589
-060C
-061B
-061F
-066B..066C  (2 chars)
-06D4
-0700..0709  (10 chars)
-070B..070D  (3 chars)
-0964..0965  (2 chars)
-0DF4
-0E5A..0E5B  (2 chars)
-0F0B
-0F0D..0F12  (6 chars)
-0F3A..0F3D  (4 chars)
-104A..104B  (2 chars)
-10FB
-1361..1368  (8 chars)
-166D..166E  (2 chars)
-1680
-169B..169C  (2 chars)
-16EB..16ED  (3 chars)
-17D4..17D6  (3 chars)
-17DA
-1802..1805  (4 chars)
-1808..1809  (2 chars)
-2000..200B  (12 chars)
-2016
-2018..201F  (8 chars)
-2028..2029  (2 chars)
-202F
-2039..203A  (2 chars)
-203C..203D  (2 chars)
-2045..2046  (2 chars)
-2048..2049  (2 chars)
-207D..207E  (2 chars)
-208D..208E  (2 chars)
-2329..232A  (2 chars)
-3000..3002  (3 chars)
-3008..3011  (10 chars)
-3014..301B  (8 chars)
-301D..301F  (3 chars)
-30FB
-FD3E..FD3F  (2 chars)
-FE35..FE44  (16 chars)
-FE50..FE52  (3 chars)
-FE54..FE57  (4 chars)
-FE59..FE5F  (7 chars)
-FE68
-FF01..FF03  (3 chars)
-FF08..FF09  (2 chars)
-FF0C
-FF0E..FF0F  (2 chars)
-FF1A..FF1B  (2 chars)
-FF1F
-FF3B..FF3D  (3 chars)
-FF5B..FF5D  (3 chars)
-FF61..FF65  (5 chars)
-FFE4
-
-*******************************************
-
 Property dump for: 0x80000003 (Line Separator)
 
 2028
@@ -591,7 +508,6 @@ Property dump for: 0x20000004 (Combining)
 20D0..20E3  (20 chars)
 302A..302F  (6 chars)
 3099..309A  (2 chars)
-F8F0..F8FF  (16 chars)
 FB1E
 FE20..FE23  (4 chars)
 
@@ -689,7 +605,6 @@ Property dump for: 0x20040000 (Non-spacing)
 20D0..20E3  (20 chars)
 302A..302F  (6 chars)
 3099..309A  (2 chars)
-F8F0..F8FF  (16 chars)
 FB1E
 FE20..FE23  (4 chars)
 
@@ -1161,7 +1076,6 @@ Property dump for: 0x20000001 (Alphabetic)
 0DF2..0DF3  (2 chars)
 0E01..0E3A  (58 chars)
 0E40..0E45  (6 chars)
-0E47
 0E4D
 0E81..0E82  (2 chars)
 0E84
@@ -1355,7 +1269,7 @@ Property dump for: 0x20010000 (Diacritic)
 0CCD
 0D4D
 0DCA
-0E48..0E4C  (5 chars)
+0E47..0E4C  (6 chars)
 0E4E
 0EC8..0ECC  (5 chars)
 0F18..0F19  (2 chars)
@@ -2077,8 +1991,7 @@ Property dump for: 0x01000000 (Bidi: Left-to-Right)
 4E00..9FA5  (20902 chars)
 A000..A48C  (1165 chars)
 AC00..D7A3  (11172 chars)
-D800..F7FF  (8192 chars)
-F900..FA2D  (302 chars)
+D800..FA2D  (8750 chars)
 FB00..FB06  (7 chars)
 FB13..FB17  (5 chars)
 FF21..FF3A  (26 chars)
@@ -2088,6 +2001,8 @@ FFC2..FFC7  (6 chars)
 FFCA..FFCF  (6 chars)
 FFD2..FFD7  (6 chars)
 FFDA..FFDC  (3 chars)
+F0000..FFFFD  (65534 chars)
+100000..10FFFD  (65534 chars)
 
 *******************************************
 
@@ -2331,7 +2246,6 @@ Property dump for: 0x0C000000 (Bidi: Non-spacing Mark)
 20D0..20E3  (20 chars)
 302A..302F  (6 chars)
 3099..309A  (2 chars)
-F8F0..F8FF  (16 chars)
 FB1E
 FE20..FE23  (4 chars)
 
@@ -2483,6 +2397,8 @@ FFFC..FFFD  (2 chars)
 Property dump for: 0x80000005 (Private Use)
 
 E000..F8FF  (6400 chars)
+F0000..FFFFD  (65534 chars)
+100000..10FFFD  (65534 chars)
 
 *******************************************
 
@@ -3281,6 +3197,28 @@ DB80..DBFF  (128 chars)
 
 *******************************************
 
+Property dump for: 0x8000000A (Not a Character)
+
+FFFE..FFFF  (2 chars)
+1FFFE..1FFFF  (2 chars)
+2FFFE..2FFFF  (2 chars)
+3FFFE..3FFFF  (2 chars)
+4FFFE..4FFFF  (2 chars)
+5FFFE..5FFFF  (2 chars)
+6FFFE..6FFFF  (2 chars)
+7FFFE..7FFFF  (2 chars)
+8FFFE..8FFFF  (2 chars)
+9FFFE..9FFFF  (2 chars)
+AFFFE..AFFFF  (2 chars)
+BFFFE..BFFFF  (2 chars)
+CFFFE..CFFFF  (2 chars)
+DFFFE..DFFFF  (2 chars)
+EFFFE..EFFFF  (2 chars)
+FFFFE..FFFFF  (2 chars)
+10FFFE..10FFFF  (2 chars)
+
+*******************************************
+
 Property dump for: 0x00000000 (Unassigned Code Value)
 
 0220..0221  (2 chars)
@@ -3637,4 +3575,18 @@ FFD8..FFD9  (2 chars)
 FFDD..FFDF  (3 chars)
 FFE7
 FFEF..FFF8  (10 chars)
+10000..1FFFD  (65534 chars)
+20000..2FFFD  (65534 chars)
+30000..3FFFD  (65534 chars)
+40000..4FFFD  (65534 chars)
+50000..5FFFD  (65534 chars)
+60000..6FFFD  (65534 chars)
+70000..7FFFD  (65534 chars)
+80000..8FFFD  (65534 chars)
+90000..9FFFD  (65534 chars)
+A0000..AFFFD  (65534 chars)
+B0000..BFFFD  (65534 chars)
+C0000..CFFFD  (65534 chars)
+D0000..DFFFD  (65534 chars)
+E0000..EFFFD  (65534 chars)
 
diff --git a/lib/unicode/README.perl b/lib/unicode/README.perl
new file mode 100644 (file)
index 0000000..2294bd3
--- /dev/null
@@ -0,0 +1,37 @@
+The *.txt files were copied 30 Aug 2000 from
+
+       http://www.unicode.org/Public/UNIDATA/
+
+and most of them were renamed to better fit 8.3 filename limitations,
+by which the Perl distribution tries to live.
+
+       www.unicode.org                 Perl distribution
+
+       ArabicShaping.txt               ArabShap.txt
+       BidiMirroring.txt               BidiMirr.txt
+       Blocks.txt                      Blocks.txt
+       CaseFolding.txt                 CaseFold.txt
+       CompositionExclusions.txt       CompExcl.txt
+       EastAsianWidth.txt              EAWidth.txt     (0)
+       Index.txt                       Index.txt
+       Jamo.txt                        Jamo.txt
+       LineBreak.txt                   LineBrk.txt     (0)
+       NamesList.html                  NamesList.html  (0)
+       NamesList.txt                   Names.txt
+       PropList.txt                    PropList.txt
+       ReadMe.txt                      ReadMe.txt
+       SpecialCasing.txt               SpecCase.txt
+       UnicodeCharacterDatabase.html   UCD301.html
+       UnicodeData.html                UCDFF301.html
+       UnicodeData.txt                 Unicode.301
+
+The two big files, NormalizationTest.txt (1.7MB) and Unihan.txt (15.8MB)
+were not copied for space considerations.  The files marked with (0) had
+not been updated since Unicode 3.0.0 (10 Sep 1999)
+
+The *.pl files are generated from these files by the 'mktables.PL' script.
+
+While the files have been renamed the links in the html files haven't.
+
+-- 
+jhi@iki.fi
index c2c4aee..b8a643c 100644 (file)
@@ -1,45 +1,13 @@
-June 23, 1999
+August 30, 2000
 
-This directory contains the initial release for Unicode 3.0.
+This directory contains the first update release for Unicode 3.0.
 
 This release consists of corrections and additions to the
-Unicode Character Database, to match the publication of
-The Unicode Standard, Version 3.0.
+Unicode Character Database for the Unicode Standard, 
+Version 3.0.1.
 
 Detailed documentation of the files constituting the
 Unicode Character Database (contributory data files for
 the standard itself) can now be found in
 UnicodeCharacterDatabase.html.
 
---------------------------------------------------------------------------
-NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE 
-
-The files have been copied from
-
-       ftp://ftp.unicode.org/Public/3.0-Update/
-
-and most of them have been renamed to better fit 8.3 filename limitations.
-
-long name at unicode.org               short name              latest '#'
-------------------------               ----------              ----------
-ArabicShaping-#.txt                    ArabShap.txt            2
-Blocks-#.txt                           Blocks.txt              3
-CompositionExclusions-#.txt            CompExcl.txt            1
-EastAsianWidth-#.txt                   EAWidth.txt             3
-Index-#.txt                            Index.txt               3.0.0
-Jamo-#.txt                             Jamo.txt                2
-LineBreak-#.txt                                LineBrk.txt             5
-NamesList-#.txt                                Names.txt               3.0.0
-NamesList-#.html                       NamesList.html          1
-PropList-#.txt                         Props.txt               3.0.0
-SpecialCasing-#.txt                    SpecCase.txt            2
-UnicodeData-#.txt                      Unicode.300             3.0.0
-UnicodeData-#.html                     Unicode3.html           3.0.0
-UnicodeCharacterDatabase-#.html                UCD300.html             3.0.0
-
-The *.pl files are generated from these files by the 'mktables.PL' script.
-
-While the files have been renamed the links in the html files haven't.
-
--- 
-jhi@iki.fi
index af002ef..94662d3 100644 (file)
@@ -1,4 +1,4 @@
-# SpecialCasing-2.txt
+# SpecialCasing-3.txt
 #
 # Special Casing Properties
 #
 # <upper> := <code_point_list>
 # <code_point_list> := <code_point> (<s>+ <code_point>)*
 # <code_point> := <hex><hex><hex><hex>
-# <hex> := [0-1A-Fa-f]
+# <hex> := [0-9A-Fa-f]
 # <s> := <space>
 #
-# <condition_list> := <locale>? (<s>+ <context>)*
-# <locale> := <ISO_3166_code> ( "_" <ISO_639_code> )? ( "_" <variant> )?
+# <condition_list> := <locale>? (<s>+ <context>)* <sep>
+# <locale> := <ISO_639_code> ( "_" <ISO_3166_code> )? ( "_" <variant> )?
 # <ISO_3166_code> := 2-letter country code,
 #                    as in http://www.unicode.org/unicode/onlinedat/countries.html
 # <ISO_639_code> :=  2-letter code,
 #                    as in http://www.unicode.org/unicode/onlinedat/languages.html
-# <context> := "FINAL" | "NON_FINAL" | "MODERN" | "NON_MODERN"
+# <context> := "FINAL" | "NON_FINAL" | "MODERN" | "NON_MODERN" | "AFTER_i"
+#
+#  A condition list overrides the normal behavior if all of the listed conditions are true.
+#  Case distinctions in the condition list are not significant.
 #
-#  A condition list overrides the normal behavior if any of the listed conditions is true.
 #   FINAL:  The letter is not followed by a letter of category L* (e.g. Ll, Lt, Lu, Lm, or Lo).
 #   MODERN: The mapping is only used for modern text.
+#   AFTER_i: The last base character was "i" 0069
+#
 #  Conditions preceded by "NON_" represent the negation of the condition
 #
 # New contexts may be added in the future.
-# Parsers of this file must be prepared to deal with that situation.
 # Additional whitespace around elements is optional. Blank lines are ignored in parsing.
 # On any line, all text following "#" is a comment, and are ignored in parsing.
+#
+# Parsers of this file must be prepared to deal future additions to this format:
+#  * Additional contexts
+#  * Additional fields
 # ================================================================================
 
 # ================================================================================
@@ -76,7 +83,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
 
 # No corresponding uppercase precomposed character
 
-0149; 0149; 02BC 006E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
 0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
 03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
 01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON
@@ -199,7 +206,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
 # 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA
 # 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA
 
-# Note: the following cases are not included, since they would normalize in lowercasing
+# Note: the following cases are not included, since they would case-fold in lowercasing
 
 # 03C3; 03C2; 03A3; 03A3; FINAL; # GREEK SMALL LETTER SIGMA
 # 03C2; 03C3; 03A3; 03A3; NON_FINAL; # GREEK SMALL LETTER FINAL SIGMA
@@ -208,12 +215,16 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
 # Locale-sensitive mappings
 # ================================================================================
 
+# Lithuanian 
+
+0307; 0307; ; ; lt AFTER_i; # Remove DOT ABOVE after "i" with upper or titlecase
+
 # Turkish
 
-0049; 0131; 0049; 0049; TR; # LATIN CAPITAL LETTER I
-0069; 0069; 0130; 0130; TR; # LATIN SMALL LETTER I
+0049; 0131; 0049; 0049; tr; # LATIN CAPITAL LETTER I
+0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I
 
 # Note: the following cases are already in the UnicodeData file.
 
-# 0131; 0131; 0049; 0049; TR; # LATIN SMALL LETTER DOTLESS I
-# 0130; 0069; 0130; 0130; TR; # LATIN CAPITAL LETTER I WITH DOT ABOVE
+# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I
+# 0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE
index a96bc1c..4bace1e 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0030   0039    0000
index a78a7e4..89755b7 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0041   005a    0061
index d8f5c04..cadeaf9 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0061   007a    0041
index 1fc7637..d6c03d3 100644 (file)
@@ -1,5 +1,5 @@
 # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
-# This file is built by mktables.PL from e.g. Unicode.300.
+# This file is built by mktables.PL from e.g. Unicode.301.
 # Any changes made here will be lost!
 return <<'END';
 0061   007a    0041
similarity index 54%
rename from lib/unicode/UCD300.html
rename to lib/unicode/UCD301.html
index 113d311..284349e 100644 (file)
 
 <html>
 
-
-
 <head>
-
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-
 <meta http-equiv="Content-Language" content="en-us">
-
 <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-
 <meta name="ProgId" content="FrontPage.Editor.Document">
-
 <link rel="stylesheet" href="http://www.unicode.org/unicode.css" type="text/css">
-
 <title>Unicode Character Database</title>
-
 </head>
 
-
-
 <body>
 
-
-
-<h1>UNICODE CHARACTER DATABASE<br>  
-Version 3.0.0</h1>
-
+<h1>UNICODE CHARACTER DATABASE<br>
+Version 3.0.1</h1>
 <table border="1" cellspacing="2" cellpadding="0" height="87" width="100%">
-
   <tr>
-
     <td valign="TOP" width="144">Revision</td>
-
-    <td valign="TOP">3.0.0</td>
-
+    <td valign="TOP">3.0.1</td>
   </tr>
-
   <tr>
-
     <td valign="TOP" width="144">Authors</td>
-
     <td valign="TOP">Mark Davis and Ken Whistler</td>
-
   </tr>
-
   <tr>
-
     <td valign="TOP" width="144">Date</td>
-
-    <td valign="TOP">1999-09-11</td>
-
+    <td valign="TOP">2000-08-17</td>
   </tr>
-
   <tr>
-
     <td valign="TOP" width="144">This Version</td>
-
-    <td valign="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
-
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/3.0-Update1/UnicodeCharacterDatabase-3.0.1.html">http://www.unicode.org/Public/3.0-Update1/UnicodeCharacterDatabase-3.0.1.html</a></td>
   </tr>
-
   <tr>
-
     <td valign="TOP" width="144">Previous Version</td>
-
-    <td valign="TOP">n/a</td>
-
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">http://www.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
   </tr>
-
   <tr>
-
     <td valign="TOP" width="144">Latest Version</td>
-
-    <td valign="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html</a></td>
-
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html">http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html</a></td>
   </tr>
-
 </table>
-
-<p align="center">Copyright © 1995-1999 Unicode, Inc. All Rights reserved.</p>  
-  
-<h2>Disclaimer</h2>  
-  
-<p>The Unicode Character Database is provided as is by Unicode, Inc. No claims   
-  
-are made as to fitness for any particular purpose. No warranties of any kind are   
-  
-expressed or implied. The recipient agrees to determine applicability of   
-  
-information provided. If this file has been purchased on magnetic or optical   
-  
-media from Unicode, Inc., the sole remedy for any claim will be exchange of   
-  
-defective media within 90 days of receipt.</p>  
-  
-<p>This disclaimer is applicable for all other data files accompanying the   
-  
-Unicode Character Database, some of which have been compiled by the Unicode   
-  
-Consortium, and some of which have been supplied by other sources.</p>  
-  
-<h2>Limitations on Rights to Redistribute This Data</h2>  
-  
-<p>Recipient is granted the right to make copies in any form for internal   
-  
-distribution and to freely use the information supplied in the creation of   
-  
-products supporting the Unicode<sup>TM</sup> Standard. The files in the Unicode   
-  
-Character Database can be redistributed to third parties or other organizations   
-  
-(whether for profit or not) as long as this notice and the disclaimer notice are   
-  
-retained. Information can be extracted from these files and used in   
-  
-documentation or programs, as long as there is an accompanying notice indicating   
-  
-the source.</p>  
-  
-<h2>Introduction</h2>  
-  
-<p>The Unicode Character Database is a set of files that define the Unicode   
-  
-character properties and internal mappings. For more information about character   
-  
-properties and mappings, see <i><a href="http://www.unicode.org/unicode/uni2book/u2.html">The   
-  
-Unicode Standard</a></i>.</p>  
-  
-<p>The Unicode Character Database has been updated to reflect Version 3.0 of the   
-  
-Unicode Standard, with many characters added to those published in Version 2.0.   
-  
-A number of corrections have also been made to case mappings or other errors in   
-  
-the database noted since the publication of Version 2.0. Normative bidirectional   
-  
-properties have also been modified to reflect decisions of the Unicode Technical   
-  
-Committee.</p>  
-  
-<p>For more information on versions of the Unicode Standard and how to reference   
-  
-them, see <a href="http://www.unicode.org/unicode/standard/versions/">http://www.unicode.org/unicode/standard/versions/</a>.</p>  
-  
-<h2>Conformance</h2>  
-  
-<p>Character properties may be either normative or informative. <i>Normative</i>   
-  
-means that implementations that claim conformance to the Unicode Standard (at a   
-  
-particular version) and which make use of a particular property or field must   
-  
-follow the specifications of the standard for that property or field in order to   
-  
-be conformant. The term <i>normative</i> when applied to a property or field of   
-  
-the Unicode Character Database, does <i>not</i> mean that the value of that   
-  
-field will never change. Corrections and extensions to the standard in the   
-  
-future may require minor changes to normative values, even though the Unicode   
-  
-Technical Committee strives to minimize such changes. An<i> informative </i>property   
-  
-or field is strongly recommended, but a conformant implementation is free to use   
-  
-or change such values as it may require while still being conformant to the   
-  
-standard. Particular implementations may choose to override the properties and   
-  
-mappings that are not normative. In that case, it is up to the implementer to   
-  
-establish a protocol to convey that information.</p>  
-  
-<h2>Files</h2>  
-  
-<p>The following summarizes the files in the Unicode Character Database. &nbsp;For   
-  
-more information about these files, see the referenced technical report or   
-  
-section of Unicode Standard, Version 3.0.</p>  
-  
-<p><b>UnicodeData.txt (Chapter 4)</b>  
-  
-<ul>  
-  
-  <li>The main file in the Unicode Character Database.</li>  
-  
-  <li>For detailed information on the format, see <a href="UnicodeData.html">UnicodeData.html</a>.   
-  
-    This file also characterizes which properties are normative and which are   
-  
-    informative.</li>  
-  
-</ul>  
-  
-<p><b>PropList.txt (Chapter 4)</b>  
-  
-<ul>  
-  
-  <li>Additional informative properties list: <i>Alphabetic, Ideographic,</i>   
-  
-    and <i>Mathematical</i>, among others.</li>  
-  
-</ul>  
-  
-<p><b>SpecialCasing.txt (Chapter 4)</b>  
-  
-<ul>  
-  
-  <li>List of informative special casing properties, including one-to-many   
-  
-    mappings such as SHARP S =&gt; &quot;SS&quot;, and locale-specific mappings,   
-  
-    such as for Turkish <i>dotless i</i>.</li>  
-  
-</ul>  
-  
-<p><b>Blocks.txt (Chapter 14)</b>  
-  
-<ul>  
-  
-  <li>List of normative block names.</li>  
-  
-</ul>  
-  
-<p><b>Jamo.txt (Chapter 4)</b>  
-  
-<ul>  
-  
-  <li>List of normative Jamo short names, used in deriving HANGUL SYLLABLE names   
-  
-    algorithmically.</li>  
-  
-</ul>  
-  
-<p><b>ArabicShaping.txt (Section 8.2)</b>  
-  
-<ul>  
-  
-  <li>Basic Arabic and Syriac character shaping properties, such as initial,   
-  
-    medial and final shapes. These properties are normative for minimal shaping   
-  
-    of Arabic and Syriac. </li>  
-  
-</ul>  
-  
-<p><b>NamesList.txt (Chapter 14)</b>  
-  
-<ul>  
-  
-  <li>This file duplicates some of the material in the UnicodeData file, and   
-  
-    adds informative annotations uses in the character charts, as printed in the   
-  
-    Unicode Standard. </li>  
-  
-  <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches   
-  
-    the appropriate version of the book. Changes in the Unicode Character   
-  
-    Database since then may not be reflected in these files, since they are   
-  
-    primarily of archival interest.</li>  
-  
-</ul>  
-  
-<p><b>Index.txt (Chapter 14)</b>  
-  
-<ul>  
-  
-  <li>Informative index to Unicode characters, as printed in the Unicode   
-  
-    Standard</li>  
-  
-  <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches   
-  
-    the appropriate version of the book. Changes in the Unicode Character   
-  
-    Database since then may not be reflected in these files, since they are   
-  
-    primarily of archival interest.</li>  
-  
-</ul>  
-  
-<p><b>CompositionExclusions.txt (<a href="http://www.unicode.org/unicode/reports/tr15/">UTR#15   
-  
-Unicode Normalization Forms</a>)</b>  
-  
-<ul>  
-  
-  <li>Normative properties for normalization.</li>  
-  
-</ul>  
-  
-<p><b>LineBreak.txt (<a href="http://www.unicode.org/unicode/reports/tr14/">UTR   
-  
-#14: Line Breaking Properties</a>)</b>  
-  
-<ul>  
-  
-  <li>Normative and informative properties for line breaking. To see which   
-  
-    properties are informative and which are normative, consult UTR#14.</li>  
-  
-</ul>  
-  
-<p><b>EastAsianWidth.txt (<a href="http://www.unicode.org/unicode/reports/tr11/">UTR   
-  
-#11: East Asian Character Width</a>)</b>  
-  
-<ul>  
-  
-  <li>Informative properties for determining the choice of wide vs. narrow   
-  
-    glyphs in East Asian contexts.</li>  
-  
-</ul>  
-  
-<p><b>diffXvY.txt</b>  
-  
-<ul>  
-  
-  <li>Mechanically-generated informative files containing accumulated   
-  
-    differences between successive versions of UnicodeData.txt</li>  
-  
-</ul>  
-  
-  
-  
-</body>  
-  
-  
-  
-</html>  
-  
+<p align="center">Copyright © 1995-2000 Unicode, Inc. All Rights reserved.</p>
+<h2>Disclaimer</h2>
+<p>The Unicode Character Database is provided as is by Unicode, Inc. No claims 
+are made as to fitness for any particular purpose. No warranties of any kind are 
+expressed or implied. The recipient agrees to determine applicability of 
+information provided. If this file has been purchased on magnetic or optical 
+media from Unicode, Inc., the sole remedy for any claim will be exchange of 
+defective media within 90 days of receipt.</p>
+<p>This disclaimer is applicable for all other data files accompanying the 
+Unicode Character Database, some of which have been compiled by the Unicode 
+Consortium, and some of which have been supplied by other sources.</p>
+<h2>Limitations on Rights to Redistribute This Data</h2>
+<p>Recipient is granted the right to make copies in any form for internal 
+distribution and to freely use the information supplied in the creation of 
+products supporting the Unicode<sup>TM</sup> Standard. The files in the Unicode 
+Character Database can be redistributed to third parties or other organizations 
+(whether for profit or not) as long as this notice and the disclaimer notice are 
+retained. Information can be extracted from these files and used in 
+documentation or programs, as long as there is an accompanying notice indicating 
+the source.</p>
+<h2>Introduction</h2>
+<p>The Unicode Character Database is a set of files that define the Unicode 
+character properties and internal mappings. For more information about character 
+properties and mappings, see <i><a
+href="http://www.unicode.org/unicode/uni2book/u2.html">The Unicode Standard</a></i>.</p>
+<p>The Unicode Character Database has been updated to reflect Version 3.0 of the 
+Unicode Standard, with many characters added to those published in Version 2.0. 
+A number of corrections have also been made to case mappings or other errors in 
+the database noted since the publication of Version 2.0. Normative bidirectional 
+properties have also been modified to reflect decisions of the Unicode Technical 
+Committee.</p>
+<p>For more information on versions of the Unicode Standard and how to reference 
+them, see <a href="http://www.unicode.org/unicode/standard/versions/">http://www.unicode.org/unicode/standard/versions/</a>.</p>
+<h2>Conformance</h2>
+<p>Character properties may be either normative or informative. <i>Normative</i> 
+means that implementations that claim conformance to the Unicode Standard (at a 
+particular version) and which make use of a particular property or field must 
+follow the specifications of the standard for that property or field in order to 
+be conformant. The term <i>normative</i> when applied to a property or field of 
+the Unicode Character Database, does <i>not</i> mean that the value of that 
+field will never change. Corrections and extensions to the standard in the 
+future may require minor changes to normative values, even though the Unicode 
+Technical Committee strives to minimize such changes. An<i> informative </i>property 
+or field is strongly recommended, but a conformant implementation is free to use 
+or change such values as it may require while still being conformant to the 
+standard. Particular implementations may choose to override the properties and 
+mappings that are not normative. In that case, it is up to the implementer to 
+establish a protocol to convey that information.</p>
+<h2>Files</h2>
+<p>The following summarizes the files in the Unicode Character Database. &nbsp;For 
+more information about these files, see the referenced technical report(s) or 
+section of Unicode Standard, Version 3.0.</p>
+<p><b>UnicodeData.txt (Chapter 4, <a
+href="http://www.unicode.org/unicode/reports/tr21/">UTR #21: Case Mappings</a>, <a
+href="http://www.unicode.org/unicode/reports/tr15/">UAX #15 Unicode Normalization 
+Forms</a>)</b>
+<ul>
+  <li>The main file in the Unicode Character Database.</li>
+  <li>For detailed information on the format, see <a href="UnicodeData.html">UnicodeData.html</a>. 
+    This file also characterizes which properties are normative and which are 
+    informative.</li>
+</ul>
+<p><b>PropList.txt (Chapter 4)</b>
+<ul>
+  <li>Additional informative properties list: <i>Alphabetic, Ideographic,</i> 
+    and <i>Mathematical</i>, among others.</li>
+</ul>
+<p><b>SpecialCasing.txt (Chapter 4, <a
+href="http://www.unicode.org/unicode/reports/tr21/">UTR #21: Case Mappings</a>)</b>
+<ul>
+  <li>List of informative special casing properties, including one-to-many 
+    mappings such as SHARP S =&gt; &quot;SS&quot;, and locale-specific mappings, 
+    such as for Turkish <i>dotless i</i>.</li>
+</ul>
+<p><b>Blocks.txt (Chapter 14)</b>
+<ul>
+  <li>List of normative block names.</li>
+</ul>
+<p><b>Jamo.txt (Chapter 4)</b>
+<ul>
+  <li>List of normative Jamo short names, used in deriving HANGUL SYLLABLE names 
+    algorithmically.</li>
+</ul>
+<p><b>ArabicShaping.txt (Section 8.2)</b>
+<ul>
+  <li>Basic Arabic and Syriac character shaping properties, such as initial, 
+    medial and final shapes. These properties are normative for minimal shaping 
+    of Arabic and Syriac.</li>
+</ul>
+<p><b>NamesList.txt (Chapter 14)</b>
+<ul>
+  <li>This file duplicates some of the material in the UnicodeData file, and 
+    adds informative annotations uses in the character charts, as printed in the 
+    Unicode Standard.</li>
+  <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches 
+    the appropriate version of the book. Changes in the Unicode Character 
+    Database since then may not be reflected in these files, since they are 
+    primarily of archival interest.</li>
+</ul>
+<p><b>Index.txt (Chapter 14)</b>
+<ul>
+  <li>Informative index to Unicode characters, as printed in the Unicode 
+    Standard</li>
+  <li><b>Note: </b>The information in NamesList.txt and Index.txt files matches 
+    the appropriate version of the book. Changes in the Unicode Character 
+    Database since then may not be reflected in these files, since they are 
+    primarily of archival interest.</li>
+</ul>
+<p><b>CompositionExclusions.txt (<a
+href="http://www.unicode.org/unicode/reports/tr15/">UAX #15 Unicode Normalization 
+Forms</a>)</b>
+<ul>
+  <li>Normative properties for normalization.</li>
+</ul>
+<p><b>LineBreak.txt (<a href="http://www.unicode.org/unicode/reports/tr14/">UAX 
+#14: Line Breaking Properties</a>)</b>
+<ul>
+  <li>Normative and informative properties for line breaking. To see which 
+    properties are informative and which are normative, consult UAX #14.</li>
+</ul>
+<p><b>EastAsianWidth.txt (<a href="http://www.unicode.org/unicode/reports/tr11/">UAX 
+#11: East Asian Character Width</a>)</b>
+<ul>
+  <li>Informative properties for determining the choice of wide vs. narrow 
+    glyphs in East Asian contexts.</li>
+</ul>
+<p><b>BidiMirroring.txt</b><b> (<a
+href="http://www.unicode.org/unicode/reports/tr9/">UAX #9:&nbsp;The 
+Bidirectional Algorithm</a>)</b></p>
+<ul>
+  <li>Informative properties for substituting characters in an implementation of 
+    bidirectional mirroring.</li>
+</ul>
+<p><b>CaseFolding.txt (<a href="http://www.unicode.org/unicode/reports/tr21/">UTR 
+#21: Case Mappings</a>)</b></p>
+<ul>
+  <li>Informative file mapping characters to their case-folded form.</li>
+</ul>
+<p><b>NormalizationTest.txt (<a
+href="http://www.unicode.org/unicode/reports/tr15/">UAX #15 Unicode Normalization 
+Forms</a>)</b></p>
+<ul>
+  <li>Normative test file for conformance to Unicode Normalization Forms.</li>
+</ul>
+<p><b>diffXvY.txt</b>
+<ul>
+  <li>Mechanically-generated informative files containing accumulated 
+    differences between successive versions of UnicodeData.txt</li>
+</ul>
+
+</body>
+
+</html>
diff --git a/lib/unicode/UCDFF301.html b/lib/unicode/UCDFF301.html
new file mode 100644 (file)
index 0000000..a8fbe32
--- /dev/null
@@ -0,0 +1,1025 @@
+<html>
+
+<head>
+<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" href="http://www.unicode.org/unicode.css" type="text/css">
+<title>UnicodeData File Format</title>
+</head>
+
+<body>
+
+<h1>UnicodeData File Format<br>
+Version 3.0.1</h1>
+<table border="1" cellspacing="2" cellpadding="0" height="87" width="100%">
+  <tr>
+    <td valign="TOP" width="144">Revision</td>
+    <td valign="TOP">3.0.1</td>
+  </tr>
+  <tr>
+    <td valign="TOP" width="144">Authors</td>
+    <td valign="TOP">Mark Davis and Ken Whistler</td>
+  </tr>
+  <tr>
+    <td valign="TOP" width="144">Date</td>
+    <td valign="TOP">2000-08-17</td>
+  </tr>
+  <tr>
+    <td valign="TOP" width="144">This Version</td>
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/3.0-Update1/UnicodeData-3.0.1.html">http://www.unicode.org/Public/3.0-Update1/UnicodeData-3.0.1.html</a></td>
+  </tr>
+  <tr>
+    <td valign="TOP" width="144">Previous Version</td>
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+  </tr>
+  <tr>
+    <td valign="TOP" width="144">Latest Version</td>
+    <td valign="TOP"><a
+      href="http://www.unicode.org/Public/UNIDATA/UnicodeData.html">http://www.unicode.org/Public/UNIDATA/UnicodeData.html</a></td>
+  </tr>
+</table>
+<p align="center">Copyright © 1995-2000 Unicode, Inc. All Rights reserved.<br>
+<i>For more information, including Disclamer and Limitations, see <a
+href="UnicodeCharacterDatabase-3.0.1.html">UnicodeCharacterDatabase-3.0.1.html</a></i></p>
+<p>This document describes the format of the UnicodeData.txt file, which is one 
+of the files in the Unicode Character Database. The document is divided into the 
+following sections:
+<ul>
+  <li><a href="#Field Formats">Field Formats</a>
+    <ul>
+      <li><a href="#General Category">General Category</a></li>
+      <li><a href="#Bidirectional Category">Bidirectional Category</a></li>
+      <li><a href="#Character Decomposition">Character Decomposition Mapping</a></li>
+      <li><a href="#Canonical Combining Classes">Canonical Combining Classes</a></li>
+      <li><a href="#Decompositions and Normalization">Decompositions and 
+        Normalization</a></li>
+      <li><a href="#Case Mappings">Case Mappings</a></li>
+    </ul>
+  </li>
+  <li><a href="#Property Invariants">Property Invariants</a></li>
+  <li><a href="#Modification History">Modification History</a></li>
+</ul>
+<p><b>Warning: </b>the information in this file does not completely describe the 
+use and interpretation of Unicode character properties and behavior. It must be 
+used in conjunction with the data in the other files in the <a
+href="UnicodeCharacterDatabase-3.0.1.html">Unicode Character Database</a>, and 
+relies on the notation and definitions supplied in <i><a
+href="http://www.unicode.org/unicode/standard/versions/Unicode3.0.html">The 
+Unicode Standard</a></i>. All chapter references are to Version 3.0 of the 
+standard.</p>
+<h2><a name="Field Formats"></a>Field Formats</h2>
+<p>The file consists of lines containing fields separated by semicolons. Each 
+line represents the data for one encoded character in the Unicode Standard. 
+Every encoded character has a data entry, with the exception of certain special 
+ranges, as detailed below.
+<ul>
+  <li>There are nine special ranges of characters that are represented only by 
+    their start and end characters, since the properties in the file are 
+    uniform, except for code values (which are all sequential and assigned).</li>
+  <li>The names of CJK ideograph characters and the names and decompositions of 
+    Hangul syllable characters are algorithmically derivable. (See the Unicode 
+    Standard and <a href="http://www.unicode.org/unicode/reports/tr15/">Unicode 
+    Standard Annex #15</a> for more information).</li>
+  <li>Surrogate code values and private use characters have no names.</li>
+  <li>The Private Use character outside of the BMP (U+F0000..U+FFFFD, 
+    U+100000..U+10FFFD) are listed as distinct ranges. These correspond to surrogate pairs 
+    where the first surrogate is in the High Surrogate Private Use section.</li>
+</ul>
+<p>The exact ranges represented by start and end characters are:
+<ul>
+  <li>CJK Ideographs Extension A (U+3400 - U+4DB5)</li>
+  <li>CJK Ideographs (U+4E00 - U+9FA5)</li>
+  <li>Hangul Syllables (U+AC00 - U+D7A3)</li>
+  <li>Non-Private Use High Surrogates (U+D800 - U+DB7F)</li>
+  <li>Private Use High Surrogates (U+DB80 - U+DBFF)</li>
+  <li>Low Surrogates (U+DC00 - U+DFFF)</li>
+  <li>The Private Use Area (U+E000 - U+F8FF)</li>
+  <li>Plane 15 Private Use Area (U+F0000 - U+FFFFD)</li>
+  <li>Plane 16 Private Use Area (U+100000 - U+10FFFD)</li>
+</ul>
+<p>The following table describes the format and meaning of each field in a data 
+entry in the UnicodeData file. Fields which contain normative information are so 
+indicated.</p>
+<table border="1" cellspacing="2" cellpadding="2">
+  <tr>
+    <th valign="top" align="LEFT">
+      <p align="LEFT">Field</th>
+    <th valign="top" align="LEFT">
+      <p align="LEFT">Name</th>
+    <th valign="top" align="LEFT">
+      <p align="LEFT">Status</th>
+    <th valign="top" align="LEFT">
+      <p align="LEFT">Explanation</th>
+  </tr>
+  <tr>
+    <th valign="top">0</th>
+    <td valign="top">Code value</td>
+    <td valign="top">normative</td>
+    <td valign="top">Code value. For characters in the range U+0000..U+FFFD
+      the code value uses a 4-digit hexadecimal format; for characters in the
+      range U+10000..U+FFFFD the code value uses a 5-digit hexadecimal format;
+      and for characters in the range U+100000..U+10FFFD the code value uses a
+      6-digit hexadecimal format.</td>
+  </tr>
+  <tr>
+    <th valign="top">1</th>
+    <td valign="top">Character name</td>
+    <td valign="top">normative</td>
+    <td valign="top">These names match exactly the names published in Chapter 14 
+      of the Unicode Standard, Version 3.0.</td>
+  </tr>
+  <tr>
+    <th valign="top">2</th>
+    <td valign="top"><a href="#General Category">General Category</a></td>
+    <td valign="top">normative / informative<br>
+      (see below)</td>
+    <td valign="top">This is a useful breakdown into various &quot;character 
+      types&quot; which can be used as a default categorization in 
+      implementations. See below for a brief explanation.</td>
+  </tr>
+  <tr>
+    <th valign="top">3</th>
+    <td valign="top"><a href="#Canonical Combining Classes">Canonical Combining 
+      Classes</a></td>
+    <td valign="top">normative</td>
+    <td valign="top">The classes used for the Canonical Ordering Algorithm in 
+      the Unicode Standard. These classes are also printed in Chapter 4 of the 
+      Unicode Standard.</td>
+  </tr>
+  <tr>
+    <th valign="top">4</th>
+    <td valign="top"><a href="#Bidirectional Category">Bidirectional Category</a></td>
+    <td valign="top">normative</td>
+    <td valign="top">See the list below for an explanation of the abbreviations 
+      used in this field. These are the categories required by the Bidirectional 
+      Behavior Algorithm in the Unicode Standard. These categories are 
+      summarized in Chapter 3 of the Unicode Standard.</td>
+  </tr>
+  <tr>
+    <th valign="top">5</th>
+    <td valign="top"><a href="#Character Decomposition">Character Decomposition 
+      Mapping</a></td>
+    <td valign="top">normative</td>
+    <td valign="top">In the Unicode Standard, not all of the mappings are full 
+      (maximal) decompositions. Recursive application of look-up for 
+      decompositions will, in all cases, lead to a maximal decomposition. The 
+      decomposition mappings match exactly the decomposition mappings published 
+      with the character names in the Unicode Standard.</td>
+  </tr>
+  <tr>
+    <th valign="top">6</th>
+    <td valign="top">Decimal digit value</td>
+    <td valign="top">normative</td>
+    <td valign="top">This is a numeric field. If the character has the decimal 
+      digit property, as specified in Chapter 4 of the Unicode Standard, the 
+      value of that digit is represented with an integer value in this field</td>
+  </tr>
+  <tr>
+    <th valign="top">7</th>
+    <td valign="top">Digit value</td>
+    <td valign="top">normative</td>
+    <td valign="top">This is a numeric field. If the character represents a 
+      digit, not necessarily a decimal digit, the value is here. This covers 
+      digits which do not form decimal radix forms, such as the compatibility 
+      superscript digits</td>
+  </tr>
+  <tr>
+    <th valign="top">8</th>
+    <td valign="top">Numeric value</td>
+    <td valign="top">normative</td>
+    <td valign="top">This is a numeric field. If the character has the numeric 
+      property, as specified in Chapter 4 of the Unicode Standard, the value of 
+      that character is represented with an integer or rational number in this 
+      field. This includes fractions as, e.g., &quot;1/5&quot; for U+2155 VULGAR 
+      FRACTION ONE FIFTH Also included are numerical values for compatibility 
+      characters such as circled numbers.</td>
+  </tr>
+  <tr>
+    <th valign="top">9</th>
+    <td valign="top">Mirrored</td>
+    <td valign="top">normative</td>
+    <td valign="top">If the character has been identified as a 
+      &quot;mirrored&quot; character in bidirectional text, this field has the 
+      value &quot;Y&quot;; otherwise &quot;N&quot;. The list of mirrored 
+      characters is also printed in Chapter 4 of the Unicode Standard.</td>
+  </tr>
+  <tr>
+    <th valign="top">10</th>
+    <td valign="top">Unicode 1.0 Name</td>
+    <td valign="top">informative</td>
+    <td valign="top">This is the old name as published in Unicode 1.0. This name 
+      is only provided when it is significantly different from the Unicode 3.0 
+      name for the character.</td>
+  </tr>
+  <tr>
+    <th valign="top">11</th>
+    <td valign="top">10646 comment field</td>
+    <td valign="top">informative</td>
+    <td valign="top">This is the ISO 10646 comment field. It appears in parentheses 
+      in the 10646 names list, or contains an asterisk to mark an Annex P note.</td>
+  </tr>
+  <tr>
+    <th valign="top">12</th>
+    <td valign="top"><a href="#Case Mappings">Uppercase Mapping</a></td>
+    <td valign="top">informative</td>
+    <td valign="top">Upper case equivalent mapping. If a character is part of an 
+      alphabet with case distinctions, and has an upper case equivalent, then 
+      the upper case equivalent is in this field. See the explanation below on 
+      case distinctions. These mappings are always one-to-one, not one-to-many 
+      or many-to-one. This field is informative.</td>
+  </tr>
+  <tr>
+    <th valign="top">13</th>
+    <td valign="top"><a href="#Case Mappings">Lowercase Mapping</a></td>
+    <td valign="top">informative</td>
+    <td valign="top">Similar to Uppercase mapping</td>
+  </tr>
+  <tr>
+    <th valign="top">14</th>
+    <td valign="top"><a href="#Case Mappings">Titlecase Mapping</a></td>
+    <td valign="top">informative</td>
+    <td valign="top">Similar to Uppercase mapping</td>
+  </tr>
+</table>
+<h3><a name="General Category"></a>General Category</h3>
+<p>The values in this field are abbreviations for the following. Some of the 
+values are normative, and some are informative. For more information, see the 
+Unicode Standard.</p>
+<p><b>Note:</b> the standard does not assign information to control characters 
+(except for certain cases in the Bidirectional Algorithm). Implementations will 
+generally also assign categories to certain control characters, notably CR and 
+LF, according to platform conventions.</p>
+<h4>Normative Categories</h4>
+<table border="0" cellspacing="2" cellpadding="0">
+  <tr>
+    <th>
+      <p align="LEFT">Abbr.</th>
+    <th>
+      <p align="LEFT">Description</th>
+  </tr>
+  <tr>
+    <td align="CENTER">Lu</td>
+    <td>Letter, Uppercase</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Ll</td>
+    <td>Letter, Lowercase</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Lt</td>
+    <td>Letter, Titlecase</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Mn</td>
+    <td>Mark, Non-Spacing</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Mc</td>
+    <td>Mark, Spacing Combining</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Me</td>
+    <td>Mark, Enclosing</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Nd</td>
+    <td>Number, Decimal Digit</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Nl</td>
+    <td>Number, Letter</td>
+  </tr>
+  <tr>
+    <td align="CENTER">No</td>
+    <td>Number, Other</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Zs</td>
+    <td>Separator, Space</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Zl</td>
+    <td>Separator, Line</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Zp</td>
+    <td>Separator, Paragraph</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Cc</td>
+    <td>Other, Control</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Cf</td>
+    <td>Other, Format</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Cs</td>
+    <td>Other, Surrogate</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Co</td>
+    <td>Other, Private Use</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Cn</td>
+    <td>Other, Not Assigned (no characters in the file have this property)</td>
+  </tr>
+</table>
+<h4>Informative Categories</h4>
+<table border="0" cellspacing="2" cellpadding="0">
+  <tr>
+    <th>
+      <p align="LEFT">Abbr.</th>
+    <th>
+      <p align="LEFT">Description</th>
+  </tr>
+  <tr>
+    <td align="CENTER">Lm</td>
+    <td>Letter, Modifier</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Lo</td>
+    <td>Letter, Other</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Pc</td>
+    <td>Punctuation, Connector</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Pd</td>
+    <td>Punctuation, Dash</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Ps</td>
+    <td>Punctuation, Open</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Pe</td>
+    <td>Punctuation, Close</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Pi</td>
+    <td>Punctuation, Initial quote (may behave like Ps or Pe depending on usage)</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Pf</td>
+    <td>Punctuation, Final quote (may behave like Ps or Pe depending on usage)</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Po</td>
+    <td>Punctuation, Other</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Sm</td>
+    <td>Symbol, Math</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Sc</td>
+    <td>Symbol, Currency</td>
+  </tr>
+  <tr>
+    <td align="CENTER">Sk</td>
+    <td>Symbol, Modifier</td>
+  </tr>
+  <tr>
+    <td align="CENTER">So</td>
+    <td>Symbol, Other</td>
+  </tr>
+</table>
+<h3><a name="Bidirectional Category"></a>Bidirectional Category</h3>
+<p>Please refer to Chapter 3 for an explanation of the algorithm for 
+Bidirectional Behavior and an explanation of the significance of these 
+categories. An up-to-date version can be found on <a
+href="http://www.unicode.org/unicode/reports/tr9/">Unicode Standard Annex #9: 
+The Bidirectional Algorithm</a>. These values are normative.</p>
+<table border="0" cellpadding="2">
+  <tr>
+    <th valign="TOP" align="LEFT">
+      <p align="LEFT">Type</th>
+    <th valign="TOP" align="LEFT">
+      <p align="LEFT">Description</th>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>L</b></td>
+    <td valign="TOP">Left-to-Right</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>LRE</b></td>
+    <td valign="TOP">Left-to-Right Embedding</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>LRO</b></td>
+    <td valign="TOP">Left-to-Right Override</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>R</b></td>
+    <td valign="TOP">Right-to-Left</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>AL</b></td>
+    <td valign="TOP">Right-to-Left Arabic</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>RLE</b></td>
+    <td valign="TOP">Right-to-Left Embedding</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>RLO</b></td>
+    <td valign="TOP">Right-to-Left Override</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>PDF</b></td>
+    <td valign="TOP">Pop Directional Format</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>EN</b></td>
+    <td valign="TOP">European Number</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>ES</b></td>
+    <td valign="TOP">European Number Separator</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>ET</b></td>
+    <td valign="TOP">European Number Terminator</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>AN</b></td>
+    <td valign="TOP">Arabic Number</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>CS</b></td>
+    <td valign="TOP">Common Number Separator</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>NSM</b></td>
+    <td valign="TOP">Non-Spacing Mark</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>BN</b></td>
+    <td valign="TOP">Boundary Neutral</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>B</b></td>
+    <td valign="TOP">Paragraph Separator</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>S</b></td>
+    <td valign="TOP">Segment Separator</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>WS</b></td>
+    <td valign="TOP">Whitespace</td>
+  </tr>
+  <tr>
+    <td valign="TOP"><b>ON</b></td>
+    <td valign="TOP">Other Neutrals</td>
+  </tr>
+</table>
+<h3><a name="Character Decomposition"></a>Character Decomposition Mapping</h3>
+<p>The decomposition is a normative property of a character. The tags supplied 
+with certain decomposition mappings generally indicate formatting information. 
+Where no such tag is given, the mapping is designated as canonical. Conversely, 
+the presence of a formatting tag also indicates that the mapping is a 
+compatibility mapping and not a canonical mapping. In the absence of other 
+formatting information in a compatibility mapping, the tag is used to 
+distinguish it from canonical mappings.</p>
+<p>In some instances a canonical mapping or a compatibility mapping may consist 
+of a single character. For a canonical mapping, this indicates that the 
+character is a canonical equivalent of another single character. For a 
+compatibility mapping, this indicates that the character is a compatibility 
+equivalent of another single character. The compatibility formatting tags used 
+are:</p>
+<table border="0" cellspacing="2" cellpadding="0">
+  <tr>
+    <th>Tag</th>
+    <th>
+      <p align="LEFT">Description</th>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;font&gt;&nbsp;&nbsp;</td>
+    <td>A font variant (e.g. a blackletter form).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;noBreak&gt;&nbsp;&nbsp;</td>
+    <td>A no-break version of a space or hyphen.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;initial&gt;&nbsp;&nbsp;</td>
+    <td>An initial presentation form (Arabic).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;medial&gt;&nbsp;&nbsp;</td>
+    <td>A medial presentation form (Arabic).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;final&gt;&nbsp;&nbsp;</td>
+    <td>A final presentation form (Arabic).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;isolated&gt;&nbsp;&nbsp;</td>
+    <td>An isolated presentation form (Arabic).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;circle&gt;&nbsp;&nbsp;</td>
+    <td>An encircled form.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;super&gt;&nbsp;&nbsp;</td>
+    <td>A superscript form.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;sub&gt;&nbsp;&nbsp;</td>
+    <td>A subscript form.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;vertical&gt;&nbsp;&nbsp;</td>
+    <td>A vertical layout presentation form.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;wide&gt;&nbsp;&nbsp;</td>
+    <td>A wide (or zenkaku) compatibility character.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;narrow&gt;&nbsp;&nbsp;</td>
+    <td>A narrow (or hankaku) compatibility character.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;small&gt;&nbsp;&nbsp;</td>
+    <td>A small variant form (CNS compatibility).</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;square&gt;&nbsp;&nbsp;</td>
+    <td>A CJK squared font variant.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;fraction&gt;&nbsp;&nbsp;</td>
+    <td>A vulgar fraction form.</td>
+  </tr>
+  <tr>
+    <td align="CENTER">&lt;compat&gt;&nbsp;&nbsp;</td>
+    <td>Otherwise unspecified compatibility character.</td>
+  </tr>
+</table>
+<p><b>Reminder: </b>There is a difference between decomposition and 
+decomposition mapping. The decomposition mappings are defined in the UnicodeData, 
+while the decomposition (also termed &quot;full decomposition&quot;) is defined 
+in Chapter 3 to use those mappings <i>recursively.</i>
+<ul>
+  <li>The canonical decomposition is formed by recursively applying the 
+    canonical mappings, then applying the canonical reordering algorithm.</li>
+  <li>The compatibility decomposition is formed by recursively applying the 
+    canonical <em>and</em> compatibility mappings, then applying the canonical 
+    reordering algorithm.</li>
+</ul>
+<h3><a name="Canonical Combining Classes"></a>Canonical Combining Classes</h3>
+<table border="0" cellspacing="2" cellpadding="0">
+  <tr>
+    <th>
+      <p align="LEFT">Value</th>
+    <th>
+      <p align="LEFT">Description</th>
+  </tr>
+  <tr>
+    <td align="RIGHT">0:</td>
+    <td>Spacing, split, enclosing, reordrant, and Tibetan subjoined</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">1:</td>
+    <td>Overlays and interior</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">7:</td>
+    <td>Nuktas</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">8:</td>
+    <td>Hiragana/Katakana voicing marks</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">9:</td>
+    <td>Viramas</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">10:</td>
+    <td>Start of fixed position classes</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">199:</td>
+    <td>End of fixed position classes</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">200:</td>
+    <td>Below left attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">202:</td>
+    <td>Below attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">204:</td>
+    <td>Below right attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">208:</td>
+    <td>Left attached (reordrant around single base character)</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">210:</td>
+    <td>Right attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">212:</td>
+    <td>Above left attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">214:</td>
+    <td>Above attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">216:</td>
+    <td>Above right attached</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">218:</td>
+    <td>Below left</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">220:</td>
+    <td>Below</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">222:</td>
+    <td>Below right</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">224:</td>
+    <td>Left (reordrant around single base character)</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">226:</td>
+    <td>Right</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">228:</td>
+    <td>Above left</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">230:</td>
+    <td>Above</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">232:</td>
+    <td>Above right</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">233:</td>
+    <td>Double below</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">234:</td>
+    <td>Double above</td>
+  </tr>
+  <tr>
+    <td align="RIGHT">240:</td>
+    <td>Below (iota subscript)</td>
+  </tr>
+</table>
+<p><strong>Note: </strong>some of the combining classes in this list do not 
+currently have members but are specified here for completeness.</p>
+<h3><a name="Decompositions and Normalization"></a>Decompositions and 
+Normalization</h3>
+<p>Decomposition is specified in Chapter 3. <a
+href="http://www.unicode.org/unicode/reports/tr15/"><i>Unicode Standard Annex 
+#15: Unicode Normalization Forms</i></a> specifies the interaction between decomposition 
+and normalization. The most up-to-date version is found on <a
+href="http://www.unicode.org/unicode/reports/tr15/">http://www.unicode.org/unicode/reports/tr15/</a>. 
+That report specifies how the decompositions defined in UnicodeData.txt are used 
+to derive normalized forms of Unicode text.</p>
+<p>Note that as of the 2.1.9 update of the Unicode Character Database, the 
+decompositions in the UnicodeData.txt file can be used to recursively derive the 
+full decomposition in canonical order, without the need to separately apply 
+canonical reordering. However, canonical reordering of combining character 
+sequences must still be applied in decomposition when normalizing source text 
+which contains any combining marks.</p>
+<h3><a name="Case Mappings"></a>Case Mappings</h3>
+<p>The case mapping is an informative, default mapping. Case itself, on the 
+other hand, has normative status. Thus, for example, 0041 LATIN CAPITAL LETTER A 
+is normatively uppercase, but its lowercase mapping the 0061 LATIN SMALL LETTER 
+A is informative. The reason for this is that case can be considered to be an 
+inherent property of a particular character (and is usually, but not always, 
+derivable from the presence of the terms &quot;CAPITAL&quot; or 
+&quot;SMALL&quot; in the character name), but case mappings between characters 
+are occasionally influenced by local conventions. For example, certain 
+languages, such as Turkish, German, French, or Greek may have small deviations 
+from the default mappings listed in UnicodeData.</p>
+<p>In addition to uppercase and lowercase, because of the inclusion of certain 
+composite characters for compatibility, such as 01F1 LATIN CAPITAL LETTER DZ, 
+there is a third case, called <i>titlecase</i>, which is used where the first 
+letter of a word is to be capitalized (e.g. UPPERCASE, Titlecase, lowercase). An 
+example of such a titlecase letter is 01F2 LATIN CAPITAL LETTER D WITH SMALL 
+LETTER Z.</p>
+<p>The uppercase, titlecase and lowercase fields are only included for 
+characters that have a single corresponding character of that type. Composite 
+characters (such as &quot;339D SQUARE CM&quot;) that do not have a single 
+corresponding character of that type can be cased by decomposition.</p>
+<p>For compatibility with existing parsers, UnicodeData only contains case 
+mappings for characters where they are one-to-one mappings; it also omits 
+information about context-sensitive case mappings. Information about these 
+special cases can be found in a separate data file, <a
+href="http://www.unicode.org/Public/3.0-Update1/">SpecialCasing.txt</a>, which 
+has been added starting with the 2.1.8 update to the Unicode data files. 
+SpecialCasing.txt contains additional informative case mappings that are either 
+not one-to-one or which are context-sensitive.</p>
+<h2><a name="Property Invariants"></a>Property Invariants</h2>
+<p>Values in UnicodeData.txt are subject to correction as errors are found; 
+however, some characteristics of the categories themselves can be considered 
+invariants. Applications may wish to take these invariants into account when 
+choosing how to implement character properties. The following is a partial list 
+of known invariants for the Unicode Character Database.</p>
+<h4>Database Fields</h4>
+<ul>
+  <li>The number of fields in UnicodeData.txt is fixed.</li>
+  <li>The order of the fields is also fixed.
+    <ul>
+      <li>Any additional information about character properties to be added in 
+        the future will appear in separate data tables, rather than being added 
+        on to the existing table or by subdivision or reinterpretation of 
+        existing fields.</li>
+    </ul>
+  </li>
+</ul>
+<h4>General Category</h4>
+<ul>
+  <li>There will never be more than 32 General Category values.
+    <ul>
+      <li>It is very unlikely that the Unicode Technical Committee will 
+        subdivide the General Category partition any further, since that can 
+        cause implementations to misbehave. Because the General Category is 
+        limited to 32 values, 5 bits can be used to represent the information, 
+        and a 32-bit integer can be used as a bitmask to represent arbitrary 
+        sets of categories.</li>
+    </ul>
+  </li>
+</ul>
+<h4>Combining Classes</h4>
+<ul>
+  <li>Combining classes are limited to the values 0 to 255.
+    <ul>
+      <li>In practice, there are far fewer than 256 values used. Implementations 
+        may take advantage of this fact for compression, since only the ordering 
+        of the non-zero values matters for the Canonical Reordering Algorithm. 
+        It is possible for up to 256 values to be used in the future; however, 
+        UTC decisions in the future may restrict the number of values to 128, 
+        since this has implementation advantages. [Signed bytes can be used 
+        without widening to ints in Java, for example.]</li>
+    </ul>
+  </li>
+  <li>All characters other than those of General Category M* have the combining 
+    class 0.
+    <ul>
+      <li>Currently, all characters other than those of General Category Mn have 
+        the value 0. However, some characters of General Category Me or Mc may 
+        be given non-zero values in the future.</li>
+      <li>The precise values above the value 0 are not invariant--only the 
+        relative ordering is considered normative. For example, it is not 
+        guaranteed in future versions that the class of U+05B4 will be precisely 
+        14.</li>
+    </ul>
+  </li>
+</ul>
+<h4>Case</h4>
+<ul>
+  <li>Characters of type Lu, Lt, or Ll are called <i>cased</i>. All characters 
+    with an Upper, Lower, or Titlecase mapping are cased characters.
+    <ul>
+      <li>However, characters with the General Categories of Lu, Ll, or Lt may 
+        not always have case mappings, and case mappings may vary by locale. 
+        (See http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt).</li>
+    </ul>
+  </li>
+</ul>
+<h4>Canonical Decomposition</h4>
+<ul>
+  <li>Canonical mappings are always in canonical order.</li>
+  <li>Canonical mappings have only the first of a pair possibly further 
+    decomposing.</li>
+  <li>Canonical decompositions are &quot;transparent&quot; to other character 
+    data:
+    <ul>
+      <li><tt>BIDI(a) = BIDI(principal(canonicalDecomposition(a))</tt></li>
+      <li><tt>Category(a) = Category(principal(canonicalDecomposition(a))</tt></li>
+      <li><tt>CombiningClass(a) = 
+        CombiningClass(principal(canonicalDecomposition(a))</tt><br>
+        where principal(a) is the first character not of type Mn, or the first 
+        character if all characters are of type Mn.</li>
+    </ul>
+  </li>
+  <li>However, because there are sometimes missing case pairs, and because of 
+    some legacy characters, it is only generally true that:
+    <ul>
+      <li><tt>upper(canonicalDecomposition(a)) = canonicalDecomposition(upper(a))</tt></li>
+      <li><tt>lower(canonicalDecomposition(a)) = canonicalDecomposition(lower(a))</tt></li>
+      <li><tt>title(canonicalDecomposition(a)) = canonicalDecomposition(title(a))</tt></li>
+    </ul>
+  </li>
+</ul>
+<h2><a name="Modification History"></a>Modification History</h2>
+<p>This section provides a summary of the changes between update versions of the 
+Unicode Standard.</p>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 3.0.1">Unicode 
+3.0.1</a></h3>
+<p>Modifications made for Version 3.0.1 of UnicodeData.txt include:
+<ul>
+  <li>Added 5- and 6-digit representation of code points past U+FFFF.</li>
+  <li>Added Private Use range definitions for Planes 15 and 16.</li>
+  <li>Minor additions for the 10646 comment field.</li>
+</ul>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 3.0.0">Unicode 
+3.0.0</a></h3>
+<p>Modifications made for Version 3.0.0 of UnicodeData.txt include many new 
+characters and a number of property changes. These are summarized in Appendex D 
+of <em>The Unicode Standard, Version 3.0.</em></p>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.9">Unicode 
+2.1.9</a></h3>
+<p>Modifications made for Version 2.1.9 of UnicodeData.txt include:
+<ul>
+  <li>Corrected combining class for U+05AE HEBREW ACCENT ZINOR.</li>
+  <li>Corrected combining class for U+20E1 COMBINING LEFT RIGHT ARROW ABOVE</li>
+  <li>Corrected combining class for U+0F35 and U+0F37 to 220.</li>
+  <li>Corrected combining class for U+0F71 to 129.</li>
+  <li>Added a decomposition for U+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR.</li>
+  <li>Added&nbsp; decompositions for several Greek symbol letters: 
+    U+03D0..U+03D2, U+03D5, U+03D6, U+03F0..U+03F2.</li>
+  <li>Removed&nbsp; decompositions from the conjoining jamo block: 
+    U+1100..U+11F8.</li>
+  <li>Changes to decomposition mappings for some Tibetan vowels for consistency 
+    in normalization. (U+0F71, U+0F73, U+0F77, U+0F79, U+0F81)</li>
+  <li>Updated the decomposition mappings for several Vietnamese characters with 
+    two diacritics (U+1EAC, U+1EAD, U+1EB6, U+1EB7, U+1EC6, U+1EC7, U+1ED8, 
+    U+1ED9), so that the recursive decomposition can be generated directly in 
+    canonically reordered form (not a normative change).</li>
+  <li>Updated the decomposition mappings for several Arabic compatibility 
+    characters involving shadda (U+FC5E..U+FC62, U+FCF2..U+FCF4), and two Latin 
+    characters (U+1E1C, U+1E1D), so that the decompositions are generated 
+    directly in canonically reordered form (not a normative change).</li>
+  <li>Changed BIDI category for: U+00A0 NO-BREAK SPACE, U+2007 FIGURE SPACE, 
+    U+2028 LINE SEPARATOR.</li>
+  <li>Changed BIDI category for extenders of General Category Lm: U+3005, 
+    U+3021..U+3035, U+FF9E, U+FF9F.</li>
+  <li>Changed General Category and BIDI category for the Greek numeral signs: 
+    U+0374, U+0375.</li>
+  <li>Corrected General Category for U+FFE8 HALFWIDTH FORMS LIGHT VERTICAL.</li>
+  <li>Added Unicode 1.0 names for many Tibetan characters (informative).</li>
+</ul>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.8">Unicode 
+2.1.8</a></h3>
+<p>Modifications made for Version 2.1.8 of UnicodeData.txt include:
+<ul>
+  <li>Added combining class 240 for U+0345 COMBINING GREEK YPOGEGRAMMENI so that 
+    decompositions involving iota subscript are derivable directly in 
+    canonically reordered form; this also has a bearing on simplification of 
+    casing of polytonic Greek.</li>
+  <li>Changes in decompositions related to Greek tonos. These result from the 
+    clarification that monotonic Greek &quot;tonos&quot; should be equated with 
+    U+0301 COMBINING ACUTE, rather than with U+030D COMBINING VERTICAL LINE 
+    ABOVE. (All Greek characters in the Greek block involving &quot;tonos&quot;; 
+    some Greek characters in the polytonic Greek in the 1FXX block.)</li>
+  <li>Changed decompositions involving dialytika tonos. (U+0390, U+03B0)</li>
+  <li>Changed ternary decompositions to binary. (U+0CCB, U+FB2C, U+FB2D) These 
+    changes simplify normalization.</li>
+  <li>Removed canonical decomposition for Latin Candrabindu. (U+0310)</li>
+  <li>Corrected error in canonical decomposition for U+1FF4.</li>
+  <li>Added compatibility decompositions to clarify collation tables. (U+2100, 
+    U+2101, U+2105, U+2106, U+1E9A)</li>
+  <li>A series of general category changes to assist the convergence of of 
+    Unicode definition of identifier with ISO TR 10176:
+    <ul>
+      <li>So &gt; Lo: U+0950, U+0AD0, U+0F00, U+0F88..U+0F8B</li>
+      <li>Po &gt; Lo: U+0E2F, U+0EAF, U+3006</li>
+      <li>Lm &gt; Sk: U+309B, U+309C</li>
+      <li>Po &gt; Pc: U+30FB, U+FF65</li>
+      <li>Ps/Pe &gt; Mn: U+0F3E, U+0F3F</li>
+    </ul>
+  </li>
+  <li>A series of bidi property changes for consistency.
+    <ul>
+      <li>L &gt; ET: U+09F2, U+09F3</li>
+      <li>ON &gt; L: U+3007</li>
+      <li>L &gt; ON: U+0F3A..U+0F3D, U+037E, U+0387</li>
+    </ul>
+  </li>
+  <li>Add case mapping: U+01A6 &lt;-&gt; U+0280</li>
+  <li>Updated symmetric swapping value for guillemets: U+00AB, U+00BB, U+2039, 
+    U+203A.</li>
+  <li>Changes to combining class values. Most Indic fixed position class 
+    non-spacing marks were changed to combining class 0. This fixes some 
+    inconsistencies in how canonical reordering would apply to Indic scripts, 
+    including Tibetan. Indic interacting top/bottom fixed position classes were 
+    merged into single (non-zero) classes as part of this change. Tibetan 
+    subjoined consonants are changed from combining class 6 to combining class 
+    0. Thai pinthu (U+0E3A) moved to combining class 9. Moved two Devanagari 
+    stress marks into generic above and below combining classes (U+0951, 
+    U+0952).</li>
+  <li>Corrected placement of semicolon near symmetric swapping field. (U+FA0E, 
+    etc., scattered positions to U+FA29)</li>
+</ul>
+<h3>Version 2.1.7</h3>
+<p><i>This version was for internal change tracking only, and never publicly 
+released.</i></p>
+<h3>Version 2.1.6</h3>
+<p><i>This version was for internal change tracking only, and never publicly 
+released.</i></p>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.5">Unicode 
+2.1.5</a></h3>
+<p>Modifications made for Version 2.1.5 of UnicodeData.txt include:
+<ul>
+  <li>Changed decomposition for U+FF9E and U+FF9F so that correct collation 
+    weighting will automatically result from the canonical equivalences.</li>
+  <li>Removed canonical decompositions for U+04D4, U+04D5, U+04D8, U+04D9, 
+    U+04E0, U+04E1, U+04E8, U+04E9 (the implication being that no canonical 
+    equivalence is claimed between these 8 characters and similar Latin 
+    letters), and updated 4 canonical decompositions for U+04DB, U+04DC, U+04EA, 
+    U+04EB to reflect the implied difference in the base character.</li>
+  <li>Added Pi, and Pf categories and assigned the relevant quotation marks to 
+    those categories, based on the Unicode Technical Corrigendum on Quotation 
+    Characters.</li>
+  <li>Updating of many bidi properties, following the advice of the ad hoc 
+    committee on bidi, and to make the bidi properties of compatibility 
+    characters more consistent.</li>
+  <li>Changed category of several Tibetan characters: U+0F3E, U+0F3F, 
+    U+0F88..U+0F8B to make them non-combining, reflecting the combined opinion 
+    of Tibetan experts.</li>
+  <li>Added case mapping for U+03F2.</li>
+  <li>Corrected case mapping for U+0275.</li>
+  <li>Added titlecase mappings for U+03D0, U+03D1, U+03D5, U+03D6, U+03F0.. 
+    U+03F2.</li>
+  <li>Corrected compatibility label for U+2121.</li>
+  <li>Add specific entries for all the CJK compatibility ideographs, 
+    U+F900..U+FA2D, so the canonical decomposition for each (the URO character 
+    it is equivalent to) can be carried in the database.</li>
+</ul>
+<h3>Version 2.1.4</h3>
+<p><i>This version was for internal change tracking only, and never publicly 
+released.</i></p>
+<h3>Version 2.1.3</h3>
+<p><i>This version was for internal change tracking only, and never publicly 
+released.</i></p>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.2">Unicode 
+2.1.2</a></h3>
+<p>Modifications made in updating UnicodeData.txt to Version 2.1.2 for the 
+Unicode Standard, Version 2.1 (from Version 2.0) include:
+<ul>
+  <li>Added two characters (U+20AC and U+FFFC).</li>
+  <li>Amended bidi properties for U+0026, U+002E, U+0040, U+2007.</li>
+  <li>Corrected case mappings for U+018E, U+019F, U+01DD, U+0258, U+0275, 
+    U+03C2, U+1E9B.</li>
+  <li>Changed combining order class for U+0F71.</li>
+  <li>Corrected canonical decompositions for U+0F73, U+1FBE.</li>
+  <li>Changed decomposition for U+FB1F from compatibility to canonical.</li>
+  <li>Added compatibility decompositions for U+FBE8, U+FBE9, U+FBF9..U+FBFB.</li>
+  <li>Corrected compatibility decompositions for U+2469, U+246A, U+3358.</li>
+</ul>
+<h3>Version 2.1.1</h3>
+<p><i>This version was for internal change tracking only, and never publicly 
+released.</i></p>
+<h3><a
+href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.0.0">Unicode 
+2.0.0</a></h3>
+<p>The modifications made in updating UnicodeData.txt for the Unicode Standard, 
+Version 2.0 include:
+<ul>
+  <li>Fixed decompositions with TONOS to use correct NSM: 030D.</li>
+  <li>Removed old Hangul Syllables; mapping to new characters are in a separate 
+    table.</li>
+  <li>Marked compatibility decompositions with additional tags.</li>
+  <li>Changed old tag names for clarity.</li>
+  <li>Revision of decompositions to use first-level decomposition, instead of 
+    maximal decomposition.</li>
+  <li>Correction of all known errors in decompositions from earlier versions.</li>
+  <li>Added control code names (as old Unicode names).</li>
+  <li>Added Hangul Jamo decompositions.</li>
+  <li>Added Number category to match properties list in book.</li>
+  <li>Fixed categories of Koranic Arabic marks.</li>
+  <li>Fixed categories of precomposed characters to match decomposition where 
+    possible.</li>
+  <li>Added Hebrew cantillation marks and the Tibetan script.</li>
+  <li>Added place holders for ranges such as CJK Ideographic Area and the 
+    Private Use Area.</li>
+  <li>Added categories Me, Sk, Pc, Nl, Cs, Cf, and rectified a number of 
+    mistakes in the database.</li>
+</ul>
+
+</body>
+
+</html>
similarity index 99%
rename from lib/unicode/Unicode.300
rename to lib/unicode/Unicode.301
index 6a54d3d..6804a75 100644 (file)
 0081;<control>;Cc;0;BN;;;;;N;;;;;
 0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;;
 0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;;
-0084;<control>;Cc;0;BN;;;;;N;INDEX;;;;
+0084;<control>;Cc;0;BN;;;;;N;;;;;
 0085;<control>;Cc;0;B;;;;;N;NEXT LINE;;;;
 0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;;
 0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;;
 01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2
 01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5;
 01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4
-01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280;
+01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;*;;0280;
 01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8;
 01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7
 01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283;
 027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;;
 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;;
 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;;
-0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6
+0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;*;01A6;;01A6
 0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;;
 0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;;
 0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9
 0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
 0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
 0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
-0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;;N;;;;;
-0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;;N;;;;;
-0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;;N;;;;;
-0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;;N;;;;;
-0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;;N;;;;;
-0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;;N;;;;;
-0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;;N;;;;;
-0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;;N;;;;;
-0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;;N;;;;;
-0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;;N;;;;;
+0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;;
 0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;;
 0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;;
 0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;;
 0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;;
 0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;;
 0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;;
-0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;;
+0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;dena sum;;;
 1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;;
 1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;;
 1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;;
 318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
 3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;;
 3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;;
-3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;;N;KAERITEN ITI;Kaeriten;;;
-3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;;N;KAERITEN NI;Kaeriten;;;
-3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;;N;KAERITEN SAN;Kaeriten;;;
-3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;;N;KAERITEN SI;Kaeriten;;;
+3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;Kaeriten;;;
 3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;;
 3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;;
 3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;Kaeriten;;;
 321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;;
 321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;;
 321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;;
-3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;;N;;;;;
-3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;;N;;;;;
-3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;;N;;;;;
-3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;;N;;;;;
-3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;;N;;;;;
-3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;;N;;;;;
-3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;;N;;;;;
-3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;;N;;;;;
-3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;;N;;;;;
-3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;;N;;;;;
+3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;;
 322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;;
 322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;;
 322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;;
@@ -10615,3 +10615,7 @@ FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;;
 FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;;
 FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
 FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;;
+FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;;
+100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;;
+10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;;
diff --git a/lib/unicode/Unicode3.html b/lib/unicode/Unicode3.html
deleted file mode 100644 (file)
index a08a25e..0000000
+++ /dev/null
@@ -1,1988 +0,0 @@
-<html>
-
-
-
-<head>
-
-<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 4.0">
-
-<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
-
-<link REL="stylesheet" HREF="http://www.unicode.org/unicode.css" TYPE="text/css">
-
-<title>UnicodeData File Format</title>
-
-</head>
-
-
-
-<body>
-
-
-
-<h1>UnicodeData File Format<br> 
-Version 3.0.0</h1>
-
-
-
-<table BORDER="1" CELLSPACING="2" CELLPADDING="0" HEIGHT="87" WIDTH="100%">
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">Revision</td>
-
-    <td VALIGN="TOP">3.0.0</td>
-
-  </tr>
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">Authors</td>
-
-    <td VALIGN="TOP">Mark Davis and Ken Whistler</td>
-
-  </tr>
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">Date</td>
-
-    <td VALIGN="TOP">1999-09-12</td>
-
-  </tr>
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">This Version</td>
-
-    <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
-
-  </tr>
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">Previous Version</td>
-
-    <td VALIGN="TOP">n/a</td>
-
-  </tr>
-
-  <tr>
-
-    <td VALIGN="TOP" width="144">Latest Version</td>
-
-    <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
-
-  </tr>
-
-</table>
-
-
-
-<p align="center">Copyright © 1995-1999 Unicode, Inc. All Rights reserved.<br>    
-    
-<i>For more information, including Disclamer and Limitations, see <a HREF="UnicodeCharacterDatabase-3.0.0.html">UnicodeCharacterDatabase-3.0.0.html</a> </i></p>   
-   
-   
-   
-<p>This document describes the format of the UnicodeData.txt file, which is one of the    
-   
-files in the Unicode Character Database. The document is divided into the following    
-   
-sections:    
-   
-   
-   
-<ul>   
-   
-  <li><a HREF="#Field Formats">Field Formats</a> <ul>   
-   
-      <li><a HREF="#General Category">General Category</a> </li>   
-   
-      <li><a HREF="#Bidirectional Category">Bidirectional Category</a> </li>   
-   
-      <li><a HREF="#Character Decomposition">Character Decomposition Mapping</a> </li>  
-  
-      <li><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </li>  
-  
-      <li><a HREF="#Decompositions and Normalization">Decompositions and Normalization</a> </li>  
-  
-      <li><a HREF="#Case Mappings">Case Mappings</a> </li>  
-  
-    </ul>  
-  
-  </li>  
-  
-  <li><a HREF="#Property Invariants">Property Invariants</a> </li>  
-  
-  <li><a HREF="#Modification History">Modification History</a> </li>  
-  
-</ul>  
-  
-  
-  
-<p><b>Warning: </b>the information in this file does not completely describe the use and   
-  
-interpretation of Unicode character properties and behavior. It must be used in   
-  
-conjunction with the data in the other files in the Unicode Character Database, and relies   
-  
-on the notation and definitions supplied in <i><a href="http://www.unicode.org/unicode/standard/versions/Unicode3.0.html"> The Unicode 
-Standard</a></i>. All chapter references   
-  
-are to Version 3.0 of the standard.</p>  
-  
-  
-  
-<h2><a NAME="Field Formats"></a>Field Formats</h2>    
-    
-    
-    
-<p>The file consists of lines containing fields terminated by semicolons. Each line     
-    
-represents the data for one encoded character in the Unicode Standard. Every encoded     
-    
-character has a data entry, with the exception of certain special ranges, as detailed     
-    
-below.     
-    
-    
-    
-<ul>    
-    
-  <li>There are six special ranges of characters that are represented only by their start and     
-    
-    end characters, since the properties in the file are uniform, except for code values     
-    
-    (which are all sequential and assigned). </li>    
-    
-  <li>The names of CJK ideograph characters and the names and decompositions of Hangul     
-    
-    syllable characters are algorithmically derivable. (See the Unicode Standard and <a    
-    
-    HREF="http://www.unicode.org/unicode/reports/tr15/">Unicode Technical Report #15</a> for     
-    
-    more information). </li>    
-    
-  <li>Surrogate code values and private use characters have no names. </li>    
-    
-  <li>The Private Use character outside of the BMP (U+F0000..U+FFFFD, U+100000..U+10FFFD) are     
-    
-    not listed. These correspond to surrogate pairs where the first surrogate is in the High     
-    
-    Surrogate Private Use section. </li>    
-    
-</ul>    
-    
-    
-    
-<p>The exact ranges represented by start and end characters are:     
-    
-    
-    
-<ul>    
-    
-  <li>CJK Ideographs Extension A (U+3400 - U+4DB5) </li>    
-    
-  <li>CJK Ideographs (U+4E00 - U+9FA5) </li>    
-    
-  <li>Hangul Syllables (U+AC00 - U+D7A3) </li>    
-    
-  <li>Non-Private Use High Surrogates (U+D800 - U+DB7F) </li>    
-    
-  <li>Private Use High Surrogates (U+DB80 - U+DBFF) </li>    
-    
-  <li>Low Surrogates (U+DC00 - U+DFFF) </li>    
-    
-  <li>The Private Use Area (U+E000 - U+F8FF) </li>    
-    
-</ul>    
-    
-    
-    
-<p>The following table describes the format and meaning of each field in a data entry in     
-    
-the UnicodeData file. Fields which contain normative information are so indicated.</p>    
-    
-    
-    
-<table BORDER="1" CELLSPACING="2" CELLPADDING="2">    
-    
-  <tr>    
-    
-    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Field</th>    
-    
-    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Name</th>    
-    
-    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Status</th>    
-    
-    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Explanation</th>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">0</th>    
-    
-    <td VALIGN="top">Code value</td>    
-    
-    <td VALIGN="top">normative</td>    
-    
-    <td VALIGN="top">Code value in 4-digit hexadecimal format.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">1</th>    
-    
-    <td VALIGN="top">Character name</td>    
-    
-    <td VALIGN="top">normative</td>    
-    
-    <td VALIGN="top">These names match exactly the names published in Chapter 14 of the     
-    
-    Unicode Standard, Version 3.0.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">2</th>    
-    
-    <td VALIGN="top"><a HREF="#General Category">General Category</a> </td>    
-    
-    <td VALIGN="top">normative / informative<br>    
-    
-    (see below)</td>    
-    
-    <td VALIGN="top">This is a useful breakdown into various &quot;character types&quot; which     
-    
-    can be used as a default categorization in implementations. See below for a brief     
-    
-    explanation.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">3</th>    
-    
-    <td VALIGN="top"><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </td>    
-    
-    <td VALIGN="top">normative</td>    
-    
-    <td VALIGN="top">The classes used for the Canonical Ordering Algorithm in the Unicode     
-    
-    Standard. These classes are also printed in Chapter 4 of the Unicode Standard.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">4</th>    
-    
-    <td VALIGN="top"><a HREF="#Bidirectional Category">Bidirectional Category</a> </td>    
-    
-    <td VALIGN="top">normative</td>    
-    
-    <td VALIGN="top">See the list below for an explanation of the abbreviations used in this     
-    
-    field. These are the categories required by the Bidirectional Behavior Algorithm in the     
-    
-    Unicode Standard. These categories are summarized in Chapter 3 of the Unicode Standard.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">5</th>    
-    
-    <td VALIGN="top"><a HREF="#Character Decomposition">Character Decomposition  
-      Mapping</a></td>   
-   
-    <td VALIGN="top">normative</td>   
-   
-    <td VALIGN="top">In the Unicode Standard, not all of the mappings are full (maximal)    
-   
-    decompositions. Recursive application of look-up for decompositions will, in all cases,    
-   
-    lead to a maximal decomposition. The decomposition mappings match exactly the    
-   
-    decomposition mappings published with the character names in the Unicode Standard.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">6</th>   
-   
-    <td VALIGN="top">Decimal digit value</td>   
-   
-    <td VALIGN="top">normative</td>   
-   
-    <td VALIGN="top">This is a numeric field. If the character has the decimal digit property,    
-   
-    as specified in Chapter 4 of the Unicode Standard, the value of that digit is represented    
-   
-    with an integer value in this field</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">7</th>   
-   
-    <td VALIGN="top">Digit value</td>   
-   
-    <td VALIGN="top">normative</td>   
-   
-    <td VALIGN="top">This is a numeric field. If the character represents a digit, not    
-   
-    necessarily a decimal digit, the value is here. This covers digits which do not form    
-   
-    decimal radix forms, such as the compatibility superscript digits</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">8</th>   
-   
-    <td VALIGN="top">Numeric value</td>   
-   
-    <td VALIGN="top">normative</td>   
-   
-    <td VALIGN="top">This is a numeric field. If the character has the numeric property, as    
-   
-    specified in Chapter 4 of the Unicode Standard, the value of that character is represented    
-   
-    with an integer or rational number in this field. This includes fractions as, e.g.,    
-   
-    &quot;1/5&quot; for U+2155 VULGAR FRACTION ONE FIFTH Also included are numerical values    
-   
-    for compatibility characters such as circled numbers.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">8</th>   
-   
-    <td VALIGN="top">Mirrored</td>   
-   
-    <td VALIGN="top">normative</td>   
-   
-    <td VALIGN="top">If the character has been identified as a &quot;mirrored&quot; character    
-   
-    in bidirectional text, this field has the value &quot;Y&quot;; otherwise &quot;N&quot;.    
-   
-    The list of mirrored characters is also printed in Chapter 4 of the Unicode Standard.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">10</th>   
-   
-    <td VALIGN="top">Unicode 1.0 Name</td>   
-   
-    <td VALIGN="top">informative</td>   
-   
-    <td VALIGN="top">This is the old name as published in Unicode 1.0. This name is only    
-   
-    provided when it is significantly different from the Unicode 3.0 name for the character.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">11</th>   
-   
-    <td VALIGN="top">10646 comment field</td>   
-   
-    <td VALIGN="top">informative</td>   
-   
-    <td VALIGN="top">This is the ISO 10646 comment field. It is in parantheses in the 10646    
-   
-    names list.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">12</th>   
-   
-    <td VALIGN="top"><a HREF="#Case Mappings">Uppercase Mapping</a></td>   
-   
-    <td VALIGN="top">informative</td>   
-   
-    <td VALIGN="top">Upper case equivalent mapping. If a character is part of an alphabet with    
-   
-    case distinctions, and has an upper case equivalent, then the upper case equivalent is in    
-   
-    this field. See the explanation below on case distinctions. These mappings are always    
-   
-    one-to-one, not one-to-many or many-to-one. This field is informative.</td>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <th VALIGN="top">13</th>   
-   
-    <td VALIGN="top"><a HREF="#Case Mappings">Lowercase Mapping</a></td>   
-   
-    <td VALIGN="top">informative</td>   
-   
-    <td VALIGN="top">Similar to Uppercase mapping</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <th VALIGN="top">14</th>    
-    
-    <td VALIGN="top"><a HREF="#Case Mappings">Titlecase Mapping</a></td>   
-   
-    <td VALIGN="top">informative</td>   
-   
-    <td VALIGN="top">Similar to Uppercase mapping</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<h3><a NAME="General Category"></a>General Category</h3>    
-    
-    
-    
-<p>The values in this field are abbreviations for the following. Some of the values are     
-    
-normative, and some are informative. For more information, see the Unicode Standard.</p>    
-    
-    
-    
-<p><b>Note:</b> the standard does not assign information to control characters (except for     
-    
-certain cases in the Bidirectional Algorithm). Implementations will generally also assign     
-    
-categories to certain control characters, notably CR and LF, according to platform     
-    
-conventions.</p>    
-    
-    
-    
-<h4>Normative Categories</h4>    
-    
-    
-    
-<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
-    
-  <tr>    
-    
-    <th><p ALIGN="LEFT">Abbr.</th>    
-    
-    <th><p ALIGN="LEFT">Description</th>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Lu</td>    
-    
-    <td>Letter, Uppercase</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Ll</td>    
-    
-    <td>Letter, Lowercase</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Lt</td>    
-    
-    <td>Letter, Titlecase</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Mn</td>    
-    
-    <td>Mark, Non-Spacing</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Mc</td>    
-    
-    <td>Mark, Spacing Combining</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Me</td>    
-    
-    <td>Mark, Enclosing</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Nd</td>    
-    
-    <td>Number, Decimal Digit</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Nl</td>    
-    
-    <td>Number, Letter</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">No</td>    
-    
-    <td>Number, Other</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Zs</td>    
-    
-    <td>Separator, Space</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Zl</td>    
-    
-    <td>Separator, Line</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Zp</td>    
-    
-    <td>Separator, Paragraph</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Cc</td>    
-    
-    <td>Other, Control</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Cf</td>    
-    
-    <td>Other, Format</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Cs</td>    
-    
-    <td>Other, Surrogate</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Co</td>    
-    
-    <td>Other, Private Use</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Cn</td>    
-    
-    <td>Other, Not Assigned (no characters in the file have this property)</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<h4>Informative Categories</h4>    
-    
-    
-    
-<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
-    
-  <tr>    
-    
-    <th><p ALIGN="LEFT">Abbr.</th>    
-    
-    <th><p ALIGN="LEFT">Description</th>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Lm</td>    
-    
-    <td>Letter, Modifier</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Lo</td>    
-    
-    <td>Letter, Other</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Pc</td>    
-    
-    <td>Punctuation, Connector</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Pd</td>    
-    
-    <td>Punctuation, Dash</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Ps</td>    
-    
-    <td>Punctuation, Open</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Pe</td>    
-    
-    <td>Punctuation, Close</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Pi</td>    
-    
-    <td>Punctuation, Initial quote (may behave like Ps or Pe depending on usage)</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Pf</td>    
-    
-    <td>Punctuation, Final quote (may behave like Ps or Pe depending on usage)</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Po</td>    
-    
-    <td>Punctuation, Other</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Sm</td>    
-    
-    <td>Symbol, Math</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Sc</td>    
-    
-    <td>Symbol, Currency</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">Sk</td>    
-    
-    <td>Symbol, Modifier</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">So</td>    
-    
-    <td>Symbol, Other</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<h3><a NAME="Bidirectional Category"></a>Bidirectional Category</h3>    
-    
-    
-    
-<p>Please refer to Chapter 3 for an explanation of the algorithm for Bidirectional     
-    
-Behavior and an explanation of the significance of these categories. An up-to-date version     
-    
-can be found on <a HREF="http://www.unicode.org/unicode/reports/tr9/">Unicode Technical     
-    
-Report #9: The Bidirectional Algorithm</a>. These values are normative.</p>    
-    
-    
-    
-<table BORDER="0" CELLPADDING="2">    
-    
-  <tr>    
-    
-    <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Type</th>    
-    
-    <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Description</th>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>L</b></td>    
-    
-    <td VALIGN="TOP">Left-to-Right</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>LRE</b></td>    
-    
-    <td VALIGN="TOP">Left-to-Right Embedding</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>LRO</b></td>    
-    
-    <td VALIGN="TOP">Left-to-Right Override</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>R</b></td>    
-    
-    <td VALIGN="TOP">Right-to-Left</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>AL</b></td>    
-    
-    <td VALIGN="TOP">Right-to-Left Arabic</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>RLE</b></td>    
-    
-    <td VALIGN="TOP">Right-to-Left Embedding</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>RLO</b></td>    
-    
-    <td VALIGN="TOP">Right-to-Left Override</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>PDF</b></td>    
-    
-    <td VALIGN="TOP">Pop Directional Format</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>EN</b></td>    
-    
-    <td VALIGN="TOP">European Number</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>ES</b></td>    
-    
-    <td VALIGN="TOP">European Number Separator</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>ET</b></td>    
-    
-    <td VALIGN="TOP">European Number Terminator</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>AN</b></td>    
-    
-    <td VALIGN="TOP">Arabic Number</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>CS</b></td>    
-    
-    <td VALIGN="TOP">Common Number Separator</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>NSM</b></td>    
-    
-    <td VALIGN="TOP">Non-Spacing Mark</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>BN</b></td>    
-    
-    <td VALIGN="TOP">Boundary Neutral</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>B</b></td>    
-    
-    <td VALIGN="TOP">Paragraph Separator</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>S</b></td>    
-    
-    <td VALIGN="TOP">Segment Separator</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>WS</b></td>    
-    
-    <td VALIGN="TOP">Whitespace</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td VALIGN="TOP"><b>ON</b></td>    
-    
-    <td VALIGN="TOP">Other Neutrals</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<h3><a NAME="Character Decomposition"></a>Character Decomposition Mapping</h3>   
-   
-   
-   
-<p>The decomposition is a normative property of a character. The tags supplied with    
-   
-certain decomposition mappings generally indicate formatting information. Where no such    
-   
-tag is given, the mapping is designated as canonical. Conversely, the presence of a    
-   
-formatting tag also indicates that the mapping is a compatibility mapping and not a    
-   
-canonical mapping. In the absence of other formatting information in a compatibility    
-   
-mapping, the tag is used to distinguish it from canonical mappings.</p>   
-   
-   
-   
-<p>In some instances a canonical mapping or a compatibility mapping may consist of a    
-   
-single character. For a canonical mapping, this indicates that the character is a    
-   
-canonical equivalent of another single character. For a compatibility mapping, this    
-   
-indicates that the character is a compatibility equivalent of another single character.    
-   
-The compatibility formatting tags used are:</p>   
-   
-   
-   
-<table BORDER="0" CELLSPACING="2" CELLPADDING="0">   
-   
-  <tr>   
-   
-    <th>Tag</th>   
-   
-    <th><p ALIGN="LEFT">Description</th>   
-   
-  </tr>   
-   
-  <tr>   
-   
-    <td ALIGN="CENTER">&lt;font&gt;&nbsp;&nbsp;</td>   
-   
-    <td>A font variant (e.g. a blackletter form).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;noBreak&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A no-break version of a space or hyphen.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;initial&gt;&nbsp;&nbsp;</td>    
-    
-    <td>An initial presentation form (Arabic).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;medial&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A medial presentation form (Arabic).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;final&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A final presentation form (Arabic).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;isolated&gt;&nbsp;&nbsp;</td>    
-    
-    <td>An isolated presentation form (Arabic).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;circle&gt;&nbsp;&nbsp;</td>    
-    
-    <td>An encircled form.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;super&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A superscript form.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;sub&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A subscript form.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;vertical&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A vertical layout presentation form.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;wide&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A wide (or zenkaku) compatibility character.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;narrow&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A narrow (or hankaku) compatibility character.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;small&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A small variant form (CNS compatibility).</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;square&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A CJK squared font variant.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;fraction&gt;&nbsp;&nbsp;</td>    
-    
-    <td>A vulgar fraction form.</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="CENTER">&lt;compat&gt;&nbsp;&nbsp;</td>    
-    
-    <td>Otherwise unspecified compatibility character.</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<p><b>Reminder: </b>There is a difference between decomposition and decomposition mapping.     
-    
-The decomposition mappings are defined in the UnicodeData, while the decomposition (also     
-    
-termed &quot;full decomposition&quot;) is defined in Chapter 3 to use those mappings  
-<i>    
-   
-recursively.</i>    
-   
-   
-   
-<ul>   
-   
-  <li>The canonical decomposition is formed by recursively applying the canonical mappings,    
-   
-    then applying the canonical reordering algorithm. </li>   
-   
-  <li>The compatibility decomposition is formed by recursively applying the canonical <em>and</em>    
-   
-    compatibility mappings, then applying the canonical reordering algorithm. </li>   
-   
-</ul>   
-   
-   
-   
-<h3><a NAME="Canonical Combining Classes"></a>Canonical Combining Classes</h3>    
-    
-    
-    
-<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
-    
-  <tr>    
-    
-    <th><p ALIGN="LEFT">Value</th>    
-    
-    <th><p ALIGN="LEFT">Description</th>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">0:</td>    
-    
-    <td>Spacing, split, enclosing, reordrant, and Tibetan subjoined</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">1:</td>    
-    
-    <td>Overlays and interior</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">7:</td>    
-    
-    <td>Nuktas</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">8:</td>    
-    
-    <td>Hiragana/Katakana voicing marks</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">9:</td>    
-    
-    <td>Viramas</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">10:</td>    
-    
-    <td>Start of fixed position classes</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">199:</td>    
-    
-    <td>End of fixed position classes</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">200:</td>    
-    
-    <td>Below left attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">202:</td>    
-    
-    <td>Below attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">204:</td>    
-    
-    <td>Below right attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">208:</td>    
-    
-    <td>Left attached (reordrant around single base character)</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">210:</td>    
-    
-    <td>Right attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">212:</td>    
-    
-    <td>Above left attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">214:</td>    
-    
-    <td>Above attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">216:</td>    
-    
-    <td>Above right attached</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">218:</td>    
-    
-    <td>Below left</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">220:</td>    
-    
-    <td>Below</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">222:</td>    
-    
-    <td>Below right</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">224:</td>    
-    
-    <td>Left (reordrant around single base character)</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">226:</td>    
-    
-    <td>Right</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">228:</td>    
-    
-    <td>Above left</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">230:</td>    
-    
-    <td>Above</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">232:</td>    
-    
-    <td>Above right</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">233:</td>    
-    
-    <td>Double below</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">234:</td>    
-    
-    <td>Double above</td>    
-    
-  </tr>    
-    
-  <tr>    
-    
-    <td ALIGN="RIGHT">240:</td>    
-    
-    <td>Below (iota subscript)</td>    
-    
-  </tr>    
-    
-</table>    
-    
-    
-    
-<p><strong>Note: </strong>some of the combining classes in this list do not currently have     
-    
-members but are specified here for completeness.</p>    
-    
-    
-    
-<h3><a NAME="Decompositions and Normalization"></a>Decompositions and Normalization</h3>    
-    
-    
-    
-<p>Decomposition is specified in Chapter 3. <a href="http://www.unicode.org/unicode/reports/tr15/"><i>Unicode Technical Report #15:     
-    
-Normalization Forms</i></a> specifies the interaction between decomposition and normalization. The     
-    
-most up-to-date version is found on <a HREF="http://www.unicode.org/unicode/reports/tr15/">http://www.unicode.org/unicode/reports/tr15/</a>.     
-    
-That report specifies how the decompositions defined in UnicodeData.txt are used to derive     
-    
-normalized forms of Unicode text.</p>    
-    
-    
-    
-<p>Note that as of the 2.1.9 update of the Unicode Character Database, the decompositions     
-    
-in the UnicodeData.txt file can be used to recursively derive the full decomposition in     
-    
-canonical order, without the need to separately apply canonical reordering. However,     
-    
-canonical reordering of combining character sequences must still be applied in     
-    
-decomposition when normalizing source text which contains any combining marks.</p>    
-    
-    
-    
-<h3><a NAME="Case Mappings"></a>Case Mappings</h3>    
-    
-    
-    
-<p>The case mapping is an informative, default mapping. Case itself, on the other hand,     
-    
-has normative status. Thus, for example, 0041 LATIN CAPITAL LETTER A is normatively     
-    
-uppercase, but its lowercase mapping the 0061 LATIN SMALL LETTER A is informative. The     
-    
-reason for this is that case can be considered to be an inherent property of a particular     
-    
-character (and is usually, but not always, derivable from the presence of the terms     
-    
-&quot;CAPITAL&quot; or &quot;SMALL&quot; in the character name), but case mappings between     
-    
-characters are occasionally influenced by local conventions. For example, certain     
-    
-languages, such as Turkish, German, French, or Greek may have small deviations from the     
-    
-default mappings listed in UnicodeData.</p>    
-    
-    
-    
-<p>In addition to uppercase and lowercase, because of the inclusion of certain composite     
-    
-characters for compatibility, such as 01F1 LATIN CAPITAL LETTER DZ, there is a third case,     
-    
-called <i>titlecase</i>, which is used where the first letter of a word is to be     
-    
-capitalized (e.g. UPPERCASE, Titlecase, lowercase). An example of such a titlecase letter     
-    
-is 01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z.</p>    
-    
-    
-    
-<p>The uppercase, titlecase and lowercase fields are only included for characters that     
-    
-have a single corresponding character of that type. Composite characters (such as     
-    
-&quot;339D SQUARE CM&quot;) that do not have a single corresponding character of that type     
-    
-can be cased by decomposition.</p>    
-    
-    
-    
-<p>For compatibility with existing parsers, UnicodeData only contains case mappings for     
-    
-characters where they are one-to-one mappings; it also omits information about     
-    
-context-sensitive case mappings. Information about these special cases can be found in a     
-    
-separate data file, SpecialCasing.txt,     
-    
-which has been added starting with the 2.1.8 update to the Unicode data files.     
-    
-SpecialCasing.txt contains additional informative case mappings that are either not     
-    
-one-to-one or which are context-sensitive.</p>    
-    
-    
-    
-<h2><a NAME="Property Invariants"></a>Property Invariants</h2>    
-    
-    
-    
-<p>Values in UnicodeData.txt are subject to correction as errors are found; however, some     
-    
-characteristics of the categories themselves can be considered invariants. Applications     
-    
-may wish to take these invariants into account when choosing how to implement character     
-    
-properties. The following is a partial list of known invariants for the Unicode Character     
-    
-Database.</p>    
-    
-    
-    
-<h4>Database Fields</h4>    
-    
-    
-    
-<ul>    
-    
-  <li>The number of fields in UnicodeData.txt is fixed. </li>    
-    
-  <li>The order of the fields is also fixed. <ul>    
-    
-      <li>Any additional information about character properties to be added in the future will     
-    
-        appear in separate data tables, rather than being added on to the existing table or by     
-    
-        subdivision or reinterpretation of existing fields. </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-</ul>    
-    
-    
-    
-<h4>General Category</h4>    
-    
-    
-    
-<ul>    
-    
-  <li>There will never be more than 32 General Category values. <ul>    
-    
-      <li>It is very unlikely that the Unicode Technical Committee will subdivide the General     
-    
-        Category partition any further, since that can cause implementations to misbehave. Because     
-    
-        the General Category is limited to 32 values, 5 bits can be used to represent the     
-    
-        information, and a 32-bit integer can be used as a bitmask to represent arbitrary sets of     
-    
-        categories. </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-</ul>    
-    
-    
-    
-<h4>Combining Classes</h4>    
-    
-    
-    
-<ul>    
-    
-  <li>Combining classes are limited to the values 0 to 255. <ul>    
-    
-      <li>In practice, there are far fewer than 256 values used. Implementations may take     
-    
-        advantage of this fact for compression, since only the ordering of the non-zero values     
-    
-        matters for the Canonical Reordering Algorithm. It is possible for up to 256 values to be     
-    
-        used in the future; however, UTC decisions in the future may restrict the number of values     
-    
-        to 128, since this has implementation advantages. [Signed bytes can be used without     
-    
-        widening to ints in Java, for example.] </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-  <li>All characters other than those of General Category M* have the combining class 0. <ul>    
-    
-      <li>Currently, all characters other than those of General Category Mn have the value 0.     
-    
-        However, some characters of General Category Me or Mc may be given non-zero values in the     
-    
-        future. </li>    
-    
-      <li>The precise values above the value 0 are not invariant--only the relative ordering is     
-    
-        considered normative. For example, it is not guaranteed in future versions that the class     
-    
-        of U+05B4 will be precisely 14. </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-</ul>    
-    
-    
-    
-<h4>Case</h4>    
-    
-    
-    
-<ul>    
-    
-  <li>Characters of type Lu, Lt, or Ll are called <i>cased</i>. All characters with an Upper,     
-    
-    Lower, or Titlecase mapping are cased characters. <ul>    
-    
-      <li>However, characters with the General Categories of Lu, Ll, or Lt may not always have     
-    
-        case mappings, and case mappings may vary by locale. (See     
-    
-        ftp://ftp.unicode.org/Public/UNIDATA/SpecialCasing.txt). </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-</ul>    
-    
-    
-    
-<h4>Canonical Decomposition</h4>    
-    
-    
-    
-<ul>    
-    
-  <li>Canonical mappings are always in canonical order. </li>    
-    
-  <li>Canonical mappings have only the first of a pair possibly further decomposing. </li>    
-    
-  <li>Canonical decompositions are &quot;transparent&quot; to other character data: <ul>    
-    
-      <li><tt>BIDI(a) = BIDI(principal(canonicalDecomposition(a))</tt> </li>    
-    
-      <li><tt>Category(a) = Category(principal(canonicalDecomposition(a))</tt> </li>    
-    
-      <li><tt>CombiningClass(a) = CombiningClass(principal(canonicalDecomposition(a))</tt><br>    
-    
-        where principal(a) is the first character not of type Mn, or the first character if all     
-    
-        characters are of type Mn. </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-  <li>However, because there are sometimes missing case pairs, and because of some legacy     
-    
-    characters, it is only generally true that: <ul>    
-    
-      <li><tt>upper(canonicalDecomposition(a)) = canonicalDecomposition(upper(a))</tt> </li>    
-    
-      <li><tt>lower(canonicalDecomposition(a)) = canonicalDecomposition(lower(a))</tt> </li>    
-    
-      <li><tt>title(canonicalDecomposition(a)) = canonicalDecomposition(title(a))</tt> </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-</ul>    
-    
-    
-    
-<h2><a NAME="Modification History"></a>Modification History</h2>    
-    
-    
-    
-<p>This section provides a summary of the changes between update versions of the Unicode     
-    
-Standard.</p>    
-    
-    
-    
-<h3><a href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 3.0.0"> Unicode 3.0.0</a></h3>    
-    
-    
-    
-<p>Modifications made for Version 3.0.0 of UnicodeData.txt include many new characters and     
-    
-a number of property changes. These are summarized in Appendex D of <em>The Unicode     
-    
-Standard, Version 3.0.</em></p>    
-    
-    
-    
-<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.9">Unicode 2.1.9</a> </h3>    
-    
-    
-    
-<p>Modifications made for Version 2.1.9 of UnicodeData.txt include:     
-    
-    
-    
-<ul>    
-    
-  <li>Corrected combining class for U+05AE HEBREW ACCENT ZINOR. </li>    
-    
-  <li>Corrected combining class for U+20E1 COMBINING LEFT RIGHT ARROW ABOVE </li>    
-    
-  <li>Corrected combining class for U+0F35 and U+0F37 to 220. </li>    
-    
-  <li>Corrected combining class for U+0F71 to 129. </li>    
-    
-  <li>Added a decomposition for U+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR. </li>    
-    
-  <li>Added&nbsp; decompositions for several Greek symbol letters: U+03D0..U+03D2, U+03D5,     
-    
-    U+03D6, U+03F0..U+03F2. </li>    
-    
-  <li>Removed&nbsp; decompositions from the conjoining jamo block: U+1100..U+11F8. </li>    
-    
-  <li>Changes to decomposition mappings for some Tibetan vowels for consistency in     
-    
-    normalization. (U+0F71, U+0F73, U+0F77, U+0F79, U+0F81) </li>    
-    
-  <li>Updated the decomposition mappings for several Vietnamese characters with two diacritics     
-    
-    (U+1EAC, U+1EAD, U+1EB6, U+1EB7, U+1EC6, U+1EC7, U+1ED8, U+1ED9), so that the recursive     
-    
-    decomposition can be generated directly in canonically reordered form (not a normative     
-    
-    change). </li>    
-    
-  <li>Updated the decomposition mappings for several Arabic compatibility characters involving     
-    
-    shadda (U+FC5E..U+FC62, U+FCF2..U+FCF4), and two Latin characters (U+1E1C, U+1E1D), so     
-    
-    that the decompositions are generated directly in canonically reordered form (not a     
-    
-    normative change). </li>    
-    
-  <li>Changed BIDI category for: U+00A0 NO-BREAK SPACE, U+2007 FIGURE SPACE, U+2028 LINE     
-    
-    SEPARATOR. </li>    
-    
-  <li>Changed BIDI category for extenders of General Category Lm: U+3005, U+3021..U+3035,     
-    
-    U+FF9E, U+FF9F. </li>    
-    
-  <li>Changed General Category and BIDI category for the Greek numeral signs: U+0374, U+0375. </li>    
-    
-  <li>Corrected General Category for U+FFE8 HALFWIDTH FORMS LIGHT VERTICAL. </li>    
-    
-  <li>Added Unicode 1.0 names for many Tibetan characters (informative). </li>    
-    
-</ul>    
-    
-    
-    
-<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.8">Unicode 2.1.8</a> </h3>    
-    
-    
-    
-<p>Modifications made for Version 2.1.8 of UnicodeData.txt include:     
-    
-    
-    
-<ul>    
-    
-  <li>Added combining class 240 for U+0345 COMBINING GREEK YPOGEGRAMMENI so that     
-    
-    decompositions involving iota subscript are derivable directly in canonically reordered     
-    
-    form; this also has a bearing on simplification of casing of polytonic Greek. </li>    
-    
-  <li>Changes in decompositions related to Greek tonos. These result from the clarification     
-    
-    that monotonic Greek &quot;tonos&quot; should be equated with U+0301 COMBINING ACUTE,     
-    
-    rather than with U+030D COMBINING VERTICAL LINE ABOVE. (All Greek characters in the Greek     
-    
-    block involving &quot;tonos&quot;; some Greek characters in the polytonic Greek in the     
-    
-    1FXX block.) </li>    
-    
-  <li>Changed decompositions involving dialytika tonos. (U+0390, U+03B0) </li>    
-    
-  <li>Changed ternary decompositions to binary. (U+0CCB, U+FB2C, U+FB2D) These changes     
-    
-    simplify normalization. </li>    
-    
-  <li>Removed canonical decomposition for Latin Candrabindu. (U+0310) </li>    
-    
-  <li>Corrected error in canonical decomposition for U+1FF4. </li>    
-    
-  <li>Added compatibility decompositions to clarify collation tables. (U+2100, U+2101, U+2105,     
-    
-    U+2106, U+1E9A) </li>    
-    
-  <li>A series of general category changes to assist the convergence of of Unicode definition     
-    
-    of identifier with ISO TR 10176: <ul>    
-    
-      <li>So &gt; Lo: U+0950, U+0AD0, U+0F00, U+0F88..U+0F8B </li>    
-    
-      <li>Po &gt; Lo: U+0E2F, U+0EAF, U+3006 </li>    
-    
-      <li>Lm &gt; Sk: U+309B, U+309C </li>    
-    
-      <li>Po &gt; Pc: U+30FB, U+FF65 </li>    
-    
-      <li>Ps/Pe &gt; Mn: U+0F3E, U+0F3F </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-  <li>A series of bidi property changes for consistency. <ul>    
-    
-      <li>L &gt; ET: U+09F2, U+09F3 </li>    
-    
-      <li>ON &gt; L: U+3007 </li>    
-    
-      <li>L &gt; ON: U+0F3A..U+0F3D, U+037E, U+0387 </li>    
-    
-    </ul>    
-    
-  </li>    
-    
-  <li>Add case mapping: U+01A6 &lt;-&gt; U+0280 </li>    
-    
-  <li>Updated symmetric swapping value for guillemets: U+00AB, U+00BB, U+2039, U+203A. </li>    
-    
-  <li>Changes to combining class values. Most Indic fixed position class non-spacing marks     
-    
-    were changed to combining class 0. This fixes some inconsistencies in how canonical     
-    
-    reordering would apply to Indic scripts, including Tibetan. Indic interacting top/bottom     
-    
-    fixed position classes were merged into single (non-zero) classes as part of this change.     
-    
-    Tibetan subjoined consonants are changed from combining class 6 to combining class 0. Thai     
-    
-    pinthu (U+0E3A) moved to combining class 9. Moved two Devanagari stress marks into generic     
-    
-    above and below combining classes (U+0951, U+0952). </li>    
-    
-  <li>Corrected placement of semicolon near symmetric swapping field. (U+FA0E, etc., scattered     
-    
-    positions to U+FA29) </li>    
-    
-</ul>    
-    
-    
-    
-<h3>Version 2.1.7</h3>    
-    
-    
-    
-<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
-    
-    
-    
-<h3>Version 2.1.6</h3>    
-    
-    
-    
-<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
-    
-    
-    
-<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.5">Unicode 2.1.5</a> </h3>    
-    
-    
-    
-<p>Modifications made for Version 2.1.5 of UnicodeData.txt include:     
-    
-    
-    
-<ul>    
-    
-  <li>Changed decomposition for U+FF9E and U+FF9F so that correct collation weighting will     
-    
-    automatically result from the canonical equivalences. </li>    
-    
-  <li>Removed canonical decompositions for U+04D4, U+04D5, U+04D8, U+04D9, U+04E0, U+04E1,     
-    
-    U+04E8, U+04E9 (the implication being that no canonical equivalence is claimed between     
-    
-    these 8 characters and similar Latin letters), and updated 4 canonical decompositions for     
-    
-    U+04DB, U+04DC, U+04EA, U+04EB to reflect the implied difference in the base character. </li>    
-    
-  <li>Added Pi, and Pf categories and assigned the relevant quotation marks to those     
-    
-    categories, based on the Unicode Technical Corrigendum on Quotation Characters. </li>    
-    
-  <li>Updating of many bidi properties, following the advice of the ad hoc committee on bidi,     
-    
-    and to make the bidi properties of compatibility characters more consistent. </li>    
-    
-  <li>Changed category of several Tibetan characters: U+0F3E, U+0F3F, U+0F88..U+0F8B to make     
-    
-    them non-combining, reflecting the combined opinion of Tibetan experts. </li>    
-    
-  <li>Added case mapping for U+03F2. </li>    
-    
-  <li>Corrected case mapping for U+0275. </li>    
-    
-  <li>Added titlecase mappings for U+03D0, U+03D1, U+03D5, U+03D6, U+03F0.. U+03F2. </li>    
-    
-  <li>Corrected compatibility label for U+2121. </li>    
-    
-  <li>Add specific entries for all the CJK compatibility ideographs, U+F900..U+FA2D, so the     
-    
-    canonical decomposition for each (the URO character it is equivalent to) can be carried in     
-    
-    the database. </li>    
-    
-</ul>    
-    
-    
-    
-<h3>Version 2.1.4</h3>    
-    
-    
-    
-<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
-    
-    
-    
-<h3>Version 2.1.3</h3>    
-    
-    
-    
-<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
-    
-    
-    
-<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.2">Unicode 2.1.2</a> </h3>    
-    
-    
-    
-<p>Modifications made in updating UnicodeData.txt to Version 2.1.2 for the Unicode     
-    
-Standard, Version 2.1 (from Version 2.0) include:     
-    
-    
-    
-<ul>    
-    
-  <li>Added two characters (U+20AC and U+FFFC). </li>    
-    
-  <li>Amended bidi properties for U+0026, U+002E, U+0040, U+2007. </li>    
-    
-  <li>Corrected case mappings for U+018E, U+019F, U+01DD, U+0258, U+0275, U+03C2, U+1E9B. </li>    
-    
-  <li>Changed combining order class for U+0F71. </li>    
-    
-  <li>Corrected canonical decompositions for U+0F73, U+1FBE. </li>    
-    
-  <li>Changed decomposition for U+FB1F from compatibility to canonical. </li>    
-    
-  <li>Added compatibility decompositions for U+FBE8, U+FBE9, U+FBF9..U+FBFB. </li>    
-    
-  <li>Corrected compatibility decompositions for U+2469, U+246A, U+3358. </li>    
-    
-</ul>    
-    
-    
-    
-<h3>Version 2.1.1</h3>    
-    
-    
-    
-<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
-    
-    
-    
-<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.0.0">Unicode 2.0.0</a> </h3>    
-    
-    
-    
-<p>The modifications made in updating UnicodeData.txt for the Unicode     
-    
-Standard, Version 2.0 include:     
-    
-    
-    
-<ul>    
-    
-  <li>Fixed decompositions with TONOS to use correct NSM: 030D. </li>    
-    
-  <li>Removed old Hangul Syllables; mapping to new characters are in a separate table. </li>    
-    
-  <li>Marked compatibility decompositions with additional tags. </li>    
-    
-  <li>Changed old tag names for clarity. </li>    
-    
-  <li>Revision of decompositions to use first-level decomposition, instead of maximal     
-    
-    decomposition. </li>    
-    
-  <li>Correction of all known errors in decompositions from earlier versions. </li>    
-    
-  <li>Added control code names (as old Unicode names). </li>    
-    
-  <li>Added Hangul Jamo decompositions. </li>    
-    
-  <li>Added Number category to match properties list in book. </li>    
-    
-  <li>Fixed categories of Koranic Arabic marks. </li>    
-    
-  <li>Fixed categories of precomposed characters to match decomposition where possible. </li>    
-    
-  <li>Added Hebrew cantillation marks and the Tibetan script. </li>    
-    
-  <li>Added place holders for ranges such as CJK Ideographic Area and the Private Use Area. </li>    
-    
-  <li>Added categories Me, Sk, Pc, Nl, Cs, Cf, and rectified a number of mistakes in the     
-    
-    database. </li>    
-    
-</ul>    
-    
-</body>    
-    
-</html>    
-    
index 241d2e6..37b6e84 100755 (executable)
@@ -2,16 +2,16 @@
 
 use bytes;
 
-$UnicodeData = "Unicode.300";
+$UnicodeData = "Unicode.301";
 $SyllableData = "syllables.txt";
-$PropData = "Props.txt";
+$PropData = "PropList.txt";
 
 
 # Note: we try to keep filenames unique within first 8 chars.  Using
 # subdirectories for the following helps.
-mkdir "In", 0777;
-mkdir "Is", 0777;
-mkdir "To", 0777;
+mkdir "In", 0755;
+mkdir "Is", 0755;
+mkdir "To", 0755;
 
 @todo = (
 # typical
@@ -161,7 +161,7 @@ mkdir "To", 0777;
 
 # Number
 
-    ['Number',         '$num',                 '$num'],
+    ['Number',         '$num ne ""',           '$num'],
 
 # Mirrored
 
index 17ec37b..6d6c0eb 100644 (file)
@@ -1,5 +1,7 @@
 package utf8;
 
+if (ord('A') != 193) { # make things more pragmatic for EBCDIC folk
+
 $utf8::hint_bits = 0x00800000;
 
 sub import {
@@ -13,7 +15,10 @@ sub unimport {
 
 sub AUTOLOAD {
     require "utf8_heavy.pl";
-    goto &$AUTOLOAD;
+    goto &$AUTOLOAD if defined &$AUTOLOAD;
+    Carp::croak("Undefined subroutine $AUTOLOAD called");
+}
+
 }
 
 1;
@@ -44,7 +49,9 @@ in future we would like to standardize on the UTF-8 encoding for
 source text.  Until UTF-8 becomes the default format for source
 text, this pragma should be used to recognize UTF-8 in the source.
 When UTF-8 becomes the standard source format, this pragma will
-effectively become a no-op.
+effectively become a no-op.  This pragma already is a no-op on
+EBCDIC platforms (where it is alright to code perl in EBCDIC 
+rather than UTF-8).
 
 Enabling the C<utf8> pragma has the following effects:
 
index ac6d919..2517239 100644 (file)
@@ -26,6 +26,14 @@ warnings - Perl pragma to control optional warnings
         warnings::warn("void", "some warning");
     }
 
+    if (warnings::enabled($object)) {
+        warnings::warn($object, "some warning");
+    }
+
+    warnif("some warning");
+    warnif("void", "some warning");
+    warnif($object, "some warning");
+
 =head1 DESCRIPTION
 
 If no import list is supplied, all possible warnings are either enabled
@@ -37,26 +45,78 @@ A number of functions are provided to assist module authors.
 
 =item use warnings::register
 
-Creates a new warnings category which has the same name as the module
-where the call to the pragma is used.
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
+
+=item warnings::warn($object, $message)
 
-=item warnings::enabled([$category])
+Print C<$message> to STDERR.
 
-Returns TRUE if the warnings category C<$category> is enabled in the
-calling module.  Otherwise returns FALSE.
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
 
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
 
-=item warnings::warn([$category,] $message)
 
-If the calling module has I<not> set C<$category> to "FATAL", print
-C<$message> to STDERR.
-If the calling module has set C<$category> to "FATAL", print C<$message>
-STDERR then die.
+=item warnings::warnif($message)
 
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+Equivalent to:
+
+    if (warnings::enabled())
+      { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($category))
+      { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($object))
+      { warnings::warn($object, $message) }
 
 =back
 
@@ -243,44 +303,80 @@ sub bits {
 
 sub import {
     shift;
-    ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+    my $mask = ${^WARNING_BITS} ;
+    if (vec($mask, $Offsets{'all'}, 1)) {
+        $mask |= $Bits{'all'} ;
+        $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+    }
+    ${^WARNING_BITS} = $mask | bits(@_ ? @_ : 'all') ;
 }
 
 sub unimport {
     shift;
     my $mask = ${^WARNING_BITS} ;
     if (vec($mask, $Offsets{'all'}, 1)) {
-        $mask = $Bits{'all'} ;
+        $mask |= $Bits{'all'} ;
         $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
     }
     ${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
 }
 
-sub enabled
+sub __chk
 {
-    croak("Usage: warnings::enabled([category])")
-       unless @_ == 1 || @_ == 0 ;
-    local $Carp::CarpLevel = 1 ;
     my $category ;
     my $offset ;
-    my $callers_bitmask = (caller(1))[9] ; 
-    return 0 unless defined $callers_bitmask ;
-
+    my $isobj = 0 ;
 
     if (@_) {
         # check the category supplied.
         $category = shift ;
+        if (ref $category) {
+            croak ("not an object")
+                if $category !~ /^([^=]+)=/ ;+
+           $category = $1 ;
+            $isobj = 1 ;
+        }
         $offset = $Offsets{$category};
         croak("unknown warnings category '$category'")
            unless defined $offset;
     }
     else {
-        $category = (caller(0))[0] ; 
+        $category = (caller(1))[0] ; 
         $offset = $Offsets{$category};
         croak("package '$category' not registered for warnings")
            unless defined $offset ;
     }
 
+    my $this_pkg = (caller(1))[0] ; 
+    my $i = 2 ;
+    my $pkg ;
+
+    if ($isobj) {
+        while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+            last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+        }
+       $i -= 2 ;
+    }
+    else {
+        for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+            last if $pkg ne $this_pkg ;
+        }
+        $i = 2 
+            if !$pkg || $pkg eq $this_pkg ;
+    }
+
+    my $callers_bitmask = (caller($i))[9] ; 
+    return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+    croak("Usage: warnings::enabled([category])")
+       unless @_ == 1 || @_ == 0 ;
+
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+    return 0 unless defined $callers_bitmask ;
     return vec($callers_bitmask, $offset, 1) ||
            vec($callers_bitmask, $Offsets{'all'}, 1) ;
 }
@@ -290,29 +386,34 @@ sub warn
 {
     croak("Usage: warnings::warn([category,] 'message')")
        unless @_ == 2 || @_ == 1 ;
-    local $Carp::CarpLevel = 1 ;
-    my $category ;
-    my $offset ;
-    my $callers_bitmask = (caller(1))[9] ; 
-
-    if (@_ == 2) {
-        $category = shift ;
-        $offset = $Offsets{$category};
-        croak("unknown warnings category '$category'")
-           unless defined $offset ;
-    }
-    else {
-        $category = (caller(0))[0] ; 
-        $offset = $Offsets{$category};
-        croak("package '$category' not registered for warnings")
-           unless defined $offset ;
-    }
 
-    my $message = shift ;
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+    local $Carp::CarpLevel = $i ;
     croak($message) 
        if vec($callers_bitmask, $offset+1, 1) ||
           vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
     carp($message) ;
 }
 
+sub warnif
+{
+    croak("Usage: warnings::warnif([category,] 'message')")
+       unless @_ == 2 || @_ == 1 ;
+
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+    local $Carp::CarpLevel = $i ;
+
+    return 
+        unless defined $callers_bitmask &&
+               (vec($callers_bitmask, $offset, 1) ||
+               vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+    croak($message) 
+       if vec($callers_bitmask, $offset+1, 1) ||
+          vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+    carp($message) ;
+}
 1;
index 57ca5a1..7584000 100644 (file)
--- a/malloc.c
+++ b/malloc.c
@@ -1060,7 +1060,7 @@ Perl_malloc(register size_t nbytes)
            dTHX;
            PerlIO_printf(PerlIO_stderr(),
                          "Unaligned `next' pointer in the free "
-                         "chain 0x"UVxf" at 0x%"UVxf"\n",
+                         "chain 0x%"UVxf" at 0x%"UVxf"\n",
                          PTR2UV(p->ov_next), PTR2UV(p));
        }
 #endif
@@ -1889,6 +1889,7 @@ Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level)
        buf->start_slack = start_slack;
        buf->sbrked_remains = sbrked_remains;
        MALLOC_UNLOCK;
+       buf->nbuckets = NBUCKETS;
        if (level) {
            for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
                if (i >= buflen)
@@ -1911,12 +1912,10 @@ void
 Perl_dump_mstats(pTHX_ char *s)
 {
 #ifdef DEBUGGING_MSTATS
-       register int i, j;
-       register union overhead *p;
+       register int i;
        perl_mstats_t buffer;
-       unsigned long nf[NBUCKETS];
-       unsigned long nt[NBUCKETS];
-       struct chunk_chain_s* nextchain;
+       UV nf[NBUCKETS];
+       UV nt[NBUCKETS];
 
        buffer.nfree  = nf;
        buffer.ntotal = nt;
@@ -1924,18 +1923,18 @@ Perl_dump_mstats(pTHX_ char *s)
 
        if (s)
            PerlIO_printf(Perl_error_log,
-                         "Memory allocation statistics %s (buckets %ld(%ld)..%ld(%ld)\n",
+                         "Memory allocation statistics %s (buckets %"IVdf"(%"IVdf")..%"IVdf"(%"IVdf")\n",
                          s, 
-                         (long)BUCKET_SIZE_REAL(MIN_BUCKET), 
-                         (long)BUCKET_SIZE(MIN_BUCKET),
-                         (long)BUCKET_SIZE_REAL(buffer.topbucket), 
-                         (long)BUCKET_SIZE(buffer.topbucket));
-       PerlIO_printf(Perl_error_log, "%8ld free:", buffer.totfree);
+                         (IV)BUCKET_SIZE_REAL(MIN_BUCKET), 
+                         (IV)BUCKET_SIZE(MIN_BUCKET),
+                         (IV)BUCKET_SIZE_REAL(buffer.topbucket), 
+                         (IV)BUCKET_SIZE(buffer.topbucket));
+       PerlIO_printf(Perl_error_log, "%8"IVdf" free:", buffer.totfree);
        for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
                PerlIO_printf(Perl_error_log, 
                              ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
-                              ? " %5d" 
-                              : ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
+                              ? " %5"UVuf 
+                              : ((i < 12*BUCKETS_PER_POW2) ? " %3"UVuf : " %"UVuf)),
                              buffer.nfree[i]);
        }
 #ifdef BUCKETS_ROOT2
@@ -1943,17 +1942,17 @@ Perl_dump_mstats(pTHX_ char *s)
        for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
                PerlIO_printf(Perl_error_log, 
                              ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
-                              ? " %5d" 
-                              : ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
+                              ? " %5"UVuf 
+                              : ((i < 12*BUCKETS_PER_POW2) ? " %3"UVuf : " %"UVuf)),
                              buffer.nfree[i]);
        }
 #endif 
-       PerlIO_printf(Perl_error_log, "\n%8ld used:", buffer.total - buffer.totfree);
+       PerlIO_printf(Perl_error_log, "\n%8"IVdf" used:", buffer.total - buffer.totfree);
        for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
                PerlIO_printf(Perl_error_log, 
                              ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
-                              ? " %5d" 
-                              : ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")), 
+                              ? " %5"IVdf
+                              : ((i < 12*BUCKETS_PER_POW2) ? " %3"IVdf : " %"IVdf)), 
                              buffer.ntotal[i] - buffer.nfree[i]);
        }
 #ifdef BUCKETS_ROOT2
@@ -1961,12 +1960,12 @@ Perl_dump_mstats(pTHX_ char *s)
        for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
                PerlIO_printf(Perl_error_log, 
                              ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
-                              ? " %5d" 
-                              : ((i < 12*BUCKETS_PER_POW2) ? " %3d" : " %d")),
+                              ? " %5"IVdf 
+                              : ((i < 12*BUCKETS_PER_POW2) ? " %3"IVdf : " %"IVdf)),
                              buffer.ntotal[i] - buffer.nfree[i]);
        }
 #endif 
-       PerlIO_printf(Perl_error_log, "\nTotal sbrk(): %ld/%ld:%ld. Odd ends: pad+heads+chain+tail: %ld+%ld+%ld+%ld.\n",
+       PerlIO_printf(Perl_error_log, "\nTotal sbrk(): %"IVdf"/%"IVdf":%"IVdf". Odd ends: pad+heads+chain+tail: %"IVdf"+%"IVdf"+%"IVdf"+%"IVdf".\n",
                      buffer.total_sbrk, buffer.sbrks, buffer.sbrk_good,
                      buffer.sbrk_slack, buffer.start_slack,
                      buffer.total_chain, buffer.sbrked_remains);
diff --git a/mg.c b/mg.c
index 884e0fa..bec0a82 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -292,7 +292,8 @@ Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
        if (isUPPER(mg->mg_type)) {
            sv_magic(nsv,
-                    mg->mg_type == 'P' ? SvTIED_obj(sv, mg) : mg->mg_obj,
+                    mg->mg_type == 'P' ? SvTIED_obj(sv, mg) :
+                    (mg->mg_type == 'D' && mg->mg_obj) ? sv : mg->mg_obj,
                     toLOWER(mg->mg_type), key, klen);
            count++;
        }
@@ -379,6 +380,15 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
     return 0;
 }
 
+int
+Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
+{
+    dTHR;
+    Perl_croak(aTHX_ PL_no_modify);
+    /* NOT REACHED */
+    return 0;
+}
+
 U32
 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
 {
@@ -565,9 +575,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
            if (PL_lex_state != LEX_NOTPARSING)
                (void)SvOK_off(sv);
            else if (PL_in_eval)
-               sv_setiv(sv, 1);
-           else
-               sv_setiv(sv, 0);
+               sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
        }
        break;
     case '\024':               /* ^T */
@@ -906,7 +914,7 @@ Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
 int
 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
 {
-#if defined(VMS)
+#if defined(VMS) || defined(EPOC)
     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
 #else
 #   ifdef PERL_IMPLICIT_SYS
@@ -1277,8 +1285,6 @@ Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
                     atoi(MgPV(mg,n_a)), FALSE);
     if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
        o->op_private = i;
-    else if (ckWARN_d(WARN_INTERNAL))
-       Perl_warner(aTHX_ WARN_INTERNAL, "Can't break at that line\n");
     return 0;
 }
 
@@ -1419,6 +1425,8 @@ Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
     if (rem + offs > len)
        rem = len - offs;
     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
+    if (DO_UTF8(lsv))
+        SvUTF8_on(sv);
     return 0;
 }
 
@@ -1740,18 +1748,21 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                    PL_compiling.cop_warnings = pWARN_NONE;
                    break;
                }
-                if (isWARN_on(sv, WARN_ALL) && !isWARNf_on(sv, WARN_ALL)) {
-                   PL_compiling.cop_warnings = pWARN_ALL;
-                   PL_dowarn |= G_WARN_ONCE ;
-               }       
-               else {
+               {
                    STRLEN len, i;
                    int accumulate = 0 ;
+                   int any_fatals = 0 ;
                    char * ptr = (char*)SvPV(sv, len) ;
-                   for (i = 0 ; i < len ; ++i) 
-                       accumulate += ptr[i] ;
+                   for (i = 0 ; i < len ; ++i) {
+                       accumulate |= ptr[i] ;
+                       any_fatals |= (ptr[i] & 0xAA) ;
+                   }
                    if (!accumulate)
                        PL_compiling.cop_warnings = pWARN_NONE;
+                   else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
+                       PL_compiling.cop_warnings = pWARN_ALL;
+                       PL_dowarn |= G_WARN_ONCE ;
+                   }   
                     else {
                        if (specialWARN(PL_compiling.cop_warnings))
                            PL_compiling.cop_warnings = newSVsv(sv) ;
@@ -1760,6 +1771,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                        if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
                            PL_dowarn |= G_WARN_ONCE ;
                    }
+
                }
            }
        }
index a797e60..e80dfb5 100644 (file)
@@ -34,14 +34,14 @@ Summary of my $package (revision $baserev version $PERL_VERSION subversion $PERL
     config_args='$config_args'
     hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction
     usethreads=$usethreads use5005threads=$use5005threads useithreads=$useithreads usemultiplicity=$usemultiplicity
-    useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles 
-    use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble usesocks=$usesocks
+    useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles usesocks=$usesocks
+    use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble
   Compiler:
-    cc='$cc', optimize='$optimize', gccversion=$gccversion, gccosandvers=$gccosandvers
+    cc='$cc', ccflags ='$ccflags',
+    optimize='$optimize',
     cppflags='$cppflags'
-    ccflags ='$ccflags'
-    stdchar='$stdchar', d_stdstdio=$d_stdstdio, usevfork=$usevfork
-    intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize
+    ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers'
+    intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder
     d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize
     ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize
     alignbytes=$alignbytes, usemymalloc=$usemymalloc, prototype=$prototype
@@ -49,6 +49,7 @@ Summary of my $package (revision $baserev version $PERL_VERSION subversion $PERL
     ld='$ld', ldflags ='$ldflags'
     libpth=$libpth
     libs=$libs
+    perllibs=$perllibs
     libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl
   Dynamic Linking:
     dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags'
index 3e0ccce..bc04f03 100644 (file)
--- a/objXSUB.h
+++ b/objXSUB.h
@@ -1,4 +1,4 @@
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
 #define Perl_newSVpvn          pPerl->Perl_newSVpvn
 #undef  newSVpvn
 #define newSVpvn               Perl_newSVpvn
+#undef  Perl_newSVpvn_share
+#define Perl_newSVpvn_share    pPerl->Perl_newSVpvn_share
+#undef  newSVpvn_share
+#define newSVpvn_share         Perl_newSVpvn_share
 #undef  Perl_newSVpvf
 #define Perl_newSVpvf          pPerl->Perl_newSVpvf
 #undef  newSVpvf
 #define Perl_utf8_to_uv                pPerl->Perl_utf8_to_uv
 #undef  utf8_to_uv
 #define utf8_to_uv             Perl_utf8_to_uv
+#undef  Perl_utf8_to_uv_chk
+#define Perl_utf8_to_uv_chk    pPerl->Perl_utf8_to_uv_chk
+#undef  utf8_to_uv_chk
+#define utf8_to_uv_chk         Perl_utf8_to_uv_chk
 #undef  Perl_uv_to_utf8
 #define Perl_uv_to_utf8                pPerl->Perl_uv_to_utf8
 #undef  uv_to_utf8
diff --git a/op.c b/op.c
index 86bd419..84a1df9 100644 (file)
--- a/op.c
+++ b/op.c
@@ -22,7 +22,7 @@
 
 /* #define PL_OP_SLAB_ALLOC */
 
-#ifdef PL_OP_SLAB_ALLOC 
+#ifdef PL_OP_SLAB_ALLOC
 #define SLAB_SIZE 8192
 static char    *PL_OpPtr  = NULL;
 static int     PL_OpSpace = 0;
@@ -32,15 +32,15 @@ static int     PL_OpSpace = 0;
                               var = (type *) Slab_Alloc(m,c*sizeof(type));    \
                            } while (0)
 
-STATIC void *           
+STATIC void *
 S_Slab_Alloc(pTHX_ int m, size_t sz)
-{ 
+{
  Newz(m,PL_OpPtr,SLAB_SIZE,char);
  PL_OpSpace = SLAB_SIZE - sz;
  return PL_OpPtr += PL_OpSpace;
 }
 
-#else 
+#else
 #define NewOp(m, var, c, type) Newz(m, var, c, type)
 #endif
 /*
@@ -150,7 +150,7 @@ Perl_pad_allocmy(pTHX_ char *name)
                && strEQ(name, SvPVX(sv)))
            {
                Perl_warner(aTHX_ WARN_MISC,
-                   "\"%s\" variable %s masks earlier declaration in same %s", 
+                   "\"%s\" variable %s masks earlier declaration in same %s",
                    (PL_in_my == KEY_our ? "our" : "my"),
                    name,
                    (SvIVX(sv) == PAD_MAX ? "scope" : "statement"));
@@ -495,7 +495,8 @@ Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype)
                   (sv = names[PL_padix]) && sv != &PL_sv_undef)
                continue;
            sv = *av_fetch(PL_comppad, PL_padix, TRUE);
-           if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)) && !IS_PADGV(sv))
+           if (!(SvFLAGS(sv) & (SVs_PADTMP|SVs_PADMY)) &&
+               !IS_PADGV(sv) && !IS_PADCONST(sv))
                break;
        }
        retval = PL_padix;
@@ -651,7 +652,7 @@ Perl_find_threadsv(pTHX_ const char *name)
            break;
        case ';':
            sv_setpv(sv, "\034");
-           sv_magic(sv, 0, 0, name, 1); 
+           sv_magic(sv, 0, 0, name, 1);
            break;
        case '&':
        case '`':
@@ -675,7 +676,7 @@ Perl_find_threadsv(pTHX_ const char *name)
        /* case '!': */
 
        default:
-           sv_magic(sv, 0, 0, name, 1); 
+           sv_magic(sv, 0, 0, name, 1);
        }
        DEBUG_S(PerlIO_printf(Perl_error_log,
                              "find_threadsv: new SV %p for $%s%c\n",
@@ -1022,7 +1023,7 @@ Perl_scalarvoid(pTHX_ OP *o)
     {
        return scalar(o);                       /* As if inside SASSIGN */
     }
-    
+
     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
 
     switch (o->op_type) {
@@ -1229,7 +1230,7 @@ Perl_list(pTHX_ OP *o)
     {
        return o;                               /* As if inside SASSIGN */
     }
-    
+
     o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
 
     switch (o->op_type) {
@@ -1341,7 +1342,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
     {
        return o;
     }
-    
+
     switch (o->op_type) {
     case OP_UNDEF:
        PL_modcount++;
@@ -1419,7 +1420,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
                        newop->op_private |= OPpLVAL_INTRO;
                        break;
                    }
-                   
+               
                    if (kid->op_type != OP_RV2CV)
                        Perl_croak(aTHX_
                                   "panic: unexpected lvalue entersub "
@@ -1455,7 +1456,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
                }
                
                cv = GvCV(kGVOP_gv);
-               if (!cv) 
+               if (!cv)
                    goto restore_2cv;
                if (CvLVALUE(cv))
                    break;
@@ -1749,7 +1750,7 @@ Perl_ref(pTHX_ OP *o, I32 type)
            o->op_flags |= OPf_MOD;
        }
        break;
-      
+
     case OP_THREADSV:
        o->op_flags |= OPf_MOD;         /* XXX ??? */
        break;
@@ -1979,7 +1980,7 @@ Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
                             left->op_type == OP_PADAV)
                            ? "@array" : "%hash");
       Perl_warner(aTHX_ WARN_MISC,
-             "Applying %s to %s will act on scalar(%s)", 
+             "Applying %s to %s will act on scalar(%s)",
              desc, sample, sample);
     }
 
@@ -2069,7 +2070,7 @@ Perl_block_start(pTHX_ int full)
     PL_pad_reset_pending = FALSE;
     SAVEHINTS();
     PL_hints &= ~HINT_BLOCK_SCOPE;
-    SAVESPTR(PL_compiling.cop_warnings); 
+    SAVESPTR(PL_compiling.cop_warnings);
     if (! specialWARN(PL_compiling.cop_warnings)) {
         PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
         SAVEFREESV(PL_compiling.cop_warnings) ;
@@ -2415,10 +2416,10 @@ Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
     first->op_children += last->op_children;
     if (first->op_children)
        first->op_flags |= OPf_KIDS;
-    
+
 #ifdef PL_OP_SLAB_ALLOC
 #else
-    Safefree(last);     
+    Safefree(last);
 #endif
     return (OP*)first;
 }
@@ -2608,11 +2609,11 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
     complement = o->op_private & OPpTRANS_COMPLEMENT;
     del                = o->op_private & OPpTRANS_DELETE;
     squash     = o->op_private & OPpTRANS_SQUASH;
-    
+
     if (SvUTF8(tstr))
         o->op_private |= OPpTRANS_FROM_UTF;
-    
-    if (SvUTF8(rstr)) 
+
+    if (SvUTF8(rstr))
         o->op_private |= OPpTRANS_TO_UTF;
 
     if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
@@ -2655,7 +2656,7 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            qsort(cp, i, sizeof(U8*), utf8compare);
            for (j = 0; j < i; j++) {
                U8 *s = cp[j];
-               UV val = utf8_to_uv(s, &ulen);
+               UV val = utf8_to_uv_chk(s, &ulen, 0);
                s += ulen;
                diff = val - nextmin;
                if (diff > 0) {
@@ -2668,7 +2669,7 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
                    }
                }
                if (*s == 0xff)
-                   val = utf8_to_uv(s+1, &ulen);
+                   val = utf8_to_uv_chk(s+1, &ulen, 0);
                if (val >= nextmin)
                    nextmin = val + 1;
            }
@@ -2695,10 +2696,10 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
        while (t < tend || tfirst <= tlast) {
            /* see if we need more "t" chars */
            if (tfirst > tlast) {
-               tfirst = (I32)utf8_to_uv(t, &ulen);
+               tfirst = (I32)utf8_to_uv_chk(t, &ulen, 0);
                t += ulen;
                if (t < tend && *t == 0xff) {   /* illegal utf8 val indicates range */
-                   tlast = (I32)utf8_to_uv(++t, &ulen);
+                   tlast = (I32)utf8_to_uv_chk(++t, &ulen, 0);
                    t += ulen;
                }
                else
@@ -2708,10 +2709,10 @@ Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
            /* now see if we need more "r" chars */
            if (rfirst > rlast) {
                if (r < rend) {
-                   rfirst = (I32)utf8_to_uv(r, &ulen);
+                   rfirst = (I32)utf8_to_uv_chk(r, &ulen, 0);
                    r += ulen;
                    if (r < rend && *r == 0xff) {       /* illegal utf8 val indicates range */
-                       rlast = (I32)utf8_to_uv(++r, &ulen);
+                       rlast = (I32)utf8_to_uv_chk(++r, &ulen, 0);
                        r += ulen;
                    }
                    else
@@ -2907,7 +2908,7 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
        if (PL_hints & HINT_UTF8)
            pm->op_pmdynflags |= PMdf_UTF8;
        if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
-           expr = newUNOP((!(PL_hints & HINT_RE_EVAL) 
+           expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
                            ? OP_REGCRESET
                            : OP_REGCMAYBE),0,expr);
 
@@ -2915,7 +2916,7 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
        rcop->op_type = OP_REGCOMP;
        rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
        rcop->op_first = scalar(expr);
-       rcop->op_flags |= ((PL_hints & HINT_RE_EVAL) 
+       rcop->op_flags |= ((PL_hints & HINT_RE_EVAL)
                           ? (OPf_SPECIAL | OPf_KIDS)
                           : OPf_KIDS);
        rcop->op_private = 1;
@@ -2994,8 +2995,8 @@ Perl_pmruntime(pTHX_ OP *o, OP *expr, OP *repl)
            }
        }
        if (curop == repl
-           && !(repl_has_vars 
-                && (!pm->op_pmregexp 
+           && !(repl_has_vars
+                && (!pm->op_pmregexp
                     || pm->op_pmregexp->reganch & ROPT_EVAL_SEEN))) {
            pm->op_pmflags |= PMf_CONST;        /* const for long enough */
            pm->op_pmpermflags |= PMf_CONST;    /* const for long enough */
@@ -3415,7 +3416,11 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
                    }
                    else if (curop->op_type == OP_PUSHRE) {
                        if (((PMOP*)curop)->op_pmreplroot) {
+#ifdef USE_ITHREADS
+                           GV *gv = (GV*)PL_curpad[(PADOFFSET)((PMOP*)curop)->op_pmreplroot];
+#else
                            GV *gv = (GV*)((PMOP*)curop)->op_pmreplroot;
+#endif
                            if (gv == PL_defgv || SvCUR(gv) == PL_generation)
                                break;
                            SvCUR(gv) = PL_generation;
@@ -3524,7 +3529,7 @@ Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
     cop->cop_arybase = PL_curcop->cop_arybase;
     if (specialWARN(PL_curcop->cop_warnings))
         cop->cop_warnings = PL_curcop->cop_warnings ;
-    else 
+    else
         cop->cop_warnings = newSVsv(PL_curcop->cop_warnings) ;
 
 
@@ -3611,7 +3616,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
     }
     if (first->op_type == OP_CONST) {
        if (ckWARN(WARN_BAREWORD) && (first->op_private & OPpCONST_BARE))
-           Perl_warner(aTHX_ WARN_BAREWORD, "Bareword found in conditional"); 
+           Perl_warner(aTHX_ WARN_BAREWORD, "Bareword found in conditional");
        if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) {
            op_free(first);
            *firstp = Nullop;
@@ -3638,7 +3643,7 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
        case OP_NULL:
            if (k2 && k2->op_type == OP_READLINE
                  && (k2->op_flags & OPf_STACKED)
-                 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
+                 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
            {
                warnop = k2->op_type;
            }
@@ -3814,12 +3819,12 @@ Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
            OP *k1 = ((UNOP*)expr)->op_first;
            OP *k2 = (k1) ? k1->op_sibling : NULL;
            switch (expr->op_type) {
-             case OP_NULL: 
+             case OP_NULL:
                if (k2 && k2->op_type == OP_READLINE
                      && (k2->op_flags & OPf_STACKED)
-                     && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
+                     && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
                    expr = newUNOP(OP_DEFINED, 0, expr);
-               break;                                
+               break;
 
              case OP_SASSIGN:
                if (k1->op_type == OP_READDIR
@@ -3869,12 +3874,12 @@ Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32 whileline, OP *
        OP *k1 = ((UNOP*)expr)->op_first;
        OP *k2 = (k1) ? k1->op_sibling : NULL;
        switch (expr->op_type) {
-         case OP_NULL: 
+         case OP_NULL:
            if (k2 && k2->op_type == OP_READLINE
                  && (k2->op_flags & OPf_STACKED)
-                 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR)) 
+                 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
                expr = newUNOP(OP_DEFINED, 0, expr);
-           break;                                
+           break;
 
          case OP_SASSIGN:
            if (k1->op_type == OP_READDIR
@@ -4037,7 +4042,7 @@ Perl_newFOROP(pTHX_ I32 flags,char *label,line_t forline,OP *sv,OP *expr,OP *blo
     }
 #else
     Renew(loop, 1, LOOP);
-#endif 
+#endif
     loop->op_targ = padoff;
     wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont);
     PL_copline = forline;
@@ -4360,14 +4365,14 @@ Perl_op_const_sv(pTHX_ OP *o, CV *cv)
 
     if (!o)
        return Nullsv;
-    if (o->op_type == OP_LINESEQ && cLISTOPo->op_first) 
+
+    if (o->op_type == OP_LINESEQ && cLISTOPo->op_first)
        o = cLISTOPo->op_first->op_sibling;
 
     for (; o; o = o->op_next) {
        OPCODE type = o->op_type;
 
-       if (sv && o->op_next == o) 
+       if (sv && o->op_next == o)
            return sv;
        if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
            continue;
@@ -4989,7 +4994,7 @@ OP *
 Perl_oopsHV(pTHX_ OP *o)
 {
     dTHR;
-    
+
     switch (o->op_type) {
     case OP_PADSV:
     case OP_PADAV:
@@ -5349,7 +5354,7 @@ Perl_ck_rvconst(pTHX_ register OP *o)
                break;
            }
            if (badthing)
-               Perl_croak(aTHX_ 
+               Perl_croak(aTHX_
          "Can't use bareword (\"%s\") as %s ref while \"strict refs\" in use",
                      name, badthing);
        }
@@ -5763,7 +5768,11 @@ Perl_ck_defined(pTHX_ OP *o)             /* 19990527 MJD */
     if ((o->op_flags & OPf_KIDS) && ckWARN(WARN_DEPRECATED)) {
        switch (cUNOPo->op_first->op_type) {
        case OP_RV2AV:
-           break;                      /* Globals via GV can be undef */ 
+           /* This is needed for
+              if (defined %stash::)
+              to work.   Do not break Tk.
+              */
+           break;                      /* Globals via GV can be undef */
        case OP_PADAV:
        case OP_AASSIGN:                /* Is this a good idea? */
            Perl_warner(aTHX_ WARN_DEPRECATED,
@@ -5772,7 +5781,11 @@ Perl_ck_defined(pTHX_ OP *o)             /* 19990527 MJD */
                        "\t(Maybe you should just omit the defined()?)\n");
        break;
        case OP_RV2HV:
-           break;                      /* Globals via GV can be undef */ 
+           /* This is needed for
+              if (defined %stash::)
+              to work.   Do not break Tk.
+              */
+           break;                      /* Globals via GV can be undef */
        case OP_PADHV:
            Perl_warner(aTHX_ WARN_DEPRECATED,
                        "defined(%%hash) is deprecated");
@@ -5903,11 +5916,13 @@ Perl_ck_method(pTHX_ OP *o)
        SV* sv = kSVOP->op_sv;
        if (!(strchr(SvPVX(sv), ':') || strchr(SvPVX(sv), '\''))) {
            OP *cmop;
-           (void)SvUPGRADE(sv, SVt_PVIV);
-           (void)SvIOK_on(sv);
-           PERL_HASH(SvUVX(sv), SvPVX(sv), SvCUR(sv));
+           if (!SvREADONLY(sv) || !SvFAKE(sv)) {
+               sv = newSVpvn_share(SvPVX(sv), SvCUR(sv), 0);
+           }
+           else {
+               kSVOP->op_sv = Nullsv;
+           }
            cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
-           kSVOP->op_sv = Nullsv;
            op_free(o);
            return cmop;
        }
@@ -6127,8 +6142,8 @@ S_simplify_sort(pTHX_ OP *o)
     GV *gv;
     if (!(o->op_flags & OPf_STACKED))
        return;
-    GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV)); 
-    GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV)); 
+    GvMULTI_on(gv_fetchpv("a", TRUE, SVt_PV));
+    GvMULTI_on(gv_fetchpv("b", TRUE, SVt_PV));
     kid = kUNOP->op_first;                             /* get past null */
     if (kid->op_type != OP_SCOPE)
        return;
@@ -6235,7 +6250,7 @@ Perl_ck_split(pTHX_ OP *o)
 }
 
 OP *
-Perl_ck_join(pTHX_ OP *o) 
+Perl_ck_join(pTHX_ OP *o)
 {
     if (ckWARN(WARN_SYNTAX)) {
        OP *kid = cLISTOPo->op_first->op_sibling;
@@ -6448,6 +6463,22 @@ Perl_ck_trunc(pTHX_ OP *o)
     return ck_fun(o);
 }
 
+OP *
+Perl_ck_substr(pTHX_ OP *o)
+{
+    o = ck_fun(o);
+    if ((o->op_flags & OPf_KIDS) && o->op_private == 4) {
+       OP *kid = cLISTOPo->op_first;
+
+       if (kid->op_type == OP_NULL)
+           kid = kid->op_sibling;
+       if (kid)
+           kid->op_flags |= OPf_MOD;
+
+    }
+    return o;
+}
+
 /* A peephole optimizer.  We visit the ops in the order they're to execute. */
 
 void
@@ -6629,7 +6660,7 @@ Perl_peep(pTHX_ register OP *o)
 
        case OP_EXEC:
            o->op_seq = PL_op_seqmax++;
-           if (ckWARN(WARN_SYNTAX) && o->op_next 
+           if (ckWARN(WARN_SYNTAX) && o->op_next
                && o->op_next->op_type == OP_NEXTSTATE) {
                if (o->op_next->op_sibling &&
                        o->op_next->op_sibling->op_type != OP_EXIT &&
@@ -6653,13 +6684,26 @@ Perl_peep(pTHX_ register OP *o)
            GV **fields;
            SV **svp, **indsvp, *sv;
            I32 ind;
-           char *key;
+           char *key = NULL;
            STRLEN keylen;
        
            o->op_seq = PL_op_seqmax++;
-           if ((o->op_private & (OPpLVAL_INTRO))
-               || ((BINOP*)o)->op_last->op_type != OP_CONST)
+
+           if (((BINOP*)o)->op_last->op_type != OP_CONST)
                break;
+
+           /* Make the CONST have a shared SV */
+           svp = cSVOPx_svp(((BINOP*)o)->op_last);
+           if ((!SvFAKE(sv = *svp) || !SvREADONLY(sv)) && !IS_PADCONST(sv)) {
+               key = SvPV(sv, keylen);
+               lexname = newSVpvn_share(key, keylen, 0);
+               SvREFCNT_dec(sv);
+               *svp = lexname;
+           }
+
+           if ((o->op_private & (OPpLVAL_INTRO)))
+               break;
+
            rop = (UNOP*)((BINOP*)o)->op_first;
            if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
                break;
@@ -6669,7 +6713,6 @@ Perl_peep(pTHX_ register OP *o)
            fields = (GV**)hv_fetch(SvSTASH(lexname), "FIELDS", 6, FALSE);
            if (!fields || !GvHV(*fields))
                break;
-           svp = cSVOPx_svp(((BINOP*)o)->op_last);
            key = SvPV(*svp, keylen);
            indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
            if (!indsvp) {
@@ -6779,7 +6822,7 @@ Perl_peep(pTHX_ register OP *o)
 
                while (r->op_sibling)
                   r = r->op_sibling;
-               if (r->op_next == o 
+               if (r->op_next == o
                    || (r->op_next->op_type == OP_LIST
                        && r->op_next->op_next == o))
                {
diff --git a/op.h b/op.h
index 86f2a0b..55b85a5 100644 (file)
--- a/op.h
+++ b/op.h
@@ -55,7 +55,7 @@ typedef U32 PADOFFSET;
 /*
 =for apidoc Amn|U32|GIMME_V
 The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
-C<G_SCALAR> or C<G_ARRAY> for void, scalar or array context,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
 respectively.
 
 =for apidoc Amn|U32|GIMME
@@ -130,9 +130,7 @@ Deprecated.  Use C<GIMME_V> instead.
 /* Private for OP_TRANS */
 #define OPpTRANS_FROM_UTF      1
 #define OPpTRANS_TO_UTF                2
-#define OPpTRANS_IDENTICAL     4
-       /* When CU or UC, means straight latin-1 to utf-8 or vice versa */
-       /* Otherwise, IDENTICAL means the right side is the same as the left */
+#define OPpTRANS_IDENTICAL     4       /* right side is same as left */
 #define OPpTRANS_SQUASH                8
 #define OPpTRANS_DELETE                16
 #define OPpTRANS_COMPLEMENT    32
index 513343a..8dc8b7a 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -1205,7 +1205,7 @@ EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
        MEMBER_TO_FPTR(Perl_ck_fun),    /* oct */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* abs */
        MEMBER_TO_FPTR(Perl_ck_lengthconst),    /* length */
-       MEMBER_TO_FPTR(Perl_ck_fun),    /* substr */
+       MEMBER_TO_FPTR(Perl_ck_substr), /* substr */
        MEMBER_TO_FPTR(Perl_ck_fun),    /* vec */
        MEMBER_TO_FPTR(Perl_ck_index),  /* index */
        MEMBER_TO_FPTR(Perl_ck_index),  /* rindex */
index ab98824..43d98ae 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -321,7 +321,7 @@ sub tab {
 #      trans not OK (dTARG; TARG = sv_newmortal();)
 #      ucfirst etc not OK: TMP arg processed inplace
 #      quotemeta not OK (unsafe when TARG == arg)
-#      each repeat not OK too due to array context
+#      each repeat not OK too due to list context
 #      pack split - unknown whether they are safe
 #      sprintf: is calling do_sprintf(TARG,...) which can act on TARG
 #        before other args are processed.
@@ -515,7 +515,7 @@ abs         abs                     ck_fun          fsTu%   S?
 # String stuff.
 
 length         length                  ck_lengthconst  isTu%   S?
-substr         substr                  ck_fun          st@     S S S? S?
+substr         substr                  ck_substr       st@     S S S? S?
 vec            vec                     ck_fun          ist@    S S S
 
 index          index                   ck_index        isT@    S S S?
index f5a0c15..21c99a5 100644 (file)
@@ -97,7 +97,7 @@ perl.linkexp: perl.exports perl.map  os2/os2.sym
 # We link miniperl statically, since .DLL depends on $(DYNALOADER) 
 
 miniperl.map miniperl: $(obj) perl$(OBJ_EXT) miniperlmain$(OBJ_EXT) opmini$(OBJ_EXT)
-       $(CC) $(LARGE) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) perl$(OBJ_EXT) `echo $(obj)|sed -e 's/\bop\./opmini./g'` $(libs) -Zmap -Zlinker /map/PM:VIO
+       $(CC) $(CLDFLAGS) -o miniperl miniperlmain$(OBJ_EXT) perl$(OBJ_EXT) `echo $(obj)|sed -e 's/\bop\./opmini./g'` $(libs) -Zmap -Zlinker /map/PM:VIO
        @./miniperl -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
 
 depend: os2ish.h dlfcn.h os2thread.h os2.c
@@ -123,7 +123,7 @@ dlfcn.h: os2/dlfcn.h
 # This one is compiled OMF, so cannot fork():
 
 perl___: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl___ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
 
 # This one is compiled -Zsys, so cannot do many things:
 
@@ -131,7 +131,7 @@ perl___: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
 SYS_CLDFLAGS = -Zexe -Zomf -Zmt -Zsys -Zstack 32000
 
 perl_sys: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-       $(SHRPENV) $(CC) $(LARGE) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o perl_sys perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
+       $(SHRPENV) $(CC) $(SYS_CLDFLAGS) $(CCDLFLAGS) -o perl_sys perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
 
 installcmd : 
        perl -e 'die qq{Give the option INSTALLCMDDIR=... to make!} if $$ARGV[0] eq ""' $(INSTALLCMDDIR)
@@ -173,20 +173,20 @@ aout_perlmain.c: miniperlmain.c config.sh makefile $(static_ext_autoinit)
        sh mv-if-diff tmp aout_perlmain.c
 
 miniperl_: $& miniperlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) opmini$(AOUT_OBJ_EXT)
-       $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o miniperl_ miniperlmain$(AOUT_OBJ_EXT) opmini$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(libs)
+       $(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o miniperl_ miniperlmain$(AOUT_OBJ_EXT) opmini$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(libs)
 
 perl_: $& aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_LIBPERL) $(AOUT_DYNALOADER) $(aout_static_ext) ext.libs
-       $(CC) $(LARGE) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs)
+       $(CC) $(AOUT_CLDFLAGS) $(CCDLFLAGS) -o perl_ aout_perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER) $(aout_static_ext) $(AOUT_LIBPERL) `cat ext.libs` $(libs)
 
 perl : perl__ perl___
 
 perl__: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /PM:PM
+       $(CC) $(CLDFLAGS) $(CCDLFLAGS) -o perl__ perlmain$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs) -Zlinker /PM:PM
 
 # Forking dynamically loaded perl:
 
 perl: $& perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) ext.libs
-       $(CC) $(LARGE) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
+       $(CC) $(AOUT_CLDFLAGS_DLL) $(CCDLFLAGS) -o perl perlmain$(AOUT_OBJ_EXT) $(AOUT_DYNALOADER_OBJ) $(aout_static_ext_dll) $(AOUT_LIBPERL_DLL) `cat ext.libs` $(libs)
 
 clean: aout_clean
 
index a69a01c..1f4e203 100644 (file)
@@ -15,13 +15,13 @@ my_eadvalue(pTHX_ _ead ead, int index)
 {
     SV *sv;
     int size = _ead_value_size(ead, index);
-    void *p;
+    const char *p;
 
     if (size == -1) {
        Perl_die(aTHX_ "Error getting size of EA: %s", strerror(errno));
     }
     p = _ead_get_value(ead, index);
-    return  newSVpv((char*)p, size);
+    return  newSVpv(p, size);
 }
 
 #define my_eadreplace(ead, index, sv, flag)    \
@@ -136,7 +136,7 @@ _ead_find(ead, name)
        _ead    ead
        char *  name
 
-void *
+const void *
 _ead_get_fea2list(ead)
        _ead    ead
 
@@ -145,12 +145,12 @@ _ead_get_flags(ead, index)
        _ead    ead
        int     index
 
-char *
+const char *
 _ead_get_name(ead, index)
        _ead    ead
        int     index
 
-void *
+const void *
 _ead_get_value(ead, index)
        _ead    ead
        int     index
index a5ff8d6..c2f5cda 100644 (file)
@@ -1,2 +1,4 @@
 struct _ea *           T_PTR
 _ead                   T_PTR
+const void *            T_PTR
+const char *            T_PV
index 8a8e5f2..1dc20d3 100644 (file)
@@ -29,7 +29,7 @@ static RXSTRING   rxcommand    = {  9, "RXCOMMAND" };
 static RXSTRING   rxsubroutine = { 12, "RXSUBROUTINE" };
 static RXSTRING   rxfunction   = { 11, "RXFUNCTION" };
 
-static ULONG PERLCALL(PSZ name, ULONG argc, PRXSTRING argv, PSZ queue, PRXSTRING ret);
+static ULONG PERLCALL(PCSZ name, ULONG argc, PRXSTRING argv, PCSZ queue, PRXSTRING ret);
 
 #if 1
  #define Set   RXSHV_SET
@@ -109,7 +109,7 @@ exec_in_REXX(pTHX_ char *cmd, char * handlerName, RexxFunctionHandler *handler)
 static SV* exec_cv;
 
 static ULONG
-PERLSTART(PSZ name, ULONG argc, PRXSTRING argv, PSZ queue, PRXSTRING ret)
+PERLSTART(PCSZ name, ULONG argc, PRXSTRING argv, PCSZ queue, PRXSTRING ret)
 {
     return PERLCALL(NULL, argc, argv, queue, ret);
 }
@@ -122,7 +122,7 @@ PERLSTART(PSZ name, ULONG argc, PRXSTRING argv, PSZ queue, PRXSTRING ret)
 #define REXX_eval(cmd) REXX_eval_with(cmd,NULL,NULL)
 
 static ULONG
-PERLCALL(PSZ name, ULONG argc, PRXSTRING argv, PSZ queue, PRXSTRING ret)
+PERLCALL(PCSZ name, ULONG argc, PRXSTRING argv, PCSZ queue, PRXSTRING ret)
 {
     dTHX;
     EXCEPTIONREGISTRATIONRECORD xreg = { NULL, _emx_exception };
index 45e1d2f..c324cf2 100644 (file)
--- a/os2/os2.c
+++ b/os2/os2.c
@@ -1123,9 +1123,9 @@ fork(void)
 #endif
 
 /*******************************************************************/
-/* not implemented in EMX 0.9a */
+/* not implemented in EMX 0.9d */
 
-void * ctermid(x)      { return 0; }
+char * ctermid(char *s)        { return 0; }
 
 #ifdef MYTTYNAME /* was not in emx0.9a */
 void * ttyname(x)      { return 0; }
@@ -1718,17 +1718,20 @@ XS(XS_OS2_Process_Messages)
     {
        bool  force = SvOK(ST(0));
        unsigned long   cnt;
-       I32 *cntp = NULL;
 
        if (items == 2) {
+           I32 cntr;
            SV *sv = ST(1);
            int fake = SvIV(sv);        /* Force SvIVX */
            
            if (!SvIOK(sv))
                Perl_croak_nocontext("Can't upgrade count to IV");
-           cntp = &SvIVX(sv);
-       }
-       cnt =  Perl_Process_Messages(force, cntp);
+           cntr = SvIVX(sv);
+           cnt =  Perl_Process_Messages(force, &cntr);
+           SvIVX(sv) = cntr;
+       } else {
+           cnt =  Perl_Process_Messages(force, NULL);
+        }
        ST(0) = sv_newmortal();
        sv_setiv(ST(0), cnt);
     }
index 23857ac..c9719e6 100644 (file)
@@ -271,6 +271,8 @@ char *my_tmpnam (char *);
 #define isatty _isterm
 #define rand   random
 #define srand  srandom
+#define strtoll        _strtoll
+#define strtoull       _strtoull
 
 /*
  * fwrite1() should be a routine with the same calling sequence as fwrite(),
@@ -305,6 +307,9 @@ void *emx_realloc (void *, size_t);
         ? (--FILE_ptr(fp), ++FILE_cnt(fp), (int)c) : ungetc(c,fp))
 #endif
 
+/* ctermid is missing from emx0.9d */
+char *ctermid(char *s);
+
 #define OP_BINARY O_BINARY
 
 #define OS2_STAT_HACK 1
index f95db63..b9d0dc4 100644 (file)
@@ -4,7 +4,7 @@
  * exactly on the third column */
 
 #define PERL_REVISION  5               /* age */
-#define PERL_VERSION   6               /* epoch */
+#define PERL_VERSION   7               /* epoch */
 #define PERL_SUBVERSION        0               /* generation */
 
 /* The following numbers describe the earliest compatible version of
@@ -69,7 +69,8 @@
  */
 #if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT)
 static char    *local_patches[] = {
-       NULL
+        NULL
+       ,"DEVEL7368"
        ,NULL
 };
 
diff --git a/perl.c b/perl.c
index 969d783..cb2cb14 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -377,6 +377,7 @@ perl_destruct(pTHXx)
     DEBUG_S(PerlIO_printf(Perl_debug_log, "perl_destruct: armageddon has arrived\n"));
     MUTEX_DESTROY(&PL_threads_mutex);
     COND_DESTROY(&PL_nthreads_cond);
+    PL_nthreads--;
 #endif /* !defined(FAKE_THREADS) */
 #endif /* USE_THREADS */
 
@@ -835,7 +836,7 @@ setuid perl scripts securely.\n");
 
     PL_origargv = argv;
     PL_origargc = argc;
-#ifndef VMS  /* VMS doesn't have environ array */
+#if !defined( VMS) && !defined(EPOC)  /* VMS doesn't have environ array */
     PL_origenviron = environ;
 #endif
 
@@ -1255,13 +1256,17 @@ print \"  \\@INC:\\n    @INC\\n\";");
     if (xsinit)
        (*xsinit)(aTHXo);       /* in case linked C routines want magical variables */
 #ifndef PERL_MICRO
-#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__)
+#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
     init_os_extras();
 #endif
 #endif
 
 #ifdef USE_SOCKS
+#   ifdef HAS_SOCKS5_INIT
+    socks5_init(argv[0]);
+#   else
     SOCKSinit(argv[0]);
+#   endif
 #endif    
 
     init_predump_symbols();
@@ -2060,9 +2065,25 @@ Perl_moreswitches(pTHX_ char *s)
     case 'd':
        forbid_setid("-d");
        s++;
-       if (*s == ':' || *s == '=')  {
-           my_setenv("PERL5DB", Perl_form(aTHX_ "use Devel::%s;", ++s));
+       /* The following permits -d:Mod to accepts arguments following an =
+          in the fashion that -MSome::Mod does. */
+       if (*s == ':' || *s == '=') {
+           char *start;
+           SV *sv;
+           sv = newSVpv("use Devel::", 0);
+           start = ++s;
+           /* We now allow -d:Module=Foo,Bar */
+           while(isALNUM(*s) || *s==':') ++s;
+           if (*s != '=')
+               sv_catpv(sv, start);
+           else {
+               sv_catpvn(sv, start, s-start);
+               sv_catpv(sv, " split(/,/,q{");
+               sv_catpv(sv, ++s);
+               sv_catpv(sv,    "})");
+           }
            s += strlen(s);
+           my_setenv("PERL5DB", SvPV(sv, PL_na));
        }
        if (!PL_perldb) {
            PL_perldb = PERLDB_ALL;
@@ -2228,7 +2249,7 @@ Perl_moreswitches(pTHX_ char *s)
        return s;
     case 'v':
        PerlIO_printf(PerlIO_stdout(),
-                     Perl_form(aTHX_ "\nThis is perl, v%vd built for %s",
+                     Perl_form(aTHX_ "\nThis is perl, v%"VDf" built for %s",
                                PL_patchlevel, ARCHNAME));
 #if defined(LOCAL_PATCH_COUNT)
        if (LOCAL_PATCH_COUNT > 0)
@@ -2301,7 +2322,7 @@ Perl_moreswitches(pTHX_ char *s)
        PerlIO_printf(PerlIO_stdout(),
                      "\n\
 Perl may be copied only under the terms of either the Artistic License or the\n\
-GNU General Public License, which may be found in the Perl 5.0 source kit.\n\n\
+GNU General Public License, which may be found in the Perl 5 source kit.\n\n\
 Complete documentation for Perl, including FAQ lists, should be found on\n\
 this system using `man perl' or `perldoc perl'.  If you have access to the\n\
 Internet, point your browser at http://www.perl.com/, the Perl Home Page.\n\n");
@@ -2851,16 +2872,6 @@ S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript)
            if (tmpstatbuf.st_dev != PL_statbuf.st_dev ||
                tmpstatbuf.st_ino != PL_statbuf.st_ino) {
                (void)PerlIO_close(PL_rsfp);
-               if (PL_rsfp = PerlProc_popen("/bin/mail root","w")) {   /* heh, heh */
-                   PerlIO_printf(PL_rsfp,
-"User %"Uid_t_f" tried to run dev %ld ino %ld in place of dev %ld ino %ld!\n\
-(Filename of set-id script was %s, uid %"Uid_t_f" gid %"Gid_t_f".)\n\nSincerely,\nperl\n",
-                       PL_uid,(long)tmpstatbuf.st_dev, (long)tmpstatbuf.st_ino,
-                       (long)PL_statbuf.st_dev, (long)PL_statbuf.st_ino,
-                       CopFILE(PL_curcop),
-                       PL_statbuf.st_uid, PL_statbuf.st_gid);
-                   (void)PerlProc_pclose(PL_rsfp);
-               }
                Perl_croak(aTHX_ "Permission denied\n");
            }
            if (
@@ -3457,7 +3468,7 @@ S_init_perllib(pTHX)
 #endif /* MACOS_TRADITIONAL */
 }
 
-#if defined(DOSISH)
+#if defined(DOSISH) || defined(EPOC)
 #    define PERLLIB_SEP ';'
 #else
 #  if defined(VMS)
@@ -3679,7 +3690,14 @@ Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
 
     while (AvFILL(paramList) >= 0) {
        cv = (CV*)av_shift(paramList);
-       SAVEFREESV(cv);
+       if ((PL_minus_c & 0x10) && (paramList == PL_beginav)) {
+               /* save PL_beginav for compiler */
+           if (! PL_beginav_save)
+               PL_beginav_save = newAV();
+           av_push(PL_beginav_save, (SV*)cv);
+       } else {
+           SAVEFREESV(cv);
+       }
 #ifdef PERL_FLEXIBLE_EXCEPTIONS
        CALLPROTECT(aTHX_ pcur_env, &ret, MEMBER_TO_FPTR(S_vcall_list_body), cv);
 #else
diff --git a/perl.h b/perl.h
index 48e8801..b655e04 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -548,17 +548,6 @@ Free_t   Perl_mfree (Malloc_t where);
 
 typedef struct perl_mstats perl_mstats_t;
 
-struct perl_mstats {
-    unsigned long *nfree;
-    unsigned long *ntotal;
-    long topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
-    long total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
-    long minbucket;
-    /* Level 1 info */
-    unsigned long *bucket_mem_size;
-    unsigned long *bucket_available_size;
-};
-
 #  define safemalloc  Perl_malloc
 #  define safecalloc  Perl_calloc
 #  define saferealloc Perl_realloc
@@ -1079,6 +1068,11 @@ typedef UVTYPE UV;
 #define PTR2IV(p)      INT2PTR(IV,p)
 #define PTR2UV(p)      INT2PTR(UV,p)
 #define PTR2NV(p)      NUM2PTR(NV,p)
+#if PTRSIZE == LONGSIZE 
+#  define PTR2ul(p)    (unsigned long)(p)
+#else
+#  define PTR2ul(p)    INT2PTR(unsigned long,p)        
+#endif
   
 #ifdef USE_LONG_DOUBLE
 #  if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
@@ -1164,6 +1158,18 @@ typedef NVTYPE NV;
 #   ifdef LDBL_MANT_DIG
 #       define NV_MANT_DIG LDBL_MANT_DIG
 #   endif
+#   ifdef LDBL_MAX
+#       define NV_MAX LDBL_MAX
+#       define NV_MIN LDBL_MIN
+#   else
+#       ifdef HUGE_VALL
+#           define NV_MAX HUGE_VALL
+#       else
+#           ifdef HUGE_VAL
+#               define NV_MAX ((NV)HUGE_VAL)
+#           endif
+#       endif
+#   endif
 #   ifdef HAS_SQRTL
 #       define Perl_cos cosl
 #       define Perl_sin sinl
@@ -1200,6 +1206,14 @@ typedef NVTYPE NV;
 #   ifdef DBL_MANT_DIG
 #       define NV_MANT_DIG DBL_MANT_DIG
 #   endif
+#   ifdef DBL_MAX
+#       define NV_MAX DBL_MAX
+#       define NV_MIN DBL_MIN
+#   else
+#       ifdef HUGE_VAL
+#           define NV_MAX HUGE_VAL
+#       endif
+#   endif
 #   define Perl_cos cos
 #   define Perl_sin sin
 #   define Perl_sqrt sqrt
@@ -1220,15 +1234,22 @@ typedef NVTYPE NV;
 
 #if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
 #   if !defined(Perl_atof) && defined(HAS_STRTOLD) 
-#       define Perl_atof(s) strtold(s, (char**)NULL)
+#       define Perl_atof(s) (NV)strtold(s, (char**)NULL)
 #   endif
 #   if !defined(Perl_atof) && defined(HAS_ATOLF)
-#       define Perl_atof atolf
+#       define Perl_atof (NV)atolf
+#   endif
+#   if !defined(Perl_atof) && defined(PERL_SCNfldbl)
+#       define Perl_atof PERL_SCNfldbl
+#       define Perl_atof2(s,f) sscanf((s), "%"PERL_SCNfldbl, &(f))
 #   endif
 #endif
 #if !defined(Perl_atof)
 #   define Perl_atof atof /* we assume atof being available anywhere */
 #endif
+#if !defined(Perl_atof2)
+#   define Perl_atof2(s,f) ((f) = (NV)Perl_atof(s))
+#endif
 
 /* Previously these definitions used hardcoded figures. 
  * It is hoped these formula are more portable, although
@@ -1408,6 +1429,18 @@ typedef NVTYPE NV;
 
 #endif
 
+struct perl_mstats {
+    UV *nfree;
+    UV *ntotal;
+    IV topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
+    IV total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
+    IV minbucket;
+    /* Level 1 info */
+    UV *bucket_mem_size;
+    UV *bucket_available_size;
+    UV nbuckets;
+};
+
 typedef MEM_SIZE STRLEN;
 
 typedef struct op OP;
@@ -1423,7 +1456,12 @@ typedef struct pvop PVOP;
 typedef struct loop LOOP;
 
 typedef struct interpreter PerlInterpreter;
-typedef struct sv SV;
+#ifdef UTS
+#   define STRUCT_SV perl_sv /* Amdahl's <ksync.h> has struct sv */
+#else
+#   define STRUCT_SV sv
+#endif
+typedef struct STRUCT_SV SV;
 typedef struct av AV;
 typedef struct hv HV;
 typedef struct cv CV;
@@ -1596,7 +1634,11 @@ typedef struct ptr_tbl PTR_TBL_t;
 #     endif
 #   endif
 # endif
-#endif         
+#endif
+
+#ifndef NO_ENVIRON_ARRAY
+#  define USE_ENVIRON_ARRAY
+#endif
 
 #ifndef PERL_SYS_INIT3
 #  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
@@ -1786,9 +1828,25 @@ typedef pthread_key_t    perl_key;
 #  endif 
 #endif
 
+#ifndef UVf
+#  ifdef CHECK_FORMAT
+#    define UVf UVuf
+#  else
+#    define UVf "Vu"
+#  endif 
+#endif
+
+#ifndef VDf
+#  ifdef CHECK_FORMAT
+#    define VDf "p"
+#  else
+#    define VDf "vd"
+#  endif 
+#endif
+
 /* Some unistd.h's give a prototype for pause() even though
    HAS_PAUSE ends up undefined.  This causes the #define
-   below to be rejected by the compmiler.  Sigh.
+   below to be rejected by the compiler.  Sigh.
 */
 #ifdef HAS_PAUSE
 #define Pause  pause
@@ -2008,6 +2066,7 @@ Gid_t getegid (void);
 
 #ifndef Perl_error_log
 #  define Perl_error_log       (PL_stderrgv                    \
+                                && GvIOp(PL_stderrgv)          \
                                 && IoOFP(GvIOp(PL_stderrgv))   \
                                 ? IoOFP(GvIOp(PL_stderrgv))    \
                                 : PerlIO_stderr())
@@ -2223,18 +2282,18 @@ typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX);
 #    define environ (*environ_pointer)
 EXT char *** environ_pointer;
 #  else
-#    if defined(__APPLE__)
+#    if defined(__APPLE__) && defined(PERL_CORE)
 #      include <crt_externs.h> /* for the env array */
 #      define environ (*_NSGetEnviron())
 #    endif
 #  endif
 #else
    /* VMS and some other platforms don't use the environ array */
-#  if !defined(VMS)
+#  ifdef USE_ENVIRON_ARRAY
 #    if !defined(DONT_DECLARE_STD) || \
         (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
         defined(__sgi) || \
-        defined(__DGUX) || defined(EPOC)
+        defined(__DGUX) 
 extern char ** environ;        /* environment variables supplied via exec */
 #    endif
 #  endif
@@ -2852,7 +2911,8 @@ EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FP
 
 EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
 EXT MGVTBL PL_vtbl_regdata = {0, 0, MEMBER_TO_FPTR(Perl_magic_regdata_cnt), 0, 0};
-EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get), 0, 0, 0, 0};
+EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get),
+                              MEMBER_TO_FPTR(Perl_magic_regdatum_set), 0, 0, 0};
 
 #ifdef USE_LOCALE_COLLATE
 EXT MGVTBL PL_vtbl_collxfrm = {0,
@@ -3095,8 +3155,20 @@ typedef struct am_table_short AMTS;
        ((PL_hints & HINT_LOCALE) && \
          PL_numeric_radix && (c) == PL_numeric_radix)
 
-#define RESTORE_NUMERIC_LOCAL()                if ((PL_hints & HINT_LOCALE) && PL_numeric_standard) SET_NUMERIC_LOCAL()
-#define RESTORE_NUMERIC_STANDARD()     if ((PL_hints & HINT_LOCALE) && PL_numeric_local) SET_NUMERIC_STANDARD()
+#define STORE_NUMERIC_LOCAL_SET_STANDARD() \
+       bool was_local = (PL_hints & HINT_LOCALE) && PL_numeric_local; \
+       if (!was_local) SET_NUMERIC_STANDARD();
+
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() \
+       bool was_standard = !(PL_hints & HINT_LOCALE) || PL_numeric_standard; \
+       if (!was_standard) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_LOCAL() \
+       if (was_local) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_STANDARD() \
+       if (was_standard) SET_NUMERIC_STANDARD();
+
 #define Atof                           my_atof
 
 #else /* !USE_LOCALE_NUMERIC */
@@ -3104,6 +3176,8 @@ typedef struct am_table_short AMTS;
 #define SET_NUMERIC_STANDARD()         /**/
 #define SET_NUMERIC_LOCAL()            /**/
 #define IS_NUMERIC_RADIX(c)            (0)
+#define STORE_NUMERIC_LOCAL_SET_STANDARD()     /**/
+#define STORE_NUMERIC_STANDARD_SET_LOCAL()     /**/
 #define RESTORE_NUMERIC_LOCAL()                /**/
 #define RESTORE_NUMERIC_STANDARD()     /**/
 #define Atof                           Perl_atof
@@ -3354,6 +3428,10 @@ typedef struct am_table_short AMTS;
    I_SYSMMAN
    Mmap_t
 
+   NVef
+   NVff
+   NVgf
+
    so that Configure picks them up. */
 
 #endif /* Include guard */
index f7b16cd..39a13ba 100755 (executable)
--- a/perlapi.c
+++ b/perlapi.c
@@ -1,4 +1,4 @@
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -829,6 +829,13 @@ Perl_gv_efullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
     ((CPerlObj*)pPerl)->Perl_gv_efullname3(sv, gv, prefix);
 }
 
+#undef  Perl_gv_efullname4
+void
+Perl_gv_efullname4(pTHXo_ SV* sv, GV* gv, const char* prefix, bool keepmain)
+{
+    ((CPerlObj*)pPerl)->Perl_gv_efullname4(sv, gv, prefix, keepmain);
+}
+
 #undef  Perl_gv_fetchfile
 GV*
 Perl_gv_fetchfile(pTHXo_ const char* name)
@@ -878,6 +885,13 @@ Perl_gv_fullname3(pTHXo_ SV* sv, GV* gv, const char* prefix)
     ((CPerlObj*)pPerl)->Perl_gv_fullname3(sv, gv, prefix);
 }
 
+#undef  Perl_gv_fullname4
+void
+Perl_gv_fullname4(pTHXo_ SV* sv, GV* gv, const char* prefix, bool keepmain)
+{
+    ((CPerlObj*)pPerl)->Perl_gv_fullname4(sv, gv, prefix, keepmain);
+}
+
 #undef  Perl_gv_init
 void
 Perl_gv_init(pTHXo_ GV* gv, HV* stash, const char* name, STRLEN len, int multi)
@@ -2001,6 +2015,13 @@ Perl_newSVpvn(pTHXo_ const char* s, STRLEN len)
     return ((CPerlObj*)pPerl)->Perl_newSVpvn(s, len);
 }
 
+#undef  Perl_newSVpvn_share
+SV*
+Perl_newSVpvn_share(pTHXo_ const char* s, STRLEN len, U32 hash)
+{
+    return ((CPerlObj*)pPerl)->Perl_newSVpvn_share(s, len, hash);
+}
+
 #undef  Perl_newSVpvf
 SV*
 Perl_newSVpvf(pTHXo_ const char* pat, ...)
@@ -3345,7 +3366,7 @@ Perl_utf8_hop(pTHXo_ U8 *s, I32 off)
 
 #undef  Perl_utf8_to_bytes
 U8*
-Perl_utf8_to_bytes(pTHXo_ U8 *s, STRLEN len)
+Perl_utf8_to_bytes(pTHXo_ U8 *s, STRLEN *len)
 {
     return ((CPerlObj*)pPerl)->Perl_utf8_to_bytes(s, len);
 }
@@ -3364,6 +3385,13 @@ Perl_utf8_to_uv(pTHXo_ U8 *s, I32* retlen)
     return ((CPerlObj*)pPerl)->Perl_utf8_to_uv(s, retlen);
 }
 
+#undef  Perl_utf8_to_uv_chk
+UV
+Perl_utf8_to_uv_chk(pTHXo_ U8 *s, I32* retlen, bool checking)
+{
+    return ((CPerlObj*)pPerl)->Perl_utf8_to_uv_chk(s, retlen, checking);
+}
+
 #undef  Perl_uv_to_utf8
 U8*
 Perl_uv_to_utf8(pTHXo_ U8 *d, UV uv)
index c57d575..2d210ee 100755 (executable)
--- a/perlapi.h
+++ b/perlapi.h
@@ -1,4 +1,4 @@
-/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
+/* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
    This file is built by embed.pl from data in embed.pl, pp.sym, intrpvar.h,
    perlvars.h and thrdvar.h.  Any changes made here will be lost!
 */
@@ -130,6 +130,8 @@ START_EXTERN_C
 #define PL_basetime            (*Perl_Ibasetime_ptr(aTHXo))
 #undef  PL_beginav
 #define PL_beginav             (*Perl_Ibeginav_ptr(aTHXo))
+#undef  PL_beginav_save
+#define PL_beginav_save                (*Perl_Ibeginav_save_ptr(aTHXo))
 #undef  PL_bitcount
 #define PL_bitcount            (*Perl_Ibitcount_ptr(aTHXo))
 #undef  PL_bufend
index 7afda68..c4a1179 100644 (file)
 #define _flsbuf(c,f)  _CANNOT _flsbuf_
 #define fdopen(fd,p)  _CANNOT _fdopen_
 #define fileno(f)  _CANNOT _fileno_
+#if SFIO_VERSION < 20000101L
 #define flockfile(f)  _CANNOT _flockfile_
 #define ftrylockfile(f)  _CANNOT _ftrylockfile_
 #define funlockfile(f)  _CANNOT _funlockfile_
+#endif
 #define getc_unlocked(f)  _CANNOT _getc_unlocked_
 #define putc_unlocked(c,f)  _CANNOT _putc_unlocked_
 #define popen(c,m)  _CANNOT _popen_
 #define _flsbuf(c,f)           _CANNOT _flsbuf_
 #define getw(f)                        _CANNOT _getw_
 #define putw(v,f)              _CANNOT _putw_
+#if SFIO_VERSION < 20000101L
 #define flockfile(f)           _CANNOT _flockfile_
 #define ftrylockfile(f)                _CANNOT _ftrylockfile_
 #define funlockfile(f)         _CANNOT _funlockfile_
+#endif
 #define freopen(p,m,f)         _CANNOT _freopen_
 #define setbuf(f,b)            _CANNOT _setbuf_
 #define setvbuf(f,b,x,s)       _CANNOT _setvbuf_
index 00568d1..d0f6471 100644 (file)
@@ -3,6 +3,11 @@
 #include <sfio.h>
 #endif
 
+/* sfio 2000 changed _stdopen to _stdfdopen */
+#if SFIO_VERSION >= 20000101L
+#define _stdopen _stdfdopen 
+#endif
+
 extern Sfio_t* _stdopen _ARG_((int, const char*));
 extern int     _stdprintf _ARG_((const char*, ...));
 
index 45f1856..ae6262c 100644 (file)
@@ -22,7 +22,7 @@ if test -d pod; then
 fi
 POD=`echo *.pod`
 MAN=`echo $POD|sed 's/\.pod/\.man/g'`
-HTML=`echo $POD|sed 's/perltoc.pod//'|sed 's/\.pod/\.man/g'`
+HTML=`echo $POD|sed 's/perltoc.pod//'|sed 's/\.pod/\.html/g'`
 TEX=`echo $POD|sed 's/\.pod/\.tex/g'`
 
 echo "Extracting pod/Makefile (with variable substitutions)"
@@ -122,6 +122,9 @@ realclean:  clean
 
 distclean:     realclean
 
+veryclean:     distclean
+       -rm -f *~ *.orig
+
 check: checkpods
        @echo "checking..."; \
        $(PERL) -I../lib checkpods $(POD)
index 54853d3..3819308 100644 (file)
@@ -80,6 +80,7 @@ if (-d "pod") {
     perlrun
     perldiag
     perllexwarn
+    perldebtut
     perldebug
 
     perlvar
@@ -87,11 +88,17 @@ if (-d "pod") {
     perlopentut
     perlretut
 
-    perlref
     perlre
+    perlref
+
     perlform
-    perllocale
-    perlunicode
+
+    perlboot
+    perltoot
+    perltootc
+    perlobj
+    perlbot
+    perltie
 
     perlipc
     perlfork
@@ -99,14 +106,11 @@ if (-d "pod") {
     perlthrtut
 
     perlport
-    perlsec
+    perllocale
+    perlunicode
+    perlebcdic
 
-    perlboot
-    perltoot
-    perltootc
-    perlobj
-    perlbot
-    perltie
+    perlsec
 
     perlmod
     perlmodlib
@@ -146,6 +150,7 @@ if (-d "pod") {
     perl5005delta       
     perl5004delta       
 
+    perlaix
     perlamiga          
     perlcygwin          
     perldos             
@@ -159,6 +164,7 @@ if (-d "pod") {
          );
 
 @ARCHPODS = qw(
+    perlaix    
     perlamiga          
     perlcygwin          
     perldos             
@@ -468,3 +474,7 @@ sub output ($) {
 
 !NO!SUBS!
 
+close OUT or die "Can't close $file: $!";
+chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
+exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
+chdir $origdir;
index 0273dbf..946d6f2 100644 (file)
@@ -34,6 +34,7 @@ For ease of access, the Perl manual has been split up into several sections:
     perlrun            Perl execution and options
     perldiag           Perl diagnostic messages
     perllexwarn                Perl warnings and their control
+    perldebtut         Perl debugging tutorial
     perldebug          Perl debugging
 
     perlvar            Perl predefined variables
@@ -41,11 +42,17 @@ For ease of access, the Perl manual has been split up into several sections:
     perlopentut                Perl open() tutorial
     perlretut          Perl regular expressions tutorial
 
-    perlref            Perl references, the rest of the story
     perlre             Perl regular expressions, the rest of the story
+    perlref            Perl references, the rest of the story
+
     perlform           Perl formats
-    perllocale         Perl locale support
-    perlunicode                Perl unicode support
+
+    perlboot           Perl OO tutorial for beginners
+    perltoot           Perl OO tutorial, part 1
+    perltootc          Perl OO tutorial, part 2
+    perlobj            Perl objects
+    perlbot            Perl OO tricks and examples
+    perltie            Perl objects hidden behind simple variables
 
     perlipc            Perl interprocess communication
     perlfork           Perl fork() information
@@ -53,14 +60,11 @@ For ease of access, the Perl manual has been split up into several sections:
     perlthrtut         Perl threads tutorial
 
     perlport           Perl portability guide
-    perlsec            Perl security
+    perllocale         Perl locale support
+    perlunicode                Perl unicode support
+    perlebcdic         Considerations for running Perl on EBCDIC platforms
 
-    perlboot           Perl OO tutorial for beginners
-    perltoot           Perl OO tutorial, part 1
-    perltootc          Perl OO tutorial, part 2
-    perlobj            Perl objects
-    perlbot            Perl OO tricks and examples
-    perltie            Perl objects hidden behind simple variables
+    perlsec            Perl security
 
     perlmod            Perl modules: how they work
     perlmodlib         Perl modules: how to write and use
@@ -100,6 +104,7 @@ For ease of access, the Perl manual has been split up into several sections:
     perl5005delta      Perl changes in version 5.005
     perl5004delta      Perl changes in version 5.004
 
+    perlaix            Perl notes for AIX
     perlamiga          Perl notes for Amiga
     perlcygwin         Perl notes for Cygwin
     perldos            Perl notes for DOS
@@ -313,7 +318,7 @@ affected by wraparound).
 
 You may mail your bug reports (be sure to include full configuration
 information as output by the myconfig program in the perl source
-tree, or by C<perl -V>) to perlbug@perl.com .  If you've succeeded
+tree, or by C<perl -V>) to perlbug@perl.org .  If you've succeeded
 in compiling perl, the B<perlbug> script in the F<utils/> subdirectory
 can be used to help mail in a bug report.
 
index 85a8f96..8cec3ab 100644 (file)
@@ -810,7 +810,7 @@ builtin operations.
 
 When C<use locale> is in effect, the current LC_CTYPE locale is used
 for regular expressions and case mapping; LC_COLLATE for string
-ordering; and LC_NUMERIC for numeric formating in printf and sprintf
+ordering; and LC_NUMERIC for numeric formatting in printf and sprintf
 (but B<not> in print).  LC_NUMERIC is always used in write, since
 lexical scoping of formats is problematic at best.
 
index 5a824ac..9f30314 100644 (file)
@@ -4,7 +4,8 @@ perldelta - what's new for perl v5.6.0
 
 =head1 DESCRIPTION
 
-This document describes differences between the 5.005 release and this one.
+This document describes differences between the 5.005 release and the 5.6.0
+release.
 
 =head1 Core Enhancements
 
@@ -788,8 +789,7 @@ already.  The fatal error has been downgraded to an optional warning:
         
 This warns you that C<"fred@example.com"> is going to turn into
 C<fred.com> if you don't backslash the C<@>.
-
-See L<http://www.plover.com/~mjd/perl/at-error.html> for more details
+See http://www.plover.com/~mjd/perl/at-error.html for more details
 about the history here.
 
 =head1 Modules and Pragmata
@@ -2989,7 +2989,7 @@ Home Page.
 If you believe you have an unreported bug, please run the B<perlbug>
 program included with your release.  Be sure to trim your bug down
 to a tiny but sufficient test case.  Your bug report, along with the
-output of C<perl -V>, will be sent off to perlbug@perl.com to be
+output of C<perl -V>, will be sent off to perlbug@perl.org to be
 analysed by the Perl porting team.
 
 =head1 SEE ALSO
@@ -3007,6 +3007,6 @@ The F<Artistic> and F<Copying> files for copyright information.
 Written by Gurusamy Sarathy <F<gsar@activestate.com>>, with many
 contributions from The Perl Porters.
 
-Send omissions or corrections to <F<perlbug@perl.com>>.
+Send omissions or corrections to <F<perlbug@perl.org>>.
 
 =cut
index e0b7c2b..98abdc1 100644 (file)
@@ -4,9 +4,9 @@ perlapi - autogenerated documentation for the perl public API
 
 =head1 DESCRIPTION
 
-This file contains the documentation of the perl public API generated by 
-embed.pl, specifically a listing of functions, macros, flags, and variables 
-that may be used by extension writers.  The interfaces of any functions that 
+This file contains the documentation of the perl public API generated by
+embed.pl, specifically a listing of functions, macros, flags, and variables
+that may be used by extension writers.  The interfaces of any functions that
 are not listed here are subject to change without notice.  For this reason,
 blindly using functions listed in proto.h is to be avoided when writing
 extensions.
@@ -478,7 +478,7 @@ Found in file op.h
 =item GIMME_V
 
 The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
-C<G_SCALAR> or C<G_ARRAY> for void, scalar or array context,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
 respectively.
 
        U32     GIMME_V
@@ -499,18 +499,18 @@ Found in file gv.h
 
 Returns the glob with the given C<name> and a defined subroutine or
 C<NULL>.  The glob lives in the given C<stash>, or in the stashes
-accessible via @ISA and @UNIVERSAL. 
+accessible via @ISA and @UNIVERSAL.
 
 The argument C<level> should be either 0 or -1.  If C<level==0>, as a
 side-effect creates a glob with the given C<name> in the given C<stash>
 which in the case of success contains an alias for the subroutine, and sets
-up caching info for this glob.  Similarly for all the searched stashes. 
+up caching info for this glob.  Similarly for all the searched stashes.
 
 This function grants C<"SUPER"> token as a postfix of the stash name. The
 GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
 visible to Perl code.  So when calling C<call_sv>, you should not use
 the GV directly; instead, you should use the method's CV, which can be
-obtained from the GV with the C<GvCV> macro. 
+obtained from the GV with the C<GvCV> macro.
 
        GV*     gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
 
@@ -531,24 +531,24 @@ Found in file gv.c
 Returns the glob which contains the subroutine to call to invoke the method
 on the C<stash>.  In fact in the presence of autoloading this may be the
 glob for "AUTOLOAD".  In this case the corresponding variable $AUTOLOAD is
-already setup. 
+already setup.
 
 The third parameter of C<gv_fetchmethod_autoload> determines whether
 AUTOLOAD lookup is performed if the given method is not present: non-zero
-means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD. 
+means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
 Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
-with a non-zero C<autoload> parameter. 
+with a non-zero C<autoload> parameter.
 
 These functions grant C<"SUPER"> token as a prefix of the method name. Note
 that if you want to keep the returned glob for a long time, you need to
 check for it being "AUTOLOAD", since at the later time the call may load a
 different subroutine due to $AUTOLOAD changing its value. Use the glob
-created via a side effect to do this. 
+created via a side effect to do this.
 
 These functions have the same side-effects and as C<gv_fetchmeth> with
 C<level==0>.  C<name> should be writable if contains C<':'> or C<'
 ''>. The warning against passing the GV returned by C<gv_fetchmeth> to
-C<call_sv> apply equally to these functions. 
+C<call_sv> apply equally to these functions.
 
        GV*     gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
 
@@ -579,7 +579,7 @@ Found in file gv.c
 
 =item G_ARRAY
 
-Used to indicate array context.  See C<GIMME_V>, C<GIMME> and
+Used to indicate list context.  See C<GIMME_V>, C<GIMME> and
 L<perlcall>.
 
 =for hackers
@@ -744,7 +744,7 @@ Found in file hv.c
 =item hv_delete
 
 Deletes a key/value pair in the hash.  The value SV is removed from the
-hash and returned to the caller.  The C<klen> is the length of the key. 
+hash and returned to the caller.  The C<klen> is the length of the key.
 The C<flags> value will normally be zero; if set to G_DISCARD then NULL
 will be returned.
 
@@ -791,7 +791,7 @@ Found in file hv.c
 Returns the SV which corresponds to the specified key in the hash.  The
 C<klen> is the length of the key.  If C<lval> is set then the fetch will be
 part of a store.  Check that the return value is non-null before
-dereferencing it to a C<SV*>. 
+dereferencing it to a C<SV*>.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -809,7 +809,7 @@ if you want the function to compute it.  IF C<lval> is set then the fetch
 will be part of a store.  Make sure the return value is non-null before
 accessing it.  The return value when C<tb> is a tied hash is a pointer to a
 static location, so be sure to make a copy of the structure if you need to
-store it somewhere. 
+store it somewhere.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -823,7 +823,7 @@ Found in file hv.c
 
 Prepares a starting point to traverse a hash table.  Returns the number of
 keys in the hash (i.e. the same as C<HvKEYS(tb)>).  The return value is
-currently only meaningful for hashes without tie magic. 
+currently only meaningful for hashes without tie magic.
 
 NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
 hash buckets that happen to be in use.  If you still need that esoteric
@@ -902,7 +902,7 @@ NULL if the operation failed or if the value did not need to be actually
 stored within the hash (as in the case of tied hashes).  Otherwise it can
 be dereferenced to get the original C<SV*>.  Note that the caller is
 responsible for suitably incrementing the reference count of C<val> before
-the call, and decrementing it if the function returned NULL.  
+the call, and decrementing it if the function returned NULL.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -922,7 +922,7 @@ stored within the hash (as in the case of tied hashes).  Otherwise the
 contents of the return value can be accessed using the C<He???> macros
 described here.  Note that the caller is responsible for suitably
 incrementing the reference count of C<val> before the call, and
-decrementing it if the function returned NULL. 
+decrementing it if the function returned NULL.
 
 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
 information on how to use this function on tied hashes.
@@ -1201,7 +1201,7 @@ Found in file sv.c
 Creates a new SV.  A non-zero C<len> parameter indicates the number of
 bytes of preallocated string space the SV should have.  An extra byte for a
 tailing NUL is also reserved.  (SvPOK is not set for the SV even if string
-space is allocated.)  The reference count for the new SV is set to 1. 
+space is allocated.)  The reference count for the new SV is set to 1.
 C<id> is an integer id between 0 and 1299 (used to identify leaks).
 
        SV*     NEWSV(int id, STRLEN len)
@@ -1253,7 +1253,7 @@ Found in file sv.c
 =item newSVpvn
 
 Creates a new SV and copies a string into it.  The reference count for the
-SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length 
+SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
 string.  You are responsible for ensuring that the source string is at least
 C<len> bytes long.
 
@@ -1262,6 +1262,19 @@ C<len> bytes long.
 =for hackers
 Found in file sv.c
 
+=item newSVpvn_share
+
+Creates a new SV and populates it with a string from
+the string table. Turns on READONLY and FAKE.
+The idea here is that as string table is used for shared hash
+keys these strings will have SvPVX == HeKEY and hash lookup
+will avoid string compare.
+
+       SV*     newSVpvn_share(const char* s, STRLEN len, U32 hash)
+
+=for hackers
+Found in file sv.c
+
 =item newSVrv
 
 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
@@ -1601,7 +1614,7 @@ Found in file pp.h
 
 =item PUSHs
 
-Push an SV onto the stack.  The stack must have room for this element. 
+Push an SV onto the stack.  The stack must have room for this element.
 Does not handle 'set' magic.  See C<XPUSHs>.
 
        void    PUSHs(SV* sv)
@@ -1893,6 +1906,15 @@ the B<private> setting.  Use C<SvIOK>.
 =for hackers
 Found in file sv.h
 
+=item SvIOK_notUV
+
+Returns a boolean indicating whether the SV contains an signed integer.
+
+       void    SvIOK_notUV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
 =item SvIOK_off
 
 Unsets the IV status of an SV.
@@ -1920,6 +1942,24 @@ Tells an SV that it is an integer and disables all other OK bits.
 =for hackers
 Found in file sv.h
 
+=item SvIOK_only_UV
+
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+       void    SvIOK_only_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvIOK_UV
+
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+       void    SvIOK_UV(SV* sv)
+
+=for hackers
+Found in file sv.h
+
 =item SvIV
 
 Coerces the given SV to an integer and returns it.
@@ -1941,7 +1981,8 @@ Found in file sv.h
 
 =item SvLEN
 
-Returns the size of the string buffer in the SV.  See C<SvCUR>.
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>.  See C<SvCUR>.
 
        STRLEN  SvLEN(SV* sv)
 
@@ -2110,6 +2151,16 @@ Tells an SV that it is a string and disables all other OK bits.
 =for hackers
 Found in file sv.h
 
+=item SvPOK_only_UTF8
+
+Tells an SV that it is a UTF8 string (do not use frivolously)
+and disables all other OK bits.
+  
+       void    SvPOK_only_UTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
 =item SvPV
 
 Returns a pointer to the string in the SV, or a stringified form of the SV
@@ -2380,6 +2431,33 @@ perform the upgrade if necessary.  See C<svtype>.
 =for hackers
 Found in file sv.h
 
+=item SvUTF8
+
+Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+
+       void    SvUTF8(SV* sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_off
+
+Unsets the UTF8 status of an SV.
+
+       void    SvUTF8_off(SV *sv)
+
+=for hackers
+Found in file sv.h
+
+=item SvUTF8_on
+
+Tells an SV that it is a string and encoded in UTF8.  Do not use frivolously.
+
+       void    SvUTF8_on(SV *sv)
+
+=for hackers
+Found in file sv.h
+
 =item SvUV
 
 Coerces the given SV to an unsigned integer and returns it.
@@ -2500,7 +2578,7 @@ Found in file sv.c
 
 =item sv_chop
 
-Efficient removal of characters from the beginning of the string buffer. 
+Efficient removal of characters from the beginning of the string buffer.
 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
 the string buffer.  The C<ptr> becomes the first character of the adjusted
 string.
@@ -2992,7 +3070,7 @@ Found in file sv.c
 =item sv_usepvn
 
 Tells an SV to use C<ptr> to find its string value.  Normally the string is
-stored inside the SV but sv_usepvn allows the SV to use an outside string. 
+stored inside the SV but sv_usepvn allows the SV to use an outside string.
 The C<ptr> should point to memory that was allocated by C<malloc>.  The
 string length, C<len>, must be supplied.  This function will realloc the
 memory pointed to by C<ptr>, so that pointer should not be freed or used by
@@ -3031,7 +3109,7 @@ Found in file sv.c
 =item sv_utf8_encode
 
 Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
-flag so that it looks like bytes again. Nothing calls this. 
+flag so that it looks like bytes again. Nothing calls this.
 
 NOTE: this function is experimental and may change or be
 removed without notice.
@@ -3107,18 +3185,52 @@ Found in file handy.h
 Returns true if first C<len> bytes of the given string form valid a UTF8
 string, false otherwise.
 
-       bool_utf8_string        U8 *s(STRLEN len)
+       is_utf8_string  U8 *s(STRLEN len)
 
 =for hackers
 Found in file utf8.c
 
 =item utf8_to_bytes
 
-Converts a string C<s> of length C<len> from UTF8 into ASCII encoding.
-Unlike C<bytes_to_utf8>, this over-writes the original string.
-Returns zero on failure after converting as much as possible.
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
+
+       U8 *    utf8_to_bytes(U8 *s, STRLEN *len)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uv
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, an optional UTF8
+warning is produced.
+
+       U8* s   utf8_to_uv(I32 *retlen)
+
+=for hackers
+Found in file utf8.c
+
+=item utf8_to_uv_chk
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, the behaviour
+is dependent on the value of C<checking>: if this is true, it is
+assumed that the caller will raise a warning, and this function will
+set C<retlen> to C<-1> and return. If C<checking> is not true, an optional UTF8
+warning is produced.
 
-       U8 *    utf8_to_bytes(U8 *s, STRLEN len)
+       U8* s   utf8_to_uv_chk(I32 *retlen, I32 checking)
 
 =for hackers
 Found in file utf8.c
@@ -3177,7 +3289,7 @@ Found in file pp.h
 
 =item XPUSHu
 
-Push an unsigned integer onto the stack, extending the stack if necessary. 
+Push an unsigned integer onto the stack, extending the stack if necessary.
 See C<PUSHu>.
 
        void    XPUSHu(UV uv)
index 148b24b..94edd34 100644 (file)
@@ -201,8 +201,8 @@ As with G_SCALAR, this flag has 2 effects:
 
 =item 1.
 
-It indicates to the subroutine being called that it is executing in an
-array context (if it executes I<wantarray> the result will be true).
+It indicates to the subroutine being called that it is executing in a
+list context (if it executes I<wantarray> the result will be true).
 
 
 =item 2.
@@ -355,7 +355,7 @@ use of this flag.
 As mentioned above, you can determine the context of the currently
 executing subroutine in Perl with I<wantarray>.  The equivalent test
 can be made in C by using the C<GIMME_V> macro, which returns
-C<G_ARRAY> if you have been called in an array context, C<G_SCALAR> if
+C<G_ARRAY> if you have been called in a list context, C<G_SCALAR> if
 in a scalar context, or C<G_VOID> if in a void context (i.e. the
 return value will not be used).  An older version of this macro is
 called C<GIMME>; in a void context it returns C<G_SCALAR> instead of
@@ -806,7 +806,7 @@ Notes
 
 =item 1.
 
-We wanted array context, so G_ARRAY was used.
+We wanted list context, so G_ARRAY was used.
 
 =item 2.
 
index e5544ec..282592e 100644 (file)
@@ -183,9 +183,6 @@ one-liners:
       rename $was, $_ unless $was eq $_;
   }
 
-(this is the I<rename> program that comes in the I<eg/> directory
-of the Perl source distribution).
-
 The decompiler has several options for the code it generates.  For
 instance, you can set the size of each indent from 4 (as above) to
 2 with:
index 70ab161..50b6858 100644 (file)
@@ -462,6 +462,22 @@ from each line manually:
        down from the door where it began.
     FINIS
 
+If you use a here-doc within a delimited construct, such as in C<s///eg>,
+the quoted material must come on the lines following the final delimiter.
+So instead of
+
+    s/this/<<E . 'that'
+    the other
+    E
+     . 'more '/eg;
+
+you have to write
+
+    s/this/<<E . 'that' 
+     . 'more '/eg; 
+    the other 
+    E 
+
 =head2 List value constructors
 
 List values are denoted by separating individual values by commas
@@ -524,6 +540,15 @@ has no effect.  Thus ((),(),()) is equivalent to ().  Similarly,
 interpolating an array with no elements is the same as if no
 array had been interpolated at that point.
 
+This interpolation combines with the facts that the opening
+and closing parentheses are optional (except necessary for
+precedence) and lists may end with an optional comma to mean that
+multiple commas within lists are legal syntax. The list C<1,,3> is a
+concatenation of two lists, C<1,> and C<3>, the first of which ends
+with that optional comma.  C<1,,3> is C<(1,),(3)> is C<1,3> (And
+similarly for C<1,,,3> is C<(1,),(,),3> is C<1,3> and so on.)  Not that
+we'd advise you to use this obfuscation.
+
 A list value may also be subscripted like a normal array.  You must
 put the list in parentheses to avoid ambiguity.  For example:
 
index 3350596..8384999 100644 (file)
@@ -124,7 +124,7 @@ Here is another real-life example. By default, whenever Perl writes to
 a DBM database it always writes the key and value as strings. So when
 you use this:
 
-    $hash{12345} = "soemthing" ;
+    $hash{12345} = "something" ;
 
 the key 12345 will get stored in the DBM database as the 5 byte string
 "12345". If you actually want the key to be stored in the DBM database
index 5812a40..742423b 100644 (file)
@@ -32,20 +32,22 @@ Perl inserts the contents of C<$ENV{PERL5DB}> (or C<BEGIN {require
 
 =item *
 
-The array C<@{"_<$filename"}> holds the lines of $filename for all
-files compiled by Perl.  The same for C<eval>ed strings that contain
+Each array C<@{"_<$filename"}> holds the lines of $filename for a
+file compiled by Perl.  The same for C<eval>ed strings that contain
 subroutines, or which are currently being executed.  The $filename
 for C<eval>ed strings looks like C<(eval 34)>.   Code assertions
-in regexes look like C<(re_eval 19)>.
+in regexes look like C<(re_eval 19)>.  
+
+Values in this array are magical in numeric context: they compare
+equal to zero only if the line is not breakable.
 
 =item *
 
-The hash C<%{"_<$filename"}> contains breakpoints and actions keyed
+Each hash C<%{"_<$filename"}> contains breakpoints and actions keyed
 by line number.  Individual entries (as opposed to the whole hash)
 are settable.  Perl only cares about Boolean true here, although
 the values used by F<perl5db.pl> have the form
-C<"$break_condition\0$action">.  Values in this hash are magical
-in numeric context: they are zeros if the line is not breakable.
+C<"$break_condition\0$action">.  
 
 The same holds for evaluated strings that contain subroutines, or
 which are currently being executed.  The $filename for C<eval>ed strings
@@ -53,7 +55,7 @@ looks like C<(eval 34)> or  C<(re_eval 19)>.
 
 =item *
 
-The scalar C<${"_<$filename"}> contains C<"_<$filename">.  This is
+Each scalar C<${"_<$filename"}> contains C<"_<$filename">.  This is
 also the case for evaluated strings that contain subroutines, or
 which are currently being executed.  The $filename for C<eval>ed
 strings looks like C<(eval 34)> or C<(re_eval 19)>.
diff --git a/pod/perldebtut.pod b/pod/perldebtut.pod
new file mode 100644 (file)
index 0000000..2916897
--- /dev/null
@@ -0,0 +1,721 @@
+=head1 NAME
+
+perldebtut - Perl debugging tutorial
+
+=head1 DESCRIPTION
+
+A (very) lightweight introduction in the use of the perl debugger, and a
+pointer to existing, deeper sources of information on the subject of debugging
+perl programs.  
+
+There's an extraordinary number of people out there who don't appear to know
+anything about using the perl debugger, though they use the language every
+day.  
+This is for them.  
+
+
+=head1 use strict
+
+First of all, there's a few things you can do to make your life a lot more
+straightforward when it comes to debugging perl programs, without using the
+debugger at all.  To demonstrate, here's a simple script with a problem:
+
+       #!/usr/bin/perl
+       
+       $var1 = 'Hello World'; # always wanted to do that :-)
+       $var2 = "$varl\n";
+       
+       print $var2; 
+       exit;
+
+While this compiles and runs happily, it probably won't do what's expected,
+namely it doesn't print "Hello World\n" at all;  It will on the other hand do
+exactly what it was told to do, computers being a bit that way inclined.  That
+is, it will print out a newline character, and you'll get what looks like a
+blank line.  It looks like there's 2 variables when (because of the typo)
+there's really 3:
+
+       $var1 = 'Hello World'
+       $varl = undef
+       $var2 = "\n"
+
+To catch this kind of problem, we can force each variable to be declared
+before use by pulling in the strict module, by putting 'use strict;' after the
+first line of the script.
+
+Now when you run it, perl complains about the 3 undeclared variables and we
+get four error messages because one variable is referenced twice:
+ Global symbol "$var1" requires explicit package name at ./t1 line 4.
+ Global symbol "$var2" requires explicit package name at ./t1 line 5.
+ Global symbol "$varl" requires explicit package name at ./t1 line 5.
+ Global symbol "$var2" requires explicit package name at ./t1 line 7.
+ Execution of ./hello aborted due to compilation errors.     
+
+Luvverly! and to fix this we declare all variables explicitly and now our
+script looks like this:        
+
+       #!/usr/bin/perl
+       use strict;
+       
+       my $var1 = 'Hello World';
+       my $varl = '';
+       my $var2 = "$varl\n";
+       
+       print $var2; 
+       exit;
+
+We then do (always a good idea) a syntax check before we try to run it again:
+
+       > perl -c hello
+       hello syntax OK 
+
+And now when we run it, we get "\n" still, but at least we know why.  Just
+getting this script to compile has exposed the '$varl' (with the letter 'l)
+variable, and simply changing $varl to $var1 solves the problem.
+
+
+=head1 Looking at data and -w and w
+
+Ok, but how about when you want to really see your data, what's in that
+dynamic variable, just before using it?
+
+       #!/usr/bin/perl 
+       use strict;
+
+       my $key = 'welcome';
+       my %data = (
+               'this' => qw(that), 
+               'tom' => qw(and jerry),
+               'welcome' => q(Hello World),
+               'zip' => q(welcome),
+       );
+       my @data = keys %data;
+
+       print "$data{$key}\n";
+       exit;                               
+
+Looks OK, after it's been through the syntax check (perl -c scriptname), we
+run it and all we get is a blank line again!  Hmmmm.
+One common debugging approach here, would be to liberally sprinkle a few print
+statements, to add a check just before we print out our data, and another just
+after:
+
+       print "All OK\n" if grep($key, keys %data);
+       print "$data{$key}\n";
+       print "done: '$data{$key}'\n";
+
+And try again:
+       
+       > perl data
+       All OK     
+       
+       done: ''
+
+After much staring at the same piece of code and not seeing the wood for the
+trees for some time, we get a cup of coffee and try another approach.  That
+is, we bring in the cavalry by giving perl the 'B<-d>' switch on the command
+line:
+
+       > perl -d data 
+       Default die handler restored.
+
+       Loading DB routines from perl5db.pl version 1.07
+       Editor support available.
+
+       Enter h or `h h' for help, or `man perldebug' for more help.
+
+       main::(./data:4):     my $key = 'welcome';   
+
+Now, what we've done here is to launch the built-in perl debugger on our
+script.  It's stopped at the first line of executable code and is waiting for
+input.
+
+Before we go any further, you'll want to know how to quit the debugger: use
+just the letter 'B<q>', not the words 'quit' or 'exit':
+
+       DB<1> q
+       >
+       
+That's it, you're back on home turf again.
+
+
+=head1 help
+
+Fire the debugger up again on your script and we'll look at the help menu. 
+There's a couple of ways of calling help: a simple 'B<h>' will get you a long
+scrolled list of help, 'B<|h>' (pipe-h) will pipe the help through your pager
+('more' or 'less' probably), and finally, 'B<h h>' (h-space-h) will give you a
+helpful mini-screen snapshot:
+
+ DB<1> h h
+ List/search source lines:               Control script execution:
+ l [ln|sub]  List source code            T           Stack trace
+ - or .      List previous/current line  s [expr]    Single step [in expr]
+ w [line]    List around line            n [expr]    Next, steps over subs
+ f filename  View source in file         <CR/Enter>  Repeat last n or s
+ /pattern/ ?patt?   Search forw/backw    r           Return from subroutine
+ v           Show versions of modules    c [ln|sub]  Continue until position
+ Debugger controls:                        L           List
+break/watch/actions
+ O [...]     Set debugger options        t [expr]    Toggle trace [trace expr]
+ <[<]|{[{]|>[>] [cmd] Do pre/post-prompt b [ln|event|sub] [cnd] Set breakpoint
+ ! [N|pat]   Redo a previous command     d [ln] or D Delete a/all breakpoints
+ H [-num]    Display last num commands   a [ln] cmd  Do cmd before line
+ = [a val]   Define/list an alias        W expr      Add a watch expression
+ h [db_cmd]  Get help on command         A or W      Delete all actions/watch
+ |[|]db_cmd  Send output to pager        ![!] syscmd Run cmd in a subprocess
+ q or ^D     Quit                        R           Attempt a restart
+ Data Examination:       expr     Execute perl code, also see: s,n,t expr
+ x|m expr      Evals expr in list context, dumps the result or lists methods.
+ p expr        Print expression (uses script's current package).
+ S [[!]pat]    List subroutine names [not] matching pattern
+ V [Pk [Vars]] List Variables in Package.  Vars can be ~pattern or !pattern.
+ X [Vars]      Same as "V current_package [Vars]".
+ For more help, type h cmd_letter, or run man perldebug for all docs.       
+       
+More confusing options than you can shake a big stick at!  It's not as bad as
+it looks and it's very useful to know more about all of it, and fun too!
+
+There's a couple of useful ones to know about straight away.  You wouldn't
+think we're using any libraries at all at the moment, but 'B<v>' will show
+which modules are currently loaded, by the debugger as well your script. 
+'B<V>' and 'B<X>' show variables in the program by package scope and can be
+constrained by pattern.  'B<m>' shows methods and 'B<S>' shows all subroutines
+(by pattern):
+
+       DB<2>S str 
+       dumpvar::stringify
+       strict::bits
+       strict::import
+       strict::unimport  
+
+Using 'X' and cousins requires you not to use the type identifiers ($@%), just
+the 'name':
+
+       DM<3>X ~err
+       FileHandle(stderr) => fileno(2)    
+       
+Remember we're in our tiny program with a problem, we should have a look at
+where we are, and what our data looks like. First of all let's have a window
+on our present position (the first line of code in this case), via the letter
+'B<w>':
+
+       DB<4> w
+       1       #!/usr/bin/perl
+       2:      use strict;
+       3
+       4==>    my $key = 'welcome';
+       5:      my %data = (
+       6               'this' => qw(that),
+       7               'tom' => qw(and jerry),
+       8               'welcome' => q(Hello World),
+       9               'zip' => q(welcome),
+       10      );                                 
+
+At line number 4 is a helpful pointer, that tells you where you are now.  To
+see more code, type 'w' again:
+       
+       DB<4> w
+       8               'welcome' => q(Hello World),
+       9               'zip' => q(welcome),
+       10      );
+       11:     my @data = keys %data;
+       12:     print "All OK\n" if grep($key, keys %data);
+       13:     print "$data{$key}\n";
+       14:     print "done: '$data{$key}'\n";
+       15:     exit;      
+
+And if you wanted to list line 5 again, type 'l 5', (note the space):
+
+       DB<4> l 5
+       5:      my %data = (
+       
+In this case, there's not much to see, but of course normally there's pages of
+stuff to wade through, and 'l' can be very useful.  To reset your view to the
+line we're about to execute, type a lone period '.':
+
+       DB<5> .
+       main::(./data_a:4):     my $key = 'welcome';  
+       
+The line shown is the one that is about to be executed B<next>, it hasn't
+happened yet.  So while we can print a variable with the letter 'B<p>', at
+this point all we'd get is an empty (undefined) value back.  What we need to
+do is to step through the next executable statement with an 'B<s>':
+       
+       DB<6> s
+       main::(./data_a:5):     my %data = (
+       main::(./data_a:6):             'this' => qw(that),
+       main::(./data_a:7):             'tom' => qw(and jerry),
+       main::(./data_a:8):             'welcome' => q(Hello World),
+       main::(./data_a:9):             'zip' => q(welcome),
+       main::(./data_a:10):    );   
+
+Now we can have a look at that first ($key) variable:
+
+       DB<7> p $key 
+       welcome 
+
+line 13 is where the action is, so let's continue down to there via the letter
+'B<c>', which by the way, inserts a 'one-time-only' breakpoint at the given
+line or sub routine:
+
+       DB<8> c 13
+       All OK
+       main::(./data_a:13):    print "$data{$key}\n";
+       
+We've gone past our check (where 'All OK' was printed) and have stopped just
+before the meat of our task.  We could try to print out a couple of variables
+to see what is happening:
+
+       DB<9> p $data{$key}
+       
+Not much in there, lets have a look at our hash:
+       
+       DB<10> p %data
+       Hello Worldziptomandwelcomejerrywelcomethisthat 
+
+       DB<11> p keys %data
+       Hello Worldtomwelcomejerrythis  
+       
+Well, this isn't very easy to read, and using the helpful manual (B<h h>), the
+'B<x>' command looks promising:
+
+       DB<12> x %data
+       0  'Hello World'
+       1  'zip'
+       2  'tom'
+       3  'and'
+       4  'welcome'
+       5  undef
+       6  'jerry'
+       7  'welcome'
+       8  'this'
+       9  'that'     
+
+That's not much help, a couple of welcomes in there, but no indication of
+which are keys, and which are values, it's just a listed array dump and, in
+this case, not particularly helpful.  The trick here, is to use a B<reference>
+to the data structure:
+
+       DB<13> x \%data
+       0  HASH(0x8194bc4)
+          'Hello World' => 'zip'
+          'jerry' => 'welcome'
+          'this' => 'that'
+          'tom' => 'and'
+          'welcome' => undef  
+
+The reference is truly dumped and we can finally see what we're dealing with. 
+Our quoting was perfectly valid but wrong for our purposes, with 'and jerry'
+being treated as 2 separate words rather than a phrase, thus throwing the
+evenly paired hash structure out of alignment.
+
+The 'B<-w>' switch would have told us about this, had we used it at the start,
+and saved us a lot of trouble: 
+
+       > perl -w data
+       Odd number of elements in hash assignment at ./data line 5.    
+
+We fix our quoting: 'tom' => q(and jerry), and run it again, this time we get
+our expected output:
+
+       > perl -w data
+       Hello World
+
+
+While we're here, take a closer look at the 'B<x>' command, it's really useful
+and will merrily dump out nested references, complete objects, partial objects
+- just about whatever you throw at it:
+
+Let's make a quick object and x-plode it, first we'll start the the debugger:
+it wants some form of input from STDIN, so we give it something non-commital,
+a zero:
+
+       > perl -de 0
+       Default die handler restored.
+
+       Loading DB routines from perl5db.pl version 1.07
+       Editor support available.
+
+       Enter h or `h h' for help, or `man perldebug' for more help.
+
+       main::(-e:1):   0                       
+
+Now build an on-the-fly object over a couple of lines (note the backslash):
+
+       DB<1> $obj = bless({'unique_id'=>'123', 'attr'=> \
+       cont:   {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+
+And let's have a look at it:
+       DB<2> x $obj
+       0  MY_class=HASH(0x828ad98)
+               'attr' => HASH(0x828ad68)
+       'col' => 'black'
+       'things' => ARRAY(0x828abb8)
+               0  'this'
+               1  'that'
+               2  'etc'
+               'unique_id' => 123       
+       DB<3>
+
+Useful, huh?  You can eval nearly anything in there, and experiment with bits
+of code or regexes until the cows come home:
+
+       DB<3> @data = qw(this that the other atheism leather theory scythe)
+       
+       DB<4> p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+       atheism
+       leather
+       other
+       scythe
+       the
+       theory  
+       saw -> 6
+
+If you want to see the command History, type an 'B<H>':
+
+       DB<5> H
+       4: p 'saw -> '.($cnt += map { print "\t:\t$_\n" } grep(/the/, sort @data))
+       3: @data = qw(this that the other atheism leather theory scythe)
+       2: x $obj
+       1: $obj = bless({'unique_id'=>'123', 'attr'=>
+       {'col' => 'black', 'things' => [qw(this that etc)]}}, 'MY_class')
+       DB<5>
+       
+And if you want to repeat any previous command, use the exclamation: 'B<!>':
+
+       DB<5> !4
+       p 'saw -> '.($cnt += map { print "$_\n" } grep(/the/, sort @data))
+       atheism
+       leather
+       other
+       scythe
+       the
+       theory  
+       saw -> 12
+
+For more on references see L<perlref> and L<perlreftut>
+
+
+=head1 Stepping through code
+
+Here's a simple program which converts between Celsius and Fahrenheit, it too
+has a problem:
+
+       #!/usr/bin/perl -w
+       use strict;
+
+       my $arg = $ARGV[0] || '-c20';
+
+       if ($arg =~ /^\-(c|f)((\-|\+)*\d+(\.\d+)*)$/) {
+               my ($deg, $num) = ($1, $2);
+               my ($in, $out) = ($num, $num);
+               if ($deg eq 'c') {
+                       $deg = 'f';
+                       $out = &c2f($num);
+               } else {
+                       $deg = 'c';
+                       $out = &f2c($num);
+               }
+               $out = sprintf('%0.2f', $out);
+               $out =~ s/^((\-|\+)*\d+)\.0+$/$1/;
+               print "$out $deg\n";
+       } else {
+               print "Usage: $0 -[c|f] num\n";
+       }
+       exit;
+
+       sub f2c {
+               my $f = shift;
+               my $c = 5 * $f - 32 / 9;
+               return $c;
+       }
+
+       sub c2f {
+               my $c = shift;
+               my $f = 9 * $c / 5 + 32;
+               return $f;
+       }
+
+
+For some reason, the Fahrenheit to Celsius conversion fails to return the
+expected output.  This is what it does:
+
+       > temp -c0.72
+       33.30 f
+       
+       > temp -f33.3
+       162.94 c
+       
+Not very consistent!  We'll set a breakpoint in the code manually and run it
+under the debugger to see what's going on.  A breakpoint is a flag, to which
+the debugger will run without interruption, when it reaches the breakpoint, it
+will stop execution and offer a prompt for further interaction.  In normal
+use, these debugger commands are completely ignored, and they are safe - if a
+little messy, to leave in production code.
+       
+       my ($in, $out) = ($num, $num);
+       $DB::single=2; # insert at line 9!
+       if ($deg eq 'c') 
+               ...
+       
+       > perl -d temp -f33.3
+       Default die handler restored.
+
+       Loading DB routines from perl5db.pl version 1.07
+       Editor support available.
+
+       Enter h or `h h' for help, or `man perldebug' for more help.
+
+       main::(temp:4): my $arg = $ARGV[0] || '-c100';     
+
+We'll simply continue down to our pre-set breakpoint with a 'B<c>':
+
+       DB<1> c
+       main::(temp:10):                if ($deg eq 'c') {   
+
+Followed by a window command to see where we are:
+       
+       DB<1> w
+       7:              my ($deg, $num) = ($1, $2);
+       8:              my ($in, $out) = ($num, $num);
+       9:              $DB::single=2;
+       10==>           if ($deg eq 'c') {
+       11:                     $deg = 'f';
+       12:                     $out = &c2f($num);
+       13              } else {
+       14:                     $deg = 'c';
+       15:                     $out = &f2c($num);
+       16              }                             
+
+And a print to show what values we're currently using:
+
+       DB<1> p $deg, $num
+       f33.3
+               
+We can put another break point on any line beginning with a colon, we'll use
+line 17 as that's just as we come out of the subroutine, and we'd like to
+pause there later on:
+       
+       DB<2> b 17
+       
+There's no feedback from this, but you can see what breakpoints are set by
+using the list 'L' command:
+
+       DB<3> L
+       temp:
+               17:            print "$out $deg\n";
+               break if (1)     
+
+Note that to delete a breakpoint you use 'd' or 'D'.
+
+Now we'll continue down into our subroutine, this time rather than by line
+number, we'll use the subroutine name, followed by the now familiar 'w':
+
+       DB<3> c f2c
+       main::f2c(temp:30):             my $f = shift;  
+
+       DB<4> w
+       24:     exit;
+       25
+       26      sub f2c {
+       27==>           my $f = shift;
+       28:             my $c = 5 * $f - 32 / 9; 
+       29:             return $c;
+       30      }
+       31
+       32      sub c2f {
+       33:             my $c = shift;   
+
+
+Note that if there was a subroutine call between us and line 29, and we wanted
+to B<single-step> through it, we could use the 'B<s>' command, and to step
+over it we would use 'B<n>' which would execute the sub, but not descend into
+it for inspection.  In this case though, we simply continue down to line 29:
+
+       DB<4> c 29  
+       main::f2c(temp:29):             return $c;
+   
+And have a look at the return value:
+
+       DB<5> p $c
+       162.944444444444
+
+This is not the right answer at all, but the sum looks correct.  I wonder if
+it's anything to do with operator precedence?  We'll try a couple of other
+possibilities with our sum:
+
+       DB<6> p (5 * $f - 32 / 9)
+       162.944444444444
+       
+       DB<7> p 5 * $f - (32 / 9) 
+       162.944444444444
+       
+       DB<8> p (5 * $f) - 32 / 9
+       162.944444444444
+       
+       DB<9> p 5 * ($f - 32) / 9
+       0.722222222222221
+
+:-) that's more like it!  Ok, now we can set our return variable and we'll
+return out of the sub with an 'r':
+
+       DB<10> $c = 5 * ($f - 32) / 9
+       
+       DB<11> r
+       scalar context return from main::f2c: 0.722222222222221
+       
+Looks good, let's just continue off the end of the script:
+
+       DB<12> c
+       0.72 c 
+       Debugged program terminated.  Use q to quit or R to restart,
+       use O inhibit_exit to avoid stopping after program termination,
+       h q, h R or h O to get additional info.   
+
+A quick fix to the offending line (insert the missing parentheses) in the
+actual program and we're finished.
+
+
+=head1 Placeholder for a, w, t, T
+
+Actions, watch variables, stack traces etc.: on the TODO list.
+
+       a 
+       
+       W 
+       
+       t 
+       
+       T
+
+
+=head1 REGULAR EXPRESSIONS
+
+Ever wanted to know what a regex looked like?  You'll need perl compiled with
+the DEBUGGING flag for this one:
+       
+       > perl -Dr -e '/^pe(a)*rl$/i'
+       Compiling REx `^pe(a)*rl$'
+       size 17 first at 2
+       rarest char
+        at 0
+          1: BOL(2)
+          2: EXACTF <pe>(4)
+          4: CURLYN[1] {0,32767}(14)
+          6:   NOTHING(8)
+          8:   EXACTF <a>(0)
+         12:   WHILEM(0)
+         13: NOTHING(14)
+         14: EXACTF <rl>(16)
+         16: EOL(17)
+         17: END(0)
+       floating `'$ at 4..2147483647 (checking floating) stclass `EXACTF <pe>'
+anchored(BOL) minlen 4
+       Omitting $` $& $' support.
+        
+       EXECUTING...
+
+       Freeing REx: `^pe(a)*rl$'  
+
+Did you really want to know? :-)
+For more gory details on getting regular expressions to work, have a look at
+L<perlre>, L<perlretut>, and to decode the mysterious labels (BOL and CURLYN,
+etc. above), see L<perldebguts>.
+
+
+=head1 OUTPUT TIPS
+
+To get all the output from your error log, and not miss any messages via
+helpful operating system buffering, insert a line like this, at the start of
+your script:
+
+       $|=1;   
+
+To watch the tail of a dynamically growing logfile, (from the command line):
+
+       tail -f $error_log
+
+Wrapping all die calls in a handler routine can be useful to see how, and from
+where, they're being called, L<perlvar> has more information:
+
+       BEGIN { $SIG{__DIE__} = sub { require Carp; Carp::confess(@_) } }
+
+Various useful techniques for the redirection of STDOUT and STDERR filehandles
+are explained in L<perlopentut> and L<perlfaq8>.
+
+
+=head1 CGI
+
+Just a quick hint here for all those CGI programmers who can't figure out how
+on earth to get past that 'waiting for input' prompt, when running their CGI
+script from the command-line, try something like this:
+
+       > perl -d my_cgi.pl -nodebug 
+
+Of course 'L<perldoc CGI>' and L<perlfaq9> will tell you more.
+
+
+=head1 GUIs
+
+The command line interface is tightly integrated with an B<emacs> extension
+and there's a B<vi> interface too.  
+
+You don't have to do this all on the command line, though, there are a few GUI
+options out there.  The nice thing about these is you can wave a mouse over a
+variable and a dump of it's data will appear in an appropriate window, or in a
+popup balloon, no more tiresome typing of 'x $varname' :-)
+
+In particular have a hunt around for the following:
+
+B<ptkdb> perlTK based wrapper for the built-in debugger
+
+B<ddd> data display debugger
+       
+B<PerlDevKit> and B<PerlBuilder> are NT specific
+
+NB. (more info on these and others would be appreciated).
+
+
+=head1 SUMMARY
+
+We've seen how to encourage good coding practices with B<use strict> and
+B<-w>.  We can run the perl debugger B<perl -d scriptname> to inspect your
+data from within the perl debugger with the B<p> and B<x> commands.  You can
+walk through your code, set breakpoints with B<b> and step through that code
+with B<s> or B<n>, continue with B<c> and return from a sub with B<r>.  Fairly
+intuitive stuff when you get down to it.  
+
+There is of course lots more to find out about, this has just scratched the
+surface.  The best way to learn more is to use perldoc to find out more about
+the language, to read the on-line help (L<perldebug> is probably the next
+place to go), and of course, experiment.  
+
+
+=head1 SEE ALSO
+
+L<perldebug>, 
+L<perldebguts>, 
+L<perldiag>,
+L<dprofpp>,
+L<perlrun>
+
+
+=head1 AUTHOR
+
+Richard Foley <richard@rfi.net> Copyright (c) 2000
+
+
+=head1 CONTRIBUTORS
+
+Various people have made helpful suggestions and contributions, in particular:
+
+Ronald J Kimball <rjk@linguist.dartmouth.edu>
+
+Hugo van der Sanden <hv@crypt0.demon.co.uk>
+
+Peter Scott <Peter@PSDT.com>
+
index bccdcf4..faff39b 100644 (file)
@@ -342,7 +342,7 @@ missing, all actions are wiped out!
 
 Adds an action (Perl command) to happen after the prompt when you've
 just given a command to return to executing the script.  A multi-line
-command may be entered by slackbashing the newlines.
+command may be entered by backslashing the newlines.
 
 =item { ?
 
index d6bf043..480ab84 100644 (file)
@@ -182,6 +182,29 @@ spots.  This is now heavily deprecated.
 must either both be scalars or both be lists.  Otherwise Perl won't
 know which context to supply to the right side.
 
+=item Negative offset to vec in lvalue context
+
+(F) When vec is called in an lvalue context, the second argument must be
+greater than or equal to zero.
+
+=item Attempt to bless into a reference
+
+(F) The CLASSNAME argument to the bless() operator is expected to be
+the name of the package to bless the resulting object into. You've
+supplied instead a reference to something: perhaps you wrote
+
+    bless $self, $proto;
+
+when you intended
+
+    bless $self, ref($proto) || $proto;
+
+If you actually want to bless into the stringified version
+of the reference supplied, you need to stringify it yourself, for
+example by:
+
+    bless $self, "$proto";
+
 =item Attempt to free non-arena SV: 0x%lx
 
 (P internal) All SV objects are supposed to be allocated from arenas
@@ -386,7 +409,7 @@ check the return value of your socket() call?  See L<perlfunc/bind>.
 =item Bizarre copy of %s in %s
 
 (P) Perl detected an attempt to copy an internal value that is not
-copiable.
+copyable.
 
 =item B<-P> not allowed for setuid/setgid script
 
@@ -426,12 +449,6 @@ L<perlfunc/pack>.
 (F) Only hard references may be blessed.  This is how Perl "enforces"
 encapsulation of objects.  See L<perlobj>.
 
-=item Can't break at that line
-
-(S internal) A warning intended to only be printed while running within
-the debugger, indicating the line number specified wasn't the location
-of a statement that could be stopped at.
-
 =item Can't call method "%s" in empty package "%s"
 
 (F) You called a method correctly, and it correctly indicated a package
@@ -545,10 +562,11 @@ C<-i.bak>, or some such.
 characters and Perl was unable to create a unique filename during
 inplace editing with the B<-i> switch.  The file was ignored.
 
-=item Can't do {n,m} with n > m
+=item Can't do {n,m} with n > m before << HERE in regex m/%s/
 
-(F) Minima must be less than or equal to maxima.  If you really want
-your regexp to match something 0 times, just put {0}.  See L<perlre>.
+(F) Minima must be less than or equal to maxima. If you really want your
+regexp to match something 0 times, just put {0}. The << HERE shows in the
+regular expression about where the problem was discovered. See L<perlre>.
 
 =item Can't do setegid!
 
@@ -1025,35 +1043,6 @@ references can be weakened.
 with an assignment operator, which implies modifying the value itself.
 Perhaps you need to copy the value to a temporary, and repeat that.
 
-=item Character class syntax [%s] belongs inside character classes
-
-(W unsafe) The character class constructs [: :], [= =], and [. .]  go
-I<inside> character classes, the [] are part of the construct, for
-example: /[012[:alpha:]345]/.  Note that [= =] and [. .] are not
-currently implemented; they are simply placeholders for future
-extensions and will cause fatal errors.
-
-=item Character class syntax [. .] is reserved for future extensions
-
-(F regexp) Within regular expression character classes ([]) the syntax
-beginning with "[." and ending with ".]" is reserved for future
-extensions.  If you need to represent those character sequences inside
-a regular expression character class, just quote the square brackets
-with the backslash: "\[." and ".\]".
-
-=item Character class syntax [= =] is reserved for future extensions
-
-(F) Within regular expression character classes ([]) the syntax
-beginning with "[=" and ending with "=]" is reserved for future
-extensions.  If you need to represent those character sequences inside
-a regular expression character class, just quote the square brackets
-with the backslash: "\[=" and "=\]".
-
-=item Character class [:%s:] unknown
-
-(F) The class in the character class [: :] syntax is unknown.  See
-L<perlre>.
-
 =item chmod() mode argument is missing initial 0
 
 (W chmod) A novice will sometimes say
@@ -1064,7 +1053,7 @@ not realizing that 777 will be interpreted as a decimal number,
 equivalent to 01411.  Octal constants are introduced with a leading 0 in
 Perl, as in C.
 
-=item Close on unopened file %s
+=item close() on unopened filehandle %s
 
 (W unopened) You tried to close a filehandle that was never opened.
 
@@ -1360,12 +1349,6 @@ you which section of the Perl source code is distressed.
 (F) Your machine apparently doesn't implement fcntl().  What is this, a
 PDP-11 or something?
 
-=item Filehandle %s never opened
-
-(W unopened) An I/O operation was attempted on a filehandle that was
-never initialized.  You need to do an open() or a socket() call, or call
-a constructor from the FileHandle package.
-
 =item Filehandle %s opened only for input
 
 (W io) You tried to write on a read-only filehandle.  If you intended it
@@ -1401,10 +1384,11 @@ some time before now.  Check your logic flow.  flock() operates on
 filehandles.  Are you attempting to call flock() on a dirhandle by the
 same name?
 
-=item ?+* follows nothing in regexp
+=item Quantifier follows nothing before << HERE in regex m/%s/
 
-(F) You started a regular expression with a quantifier.  Backslash it if
-you meant it literally.   See L<perlre>.
+(F) You started a regular expression with a quantifier. Backslash it if you
+meant it literally. The << HERE shows in the regular expression about where the
+problem was discovered. See L<perlre>.
 
 =item Format not terminated
 
@@ -1638,16 +1622,6 @@ C<$ENV{ENV}> or C<$ENV{BASH_ENV}> are derived from data supplied (or
 potentially supplied) by the user.  The script must set the path to a
 known value, using trustworthy data.  See L<perlsec>.
 
-=item In string, @%s now must be written as \@%s
-
-(F) It used to be that Perl would try to guess whether you wanted an
-array interpolated or a literal @.  It did this when the string was
-first used at runtime.  Now strings are parsed at compile time, and
-ambiguous instances of @ must be disambiguated, either by prepending a
-backslash to indicate a literal, or by declaring (or using) the array
-within the program before the string (lexically).  (Someday it will
-simply assume that an unbackslashed @ interpolates an array.)
-
 =item Integer overflow in %s number
 
 (W overflow) The hexadecimal, octal or binary number you have specified
@@ -1660,9 +1634,12 @@ transparently promotes all numbers to a floating point representation
 internally--subject to loss of precision errors in subsequent
 operations.
 
-=item internal disaster in regexp
+=item Internal disaster before << HERE in regex m/%s/
 
 (P) Something went badly wrong in the regular expression parser.
+The << HERE shows in the regular expression about where the problem was
+discovered.
+
 
 =item Internal inconsistency in tracking vforks
 
@@ -1673,9 +1650,11 @@ L<perlvms/"exec LIST">).  Somehow, this count has become scrambled, so
 Perl is making a guess and treating this C<exec> as a request to
 terminate the Perl script and execute the specified command.
 
-=item internal urp in regexp at /%s/
+=item Internal urp before << HERE in regex m/%s/
+
+(P) Something went badly awry in the regular expression parser. The <<<HERE
+shows in the regular expression about where the problem was discovered.
 
-(P) Something went badly awry in the regular expression parser.
 
 =item %s (...) interpreted as function
 
@@ -1734,6 +1713,16 @@ silently ignored.
 (F) Your machine apparently doesn't implement ioctl(), which is pretty
 strange for a machine that supports C.
 
+=item `%s' is not a code reference
+
+(W) The second (fourth, sixth, ...) argument of overload::constant needs
+to be a code reference. Either an anonymous subroutine, or a reference
+to a subroutine.
+
+=item `%s' is not an overloadable type
+
+(W) You tried to overload a constant type the overload package is unaware of.
+
 =item junk on end of regexp
 
 (P) The regular expression parser is confused.
@@ -1767,12 +1756,24 @@ effective uids or gids failed.
 to check the return value of your socket() call?  See
 L<perlfunc/listen>.
 
+=item lstat() on filehandle %s
+
+(W io) You tried to do a lstat on a filehandle.  What did you mean
+by that?  lstat() makes sense only on filenames.  (Perl did a fstat()
+instead on the filehandle.)
+
 =item Lvalue subs returning %s not implemented yet
 
 (F) Due to limitations in the current implementation, array and hash
 values cannot be returned in subroutines used in lvalue context.  See
 L<perlsub/"Lvalue subroutines">.
 
+=item Lookbehind longer than %d not implemented before << HERE in reges m/%s/
+
+(F) There is currently a limit on the length of string which lookbehind can
+handle. This restriction may be eased in a future release. The << HERE shows in
+the regular expression about where the problem was discovered.
+
 =item Malformed PERLLIB_PREFIX
 
 (F) An error peculiar to OS/2.  PERLLIB_PREFIX should be of the form
@@ -1879,6 +1880,14 @@ catches that.  But an easy way to do the same thing is:
 
 Another way is to assign to a substr() that's off the end of the string.
 
+Yet another way is to assign to a C<foreach> loop I<VAR> when I<VAR>
+is aliased to a constant in the look I<LIST>:
+
+        $x = 1;
+        foreach my $n ($x, 2) {
+            $n *= 2; # modifies the $x, but fails on attempt to modify the 2
+        } 
+
 =item Modification of non-creatable array value attempted, %s
 
 (F) You tried to make an array value spring into existence, and the
@@ -1949,14 +1958,16 @@ provided for this purpose.
 (F) You tried to do a read/write/send/recv operation with a buffer
 length that is less than 0.  This is difficult to imagine.
 
-=item nested *?+ in regexp
+=item Nested quantifiers before << HERE in regex m/%s/
 
-(F) You can't quantify a quantifier without intervening parentheses.  So
-things like ** or +* or ?* are illegal.
+(F) You can't quantify a quantifier without intervening parentheses. So
+things like ** or +* or ?* are illegal. The << HERE shows in the regular
+expression about where the problem was discovered.
 
 Note, however, that the minimal matching quantifiers, C<*?>, C<+?>, and
 C<??> appear to be nested quantifiers, but aren't.  See L<perlre>.
 
+
 =item %s never introduced
 
 (S internal) The symbol in question was declared but somehow went out of
@@ -2235,6 +2246,11 @@ L<perlport> for more on portability concerns.
 
 See also L<perlport> for writing portable code.
 
+=item Odd number of arguments for overload::constant
+
+(W) The call to overload::constant contained an odd number of arguments.
+The arguments should come in pairs.
+
 =item Odd number of elements in hash assignment
 
 (W misc) You specified an odd number of elements to initialize a hash,
@@ -2247,6 +2263,17 @@ pointing outside the buffer.  This is difficult to imagine.  The sole
 exception to this is that C<sysread()>ing past the buffer will extend
 the buffer and zero pad the new area.
 
+=item -%s on unopened filehandle %s
+
+(W unopened) You tried to invoke a file test operator on a filehandle
+that isn't open.  Check your logic.  See also L<perlfunc/-X>.
+
+=item %s() on unopened %s %s
+
+(W unopened) An I/O operation was attempted on a filehandle that was
+never initialized.  You need to do an open(), a sysopen(), or a socket()
+call, or call a constructor from the FileHandle package.
+
 =item oops: oopsAV
 
 (S internal) An internal warning that the grammar is screwed up.
@@ -2554,6 +2581,35 @@ problem can be found in L<perllocale> section B<LOCALE PROBLEMS>.
 process which isn't a subprocess of the current process.  While this is
 fine from VMS' perspective, it's probably not what you intended.
 
+=item POSIX syntax [%s] belongs inside character classes
+
+(W unsafe) The character class constructs [: :], [= =], and [. .]  go
+I<inside> character classes, the [] are part of the construct, for
+example: /[012[:alpha:]345]/.  Note that [= =] and [. .] are not
+currently implemented; they are simply placeholders for future
+extensions and will cause fatal errors.
+
+=item POSIX  syntax [. .] is reserved for future extensions
+
+(F regexp) Within regular expression character classes ([]) the syntax
+beginning with "[." and ending with ".]" is reserved for future
+extensions.  If you need to represent those character sequences inside
+a regular expression character class, just quote the square brackets
+with the backslash: "\[." and ".\]".
+
+=item POSIX syntax [= =] is reserved for future extensions
+
+(F) Within regular expression character classes ([]) the syntax
+beginning with "[=" and ending with "=]" is reserved for future
+extensions.  If you need to represent those character sequences inside
+a regular expression character class, just quote the square brackets
+with the backslash: "\[=" and "=\]".
+
+=item POSIX class [:%s:] unknown
+
+(F) The class in the character class [: :] syntax is unknown.  See
+L<perlre>.
+
 =item POSIX getpgrp can't take an argument
 
 (F) Your system has POSIX getpgrp(), which takes no argument, unlike
@@ -2676,6 +2732,20 @@ in L<perlos2>.
 (S unsafe) The subroutine being declared or defined had previously been
 declared or defined with a different function prototype.
 
+=item Quantifier in {,} bigger than %d before << HERE in regex m/%s/
+
+(F) There is currently a limit to the size of the min and max values of the
+{min,max} construct. The << HERE shows in the regular expression about where
+the problem was discovered. See L<perlre>.
+
+=item Quantifier unexpected on zero-length expression before << HERE in regex m/%s/
+
+(W regexp) You applied a regular expression quantifier in a place where
+it makes no sense, such as on a zero-width assertion.  Try putting the
+quantifier inside the assertion instead.  For example, the way to match
+"abc" provided that it is followed by three repetitions of "xyz" is
+C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+
 =item Range iterator outside integer range
 
 (F) One (or both) of the numeric arguments to the range operator ".."
@@ -2736,17 +2806,22 @@ Doing so has no effect.
 (W internal) The internal sv_replace() function was handed a new SV with
 a reference count of other than 1.
 
+=item Reference to nonexistent group before << HERE in regex m/%s/
+
+(F) You used something like C<\7> in your regular expression, but there are
+not at least seven sets of capturing parentheses in the expression. If you
+wanted to have the character with value 7 inserted into the regular expression,
+prepend a zero to make the number at least two digits: C<\07>
+
+The << HERE shows in the regular expression about where the problem was
+discovered.
+
 =item regexp memory corruption
 
 (P) The regular expression engine got confused by what the regular
 expression compiler gave it.
 
-=item regexp *+ operand could be empty
-
-(F) The part of the regexp subject to either the * or + quantifier could
-match an empty string.
-
-=item regexp out of space
+=item Regexp out of space
 
 (P) A "can't happen" error, because safemalloc() should have caught it
 earlier.
@@ -2815,7 +2890,7 @@ or setgid bit set.  This doesn't make much sense.
 construct.  Remember that bracketing delimiters count nesting level.
 Missing the leading C<$> from a variable C<$m> may cause this error.
 
-=item %sseek() on unopened file
+=item %sseek() on unopened filehandle
 
 (W unopened) You tried to use the seek() or sysseek() function on a
 filehandle that was either never opened or has since been closed.
@@ -2824,6 +2899,10 @@ filehandle that was either never opened or has since been closed.
 
 (F) This machine doesn't implement the select() system call.
 
+=item Self-ties are not supported
+
+(F) Self-ties are not supported in the current implementation.
+
 =item Semicolon seems to be missing
 
 (W semicolon) A nearby syntax error was probably caused by a missing
@@ -2843,22 +2922,31 @@ scalar that had previously been marked as free.
 (W closed) The socket you're sending to got itself closed sometime
 before now.  Check your logic flow.
 
-=item Sequence (? incomplete
+=item Sequence (? incomplete before << HERE mark in regex m/%s/
 
-(F) A regular expression ended with an incomplete extension (?.  See
+(F) A regular expression ended with an incomplete extension (?. The <<<HERE
+shows in the regular expression about where the problem was discovered. See
 L<perlre>.
 
-=item Sequence (?%s...) not implemented
+=item Sequence (?{...}) not terminated or not {}-balanced in regex m/%s/
+
+(F) If the contents of a (?{...}) clause contains braces, they must balance
+for Perl to properly detect the end of the clause. See L<perlre>.
+
+=item Sequence (?%s...) not implemented before << HERE mark in regex m/%s/
 
-(F) A proposed regular expression extension has the character reserved
-but has not yet been written.  See L<perlre>.
+(F) A proposed regular expression extension has the character reserved but
+has not yet been written. The << HERE shows in the regular expression about
+where the problem was discovered. See L<perlre>.
 
-=item Sequence (?%s...) not recognized
+=item Sequence (?%s...) not recognized before << HERE mark in regex m/%s/
 
 (F) You used a regular expression extension that doesn't make sense.
+The << HERE shows in the regular expression about
+where the problem was discovered. 
 See L<perlre>.
 
-=item Sequence (?#... not terminated
+=item Sequence (?#... not terminated in regex m/%s/
 
 (F) A regular expression comment must be terminated by a closing
 parenthesis.  Embedded parentheses aren't allowed.  See L<perlre>.
@@ -2990,19 +3078,10 @@ unless there was a failure.  You probably wanted to use system()
 instead, which does return.  To suppress this warning, put the exec() in
 a block by itself.
 
-=item Stat on unopened file %s
+=item stat() on unopened filehandle %s
 
-(W unopened) You tried to use the stat() function (or an equivalent file
-test) on a filehandle that was either never opened or has since been
-closed.
-
-=item Strange *+?{} on zero-length expression
-
-(W regexp) You applied a regular expression quantifier in a place where
-it makes no sense, such as on a zero-width assertion.  Try putting the
-quantifier inside the assertion instead.  For example, the way to match
-"abc" provided that it is followed by three repetitions of "xyz" is
-C</abc(?=(?:xyz){3})/>, not C</abc(?=xyz){3}/>.
+(W unopened) You tried to use the stat() function on a filehandle that
+was either never opened or has since been closed.
 
 =item Stub found while resolving method `%s' overloading %s
 
@@ -3051,6 +3130,24 @@ assignment or as a subroutine argument for example).
 (F) Your Perl was compiled with B<-D>SETUID_SCRIPTS_ARE_SECURE_NOW, but
 a version of the setuid emulator somehow got run anyway.
 
+=item Switch (?(condition)... contains too many branches before << HERE in regex m/%s/
+
+(F) A (?(condition)if-clause|else-clause) construct can have at most two
+branches (the if-clause and the else-clause). If you want one or both to
+contain alternation, such as using C<this|that|other>, enclose it in
+clustering parentheses:
+
+    (?(condition)(?:this|that|other)|else-clause)
+
+The << HERE shows in the regular expression about where the problem was
+discovered. See L<perlre>.
+
+=item Switch condition not recognized before << HERE in regex m/%s/
+
+(F) If the argument to the (?(...)if-clause|else-clause) construct is a
+number, it can be only a number. The << HERE shows in the regular expression
+about where the problem was discovered. See L<perlre>.
+
 =item switching effective %s is not implemented
 
 (F) While under the C<use filetest> pragma, we cannot switch the real
@@ -3105,16 +3202,11 @@ before now.  Check your logic flow.
 (F) You tried to use C<goto> to reach a label that was too deeply nested
 for Perl to reach.  Perl is doing you a favor by refusing.
 
-=item tell() on unopened file
+=item tell() on unopened filehandle
 
 (W unopened) You tried to use the tell() function on a filehandle that
 was either never opened or has since been closed.
 
-=item Test on unopened file %s
-
-(W unopened) You tried to invoke a file test operator on a filehandle
-that isn't open.  Check your logic.  See also L<perlfunc/-X>.
-
 =item That use of $[ is unsupported
 
 (F) Assignment to C<$[> is now strictly circumscribed, and interpreted
@@ -3325,11 +3417,23 @@ Check the #! line, or manually feed your script into Perl yourself.
 (F) The unexec() routine failed for some reason.  See your local FSF
 representative, who probably put it there in the first place.
 
+
 =item Unknown BYTEORDER
 
 (F) There are no byte-swapping functions for a machine with this byte
 order.
 
+=item Unknown switch condition (?(%.2s before << HERE in regex m/%s/
+
+(F) The condition of a (?(condition)if-clause|else-clause) construct is not
+known. The condition may be lookaround (the condition is true if the
+lookaround is true), a (?{...}) construct (the condition is true if the
+code evaluates to a true value), or a number (the condition is true if the
+set of capturing parentheses named by the number is defined).
+
+The << HERE shows in the regular expression about where the problem was
+discovered.  See L<perlre>.
+
 =item Unknown open() mode '%s'
 
 (F) The second argument of 3-argument open() is not among the list
@@ -3343,13 +3447,14 @@ iterating over it, and someone else stuck a message in the stream of
 data Perl expected.  Someone's very confused, or perhaps trying to
 subvert Perl's population of %ENV for nefarious purposes.
 
-=item unmatched [] in regexp
+=item unmatched [ before << HERE mark in regex m/%s/
 
-(F) The brackets around a character class must match.  If you wish to
+(F) The brackets around a character class must match. If you wish to
 include a closing bracket in a character class, backslash it or put it
-first.  See L<perlre>.
+first. See L<perlre>. The << HERE shows in the regular expression about
+where the escape was discovered.
 
-=item unmatched () in regexp
+=item unmatched ( in regexp before << HERE mark in regex m/%s/
 
 (F) Unbackslashed parentheses must always be balanced in regular
 expressions.  If you're a vi user, the % key is valuable for finding the
@@ -3381,12 +3486,14 @@ script, a binary program, or a directory as a Perl program.
 recognized by Perl inside character classes.  The character was
 understood literally.
 
-=item /%s/: Unrecognized escape \\%c passed through
+=item Unrecognized escape \\%c passed through before << HERE in m/%s/
 
 (W regexp) You used a backslash-character combination which is not
-recognized by Perl.  This combination appears in an interpolated
-variable or a C<'>-delimited regular expression.  The character was
-understood literally.
+recognized by Perl. This combination appears in an interpolated variable or
+a C<'>-delimited regular expression. The character was understood
+literally. The << HERE shows in the regular expression about where the escape
+was discovered.
+
 
 =item Unrecognized escape \\%c passed through
 
@@ -3673,6 +3780,12 @@ anonymous, using the C<sub {}> syntax.  When inner anonymous subs that
 reference variables in outer subroutines are called or referenced, they
 are automatically rebound to the current values of such variables.
 
+=item Variable length lookbehind not implemented before << HERE in regex m/%s/
+
+(F) Lookbehind is allowed only for subexpressions whose length is fixed and
+known at compile time. The << HERE shows in the regular expression about where
+the problem was discovered.
+
 =item Version number must be a constant number
 
 (P) The attempt to translate a C<use Module n.n LIST> statement into
@@ -3709,6 +3822,10 @@ but in actual fact, you got
 
 So put in parentheses to say what you really mean.
 
+=item Wide character in %s
+
+(F) Perl met a wide character (>255) when it wasn't expecting one.
+
 =item write() on closed filehandle %s
 
 (W closed) The filehandle you're writing to got itself closed sometime
diff --git a/pod/perlebcdic.pod b/pod/perlebcdic.pod
new file mode 100644 (file)
index 0000000..4ef5eca
--- /dev/null
@@ -0,0 +1,1230 @@
+=head1 NAME
+
+perlebcdic - Considerations for running Perl on EBCDIC platforms
+
+=head1 DESCRIPTION
+
+An exploration of some of the issues facing Perl programmers
+on EBCDIC based computers.  We do not cover localization, 
+internationalization, or multi byte character set issues (yet).
+
+Portions that are still incomplete are marked with XXX.
+
+=head1 COMMON CHARACTER CODE SETS
+
+=head2 ASCII
+
+The American Standard Code for Information Interchange is a set of
+integers running from 0 to 127 (decimal) that imply character 
+interpretation by the display and other system(s) of computers.  
+The range 0..127 can be covered by setting the bits in a 7-bit binary 
+digit, hence the set is sometimes referred to as a "7-bit ASCII".  
+ASCII was described by the American National Standards Institute 
+document ANSI X3.4-1986.  It was also described by ISO 646:1991 
+(with localization for currency symbols).  The full ASCII set is 
+given in the table below as the first 128 elements.  Languages that 
+can be written adequately with the characters in ASCII include 
+English, Hawaiian, Indonesian, Swahili and some Native American 
+languages.
+
+There are many character sets that extend the range of integers
+from 0..2**7-1 up to 2**8-1, or 8 bit bytes (octets if you prefer).
+One common one is the ISO 8859-1 character set.
+
+=head2 ISO 8859
+
+The ISO 8859-$n are a collection of character code sets from the 
+International Organization for Standardization (ISO) each of which 
+adds characters to the ASCII set that are typically found in European 
+languages many of which are based on the Roman, or Latin, alphabet.
+
+=head2 Latin 1 (ISO 8859-1)
+
+A particular 8-bit extension to ASCII that includes grave and acute 
+accented Latin characters.  Languages that can employ ISO 8859-1 
+include all the languages covered by ASCII as well as Afrikaans, 
+Albanian, Basque, Catalan, Danish, Faroese, Finnish, Norwegian, 
+Portugese, Spanish, and Swedish.  Dutch is covered albeit without 
+the ij ligature.  French is covered too but without the oe ligature. 
+German can use ISO 8859-1 but must do so without German-style
+quotation marks.  This set is based on Western European extensions 
+to ASCII and is commonly encountered in world wide web work.
+In IBM character code set identification terminology ISO 8859-1 is
+also known as CCSID 819 (or sometimes 0819 or even 00819).
+
+=head2 EBCDIC
+
+The Extended Binary Coded Decimal Interchange Code  refers to a 
+large collection of slightly different single and multi byte 
+coded character sets that are different from ASCII or ISO 8859-1 
+and typically run on host computers.  The EBCDIC encodings derive 
+from 8 bit byte extensions of Hollerith punched card encodings.
+The layout on the cards was such that high bits were set for the
+upper and lower case alphabet characters [a-z] and [A-Z], but there
+were gaps within each latin alphabet range.
+
+Some IBM EBCDIC character sets may be known by character code set 
+identification numbers (CCSID numbers) or code page numbers.  Leading
+zero digits in CCSID numbers within this document are insignificant.
+E.g. CCSID 0037 may be referred to as 37 in places.
+
+=head2 13 variant characters
+
+Among IBM EBCDIC character code sets there are 13 characters that
+are often mapped to different integer values.  Those characters
+are known as the 13 "variant" characters and are:
+
+    \ [ ] { } ^ ~ ! # | $ @ ` 
+
+=head2 0037
+
+Character code set ID 0037 is a mapping of the ASCII plus Latin-1 
+characters (i.e. ISO 8859-1) to an EBCDIC set.  0037 is used 
+in North American English locales on the OS/400 operating system 
+that runs on AS/400 computers.  CCSID 37 differs from ISO 8859-1 
+in 237 places, in other words they agree on only 19 code point values.
+
+=head2 1047
+
+Character code set ID 1047 is also a mapping of the ASCII plus 
+Latin-1 characters (i.e. ISO 8859-1) to an EBCDIC set.  1047 is 
+used under Unix System Services for OS/390, and OpenEdition for VM/ESA. 
+CCSID 1047 differs from CCSID 0037 in eight places.
+
+=head2 POSIX-BC
+
+The EBCDIC code page in use on Siemens' BS2000 system is distinct from
+1047 and 0037.  It is identified below as the POSIX-BC set.
+
+=head1 SINGLE OCTET TABLES
+
+The following tables list the ASCII and Latin 1 ordered sets including
+the subsets: C0 controls (0..31), ASCII graphics (32..7e), delete (7f),
+C1 controls (80..9f), and Latin-1 (a.k.a. ISO 8859-1) (a0..ff).  In the 
+table non-printing control character names as well as the Latin 1 
+extensions to ASCII have been labelled with character names roughly 
+corresponding to I<The Unicode Standard, Version 2.0> albeit with 
+substitutions such as s/LATIN// and s/VULGAR// in all cases, 
+s/CAPITAL LETTER// in some cases, and s/SMALL LETTER ([A-Z])/\l$1/ 
+in some other cases (the C<charnames> pragma names unfortunately do 
+not list explicit names for the C0 or C1 control characters).  The 
+"names" of the C1 control set (128..159 in ISO 8859-1) listed here are 
+somewhat arbitrary.  The differences between the 0037 and 1047 sets are 
+flagged with ***.  The differences between the 1047 and POSIX-BC sets 
+are flagged with ###.  All ord() numbers listed are decimal.  If you 
+would rather see this table listing octal values then run the table 
+(that is, the pod version of this document since this recipe may not 
+work with a pod2_other_format translation) through:
+
+=over 4
+
+=item recipe 0
+
+=back
+
+    perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+     -e '{printf("%s%-9o%-9o%-9o%-9o\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+If you would rather see this table listing hexadecimal values then
+run the table through:
+
+=over 4
+
+=item recipe 1
+
+=back
+
+    perl -ne 'if(/(.{33})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
+     -e '{printf("%s%-9X%-9X%-9X%-9X\n",$1,$2,$3,$4,$5)}' perlebcdic.pod
+
+
+                                 8859-1
+    chr                          0819     0037     1047     POSIX-BC
+    ----------------------------------------------------------------
+    <NULL>                       0        0        0        0 
+    <START OF HEADING>           1        1        1        1
+    <START OF TEXT>              2        2        2        2
+    <END OF TEXT>                3        3        3        3
+    <END OF TRANSMISSION>        4        55       55       55
+    <ENQUIRY>                    5        45       45       45
+    <ACKNOWLEDGE>                6        46       46       46
+    <BELL>                       7        47       47       47
+    <BACKSPACE>                  8        22       22       22
+    <HORIZONTAL TABULATION>      9        5        5        5
+    <LINE FEED>                  10       37       21       21  ***
+    <VERTICAL TABULATION>        11       11       11       11
+    <FORM FEED>                  12       12       12       12
+    <CARRIAGE RETURN>            13       13       13       13
+    <SHIFT OUT>                  14       14       14       14
+    <SHIFT IN>                   15       15       15       15
+    <DATA LINK ESCAPE>           16       16       16       16
+    <DEVICE CONTROL ONE>         17       17       17       17
+    <DEVICE CONTROL TWO>         18       18       18       18
+    <DEVICE CONTROL THREE>       19       19       19       19
+    <DEVICE CONTROL FOUR>        20       60       60       60
+    <NEGATIVE ACKNOWLEDGE>       21       61       61       61
+    <SYNCHRONOUS IDLE>           22       50       50       50
+    <END OF TRANSMISSION BLOCK>  23       38       38       38
+    <CANCEL>                     24       24       24       24
+    <END OF MEDIUM>              25       25       25       25
+    <SUBSTITUTE>                 26       63       63       63
+    <ESCAPE>                     27       39       39       39
+    <FILE SEPARATOR>             28       28       28       28
+    <GROUP SEPARATOR>            29       29       29       29
+    <RECORD SEPARATOR>           30       30       30       30
+    <UNIT SEPARATOR>             31       31       31       31
+    <SPACE>                      32       64       64       64
+    !                            33       90       90       90
+    "                            34       127      127      127
+    #                            35       123      123      123
+    $                            36       91       91       91
+    %                            37       108      108      108
+    &                            38       80       80       80
+    '                            39       125      125      125
+    (                            40       77       77       77
+    )                            41       93       93       93
+    *                            42       92       92       92
+    +                            43       78       78       78
+    ,                            44       107      107      107
+    -                            45       96       96       96
+    .                            46       75       75       75
+    /                            47       97       97       97
+    0                            48       240      240      240
+    1                            49       241      241      241
+    2                            50       242      242      242
+    3                            51       243      243      243
+    4                            52       244      244      244
+    5                            53       245      245      245
+    6                            54       246      246      246
+    7                            55       247      247      247
+    8                            56       248      248      248
+    9                            57       249      249      249
+    :                            58       122      122      122
+    ;                            59       94       94       94
+    <                            60       76       76       76
+    =                            61       126      126      126
+    >                            62       110      110      110
+    ?                            63       111      111      111
+    @                            64       124      124      124
+    A                            65       193      193      193
+    B                            66       194      194      194
+    C                            67       195      195      195
+    D                            68       196      196      196
+    E                            69       197      197      197
+    F                            70       198      198      198
+    G                            71       199      199      199
+    H                            72       200      200      200
+    I                            73       201      201      201
+    J                            74       209      209      209
+    K                            75       210      210      210
+    L                            76       211      211      211
+    M                            77       212      212      212
+    N                            78       213      213      213
+    O                            79       214      214      214
+    P                            80       215      215      215
+    Q                            81       216      216      216
+    R                            82       217      217      217
+    S                            83       226      226      226
+    T                            84       227      227      227
+    U                            85       228      228      228
+    V                            86       229      229      229
+    W                            87       230      230      230
+    X                            88       231      231      231
+    Y                            89       232      232      232
+    Z                            90       233      233      233
+    [                            91       186      173      187 *** ###
+    \                            92       224      224      188 ### 
+    ]                            93       187      189      189 ***
+    ^                            94       176      95       106 *** ###
+    _                            95       109      109      109
+    `                            96       121      121      74  ###
+    a                            97       129      129      129
+    b                            98       130      130      130
+    c                            99       131      131      131
+    d                            100      132      132      132
+    e                            101      133      133      133
+    f                            102      134      134      134
+    g                            103      135      135      135
+    h                            104      136      136      136
+    i                            105      137      137      137
+    j                            106      145      145      145
+    k                            107      146      146      146
+    l                            108      147      147      147
+    m                            109      148      148      148
+    n                            110      149      149      149
+    o                            111      150      150      150
+    p                            112      151      151      151
+    q                            113      152      152      152
+    r                            114      153      153      153
+    s                            115      162      162      162
+    t                            116      163      163      163
+    u                            117      164      164      164
+    v                            118      165      165      165
+    w                            119      166      166      166
+    x                            120      167      167      167
+    y                            121      168      168      168
+    z                            122      169      169      169
+    {                            123      192      192      251 ###
+    |                            124      79       79       79
+    }                            125      208      208      253 ###
+    ~                            126      161      161      255 ###
+    <DELETE>                     127      7        7        7
+    <C1 0>                       128      32       32       32
+    <C1 1>                       129      33       33       33
+    <C1 2>                       130      34       34       34
+    <C1 3>                       131      35       35       35
+    <C1 4>                       132      36       36       36
+    <C1 5>                       133      21       37       37  ***
+    <C1 6>                       134      6        6        6
+    <C1 7>                       135      23       23       23
+    <C1 8>                       136      40       40       40
+    <C1 9>                       137      41       41       41
+    <C1 10>                      138      42       42       42
+    <C1 11>                      139      43       43       43
+    <C1 12>                      140      44       44       44
+    <C1 13>                      141      9        9        9
+    <C1 14>                      142      10       10       10
+    <C1 15>                      143      27       27       27
+    <C1 16>                      144      48       48       48
+    <C1 17>                      145      49       49       49
+    <C1 18>                      146      26       26       26
+    <C1 19>                      147      51       51       51
+    <C1 20>                      148      52       52       52
+    <C1 21>                      149      53       53       53
+    <C1 22>                      150      54       54       54
+    <C1 23>                      151      8        8        8
+    <C1 24>                      152      56       56       56
+    <C1 25>                      153      57       57       57
+    <C1 26>                      154      58       58       58
+    <C1 27>                      155      59       59       59
+    <C1 28>                      156      4        4        4
+    <C1 29>                      157      20       20       20
+    <C1 30>                      158      62       62       62
+    <C1 31>                      159      255      255      95  ###
+    <NON-BREAKING SPACE>         160      65       65       65
+    <INVERTED EXCLAMATION MARK>  161      170      170      170
+    <CENT SIGN>                  162      74       74       176 ###
+    <POUND SIGN>                 163      177      177      177
+    <CURRENCY SIGN>              164      159      159      159
+    <YEN SIGN>                   165      178      178      178
+    <BROKEN BAR>                 166      106      106      208 ###
+    <SECTION SIGN>               167      181      181      181
+    <DIAERESIS>                  168      189      187      121 *** ###
+    <COPYRIGHT SIGN>             169      180      180      180
+    <FEMININE ORDINAL INDICATOR> 170      154      154      154
+    <LEFT POINTING GUILLEMET>    171      138      138      138
+    <NOT SIGN>                   172      95       176      186 *** ###       
+    <SOFT HYPHEN>                173      202      202      202
+    <REGISTERED TRADE MARK SIGN> 174      175      175      175
+    <MACRON>                     175      188      188      161 ###
+    <DEGREE SIGN>                176      144      144      144
+    <PLUS-OR-MINUS SIGN>         177      143      143      143
+    <SUPERSCRIPT TWO>            178      234      234      234
+    <SUPERSCRIPT THREE>          179      250      250      250
+    <ACUTE ACCENT>               180      190      190      190
+    <MICRO SIGN>                 181      160      160      160
+    <PARAGRAPH SIGN>             182      182      182      182
+    <MIDDLE DOT>                 183      179      179      179
+    <CEDILLA>                    184      157      157      157
+    <SUPERSCRIPT ONE>            185      218      218      218
+    <MASC. ORDINAL INDICATOR>    186      155      155      155
+    <RIGHT POINTING GUILLEMET>   187      139      139      139
+    <FRACTION ONE QUARTER>       188      183      183      183
+    <FRACTION ONE HALF>          189      184      184      184
+    <FRACTION THREE QUARTERS>    190      185      185      185
+    <INVERTED QUESTION MARK>     191      171      171      171
+    <A WITH GRAVE>               192      100      100      100
+    <A WITH ACUTE>               193      101      101      101
+    <A WITH CIRCUMFLEX>          194      98       98       98
+    <A WITH TILDE>               195      102      102      102
+    <A WITH DIAERESIS>           196      99       99       99
+    <A WITH RING ABOVE>          197      103      103      103
+    <CAPITAL LIGATURE AE>        198      158      158      158
+    <C WITH CEDILLA>             199      104      104      104
+    <E WITH GRAVE>               200      116      116      116
+    <E WITH ACUTE>               201      113      113      113
+    <E WITH CIRCUMFLEX>          202      114      114      114
+    <E WITH DIAERESIS>           203      115      115      115
+    <I WITH GRAVE>               204      120      120      120
+    <I WITH ACUTE>               205      117      117      117
+    <I WITH CIRCUMFLEX>          206      118      118      118
+    <I WITH DIAERESIS>           207      119      119      119
+    <CAPITAL LETTER ETH>         208      172      172      172
+    <N WITH TILDE>               209      105      105      105
+    <O WITH GRAVE>               210      237      237      237
+    <O WITH ACUTE>               211      238      238      238
+    <O WITH CIRCUMFLEX>          212      235      235      235
+    <O WITH TILDE>               213      239      239      239
+    <O WITH DIAERESIS>           214      236      236      236
+    <MULTIPLICATION SIGN>        215      191      191      191
+    <O WITH STROKE>              216      128      128      128
+    <U WITH GRAVE>               217      253      253      224 ###
+    <U WITH ACUTE>               218      254      254      254
+    <U WITH CIRCUMFLEX>          219      251      251      221 ###
+    <U WITH DIAERESIS>           220      252      252      252
+    <Y WITH ACUTE>               221      173      186      173 *** ###
+    <CAPITAL LETTER THORN>       222      174      174      174
+    <SMALL LETTER SHARP S>       223      89       89       89
+    <a WITH GRAVE>               224      68       68       68
+    <a WITH ACUTE>               225      69       69       69
+    <a WITH CIRCUMFLEX>          226      66       66       66
+    <a WITH TILDE>               227      70       70       70
+    <a WITH DIAERESIS>           228      67       67       67
+    <a WITH RING ABOVE>          229      71       71       71
+    <SMALL LIGATURE ae>          230      156      156      156
+    <c WITH CEDILLA>             231      72       72       72
+    <e WITH GRAVE>               232      84       84       84
+    <e WITH ACUTE>               233      81       81       81
+    <e WITH CIRCUMFLEX>          234      82       82       82
+    <e WITH DIAERESIS>           235      83       83       83
+    <i WITH GRAVE>               236      88       88       88
+    <i WITH ACUTE>               237      85       85       85
+    <i WITH CIRCUMFLEX>          238      86       86       86
+    <i WITH DIAERESIS>           239      87       87       87
+    <SMALL LETTER eth>           240      140      140      140
+    <n WITH TILDE>               241      73       73       73
+    <o WITH GRAVE>               242      205      205      205
+    <o WITH ACUTE>               243      206      206      206
+    <o WITH CIRCUMFLEX>          244      203      203      203
+    <o WITH TILDE>               245      207      207      207
+    <o WITH DIAERESIS>           246      204      204      204
+    <DIVISION SIGN>              247      225      225      225
+    <o WITH STROKE>              248      112      112      112
+    <u WITH GRAVE>               249      221      221      192 ###
+    <u WITH ACUTE>               250      222      222      222
+    <u WITH CIRCUMFLEX>          251      219      219      219
+    <u WITH DIAERESIS>           252      220      220      220
+    <y WITH ACUTE>               253      141      141      141
+    <SMALL LETTER thorn>         254      142      142      142
+    <y WITH DIAERESIS>           255      223      223      223
+
+If you would rather see the above table in CCSID 0037 order rather than
+ASCII + Latin-1 order then run the table through:
+
+=over 4
+
+=item recipe 2
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \ 
+     -e '          map{[$_,substr($_,42,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in CCSID 1047 order then change the digit
+42 in the last line to 51, like this:
+
+=over 4
+
+=item recipe 3
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \ 
+     -e '          map{[$_,substr($_,51,3)]}@l;}' perlebcdic.pod
+
+If you would rather see it in POSIX-BC order then change the digit
+51 in the last line to 60, like this:
+
+=over 4
+
+=item recipe 4
+
+=back
+
+    perl -ne 'if(/.{33}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}\s{6,8}\d{1,3}/)'\
+     -e '{push(@l,$_)}' \
+     -e 'END{print map{$_->[0]}' \
+     -e '          sort{$a->[1] <=> $b->[1]}' \ 
+     -e '          map{[$_,substr($_,60,3)]}@l;}' perlebcdic.pod
+
+
+=head1 IDENTIFYING CHARACTER CODE SETS
+
+To determine the character set you are running under from perl one 
+could use the return value of ord() or chr() to test one or more 
+character values.  For example:
+
+    $is_ascii  = "A" eq chr(65);
+    $is_ebcdic = "A" eq chr(193);
+
+Also, "\t" is a C<HORIZONTAL TABULATION> character so that:
+
+    $is_ascii  = ord("\t") == 9;
+    $is_ebcdic = ord("\t") == 5;
+
+To distinguish EBCDIC code pages try looking at one or more of
+the characters that differ between them.  For example:
+
+    $is_ebcdic_37   = "\n" eq chr(37);
+    $is_ebcdic_1047 = "\n" eq chr(21);
+
+Or better still choose a character that is uniquely encoded in any
+of the code sets, e.g.:
+
+    $is_ascii           = ord('[') == 91;
+    $is_ebcdic_37       = ord('[') == 186;
+    $is_ebcdic_1047     = ord('[') == 173;
+    $is_ebcdic_POSIX_BC = ord('[') == 187;
+
+However, it would be unwise to write tests such as:
+
+    $is_ascii = "\r" ne chr(13);  #  WRONG
+    $is_ascii = "\n" ne chr(10);  #  ILL ADVISED
+
+Obviously the first of these will fail to distinguish most ASCII machines
+from either a CCSID 0037, a 1047, or a POSIX-BC EBCDIC machine since "\r" eq 
+chr(13) under all of those coded character sets.  But note too that 
+because "\n" is chr(13) and "\r" is chr(10) on the MacIntosh (which is an 
+ASCII machine) the second C<$is_ascii> test will lead to trouble there.
+
+To determine whether or not perl was built under an EBCDIC 
+code page you can use the Config module like so:
+
+    use Config;
+    $is_ebcdic = $Config{'ebcdic'} eq 'define';
+
+=head1 CONVERSIONS
+
+=head2 tr///
+
+In order to convert a string of characters from one character set to 
+another a simple list of numbers, such as in the right columns in the
+above table, along with perl's tr/// operator is all that is needed.  
+The data in the table are in ASCII order hence the EBCDIC columns 
+provide easy to use ASCII to EBCDIC operations that are also easily 
+reversed.
+
+For example, to convert ASCII to code page 037 take the output of the second 
+column from the output of recipe 0 and use it in tr/// like so:
+
+    $cp_037 = 
+    '\000\001\002\003\234\011\206\177\227\215\216\013\014\015\016\017' .
+    '\020\021\022\023\235\205\010\207\030\031\222\217\034\035\036\037' .
+    '\200\201\202\203\204\012\027\033\210\211\212\213\214\005\006\007' .
+    '\220\221\026\223\224\225\226\004\230\231\232\233\024\025\236\032' .
+    '\040\240\342\344\340\341\343\345\347\361\242\056\074\050\053\174' .
+    '\046\351\352\353\350\355\356\357\354\337\041\044\052\051\073\254' .
+    '\055\057\302\304\300\301\303\305\307\321\246\054\045\137\076\077' .
+    '\370\311\312\313\310\315\316\317\314\140\072\043\100\047\075\042' .
+    '\330\141\142\143\144\145\146\147\150\151\253\273\360\375\376\261' .
+    '\260\152\153\154\155\156\157\160\161\162\252\272\346\270\306\244' .
+    '\265\176\163\164\165\166\167\170\171\172\241\277\320\335\336\256' .
+    '\136\243\245\267\251\247\266\274\275\276\133\135\257\250\264\327' .
+    '\173\101\102\103\104\105\106\107\110\111\255\364\366\362\363\365' .
+    '\175\112\113\114\115\116\117\120\121\122\271\373\374\371\372\377' .
+    '\134\367\123\124\125\126\127\130\131\132\262\324\326\322\323\325' .
+    '\060\061\062\063\064\065\066\067\070\071\263\333\334\331\332\237' ;
+
+    my $ebcdic_string = $ascii_string;
+    eval '$ebcdic_string =~ tr/\000-\377/' . $cp_037 . '/';
+
+To convert from EBCDIC to ASCII just reverse the order of the tr/// 
+arguments like so:
+
+    my $ascii_string = $ebcdic_string;
+    eval '$ascii_string = tr/' . $code_page_chrs . '/\000-\037/';
+
+=head2 iconv
+
+XPG4 operability often implies the presence of an I<iconv> utility
+available from the shell or from the C library.  Consult your system's
+documentation for information on iconv.
+
+On OS/390 see the iconv(1) man page.  One way to invoke the iconv 
+shell utility from within perl would be to:
+
+    # OS/390 example
+    $ascii_data = `echo '$ebcdic_data'| iconv -f IBM-1047 -t ISO8859-1`
+
+or the inverse map:
+
+    # OS/390 example
+    $ebcdic_data = `echo '$ascii_data'| iconv -f ISO8859-1 -t IBM-1047`
+
+For other perl based conversion options see the Convert::* modules on CPAN.
+
+=head2 C RTL
+
+The OS/390 C run time library provides _atoe() and _etoa() functions.
+
+=head1 OPERATOR DIFFERENCES
+
+The C<..> range operator treats certain character ranges with 
+care on EBCDIC machines.  For example the following array
+will have twenty six elements on either an EBCDIC machine
+or an ASCII machine:
+
+    @alphabet = ('A'..'Z');   #  $#alphabet == 25
+
+The bitwise operators such as & ^ | may return different results
+when operating on string or character data in a perl program running 
+on an EBCDIC machine than when run on an ASCII machine.  Here is
+an example adapted from the one in L<perlop>:
+
+    # EBCDIC-based examples
+    print "j p \n" ^ " a h";                      # prints "JAPH\n"
+    print "JA" | "  ph\n";                        # prints "japh\n" 
+    print "JAPH\nJunk" & "\277\277\277\277\277";  # prints "japh\n";
+    print 'p N$' ^ " E<H\n";                      # prints "Perl\n";
+
+An interesting property of the 32 C0 control characters
+in the ASCII table is that they can "literally" be constructed
+as control characters in perl, e.g. C<(chr(0) eq "\c@")> 
+C<(chr(1) eq "\cA")>, and so on.  Perl on EBCDIC machines has been 
+ported to take "\c@" to chr(0) and "\cA" to chr(1) as well, but the
+thirty three characters that result depend on which code page you are
+using.  The table below uses the character names from the previous table 
+but with substitutions such as s/START OF/S.O./; s/END OF /E.O./; 
+s/TRANSMISSION/TRANS./; s/TABULATION/TAB./; s/VERTICAL/VERT./; 
+s/HORIZONTAL/HORIZ./; s/DEVICE CONTROL/D.C./; s/SEPARATOR/SEP./; 
+s/NEGATIVE ACKNOWLEDGE/NEG. ACK./;.  The POSIX-BC and 1047 sets are
+identical throughout this range and differ from the 0037 set at only 
+one spot (21 decimal).  Note that the C<LINE FEED> character
+may be generated by "\cJ" on ASCII machines but by "\cU" on 1047 or POSIX-BC 
+machines and cannot be generated as a C<"\c.letter."> control character on 
+0037 machines.  Note also that "\c\\" maps to two characters
+not one.
+
+    chr   ord  8859-1               0037                1047 && POSIX-BC     
+    ------------------------------------------------------------------------
+    "\c?" 127  <DELETE>             "                   "              ***><
+    "\c@"   0  <NULL>               <NULL>              <NULL>         ***><
+    "\cA"   1  <S.O. HEADING>       <S.O. HEADING>      <S.O. HEADING> 
+    "\cB"   2  <S.O. TEXT>          <S.O. TEXT>         <S.O. TEXT>
+    "\cC"   3  <E.O. TEXT>          <E.O. TEXT>         <E.O. TEXT>
+    "\cD"   4  <E.O. TRANS.>        <C1 28>             <C1 28> 
+    "\cE"   5  <ENQUIRY>            <HORIZ. TAB.>       <HORIZ. TAB.>    
+    "\cF"   6  <ACKNOWLEDGE>        <C1 6>              <C1 6>   
+    "\cG"   7  <BELL>               <DELETE>            <DELETE>   
+    "\cH"   8  <BACKSPACE>          <C1 23>             <C1 23>
+    "\cI"   9  <HORIZ. TAB.>        <C1 13>             <C1 13>
+    "\cJ"  10  <LINE FEED>          <C1 14>             <C1 14>
+    "\cK"  11  <VERT. TAB.>         <VERT. TAB.>        <VERT. TAB.>
+    "\cL"  12  <FORM FEED>          <FORM FEED>         <FORM FEED>    
+    "\cM"  13  <CARRIAGE RETURN>    <CARRIAGE RETURN>   <CARRIAGE RETURN> 
+    "\cN"  14  <SHIFT OUT>          <SHIFT OUT>         <SHIFT OUT>
+    "\cO"  15  <SHIFT IN>           <SHIFT IN>          <SHIFT IN>
+    "\cP"  16  <DATA LINK ESCAPE>   <DATA LINK ESCAPE>  <DATA LINK ESCAPE> 
+    "\cQ"  17  <D.C. ONE>           <D.C. ONE>          <D.C. ONE>
+    "\cR"  18  <D.C. TWO>           <D.C. TWO>          <D.C. TWO>
+    "\cS"  19  <D.C. THREE>         <D.C. THREE>        <D.C. THREE> 
+    "\cT"  20  <D.C. FOUR>          <C1 29>             <C1 29> 
+    "\cU"  21  <NEG. ACK.>          <C1 5>              <LINE FEED>    ***
+    "\cV"  22  <SYNCHRONOUS IDLE>   <BACKSPACE>         <BACKSPACE>
+    "\cW"  23  <E.O. TRANS. BLOCK>  <C1 7>              <C1 7>
+    "\cX"  24  <CANCEL>             <CANCEL>            <CANCEL>
+    "\cY"  25  <E.O. MEDIUM>        <E.O. MEDIUM>       <E.O. MEDIUM>
+    "\cZ"  26  <SUBSTITUTE>         <C1 18>             <C1 18>
+    "\c["  27  <ESCAPE>             <C1 15>             <C1 15>
+    "\c\\" 28  <FILE SEP.>\         <FILE SEP.>\        <FILE SEP.>\
+    "\c]"  29  <GROUP SEP.>         <GROUP SEP.>        <GROUP SEP.>
+    "\c^"  30  <RECORD SEP.>        <RECORD SEP.>       <RECORD SEP.>  ***><
+    "\c_"  31  <UNIT SEP.>          <UNIT SEP.>         <UNIT SEP.>    ***><
+
+
+=head1 FUNCTION DIFFERENCES
+
+=over 8
+
+=item chr()
+
+chr() must be given an EBCDIC code number argument to yield a desired 
+character return value on an EBCDIC machine.  For example:
+
+    $CAPITAL_LETTER_A = chr(193);
+
+=item ord()
+
+ord() will return EBCDIC code number values on an EBCDIC machine.
+For example:
+
+    $the_number_193 = ord("A");
+
+=item pack()
+
+The c and C templates for pack() are dependent upon character set 
+encoding.  Examples of usage on EBCDIC include:
+
+    $foo = pack("CCCC",193,194,195,196);
+    # $foo eq "ABCD"
+    $foo = pack("C4",193,194,195,196);
+    # same thing
+
+    $foo = pack("ccxxcc",193,194,195,196);
+    # $foo eq "AB\0\0CD"
+
+=item print()
+
+One must be careful with scalars and strings that are passed to
+print that contain ASCII encodings.  One common place
+for this to occur is in the output of the MIME type header for
+CGI script writing.  For example, many perl programming guides 
+recommend something similar to:
+
+    print "Content-type:\ttext/html\015\012\015\012"; 
+    # this may be wrong on EBCDIC
+
+Under the IBM OS/390 USS Web Server for example you should instead
+write that as:
+
+    print "Content-type:\ttext/html\r\n\r\n"; # OK for DGW et alia
+
+That is because the translation from EBCDIC to ASCII is done
+by the web server in this case (such code will not be appropriate for
+the Macintosh however).  Consult your web server's documentation for 
+further details.
+
+=item printf()
+
+The formats that can convert characters to numbers and vice versa
+will be different from their ASCII counterparts when executed
+on an EBCDIC machine.  Examples include:
+
+    printf("%c%c%c",193,194,195);  # prints ABC
+
+=item sort()
+
+EBCDIC sort results may differ from ASCII sort results especially for 
+mixed case strings.  This is discussed in more detail below.
+
+=item sprintf()
+
+See the discussion of printf() above.  An example of the use
+of sprintf would be:
+
+    $CAPITAL_LETTER_A = sprintf("%c",193);
+
+=item unpack()
+
+See the discussion of pack() above.
+
+=back
+
+=head1 REGULAR EXPRESSION DIFFERENCES
+
+As of perl 5.005_03 the letter range regular expression such as 
+[A-Z] and [a-z] have been especially coded to not pick up gap 
+characters.  For example, characters such as E<ocirc> C<o WITH CIRCUMFLEX> 
+that lie between I and J would not be matched by the 
+regular expression range C</[H-K]/>.  
+
+If you do want to match the alphabet gap characters in a single octet 
+regular expression try matching the hex or octal code such 
+as C</\313/> on EBCDIC or C</\364/> on ASCII machines to 
+have your regular expression match C<o WITH CIRCUMFLEX>.
+
+Another construct to be wary of is the inappropriate use of hex or
+octal constants in regular expressions.  Consider the following
+set of subs:
+
+    sub is_c0 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\000-\037]/;
+    }
+
+    sub is_print_ascii {
+        my $char = substr(shift,0,1);
+        $char =~ /[\040-\176]/;
+    }
+
+    sub is_delete {
+        my $char = substr(shift,0,1);
+        $char eq "\177";
+    }
+
+    sub is_c1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\200-\237]/;
+    }
+
+    sub is_latin_1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[\240-\377]/;
+    }
+
+The above would be adequate if the concern was only with numeric code points.
+However, the concern may be with characters rather than code points 
+and on an EBCDIC machine it may be desirable for constructs such as 
+C<if (is_print_ascii("A")) {print "A is a printable character\n";}> to print
+out the expected message.  One way to represent the above collection
+of character classification subs that is capable of working across the
+four coded character sets discussed in this document is as follows:
+
+    sub Is_c0 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\000-\037]/;
+        } 
+        if (ord('^')==176) { # 37
+            return $char =~ /[\000-\003\067\055-\057\026\005\045\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+        }
+        if (ord('^')==95 || ord('^')==106) { # 1047 || posix-bc
+            return $char =~ /[\000-\003\067\055-\057\026\005\025\013-\023\074\075\062\046\030\031\077\047\034-\037]/;
+        }
+    }
+
+    sub Is_print_ascii {
+        my $char = substr(shift,0,1);
+        $char =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~]/;
+    }
+
+    sub Is_delete {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char eq "\177";
+        }
+        else  {              # ebcdic
+            return $char eq "\007";
+        }
+    }
+
+    sub Is_c1 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\200-\237]/;
+        }
+        if (ord('^')==176) { # 37
+            return $char =~ /[\040-\044\025\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+        }
+        if (ord('^')==95)  { # 1047
+            return $char =~ /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\377]/;
+        }
+        if (ord('^')==106) { # posix-bc
+            return $char =~ 
+              /[\040-\045\006\027\050-\054\011\012\033\060\061\032\063-\066\010\070-\073\040\024\076\137]/;
+        }
+    }
+
+    sub Is_latin_1 {
+        my $char = substr(shift,0,1);
+        if (ord('^')==94)  { # ascii
+            return $char =~ /[\240-\377]/;
+        }
+        if (ord('^')==176) { # 37
+            return $char =~ 
+              /[\101\252\112\261\237\262\152\265\275\264\232\212\137\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/;
+        }
+        if (ord('^')==95)  { # 1047
+            return $char =~
+              /[\101\252\112\261\237\262\152\265\273\264\232\212\260\312\257\274\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\375\376\373\374\272\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\335\336\333\334\215\216\337]/; 
+        }
+        if (ord('^')==106) { # posix-bc
+            return $char =~ 
+              /[\101\252\260\261\237\262\320\265\171\264\232\212\272\312\257\241\220\217\352\372\276\240\266\263\235\332\233\213\267\270\271\253\144\145\142\146\143\147\236\150\164\161-\163\170\165-\167\254\151\355\356\353\357\354\277\200\340\376\335\374\255\256\131\104\105\102\106\103\107\234\110\124\121-\123\130\125-\127\214\111\315\316\313\317\314\341\160\300\336\333\334\215\216\337]/;
+        }
+    }
+
+Note however that only the C<Is_ascii_print()> sub is really independent 
+of coded character set.  Another way to write C<Is_latin_1()> would be 
+to use the characters in the range explicitly:
+
+    sub Is_latin_1 {
+        my $char = substr(shift,0,1);
+        $char =~ /[ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ]/;
+    }
+
+Although that form may run into trouble in network transit (due to the 
+presence of 8 bit characters) or on non ISO-Latin character sets.
+
+=head1 SOCKETS
+
+Most socket programming assumes ASCII character encodings in network
+byte order.  Exceptions can include CGI script writing under a
+host web server where the server may take care of translation for you.
+Most host web servers convert EBCDIC data to ISO-8859-1 or Unicode on
+output.
+
+=head1 SORTING
+
+One big difference between ASCII based character sets and EBCDIC ones
+are the relative positions of upper and lower case letters and the
+letters compared to the digits.  If sorted on an ASCII based machine the
+two letter abbreviation for a physician comes before the two letter
+for drive, that is:
+
+    @sorted = sort(qw(Dr. dr.));  # @sorted holds ('Dr.','dr.') on ASCII,
+                                  # but ('dr.','Dr.') on EBCDIC
+
+The property of lower case before uppercase letters in EBCDIC is
+even carried to the Latin 1 EBCDIC pages such as 0037 and 1047.
+An example would be that E<Euml> C<E WITH DIAERESIS> (203) comes 
+before E<euml> C<e WITH DIAERESIS> (235) on an ASCII machine, but 
+the latter (83) comes before the former (115) on an EBCDIC machine.  
+(Astute readers will note that the upper case version of E<szlig> 
+C<SMALL LETTER SHARP S> is simply "SS" and that the upper case version of 
+E<yuml> C<y WITH DIAERESIS> is not in the 0..255 range but it is 
+at U+x0178 in Unicode, or C<"\x{178}"> in a Unicode enabled Perl).
+
+The sort order will cause differences between results obtained on
+ASCII machines versus EBCDIC machines.  What follows are some suggestions
+on how to deal with these differences.
+
+=head2 Ignore ASCII vs. EBCDIC sort differences.
+
+This is the least computationally expensive strategy.  It may require
+some user education.
+
+=head2 MONO CASE then sort data.
+
+In order to minimize the expense of mono casing mixed test try to
+C<tr///> towards the character set case most employed within the data.
+If the data are primarily UPPERCASE non Latin 1 then apply tr/[a-z]/[A-Z]/
+then sort().  If the data are primarily lowercase non Latin 1 then
+apply tr/[A-Z]/[a-z]/ before sorting.  If the data are primarily UPPERCASE
+and include Latin-1 characters then apply:  
+
+    tr/[a-z]/[A-Z]/; 
+    tr/[àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]/[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]/;
+    s/ß/SS/g; 
+
+then sort().  Do note however that such Latin-1 manipulation does not 
+address the E<yuml> C<y WITH DIAERESIS> character that will remain at 
+code point 255 on ASCII machines, but 223 on most EBCDIC machines 
+where it will sort to a place less than the EBCDIC numerals.  With a 
+Unicode enabled Perl you might try:
+
+    tr/^?/\x{178}/;
+
+The strategy of mono casing data before sorting does not preserve the case 
+of the data and may not be acceptable for that reason.
+
+=head2 Convert, sort data, then re convert.
+
+This is the most expensive proposition that does not employ a network
+connection.
+
+=head2 Perform sorting on one type of machine only.
+
+This strategy can employ a network connection.  As such
+it would be computationally expensive.
+
+=head1 TRANFORMATION FORMATS
+
+There are a variety of ways of transforming data with an intra character set 
+mapping that serve a variety of purposes.  Sorting was discussed in the 
+previous section and a few of the other more popular mapping techniques are 
+discussed next.
+
+=head2 URL decoding and encoding
+
+Note that some URLs have hexadecimal ASCII code points in them in an
+attempt to overcome character or protocol limitation issues.  For example 
+the tilde character is not on every keyboard hence a URL of the form:
+
+    http://www.pvhp.com/~pvhp/
+
+may also be expressed as either of:
+
+    http://www.pvhp.com/%7Epvhp/
+
+    http://www.pvhp.com/%7epvhp/
+
+where 7E is the hexadecimal ASCII code point for '~'.  Here is an example
+of decoding such a URL under CCSID 1047:
+
+    $url = 'http://www.pvhp.com/%7Epvhp/';
+    # this array assumes code page 1047
+    my @a2e_1047 = (
+          0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 21, 11, 12, 13, 14, 15,
+         16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
+         64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
+        240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
+        124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
+        215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
+        121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
+        151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7,
+         32, 33, 34, 35, 36, 37,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
+         48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255,
+         65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
+        144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
+        100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
+        172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
+         68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
+        140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
+    );
+    $url =~ s/%([0-9a-fA-F]{2})/pack("c",$a2e_1047[hex($1)])/ge;
+
+Conversely, here is a partial solution for the task of encoding such 
+a URL under the 1047 code page:
+
+    $url = 'http://www.pvhp.com/~pvhp/';
+    # this array assumes code page 1047
+    my @e2a_1047 = (
+          0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
+         16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
+        128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
+        144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
+         32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
+         38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
+         45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
+        248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
+        216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
+        176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
+        181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
+        172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
+        123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
+        125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
+         92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
+         48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
+    );
+    # The following regular expression does not address the 
+    # mappings for: ('.' => '%2E', '/' => '%2F', ':' => '%3A') 
+    $url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/sprintf("%%%02X",$e2a_1047[ord($1)])/ge;
+
+where a more complete solution would split the URL into components 
+and apply a full s/// substitution only to the appropriate parts.
+
+In the remaining examples a @e2a or @a2e array may be employed
+but the assignment will not be shown explicitly.  For code page 1047
+you could use the @a2e_1047 or @e2a_1047 arrays just shown.
+
+=head2 uu encoding and decoding
+
+The C<u> template to pack() or unpack() will render EBCDIC data in EBCDIC 
+characters equivalent to their ASCII counterparts.  For example, the 
+following will print "Yes indeed\n" on either an ASCII or EBCDIC computer:
+
+    $all_byte_chrs = '';
+    for (0..255) { $all_byte_chrs .= chr($_); }
+    $uuencode_byte_chrs = pack('u', $all_byte_chrs);
+    ($uu = <<'    ENDOFHEREDOC') =~ s/^\s*//gm;
+    M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
+    M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
+    M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
+    MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
+    MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
+    ?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
+    ENDOFHEREDOC
+    if ($uuencode_byte_chrs eq $uu) {
+        print "Yes ";
+    }
+    $uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
+    if ($uudecode_byte_chrs eq $all_byte_chrs) {
+        print "indeed\n";
+    }
+
+Here is a very spartan uudecoder that will work on EBCDIC provided
+that the @e2a array is filled in appropriately:
+
+    #!/usr/local/bin/perl
+    @e2a = ( # this must be filled in
+           );
+    $_ = <> until ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
+    open(OUT, "> $file") if $file ne "";
+    while(<>) {
+        last if /^end/;
+        next if /[a-z]/;
+        next unless int(((($e2a[ord()] - 32 ) & 077) + 2) / 3) ==
+            int(length() / 4);
+        print OUT unpack("u", $_);
+    }
+    close(OUT);
+    chmod oct($mode), $file;
+
+
+=head2 Quoted-Printable encoding and decoding
+
+On ASCII encoded machines it is possible to strip characters outside of
+the printable set using:
+
+    # This QP encoder works on ASCII only
+    $qp_string =~ s/([=\x00-\x1F\x80-\xFF])/sprintf("=%02X",ord($1))/ge;
+
+Whereas a QP encoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the EBCDIC branch @e2a 
+array is omitted for brevity):
+
+    if (ord('A') == 65) {    # ASCII
+        $delete = "\x7F";    # ASCII
+        @e2a = (0 .. 255)    # ASCII to ASCII identity map
+    }
+    else {                   # EBCDIC
+        $delete = "\x07";    # EBCDIC
+        @e2a =               # EBCDIC to ASCII map (as shown above)
+    }
+    $qp_string =~
+      s/([^ !"\#\$%&'()*+,\-.\/0-9:;<>?\@A-Z[\\\]^_`a-z{|}~$delete])/sprintf("=%02X",$e2a[ord($1)])/ge;
+
+(although in production code the substitutions might be done
+in the EBCDIC branch with the @e2a array and separately in the 
+ASCII branch without the expense of the identity map).
+
+Such QP strings can be decoded with:
+
+    # This QP decoder is limited to ASCII only
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr hex $1/ge;
+    $string =~ s/=[\n\r]+$//;
+
+Whereas a QP decoder that works on both ASCII and EBCDIC machines 
+would look somewhat like the following (where the @a2e array is
+omitted for brevity):
+
+    $string =~ s/=([0-9A-Fa-f][0-9A-Fa-f])/chr $a2e[hex $1]/ge;
+    $string =~ s/=[\n\r]+$//;
+
+=head2 Caesarian cyphers
+
+The practice of shifting an alphabet one or more characters for encipherment
+dates back thousands of years and was explicitly detailed by Gaius Julius
+Caesar in his B<Gallic Wars> text.  A single alphabet shift is sometimes 
+referred to as a rotation and the shift amount is given as a number $n after
+the string 'rot' or "rot$n".  Rot0 and rot26 would designate identity maps 
+on the 26 letter English version of the Latin alphabet.  Rot13 has the 
+interesting property that alternate subsequent invocations are identity maps 
+(thus rot13 is its own non-trivial inverse in the group of 26 alphabet 
+rotations).  Hence the following is a rot13 encoder and decoder that will 
+work on ASCII and EBCDIC machines:
+
+    #!/usr/local/bin/perl
+
+    while(<>){
+        tr/n-za-mN-ZA-M/a-zA-Z/;
+        print;
+    }
+
+In one-liner form:
+
+    perl -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
+
+
+=head1 Hashing order and checksums
+
+XXX
+
+=head1 I18N AND L10N
+
+Internationalization(I18N) and localization(L10N) are supported at least 
+in principle even on EBCDIC machines.  The details are system dependent 
+and discussed under the L<perlebcdic/OS ISSUES> section below.
+
+=head1 MULTI OCTET CHARACTER SETS
+
+Multi byte EBCDIC code pages; Unicode, UTF-8, UTF-EBCDIC, XXX.
+
+=head1 OS ISSUES
+
+There may be a few system dependent issues 
+of concern to EBCDIC Perl programmers.
+
+=head2 OS/400 
+
+The PASE environment.
+
+=over 8
+
+=item IFS access
+
+XXX.
+
+=back
+
+=head2 OS/390 
+
+Perl runs under Unix Systems Services or USS.
+
+=over 8
+
+=item chcp
+
+B<chcp> is supported as a shell utility for displaying and changing 
+one's code page.  See also L<chcp>.
+
+=item dataset access
+
+For sequential data set access try:
+
+    my @ds_records = `cat //DSNAME`;
+
+or:
+
+    my @ds_records = `cat //'HLQ.DSNAME'`;
+
+See also the OS390::Stdio module on CPAN.
+
+=item OS/390 iconv
+
+B<iconv> is supported as both a shell utility and a C RTL routine.
+See also the iconv(1) and iconv(3) manual pages.
+
+=item locales
+
+On OS/390 see L<locale> for information on locales.  The L10N files
+are in F</usr/nls/locale>.  $Config{d_setlocale} is 'define' on OS/390.
+
+=back
+
+=head2 VM/ESA?
+
+XXX.
+
+=head2 POSIX-BC?
+
+XXX.
+
+=head1 BUGS
+
+This pod document contains literal Latin 1 characters and may encounter 
+translation difficulties.  In particular one popular nroff implementation 
+was known to strip accented characters to their unaccented counterparts 
+while attempting to view this document through the B<pod2man> program 
+(for example, you may see a plain C<y> rather than one with a diaeresis 
+as in E<yuml>).  Another nroff truncated the resultant man page at
+the first occurence of 8 bit characters.
+
+Not all shells will allow multiple C<-e> string arguments to perl to
+be concatenated together properly as recipes 2, 3, and 4 might seem
+to imply.
+
+Perl does not yet work with any Unicode features on EBCDIC platforms.
+
+=head1 SEE ALSO
+
+L<perllocale>, L<perlfunc>.
+
+=head1 REFERENCES
+
+http://anubis.dkuug.dk/i18n/charmaps
+
+http://www.unicode.org/
+
+http://www.unicode.org/unicode/reports/tr16/
+
+http://www.wps.com/texts/codes/
+B<ASCII: American Standard Code for Information Infiltration> Tom Jennings,
+September 1999.
+
+B<The Unicode Standard Version 2.0> The Unicode Consortium, 
+ISBN 0-201-48345-9, Addison Wesley Developers Press, July 1996. 
+
+B<The Unicode Standard Version 3.0> The Unicode Consortium, Lisa Moore ed., 
+ISBN 0-201-61633-5, Addison Wesley Developers Press, February 2000. 
+
+B<CDRA: IBM - Character Data Representation Architecture - 
+Reference and Registry>, IBM SC09-2190-00, December 1996. 
+
+"Demystifying Character Sets", Andrea Vine, Multilingual Computing 
+& Technology, B<#26 Vol. 10 Issue 4>, August/September 1999;
+ISSN 1523-0309; Multilingual Computing Inc. Sandpoint ID, USA.
+
+B<Codes, Ciphers, and Other Cryptic and Clandestine Communication>
+Fred B. Wrixon, ISBN 1-57912-040-7, Black Dog & Leventhal Publishers,
+1998.
+
+=head1 AUTHOR
+
+Peter Prymmer pvhp@best.com wrote this in 1999 and 2000 
+with CCSID 0819 and 0037 help from Chris Leach and 
+AndrE<eacute> Pirard A.Pirard@ulg.ac.be as well as POSIX-BC 
+help from Thomas Dorner Thomas.Dorner@start.de.
+Thanks also to Vickie Cooper, Philip Newton, William Raffloer, and 
+Joe Smith.  Trademarks, registered trademarks, service marks and 
+registered service marks used in this document are the property of 
+their respective owners.
+
+
index dce785e..1787e4b 100644 (file)
@@ -356,7 +356,7 @@ made.
    int matches(SV *string, char *pattern, AV **matches);
 
 Given an C<SV>, a pattern, and a pointer to an empty C<AV>,
-matches() evaluates C<$string =~ $pattern> in an array context, and
+matches() evaluates C<$string =~ $pattern> in a list context, and
 fills in I<matches> with the array elements, returning the number of matches found.
 
 Here's a sample program, I<match.c>, that uses all three (long lines have
@@ -434,7 +434,7 @@ been wrapped here):
 
  /** matches(string, pattern, matches)
  **
- ** Used for matches in an array context.
+ ** Used for matches in a list context.
  **
  ** Returns the number of matches,
  ** and fills in **matches with the matching substrings
index af4d7cb..ec61e8b 100644 (file)
@@ -36,7 +36,7 @@ In particular, the core development team (known as the Perl Porters)
 are a rag-tag band of highly altruistic individuals committed
 to producing better software for free than you could hope to
 purchase for money.  You may snoop on pending developments via
-news://news.perl.com/perl.porters-gw/ and the Deja archive at
+nntp://news.perl.com/perl.porters-gw/ and the Deja archive at
 http://www.deja.com/ using the perl.porters-gw newsgroup, or you can
 subscribe to the mailing list by sending perl5-porters-request@perl.org
 a subscription request.
@@ -89,24 +89,21 @@ See L<perlhist> for a history of Perl revisions.
 
 =head2 What is perl6?
 
-Perl6 is a semi-jocular reference to the Topaz project.  Headed by Chip
-Salzenberg, Topaz is yet-another ground-up rewrite of the current release
-of Perl, one whose major goal is to create a more maintainable core than
-found in release 5.  Written in nominally portable C++, Topaz hopes to
-maintain 100% source-compatibility with previous releases of Perl but to
-run significantly faster and smaller.  The Topaz team hopes to provide
-an XS compatibility interface to allow most XS modules to work unchanged,
-albeit perhaps without the efficiency that the new interface would allow.
-New features in Topaz are as yet undetermined, and will be addressed
-once compatibility and performance goals are met.
-
-If you are a hard-working C++ wizard with a firm command of Perl's
-internals, and you would like to work on the project, send a request to
-perl6-porters-request@perl.org to subscribe to the Topaz mailing list.
-
-There is no ETA for Topaz.  It is expected to be several years before it
-achieves enough robustness, compatibility, portability, and performance
-to replace perl5 for ordinary use by mere mortals.
+At The Second O'Reilly Open Source Software Convention, Larry Wall            
+announced Perl6 development would begin in earnest. Perl6 was an oft
+used term for Chip Salzenberg's project to rewrite Perl in C++ named
+Topaz. However, Topaz should not be confused with the nisus to rewrite
+Perl while keeping the lessons learned from other software, as well as
+Perl5, in mind.
+
+If you have a desire to help in the crusade to make Perl a better place
+then peruse the Perl6 developers page at http://www.perl.org/perl6/ and 
+get involved.
+
+The first alpha release is expected by Summer 2001.
+
+"We're really serious about reinventing everything that needs reinventing."
+--Larry Wall
 
 =head2 How stable is Perl?
 
index d0b92bb..df05091 100644 (file)
@@ -462,7 +462,7 @@ See also www.perl.com for updates on tutorials, training, and support.
 
 If you are reporting a bug in the perl interpreter or the modules
 shipped with Perl, use the I<perlbug> program in the Perl distribution or
-mail your report to perlbug@perl.com .
+mail your report to perlbug@perl.org .
 
 If you are posting a bug with a non-standard port (see the answer to
 "What platforms is Perl available for?"), a binary distribution, or a
index ecbd652..79905f8 100644 (file)
@@ -370,7 +370,7 @@ you can.  Is that the pencil's fault?  Of course it isn't.
 The date and time functions supplied with Perl (gmtime and localtime)
 supply adequate information to determine the year well beyond 2000
 (2038 is when trouble strikes for 32-bit machines).  The year returned
-by these functions when used in an array context is the year minus 1900.
+by these functions when used in a list context is the year minus 1900.
 For years between 1910 and 1999 this I<happens> to be a 2-digit decimal
 number. To avoid the year 2000 problem simply do not treat the year as
 a 2-digit number.  It isn't.
@@ -1189,7 +1189,6 @@ Use this:
         my $i;
         for ($i = @$array; --$i; ) {
             my $j = int rand ($i+1);
-            next if $i == $j;
             @$array[$i,$j] = @$array[$j,$i];
         }
     }
index 29136ab..4ab4d4c 100644 (file)
@@ -527,11 +527,16 @@ variable is no longer "expensive" the way the other two are.
 
 =head2 What good is C<\G> in a regular expression?
 
-The notation C<\G> is used in a match or substitution in conjunction the
-C</g> modifier (and ignored if there's no C</g>) to anchor the regular
-expression to the point just past where the last match occurred, i.e. the
-pos() point.  A failed match resets the position of C<\G> unless the
-C</c> modifier is in effect.
+The notation C<\G> is used in a match or substitution in conjunction with
+the C</g> modifier to anchor the regular expression to the point just past
+where the last match occurred, i.e. the pos() point.  A failed match resets
+the position of C<\G> unless the C</c> modifier is in effect. C<\G> can be
+used in a match without the C</g> modifier; it acts the same (i.e. still
+anchors at the pos() point) but of course only matches once and does not
+update pos(), as non-C</g> expressions never do. C<\G> in an expression
+applied to a target string that has never been matched against a C</g>
+expression before or has had its pos() reset is functionally equivalent to
+C<\A>, which matches at the beginning of the string.
 
 For example, suppose you had a line of text quoted in standard mail
 and Usenet notation, (that is, with leading C<< > >> characters), and
index 1ca7893..0d4876f 100644 (file)
@@ -196,6 +196,10 @@ own module.  Make sure to change the names appropriately.
     }
     our @EXPORT_OK;
 
+    # exported package globals go here
+    our $Var1;
+    our %Hashit;
+
     # non-exported package globals go here
     our @more;
     our $stuff;
index ed22ba0..0ac4620 100644 (file)
@@ -443,9 +443,8 @@ probably get away with setting an environment variable:
 
 If you want finer granularity than the 1 second that the sleep()
 function provides, the easiest way is to use the select() function as
-documented in L<perlfunc/"select">.  If your system has itimers and
-syscall() support, you can check out the old example in
-http://www.perl.com/CPAN/doc/misc/ancient/tutorial/eg/itimers.pl .
+documented in L<perlfunc/"select">.  Try the Time::HiRes and
+the BSD::Itimer modules (available from CPAN).
 
 =head2 How can I measure time under a second?
 
@@ -906,10 +905,6 @@ Background yourself like this:
 The Proc::Daemon module, available from CPAN, provides a function to
 perform these actions for you.
 
-=head2 How do I make my program run with sh and csh?
-
-See the F<eg/nih> script (part of the perl source distribution).
-
 =head2 How do I find out if I'm running interactively or not?
 
 Good question.  Sometimes C<-t STDIN> and C<-t STDOUT> can give clues,
index e19d341..db90b86 100644 (file)
@@ -612,6 +612,8 @@ If VARIABLE is omitted, it chomps C<$_>.  Example:
        # ...
     }
 
+If VARIABLE is a hash, it chomps the hash's values, but not its keys.
+
 You can actually chomp anything that's an lvalue, including an assignment:
 
     chomp($cwd = `pwd`);
@@ -638,6 +640,8 @@ Example:
        #...
     }
 
+If VARIABLE is a hash, it chops the hash's values, but not its keys.
+
 You can actually chop anything that's an lvalue, including an assignment:
 
     chop($cwd = `pwd`);
@@ -795,6 +799,8 @@ to check the condition at the top of the loop.
 
 =item cos EXPR
 
+=item cos
+
 Returns the cosine of EXPR (expressed in radians).  If EXPR is omitted,
 takes cosine of C<$_>.
 
@@ -2424,8 +2430,6 @@ divided by the natural log of N.  For example:
 
 See also L</exp> for the inverse operation.
 
-=item lstat FILEHANDLE
-
 =item lstat EXPR
 
 =item lstat
@@ -2819,7 +2823,7 @@ otherwise it's necessary to protect any leading and trailing whitespace:
     $file =~ s#^(\s)#./$1#;
     open(FOO, "< $file\0");
 
-(this may not work on some bizzare filesystems).  One should
+(this may not work on some bizarre filesystems).  One should
 conscientiously choose between the I<magic> and 3-arguments form
 of open():
 
@@ -3153,13 +3157,13 @@ because they obey the native byteorder and endianness.  For example a
 4-byte integer 0x12345678 (305419896 decimal) be ordered natively
 (arranged in and handled by the CPU registers) into bytes as
 
-       0x12 0x34 0x56 0x78     # little-endian
-       0x78 0x56 0x34 0x12     # big-endian
+       0x12 0x34 0x56 0x78     # big-endian
+       0x78 0x56 0x34 0x12     # little-endian
 
-Basically, the Intel, Alpha, and VAX CPUs are little-endian, while
-everybody else, for example Motorola m68k/88k, PPC, Sparc, HP PA,
-Power, and Cray are big-endian.  MIPS can be either: Digital used it
-in little-endian mode; SGI uses it in big-endian mode.
+Basically, the Intel and VAX CPUs are little-endian, while everybody
+else, for example Motorola m68k/88k, PPC, Sparc, HP PA, Power, and
+Cray are big-endian.  Alpha and MIPS can be either: Digital/Compaq
+used/uses them in little-endian mode; SGI/Cray uses them in big-endian mode.
 
 The names `big-endian' and `little-endian' are comic references to
 the classic "Gulliver's Travels" (via the paper "On Holy Wars and a
@@ -3285,10 +3289,10 @@ Examples:
 
 The same template may generally also be used in unpack().
 
-=item package 
-
 =item package NAMESPACE
 
+=item package 
+
 Declares the compilation unit as being in the given namespace.  The scope
 of the package declaration is from the declaration itself through the end
 of the enclosing block, file, or eval (the same as the C<my> operator).
@@ -3346,7 +3350,7 @@ array in subroutines, just like C<shift>.
 =item pos
 
 Returns the offset of where the last C<m//g> search left off for the variable
-is in question (C<$_> is used when the variable is not specified).  May be
+in question (C<$_> is used when the variable is not specified).  May be
 modified to change that offset.  Such modification will also influence
 the C<\G> zero-width assertion in regular expressions.  See L<perlre> and
 L<perlop>.
@@ -4101,7 +4105,7 @@ C<syscall> interface to access setitimer(2) if your system supports
 it, or else see L</select> above.  The Time::HiRes module from CPAN
 may also help.
 
-See also the POSIX module's C<sigpause> function.
+See also the POSIX module's C<pause> function.
 
 =item socket SOCKET,DOMAIN,TYPE,PROTOCOL
 
@@ -4414,6 +4418,12 @@ numbers, and even then only the standard modifiers are allowed).  As a
 result, any non-standard extensions in your local C<sprintf> are not
 available from Perl.
 
+Unlike C<printf>, C<sprintf> does not do what you probably mean when you
+pass it an array as your first argument. The array is given scalar context,
+and instead of using the 0th element of the array as the format, Perl will
+use the count of elements in the array as the format, which is almost never
+useful.
+
 Perl's C<sprintf> permits the following universally-known conversions:
 
    %%  a percent sign
@@ -4446,6 +4456,12 @@ permits these unnecessary but widely-supported conversions:
    %O  a synonym for %lo
    %F  a synonym for %f
 
+Note that the number of exponent digits in the scientific notation by
+C<%e>, C<%E>, C<%g> and C<%G> for numbers with the modulus of the
+exponent less than 100 is system-dependent: it may be three or less
+(zero-padded as necessary).  In other words, 1.23 times ten to the
+99th may be either "1.23e99" or "1.23e099".
+
 Perl permits the following universally-known flags between the C<%>
 and the conversion letter:
 
@@ -5075,6 +5091,7 @@ A class implementing a hash should have the following methods:
     FIRSTKEY this
     NEXTKEY this, lastkey
     DESTROY this
+    UNTIE this
 
 A class implementing an ordinary array should have the following methods:
 
@@ -5091,6 +5108,7 @@ A class implementing an ordinary array should have the following methods:
     SPLICE this, offset, length, LIST
     EXTEND this, count
     DESTROY this
+    UNTIE this
 
 A class implementing a file handle should have the following methods:
 
@@ -5101,8 +5119,15 @@ A class implementing a file handle should have the following methods:
     WRITE this, scalar, length, offset
     PRINT this, LIST
     PRINTF this, format, LIST
+    BINMODE this
+    EOF this
+    FILENO this
+    SEEK this, position, whence
+    TELL this
+    OPEN this, mode, LIST
     CLOSE this
     DESTROY this
+    UNTIE this
 
 A class implementing a scalar should have the following methods:
 
@@ -5110,6 +5135,7 @@ A class implementing a scalar should have the following methods:
     FETCH this,
     STORE this, value
     DESTROY this
+    UNTIE this
 
 Not all methods indicated above need be implemented.  See L<perltie>,
 L<Tie::Hash>, L<Tie::Array>, L<Tie::Scalar>, and L<Tie::Handle>.
@@ -5378,7 +5404,8 @@ derive their C<import> method via inheritance from the C<Exporter> class that
 is defined in the C<Exporter> module.  See L<Exporter>.  If no C<import>
 method can be found then the call is skipped.
 
-If you don't want your namespace altered, explicitly supply an empty list:
+If you do not want to call the package's C<import> method (for instance,
+to stop your namespace from being altered), explicitly supply the empty list:
 
     use Module ();
 
@@ -5399,8 +5426,9 @@ called).  Note that there is no comma after VERSION!
 Because this is a wide-open interface, pragmas (compiler directives)
 are also implemented this way.  Currently implemented pragmas are:
 
-    use integer;
+    use constant;
     use diagnostics;
+    use integer;
     use sigtrap  qw(SEGV BUS);
     use strict   qw(subs vars refs);
     use subs     qw(afunc blurfl);
@@ -5420,7 +5448,9 @@ by C<use>, i.e., it calls C<unimport Module LIST> instead of C<import>.
 
 If no C<unimport> method can be found the call fails with a fatal error.
 
-See L<perlmod> for a list of standard modules and pragmas.
+See L<perlmod> for a list of standard modules and pragmas.  See L<perlrun>
+for the C<-M> and C<-m> command-line options to perl that give C<use>
+functionality from the command-line.
 
 =item utime LIST
 
@@ -5466,7 +5496,7 @@ If BITS is 8, "elements" coincide with bytes of the input string.
 
 If BITS is 16 or more, bytes of the input string are grouped into chunks
 of size BITS/8, and each group is converted to a number as with
-pack()/unpack() with big-endian formats C<n>/C<N> (and analoguously
+pack()/unpack() with big-endian formats C<n>/C<N> (and analogously
 for BITS==64).  See L<"pack"> for details.
 
 If bits is 4 or less, the string is broken into bytes, then the bits
@@ -5481,9 +5511,18 @@ to give the expression the correct precedence as in
 
     vec($image, $max_x * $x + $y, 8) = 3;
 
-If the selected element is off the end of the string, the value 0 is
-returned.  If an element off the end of the string is written to,
-Perl will first extend the string with sufficiently many zero bytes.
+If the selected element is outside the string, the value 0 is returned.
+If an element off the end of the string is written to, Perl will first
+extend the string with sufficiently many zero bytes.   It is an error
+to try to write off the beginning of the string (i.e. negative OFFSET).
+
+The string should not contain any character with the value > 255 (which
+can only happen if you're using UTF8 encoding).  If it does, it will be
+treated as something which is not UTF8 encoded.  When the C<vec> was
+assigned to, other parts of your program will also no longer consider the
+string to be UTF8 encoded.  In other words, if you do have such characters
+in your string, vec() will operate on the actual byte string, and not the
+conceptual character string.
 
 Strings created with C<vec> can also be manipulated with the logical
 operators C<|>, C<&>, C<^>, and C<~>.  These operators will assume a bit
index f2b4b90..4d62774 100644 (file)
@@ -4,10 +4,10 @@ perlguts - Introduction to the Perl API
 
 =head1 DESCRIPTION
 
-This document attempts to describe how to use the Perl API, as well as containing 
-some info on the basic workings of the Perl core. It is far from complete 
-and probably contains many errors. Please refer any questions or 
-comments to the author below.
+This document attempts to describe how to use the Perl API, as well as
+containing some info on the basic workings of the Perl core. It is far
+from complete and probably contains many errors. Please refer any
+questions or comments to the author below.
 
 =head1 Variables
 
@@ -210,6 +210,39 @@ line and all will be well.
 To free an SV that you've created, call C<SvREFCNT_dec(SV*)>.  Normally this
 call is not necessary (see L<Reference Counts and Mortality>).
 
+=head2 Offsets
+
+Perl provides the function C<sv_chop> to efficiently remove characters
+from the beginning of a string; you give it an SV and a pointer to
+somewhere inside the the PV, and it discards everything before the
+pointer. The efficiency comes by means of a little hack: instead of
+actually removing the characters, C<sv_chop> sets the flag C<OOK>
+(offset OK) to signal to other functions that the offset hack is in
+effect, and it puts the number of bytes chopped off into the IV field
+of the SV. It then moves the PV pointer (called C<SvPVX>) forward that
+many bytes, and adjusts C<SvCUR> and C<SvLEN>. 
+
+Hence, at this point, the start of the buffer that we allocated lives
+at C<SvPVX(sv) - SvIV(sv)> in memory and the PV pointer is pointing
+into the middle of this allocated storage.
+
+This is best demonstrated by example:
+
+  % ./perl -Ilib -MDevel::Peek -le '$a="12345"; $a=~s/.//; Dump($a)'
+  SV = PVIV(0x8128450) at 0x81340f0
+    REFCNT = 1
+    FLAGS = (POK,OOK,pPOK)
+    IV = 1  (OFFSET)
+    PV = 0x8135781 ( "1" . ) "2345"\0
+    CUR = 4
+    LEN = 5
+
+Here the number of bytes chopped off (1) is put into IV, and
+C<Devel::Peek::Dump> helpfully reminds us that this is an offset. The
+portion of the string between the "real" and the "fake" beginnings is
+shown in parentheses, and the values of C<SvCUR> and C<SvLEN> reflect
+the fake beginning, not the real one.
+
 =head2 What's Really Stored in an SV?
 
 Recall that the usual method of determining the type of scalar you have is
@@ -1877,18 +1910,49 @@ This function isn't exported out of the Perl core.
 If you edit F<embed.pl>, you will need to run C<make regen_headers> to
 force a rebuild of F<embed.h> and other auto-generated files.
 
-=head2 Formatted Printing of IVs and UVs
+=head2 Formatted Printing of IVs, UVs, and NVs
 
-If you are printing IVs or UVs instead of the stdio(3) style formatting
-codes like C<%d> you should use the following macros for portability
+If you are printing IVs, UVs, or NVS instead of the stdio(3) style
+formatting codes like C<%d>, C<%ld>, C<%f>, you should use the
+following macros for portability
 
        IVdf            IV in decimal
        UVuf            UV in decimal
        UVof            UV in octal
        UVxf            UV in hexadecimal
+       NVef            NV %e-like
+       NVff            NV %f-like
+       NVgf            NV %g-like
+
+These will take care of 64-bit integers and long doubles.
+For example:
+
+       printf("IV is %"IVdf"\n", iv);
+
+The IVdf will expand to whatever is the correct format for the IVs.
+
+If you are printing addresses of pointers, use UVxf combined
+with PTR2UV(), do not use %lx or %p.
+
+=head2 Pointer-To-Integer and Integer-To-Pointer
+
+Because pointer size does not necessarily equal integer size,
+use the follow macros to do it right.
+
+       PTR2UV(pointer)
+       PTR2IV(pointer)
+       PTR2NV(pointer)
+       INT2PTR(pointertotype, integer)
+
+For example:
+
+       IV  iv = ...;
+       SV *sv = INT2PTR(SV*, iv);
+
+and
 
-For example: printf("IV is %"IVdf"\n", iv);  That will expand
-to whatever is the correct format for the IVs.
+       AV *av = ...;
+       UV  uv = PTR2UV(av);
 
 =head2 Source Documentation
 
@@ -1941,8 +2005,7 @@ produced a new character set containing all the characters you can
 possibly think of and more. There are several ways of representing these
 characters, and the one Perl uses is called UTF8. UTF8 uses
 a variable number of bytes to represent a character, instead of just
-one. You can learn more about Unicode at
-L<http://www.unicode.org/|http://www.unicode.org/>
+one. You can learn more about Unicode at http://www.unicode.org/
 
 =head2 How can I recognise a UTF8 string?
 
@@ -1963,7 +2026,7 @@ whether the current character in a string is valid UTF8.
 As mentioned above, UTF8 uses a variable number of bytes to store a
 character. Characters with values 1...128 are stored in one byte, just
 like good ol' ASCII. Character 129 is stored as C<v194.129>; this
-contines up to character 191, which is C<v194.191>. Now we've run out of
+continues up to character 191, which is C<v194.191>. Now we've run out of
 bits (191 is binary C<10111111>) so we move on; 192 is C<v195.128>. And
 so it goes on, moving to three bytes at character 2048.
 
@@ -2075,12 +2138,12 @@ However, you must not do this, for example:
         sv_utf8_upgrade(left);
 
 If you do this in a binary operator, you will actually change one of the
-strings that came into the operator, and, while it shouldn't be noticable
+strings that came into the operator, and, while it shouldn't be noticeable
 by the end user, it can cause problems.
 
 Instead, C<bytes_to_utf8> will give you a UTF8-encoded B<copy> of its
 string argument. This is useful for having the data available for
-comparisons and so on, without harming the orginal SV. There's also
+comparisons and so on, without harming the original SV. There's also
 C<utf8_to_bytes> to go the other way, but naturally, this will fail if
 the string contains any characters above 255 that can't be represented
 in a single byte.
index 4d2545d..3abc1f7 100644 (file)
@@ -210,11 +210,11 @@ Selective parts are also visible via the rsync protocol.  To get all
 the individual changes to the mainline since the last development
 release, use the following command:
 
-    rsync -avuz rsync://ftp.linux.activestate.com/perl-diffs perl-diffs
+    rsync -avz rsync://ftp.linux.activestate.com/perl-diffs perl-diffs
 
 Use this to get the latest source tree in full:
 
-    rsync -avuz rsync://ftp.linux.activestate.com/perl-current perl-current
+    rsync -avz rsync://ftp.linux.activestate.com/perl-current perl-current
 
 Needless to say, the source code in perl-current is usually in a perpetual
 state of evolution.  You should expect it to be very buggy.  Do B<not> use
@@ -568,7 +568,7 @@ make sure that the SV B<has> a valid PV, by calling the C<SvPV_force>
 macro to force a PV. As a side effect, C<tlen> gets set to the current
 value of the PV, and the PV itself is returned to C<junk>.
 
-In line 7, we make sure that the SV will have enough room to accomodate
+In line 7, we make sure that the SV will have enough room to accommodate
 the old string, the new string and the null terminator. If C<LEN> isn't
 big enough, C<SvGROW> will reallocate space for us.
 
@@ -1230,7 +1230,7 @@ the first active format:
                      sprintf "%vd", pack("C0U*",1,20,300,4000);
  print "ok $test\n"; $test++;
 
-Musn't forget to change the number of tests which appears at the top, or
+Mustn't forget to change the number of tests which appears at the top, or
 else the automated tester will get confused:
 
  -print "1..156\n";
@@ -1283,13 +1283,156 @@ We end up with a patch looking a little like this:
 And finally, we submit it, with our rationale, to perl5-porters. Job
 done!
 
+=head1 EXTERNAL TOOLS FOR DEBUGGING PERL
+
+Sometimes it helps to use external tools while debugging and
+testing Perl.  This section tries to guide you through using
+some common testing and debugging tools with Perl.  This is
+meant as a guide to interfacing these tools with Perl, not
+as any kind of guide to the use of the tools themselves.
+
+=head2 Rational Software's Purify
+
+Purify is a commercial tool that is helpful in identifying
+memory overruns, wild pointers, memory leaks and other such
+badness.  Perl must be compiled in a specific way for
+optimal testing with Purify.  Purify is available under
+Windows NT, Solaris, HP-UX, SGI, and Siemens Unix.
+
+The only currently known leaks happen when there are
+compile-time errors within eval or require.  (Fixing these
+is non-trivial, unfortunately, but they must be fixed
+eventually.)
+
+=head2 Purify on Unix
+
+On Unix, Purify creates a new Perl binary.  To get the most
+benefit out of Purify, you should create the perl to Purify
+using:
+
+    sh Configure -Accflags=-DPURIFY -Doptimize='-g' \
+     -Uusemymalloc -Dusemultiplicity
+
+where these arguments mean:
+
+=over 4
+
+=item -Accflags=-DPURIFY
+
+Disables Perl's arena memory allocation functions, as well as
+forcing use of memory allocation functions derived from the
+system malloc.
+
+=item -Doptimize='-g'
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=item -Uusemymalloc
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item -Dusemultiplicity
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=back
+
+Once you've compiled a perl suitable for Purify'ing, then you
+can just:
+
+    make pureperl   
+
+which creates a binary named 'pureperl' that has been Purify'ed.
+This binary is used in place of the standard 'perl' binary
+when you want to debug Perl memory problems.
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run the Purify'ed
+perl as:
+
+    make pureperl
+    cd t
+    ../pureperl -I../lib harness 
+
+which would run Perl on test.pl and report any memory problems.
+
+Purify outputs messages in "Viewer" windows by default.  If
+you don't have a windowing environment or if you simply
+want the Purify output to unobtrusively go to a log file
+instead of to the interactive window, use these following
+options to output to the log file "perl.log":
+
+    setenv PURIFYOPTIONS "-chain-length=25 -windows=no \
+     -log-file=perl.log -append-logfile=yes"
+
+If you plan to use the "Viewer" windows, then you only need this option:
+
+    setenv PURIFYOPTIONS "-chain-length=25"
+
+=head2 Purify on NT
+
+Purify on Windows NT instruments the Perl binary 'perl.exe'
+on the fly.  There are several options in the makefile you
+should change to get the most use out of Purify:
+
+=over 4
+
+=item DEFINES
+
+You should add -DPURIFY to the DEFINES line so the DEFINES
+line looks something like:
+
+    DEFINES = -DWIN32 -D_CONSOLE -DNO_STRICT $(CRYPT_FLAG) -DPURIFY=1 
+
+to disable Perl's arena memory allocation functions, as
+well as to force use of memory allocation functions derived
+from the system malloc.
+
+=item USE_MULTI = define
+
+Enabling the multiplicity option allows perl to clean up
+thoroughly when the interpreter shuts down, which reduces the
+number of bogus leak reports from Purify.
+
+=item #PERL_MALLOC = define
+
+Disable Perl's malloc so that Purify can more closely monitor
+allocations and leaks.  Using Perl's malloc will make Purify
+report most leaks in the "potential" leaks category.
+
+=item CFG = Debug
+
+Adds debugging information so that you see the exact source
+statements where the problem occurs.  Without this flag, all
+you will see is the source filename of where the error occurred.
+
+=back
+
+As an example, to show any memory leaks produced during the
+standard Perl testset you would create and run Purify as:
+
+    cd win32
+    make
+    cd ../t
+    purify ../perl -I../lib harness 
+
+which would instrument Perl in memory, run Perl on test.pl,
+then finally report any memory problems.
+
 =head2 CONCLUSION
 
 We've had a brief look around the Perl source, an overview of the stages
 F<perl> goes through when it's running your code, and how to use a
-debugger to poke at the Perl guts. Finally, we took a very simple
-problem and demonstrated how to solve it fully - with documentation,
-regression tests, and finally a patch for submission to p5p.
+debugger to poke at the Perl guts. We took a very simple problem and
+demonstrated how to solve it fully - with documentation, regression
+tests, and finally a patch for submission to p5p.  Finally, we talked
+about how to use external tools to debug and test Perl.
 
 I'd now suggest you read over those references again, and then, as soon
 as possible, get your hands dirty. The best way to learn is by doing,
index 4311ee2..2aa928c 100644 (file)
@@ -36,7 +36,7 @@ Perl history in brief, by Larry Wall:
 
 Larry Wall, Andy Dougherty, Tom Christiansen, Charles Bailey, Nick
 Ing-Simmons, Chip Salzenberg, Tim Bunce, Malcolm Beattie, Gurusamy
-Sarathy, Graham Barr.
+Sarathy, Graham Barr, Jarkko Hietaniemi.
 
 =head2 PUMPKIN?
 
@@ -341,6 +341,10 @@ the strings?).
          5.6.0-RC3     2000-Mar-21     release candidate 3
          5.6.0         2000-Mar-22
 
+ Sarathy  5.6.1         2000-***-**    The 5.6 maintenance track.
+
+ Jarkko   5.7.0         2000-Sep-02    The 5.7 track: Development.
+
 =head2 SELECTED RELEASE SIZES
 
 For example the notation "core: 212  29" in the release 1.000 means that
index 8afabd9..11d9385 100644 (file)
@@ -1,13 +1,13 @@
 =head1 NAME
 
-perlintern - autogenerated documentation of purely B<internal> 
+perlintern - autogenerated documentation of purely B<internal>
                 Perl functions
 
 =head1 DESCRIPTION
 
-This file is the autogenerated documentation of functions in the 
+This file is the autogenerated documentation of functions in the
 Perl interpreter that are documented using Perl's internal documentation
-format but are not marked as part of the Perl API. In other words, 
+format but are not marked as part of the Perl API. In other words,
 B<they are not for use in extensions>!
 
 =over 8
@@ -31,8 +31,8 @@ Found in file gv.c
 
 =head1 AUTHORS
 
-The autodocumentation system was originally added to the Perl core by 
-Benjamin Stuhl. Documentation is by whoever was kind enough to 
+The autodocumentation system was originally added to the Perl core by
+Benjamin Stuhl. Documentation is by whoever was kind enough to
 document their functions.
 
 =head1 SEE ALSO
index 6467a29..94b6bde 100644 (file)
@@ -745,6 +745,7 @@ go back to service a new client.
                at port $port";
 
        spawn sub {
+           $|=1;
            print "Hello there, $name, it's now ", scalar localtime, $EOL;
            exec '/usr/games/fortune'           # XXX: `wrong' line terminators
                or confess "can't exec fortune: $!";
@@ -1246,6 +1247,11 @@ find yourself overly concerned about reliability and start building checks
 into your message system, then you probably should use just TCP to start
 with.
 
+Note that UDP datagrams are I<not> a bytestream and should not be treated
+as such. This makes using I/O mechanisms with internal buffering
+like stdio (i.e. print() and friends) especially cumbersome. Use syswrite(),
+or better send(), like in the example below.
+
 Here's a UDP program similar to the sample Internet TCP client given
 earlier.  However, instead of checking one host at a time, the UDP version
 will check many of them asynchronously by simulating a multicast and then
@@ -1296,6 +1302,11 @@ with TCP, you'd have to use a different socket handle for each host.
        $count--;
     }
 
+Note that this example does not include any retries and may consequently
+fail to contact a reachable host. The most prominent reason for this
+is congestion of the queues on the sending host if the number of
+list of hosts to contact is sufficiently large.
+
 =head1 SysV IPC
 
 While System V IPC isn't so widely used as sockets, it still has some
index 0052d33..3dd3ba9 100644 (file)
@@ -30,18 +30,17 @@ Similarly all warnings are disabled in a block by either of these:
 For example, consider the code below:
 
     use warnings ;
-    my $a ;
-    my $b ;
+    my @a ;
     {
         no warnings ;
-       $b = 2 if $a EQ 3 ;
+       my $b = @a[0] ;
     }
-    $b = 1 if $a NE 3 ;
+    my $c = @a[0];
 
 The code in the enclosing block has warnings enabled, but the inner
-block has them disabled. In this case that means that the use of the C<EQ>
-operator won't trip a C<"Use of EQ is deprecated"> warning, but the use of
-C<NE> will produce a C<"Use of NE is deprecated"> warning.
+block has them disabled. In this case that means the assignment to the
+scalar C<$c> will trip the C<"Scalar value @a[0] better written as $a[0]">
+warning, but the assignment to the scalar C<$b> will not.
 
 =head2 Default Warnings and Optional Warnings
 
@@ -100,7 +99,7 @@ disable compile-time warnings you need to rewrite the code like this:
         my $b ; chop $b ;
      }
 
-The other big problem with C<$^W> is that way you can inadvertently
+The other big problem with C<$^W> is the way you can inadvertently
 change the warning setting in unexpected places in your code. For example,
 when the code below is run (without the B<-w> flag), the second call
 to C<doit> will trip a C<"Use of uninitialized value"> warning, whereas
@@ -321,27 +320,38 @@ L<perldiag>.
 
 The presence of the word "FATAL" in the category list will escalate any
 warnings detected from the categories specified in the lexical scope
-into fatal errors. In the code below, there are 3 places where a
-deprecated warning will be detected, the middle one will produce a
-fatal error.
-
+into fatal errors. In the code below, the use of C<time>, C<length>
+and C<join> can all produce a C<"Useless use of xxx in void context">
+warning.
 
     use warnings ;
-
-    $a = 1 if $a EQ $b ;
-
+    time ;
     {
-        use warnings FATAL => qw(deprecated) ;
-        $a = 1 if $a EQ $b ;
+        use warnings FATAL => qw(void) ;
+        length "abc" ;
     }
+    join "", 1,2,3 ;
+    print "done\n" ;     
+
+When run it produces this output
+
+    Useless use of time in void context at fatal line 3.
+    Useless use of length in void context at fatal line 7.  
+
+The scope where C<length> is used has escalated the C<void> warnings
+category into a fatal error, so the program terminates immediately it
+encounters the warning.
 
-    $a = 1 if $a EQ $b ;
 
 =head2 Reporting Warnings from a Module
 
 The C<warnings> pragma provides a number of functions that are useful for
 module authors. These are used when you want to report a module-specific
-warning when the calling module has enabled warnings via the C<warnings>
+warning to a calling module has enabled warnings via the C<warnings>
 pragma.
 
 Consider the module C<MyMod::Abc> below.
@@ -361,11 +371,11 @@ Consider the module C<MyMod::Abc> below.
     1 ;
 
 The call to C<warnings::register> will create a new warnings category
-called "MyMod::abc", i.e. the new category name matches the module
-name. The C<open> function in the module will display a warning message
-if it gets given a relative path as a parameter. This warnings will only
-be displayed if the code that uses C<MyMod::Abc> has actually enabled
-them with the C<warnings> pragma like below.
+called "MyMod::abc", i.e. the new category name matches the current
+package name. The C<open> function in the module will display a warning
+message if it gets given a relative path as a parameter. This warnings
+will only be displayed if the code that uses C<MyMod::Abc> has actually
+enabled them with the C<warnings> pragma like below.
 
     use MyMod::Abc;
     use warnings 'MyMod::Abc';
@@ -379,10 +389,8 @@ this snippet of code:
     package MyMod::Abc;
 
     sub open {
-        if (warnings::enabled("deprecated")) {
-            warnings::warn("deprecated", 
-                           "open is deprecated, use new instead") ;
-        }
+        warnings::warnif("deprecated", 
+                         "open is deprecated, use new instead") ;
         new(@_) ;
     }
 
@@ -399,18 +407,89 @@ display a warning message whenever the calling module has (at least) the
     ...
     MyMod::Abc::open($filename) ;
 
-The C<warnings::warn> function should be used to actually display the
-warnings message. This is because they can make use of the feature that
-allows warnings to be escalated into fatal errors. So in this case
+Either the C<warnings::warn> or C<warnings::warnif> function should be
+used to actually display the warnings message. This is because they can
+make use of the feature that allows warnings to be escalated into fatal
+errors. So in this case
 
     use MyMod::Abc;
     use warnings FATAL => 'MyMod::Abc';
     ...
     MyMod::Abc::open('../fred.txt');
 
-the C<warnings::warn> function will detect this and die after
+the C<warnings::warnif> function will detect this and die after
 displaying the warning message.
 
+The three warnings functions, C<warnings::warn>, C<warnings::warnif>
+and C<warnings::enabled> can optionally take an object reference in place
+of a category name. In this case the functions will use the class name
+of the object as the warnings category.
+
+Consider this example:
+
+    package Original ;
+
+    no warnings ;
+    use warnings::register ;
+
+    sub new
+    {
+        my $class = shift ;
+        bless [], $class ;
+    }
+
+    sub check
+    {
+        my $self = shift ;
+        my $value = shift ;
+
+        if ($value % 2 && warnings::enabled($self))
+          { warnings::warn($self, "Odd numbers are unsafe") }
+    }
+
+    sub doit
+    {
+        my $self = shift ;
+        my $value = shift ;
+        $self->check($value) ;
+        # ...
+    }
+
+    1 ;
+
+    package Derived ;
+
+    use warnings::register ;
+    use Original ;
+    our @ISA = qw( Original ) ;
+    sub new
+    {
+        my $class = shift ;
+        bless [], $class ;
+    }
+
+   
+    1 ;
+
+The code below makes use of both modules, but it only enables warnings from 
+C<Derived>.
+
+    use Original ;
+    use Derived ;
+    use warnings 'Derived';
+    my $a = new Original ;
+    $a->doit(1) ;
+    my $b = new Derived ;
+    $a->doit(1) ;
+
+When this code is run only the C<Derived> object, C<$b>, will generate
+a warning. 
+
+    Odd numbers are unsafe at main.pl line 7
+
+Notice also that the warning is reported at the line where the object is first
+used.
+
 =head1 TODO
 
   perl5db.pl
@@ -424,6 +503,8 @@ displaying the warning message.
     around the limitations of C<$^W>. Now that those limitations are gone,
     the module should be revisited.
 
+  document calling the warnings::* functions from XS
+
 =head1 SEE ALSO
 
 L<warnings>, L<perldiag>.
index a257e38..3d9a58a 100644 (file)
@@ -947,7 +947,7 @@ In certain systems, the operating system's locale support
 is broken and cannot be fixed or used by Perl.  Such deficiencies can
 and will result in mysterious hangs and/or Perl core dumps when the
 C<use locale> is in effect.  When confronted with such a system,
-please report in excruciating detail to <F<perlbug@perl.com>>, and
+please report in excruciating detail to <F<perlbug@perl.org>>, and
 complain to your vendor: bug fixes may exist for these problems
 in your operating system.  Sometimes such bug fixes are called an
 operating system upgrade.
index 6bec46b..6f98cf6 100644 (file)
@@ -8,7 +8,7 @@ perlmod - Perl modules (packages and symbol tables)
 
 Perl provides a mechanism for alternative namespaces to protect
 packages from stomping on each other's variables.  In fact, there's
-really no such thing as a global variable in Perl .  The package
+really no such thing as a global variable in Perl.  The package
 statement declares the compilation unit as being in the given
 namespace.  The scope of the package declaration is from the
 declaration itself through the end of the enclosing block, C<eval>,
@@ -96,6 +96,12 @@ table lookups at compile time:
     local *main::foo    = *main::bar;
     local $main::{foo}  = $main::{bar};
 
+(Be sure to note the B<vast> difference between the second line above
+and C<local $main::foo = $main::bar>. The former is accessing the hash
+C<%main::>, which is the symbol table of package C<main>. The latter is
+simply assigning scalar C<$bar> in package C<main> to scalar C<$foo> of
+the same package.)
+
 You can use this to print out all the variables in a package, for
 instance.  The standard but antiquated F<dumpvar.pl> library and
 the CPAN module Devel::Symdump make use of this.
@@ -139,7 +145,7 @@ Another use of symbol tables is for making "constant" scalars.
 
     *PI = \3.14159265358979;
 
-Now you cannot alter $PI, which is probably a good thing all in all.
+Now you cannot alter C<$PI>, which is probably a good thing all in all.
 This isn't the same as a constant subroutine, which is subject to
 optimization at compile-time.  A constant subroutine is one prototyped
 to take no arguments and to return a constant expression.  See 
@@ -304,6 +310,10 @@ create a file called F<Some/Module.pm> and start with this template:
     }
     our @EXPORT_OK;
 
+    # exported package globals go here
+    our $Var1;
+    our %Hashit;
+
     # non-exported package globals go here
     our @more;
     our $stuff;
index 57f62a5..0fc359e 100644 (file)
@@ -47,7 +47,7 @@ Makefile.PL PREFIX=/my/perl_directory> to install the modules
 into C</my/perl_directory>.  Then you can use the modules
 from your Perl programs with C<use lib
 "/my/perl_directory/lib/site_perl"> or sometimes just C<use
-"/my/perl_directory">.  
+"/my/perl_directory">.
 
 =over 4
 
@@ -55,16 +55,16 @@ from your Perl programs with C<use lib
 
 B<If you're on Unix,>
 
-You can use Andreas Koenig's CPAN module 
+You can use Andreas Koenig's CPAN module
 (which comes standard with Perl, or can itself be downloaded
-from http://www.perl.com/CPAN/modules/by-module/CPAN) 
+from http://www.perl.com/CPAN/modules/by-module/CPAN)
 to automate the following steps, from DECOMPRESS through INSTALL.
 
-A. DECOMPRESS 
+A. DECOMPRESS
 
 Decompress the file with C<gzip -d yourmodule.tar.gz>
 
-You can get gzip from ftp://prep.ai.mit.edu/pub/gnu. 
+You can get gzip from ftp://prep.ai.mit.edu/pub/gnu.
 
 Or, you can combine this step with the next to save disk space:
 
@@ -126,13 +126,14 @@ CPAN for others to use.  If it doesn't, go to INSTALL.
    D. INSTALL
 
 Copy the module into your Perl's I<lib> directory.  That'll be one
-of the directories you see when you type 
+of the directories you see when you type
 
    perl -e 'print "@INC"'
 
 =item *
 
-B<If you're running Windows 95 or NT with the core Windows distribution of Perl,>
+B<If you're running Windows 95 or NT with the core Windows distribution of
+Perl,>
 
    A. DECOMPRESS
 
@@ -185,63 +186,66 @@ B<If you're using a Macintosh,>
 
 A. DECOMPRESS
 
-In general, all Macintosh decompression utilities mentioned here
-can be found in the Info-Mac Hyperarchive
-( http://hyperarchive.lcs.mit.edu/HyperArchive.html ).
-Specifically the "Compress & Translate" listing
-( http://hyperarchive.lcs.mit.edu/HyperArchive/Abstracts/cmp/HyperArchive.html ).
+First thing you should do is make sure you have the latest B<cpan-mac>
+distribution ( http://www.cpan.org/authors/id/CNANDOR/ ), which has
+utilities for doing all of the steps.  Read the cpan-mac directions
+carefully and install it.  If you choose not to use cpan-mac
+for some reason, there are alternatives listed here.
 
+After installing cpan-mac, drop the module archive on the
+B<untarzipme> droplet, which will decompress and unpack for you.
 
-You can either use the shareware B<StuffIt Expander> program
-( http://www.aladdinsys.com/expander/ ) 
-in combination with I<DropStuff with Expander Enhancer>
-( http://www.aladdinsys.com/dropstuff/ ) 
+B<Or>, you can either use the shareware B<StuffIt Expander> program
+( http://www.aladdinsys.com/expander/ )
+in combination with B<DropStuff with Expander Enhancer>
+( http://www.aladdinsys.com/dropstuff/ )
 or the freeware B<MacGzip> program (
 http://persephone.cps.unizar.es/general/gente/spd/gzip/gzip.html ).
 
-
 B. UNPACK
 
-If you're using DropStuff or Stuffit, you can just extract the tar
-archive.  Otherwise, you can use the freeware B<suntar> or I<Tar> (
+If you're using untarzipme or StuffIt, the archive should be extracted
+now.  B<Or>, you can use the freeware B<suntar> or I<Tar> (
 http://hyperarchive.lcs.mit.edu/HyperArchive/Archive/cmp/ ).
 
 C. BUILD
 
-Does the module require compilation? 
-
-1. If it does,
+Check the contents of the distribution.
+Read the module's documentation, looking for
+reasons why you might have trouble using it with MacPerl.  Look for
+F<.xs> and F<.c> files, which normally denote that the distribution
+must be compiled, and you cannot install it "out of the box."
+(See L<"PORTABILITY">.)
+
+If a module does not work on MacPerl but should, or needs to be
+compiled, see if the module exists already as a port on the
+MacPerl Module Porters site (http://pudge.net/mmp/).
+For more information on doing XS with MacPerl yourself, see
+Arved Sandstrom's XS tutorial (http://macperl.com/depts/Tutorials/),
+and then consider uploading your binary to the CPAN and
+registering it on the MMP site.
 
-Overview: You need MPW and a combination of new and old CodeWarrior
-compilers for MPW and libraries.  Makefiles created for building under
-MPW use Metrowerks compilers.  It's most likely possible to build
-without other compilers, but it has not been done successfully, to our
-knowledge.  Read the documentation in I<MacPerl: Power and Ease> (
-http://www.ptf.com/macperl/ ) on porting/building extensions, or find
-an existing precompiled binary, or hire someone to build it for you.
+D. INSTALL
 
-Or, ask someone on the mac-perl mailing list (mac-perl@iis.ee.ethz.ch)
-to build it for you.  To subscribe to the mac-perl mailing list, send
-mail to mac-perl-request@iis.ee.ethz.ch.
+If you are using cpan-mac, just drop the folder on the
+B<installme> droplet, and use the module.
 
-2. If the module doesn't require compilation, go to INSTALL.
-
-D. INSTALL
+B<Or>, if you aren't using cpan-mac, do some manual labor.
 
 Make sure the newlines for the modules are in Mac format, not Unix format.
 If they are not then you might have decompressed them incorrectly.  Check
 your decompression and unpacking utilities settings to make sure they are
 translating text files properly.
 
-As a last resort, you can use the perl one-liner:  
+As a last resort, you can use the perl one-liner:
 
-    perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames> 
+    perl -i.bak -pe 's/(?:\015)?\012/\015/g' <filenames>
 
 on the source files.
 
-Move the files manually into the correct folders.
-
-Move the files to their final destination: This will
+Then move the files (probably just the F<.pm> files, though there
+may be some additional ones, too; check the module documentation)
+to their final destination: This will
 most likely be in C<$ENV{MACPERL}site_lib:> (i.e.,
 C<HD:MacPerl folder:site_lib:>).  You can add new paths to
 the default C<@INC> in the Preferences menu item in the
@@ -251,16 +255,13 @@ automagically).  Create whatever directory structures are required
 C<$ENV{MACPERL}site_lib:Some:> and put
 C<Module.pm> in that directory).
 
-Run the following script (or something like it):
+Then run the following script (or something like it):
 
      #!perl -w
      use AutoSplit;
      my $dir = "${MACPERL}site_perl";
      autosplit("$dir:Some:Module.pm", "$dir:auto", 0, 1, 1);
 
-Eventually there should be a way to automate the installation process; some
-solutions exist, but none are ready for the general public yet.
-
 =item *
 
 B<If you're on the DJGPP port of DOS,>
@@ -268,7 +269,7 @@ B<If you're on the DJGPP port of DOS,>
    A. DECOMPRESS
 
 djtarx ( ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2/ )
-will both uncompress and unpack.  
+will both uncompress and unpack.
 
    B. UNPACK
 
@@ -289,7 +290,7 @@ in the Perl distribution.
 
 While still in that directory, type:
 
-     make install      
+     make install
 
 You will need the packages mentioned in F<README.dos> in the Perl distribution.
 
@@ -313,17 +314,17 @@ C<Your-Module-1_33.tgz>.
 
 A. DECOMPRESS
 
-Type 
+Type
 
     gzip -d Your-Module.tgz
 
-or, for zipped modules, type 
+or, for zipped modules, type
 
     unzip Your-Module.zip
 
 Executables for gzip, zip, and VMStar ( Alphas:
 http://www.openvms.digital.com/freeware/000TOOLS/ALPHA/ and Vaxen:
-http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ).  
+http://www.openvms.digital.com/freeware/000TOOLS/VAX/ ).
 
 gzip and tar
 are also available at ftp://ftp.digital.com/pub/VMS.
@@ -342,10 +343,11 @@ Or, if you're fond of VMS command syntax:
 
      tar/extract/verbose Your_Module.tar
 
-C. BUILD 
+C. BUILD
 
-Make sure you have MMS (from Digital) or the freeware MMK ( available from MadGoat at  http://www.madgoat.com ).  Then type this to create the
-DESCRIP.MMS for the module: 
+Make sure you have MMS (from Digital) or the freeware MMK ( available from
+MadGoat at  http://www.madgoat.com ).  Then type this to create the
+DESCRIP.MMS for the module:
 
     perl Makefile.PL
 
@@ -358,7 +360,7 @@ Substitute C<mmk> for C<mms> above if you're using MMK.
 
 D. INSTALL
 
-Type 
+Type
 
     mms install
 
@@ -371,16 +373,16 @@ B<If you're on MVS>,
 Introduce the F<.tar.gz> file into an HFS as binary; don't translate from
 ASCII to EBCDIC.
 
-A. DECOMPRESS 
+A. DECOMPRESS
 
       Decompress the file with C<gzip -d yourmodule.tar.gz>
 
-      You can get gzip from 
+      You can get gzip from
       http://www.s390.ibm.com/products/oe/bpxqp1.html.
 
 B. UNPACK
 
-Unpack the result with 
+Unpack the result with
 
      pax -o to=IBM-1047,from=ISO8859-1 -r < yourmodule.tar
 
@@ -390,6 +392,52 @@ available from http://www.mks.com/s390/gnu/index.htm.
 
 =back
 
+
+=head1 PORTABILITY
+
+Note that not all modules will work with on all platforms.
+See L<perlport> for more information on portability issues.
+Read the documentation to see if the module will work on your
+system.  There are basically three categories
+of modules that will not work "out of the box" with all
+platforms (with some possibility of overlap):
+
+=over 4
+
+=item *
+
+B<Those that should, but don't.>  These need to be fixed; consider
+contacting the author and possibly writing a patch.
+
+=item *
+
+B<Those that need to be compiled, where the target platform
+doesn't have compilers readily available.>  (These modules contain
+F<.xs> or F<.c> files, usually.)  You might be able to find
+existing binaries on the CPAN or elsewhere, or you might
+want to try getting compilers and building it yourself, and then
+release the binary for other poor souls to use.
+
+=item *
+
+B<Those that are targeted at a specific platform.>
+(Such as the Win32:: modules.)  If the module is targeted
+specifically at a platform other than yours, you're out
+of luck, most likely.
+
+=back
+
+
+
+Check the CPAN Testers if a module should work with your platform
+but it doesn't behave as you'd expect, or you aren't sure whether or
+not a module will work under your platform.  If the module you want
+isn't listed there, you can test it yourself and let CPAN Testers know,
+you can join CPAN Testers, or you can request it be tested.
+
+    http://testers.cpan.org/
+
+
 =head1 HEY
 
 If you have any suggested changes for this page, let me know.  Please
@@ -401,7 +449,7 @@ familiar with Perl on your operating system.
 
 =head1 AUTHOR
 
-Jon Orwant 
+Jon Orwant
 
 orwant@tpj.com
 
@@ -413,11 +461,13 @@ Nick Ing-Simmons, Tuomas J. Lukka, Laszlo Molnar, Chris Nandor, Alan
 Olsen, Peter Prymmer, Gurusamy Sarathy, Christoph Spalinger, Dan
 Sugalski, Larry Virden, and Ilya Zakharevich.
 
-July 22, 1998
+First version July 22, 1998
+
+Last Modified August 22, 2000
 
 =head1 COPYRIGHT
 
-Copyright (C) 1998 Jon Orwant.  All Rights Reserved.
+Copyright (C) 1998, 2000 Jon Orwant.  All Rights Reserved.
 
 Permission is granted to make and distribute verbatim copies of this
 documentation provided the copyright notice and this permission notice are
@@ -434,4 +484,3 @@ to this one.
 Permission is granted to copy and distribute translations of this
 documentation into another language, under the above conditions for
 modified versions.
-
index a594d72..e1ba87b 100644 (file)
@@ -115,7 +115,7 @@ print OUT <<'EOF';
 
 To find out I<all> modules installed on your system, including
 those without documentation or outside the standard release,
-jus tdo this:
+just do this:
 
     % find `perl -e 'print "@INC"'` -name '*.pm' -print
 
index 1c58080..f37279d 100644 (file)
@@ -736,7 +736,7 @@ By-name interface to Perl's built-in getpw*() functions
 
 To find out I<all> modules installed on your system, including
 those without documentation or outside the standard release,
-jus tdo this:
+just do this:
 
     % find `perl -e 'print "@INC"'` -name '*.pm' -print
 
index 1e4a9c3..ace8d85 100644 (file)
@@ -224,7 +224,7 @@ installs modules, and this produces a Makefile with a C<dist> target.
 
 Once you've ensured that your module passes its own tests - always a
 good thing to make sure - you can C<make dist>, and the Makefile will
-hopefully produce you a nice tarball of your module, ready for upliad.
+hopefully produce you a nice tarball of your module, ready for upload.
 
 =item Upload the tarball
 
index 3c84e60..e97a25b 100644 (file)
@@ -119,7 +119,7 @@ you increment a variable that is numeric, or that has ever been used in
 a numeric context, you get a normal increment.  If, however, the
 variable has been used in only string contexts since it was set, and
 has a value that is not the empty string and matches the pattern
-C</^[a-zA-Z]*[0-9]*$/>, the increment is done as a string, preserving each
+C</^[a-zA-Z]*[0-9]*\z/>, the increment is done as a string, preserving each
 character within its range, with carry:
 
     print ++($foo = '99');     # prints '100'
@@ -196,7 +196,7 @@ C<$a> minus the largest multiple of C<$b> that is not greater than
 C<$a>.  If C<$b> is negative, then C<$a % $b> is C<$a> minus the
 smallest multiple of C<$b> that is not less than C<$a> (i.e. the
 result will be less than or equal to zero). 
-Note than when C<use integer> is in scope, "%" give you direct access
+Note than when C<use integer> is in scope, "%" gives you direct access
 to the modulus operator as implemented by your C compiler.  This
 operator is not as well defined for negative operands, but it will
 execute faster.
@@ -299,7 +299,9 @@ to the right argument.
 
 Binary "<=>" returns -1, 0, or 1 depending on whether the left
 argument is numerically less than, equal to, or greater than the right
-argument.
+argument.  If your platform supports NaNs (not-a-numbers) as numeric
+values, using them with "<=>" (or any other numeric comparison)
+returns undef.
 
 Binary "eq" returns true if the left argument is stringwise equal to
 the right argument.
@@ -307,8 +309,9 @@ the right argument.
 Binary "ne" returns true if the left argument is stringwise not equal
 to the right argument.
 
-Binary "cmp" returns -1, 0, or 1 depending on whether the left argument is stringwise
-less than, equal to, or greater than the right argument.
+Binary "cmp" returns -1, 0, or 1 depending on whether the left
+argument is stringwise less than, equal to, or greater than the right
+argument.
 
 "lt", "le", "ge", "gt" and "cmp" use the collation (sort) order specified
 by the current locale if C<use locale> is in effect.  See L<perllocale>.
@@ -707,7 +710,7 @@ on a Mac, these are reversed, and on systems without line terminator,
 printing C<"\n"> may emit no actual data.  In general, use C<"\n"> when
 you mean a "newline" for your system, but use the literal ASCII when you
 need an exact character.  For example, most networking protocols expect
-and prefer a CR+LF (C<"\012\015"> or C<"\cJ\cM">) for line terminators,
+and prefer a CR+LF (C<"\015\012"> or C<"\cM\cJ">) for line terminators,
 and although they often accept just C<"\012">, they seldom tolerate just
 C<"\015">.  If you get in the habit of using C<"\n"> for networking,
 you may be burned some day.
@@ -848,9 +851,11 @@ string also resets the search position.
 
 You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
 zero-width assertion that matches the exact position where the previous
-C<m//g>, if any, left off.  The C<\G> assertion is not supported without
-the C</g> modifier.  (Currently, without C</g>, C<\G> behaves just like
-C<\A>, but that's accidental and may change in the future.)
+C<m//g>, if any, left off.  Without the C</g> modifier, the C<\G> assertion
+still anchors at pos(), but the match is of course only attempted once.
+Using C<\G> without C</g> on a target string that has not previously had a
+C</g> match applied to it is the same as using the C<\A> assertion to match
+the beginning of the string.
 
 Examples:
 
@@ -858,7 +863,7 @@ Examples:
     ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
 
     # scalar context
-    $/ = ""; $* = 1;  # $* deprecated in modern perls
+    $/ = "";
     while (defined($paragraph = <>)) {
        while ($paragraph =~ /[a-z]['")]*[.!?]+['")]*\s/g) {
            $sentences++;
@@ -876,6 +881,7 @@ Examples:
         print "3: '";
         print $1 while /(p)/gc; print "', pos=", pos, "\n";
     }
+    print "Final: '$1', pos=",pos,"\n" if /\G(.)/;
 
 The last example should print:
 
@@ -885,6 +891,13 @@ The last example should print:
     1: '', pos=7
     2: 'q', pos=8
     3: '', pos=8
+    Final: 'q', pos=8
+
+Notice that the final match matched C<q> instead of C<p>, which a match
+without the C<\G> anchor would have done. Also note that the final match
+did not update C<pos> -- C<pos> is only updated on a C</g> match. If the
+final match did indeed match C<p>, it's a good bet that you're running an
+older (pre-5.6.0) Perl.
 
 A useful idiom for C<lex>-like scanners is C</\G.../gc>.  You can
 combine several regexps like this to process a string part-by-part,
@@ -997,13 +1010,14 @@ for a detailed look at the semantics of regular expressions.
 
 =item `STRING`
 
-A string which is (possibly) interpolated and then executed as a system
-command with C</bin/sh> or its equivalent.  Shell wildcards, pipes,
-and redirections will be honored.  The collected standard output of the
-command is returned; standard error is unaffected.  In scalar context,
-it comes back as a single (potentially multi-line) string.  In list
-context, returns a list of lines (however you've defined lines with $/
-or $INPUT_RECORD_SEPARATOR).
+A string which is (possibly) interpolated and then executed as a
+system command with C</bin/sh> or its equivalent.  Shell wildcards,
+pipes, and redirections will be honored.  The collected standard
+output of the command is returned; standard error is unaffected.  In
+scalar context, it comes back as a single (potentially multi-line)
+string, or undef if the command failed.  In list context, returns a
+list of lines (however you've defined lines with $/ or
+$INPUT_RECORD_SEPARATOR), or an empty list if the command failed.
 
 Because backticks do not affect standard error, use shell file descriptor
 syntax (assuming the shell supports this) if you care to address this.
index ee147e9..0c35546 100644 (file)
@@ -181,10 +181,12 @@ numbers to secondary storage such as a disk file or tape.
 
 Conflicting storage orders make utter mess out of the numbers.  If a
 little-endian host (Intel, VAX) stores 0x12345678 (305419896 in
-decimal), a big-endian host (Motorola, MIPS, Sparc, PA) reads it as
-0x78563412 (2018915346 in decimal).  To avoid this problem in network
-(socket) connections use the C<pack> and C<unpack> formats C<n>
-and C<N>, the "network" orders.  These are guaranteed to be portable.
+decimal), a big-endian host (Motorola, Sparc, PA) reads it as
+0x78563412 (2018915346 in decimal).  Alpha and MIPS can be either:
+Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses
+them in big-endian mode.  To avoid this problem in network (socket)
+connections use the C<pack> and C<unpack> formats C<n> and C<N>, the
+"network" orders.  These are guaranteed to be portable.
 
 You can explore the endianness of your platform by unpacking a
 data structure packed in native format such as:
@@ -681,7 +683,7 @@ The ActiveState Pages, http://www.activestate.com/
 =item *
 
 The Cygwin environment for Win32; F<README.cygwin> (installed 
-as L<perlcygwin>), http://sourceware.cygnus.com/cygwin/
+as L<perlcygwin>), http://sources.redhat.com/cygwin/
 
 =item *
 
@@ -1042,7 +1044,8 @@ Also see:
 
 *
 
-L<perlos390>, F<README.os390>, F<README.posix-bc>, F<README.vmesa>
+L<perlos390>, F<README.os390>, F<perlposix-bc>, F<README.vmesa>,
+L<perlebcdic>.
 
 =item *
 
@@ -1053,7 +1056,7 @@ general usage issues for all EBCDIC Perls.  Send a message body of
 =item  *
 
 AS/400 Perl information at
-ttp://as400.rochester.ibm.com/
+http://as400.rochester.ibm.com/
 as well as on CPAN in the F<ports/> directory.
 
 =back
@@ -1753,7 +1756,7 @@ two seconds. (Win32)
 Not implemented. (S<Mac OS>, VOS)
 
 Can only be applied to process handles returned for processes spawned
-using C<system(1, ...)>. (Win32)
+using C<system(1, ...)> or pseudo processes created with C<fork()>. (Win32)
 
 Not useful. (S<RISC OS>)
 
@@ -1992,8 +1995,9 @@ http://www.perl.com/CPAN/ports/index.html for binary distributions.
 
 =head1 SEE ALSO
 
-L<perlamiga>, L<perlcygwin>, L<perldos>, L<perlhpux>, L<perlos2>,
-L<perlos390>, L<perlwin32>, L<perlvms>, and L<Win32>.
+L<perlaix>, L<perlamiga>, L<perlcygwin>, L<perldos>, L<perlebcdic>,
+L<perlhpux>, L<perlos2>, L<perlos390>, L<perlposix-bc>, L<perlwin32>,
+L<perlvms>, and L<Win32>.
 
 =head1 AUTHORS / CONTRIBUTORS
 
@@ -2009,7 +2013,7 @@ Neale Ferguson <neale@mailbox.tabnsw.com.au>,
 David J. Fiander <davidf@mks.com>,
 Paul Green <Paul_Green@stratus.com>,
 M.J.T. Guy <mjtg@cus.cam.ac.uk>,
-Jarkko Hietaniemi <jhi@iki.fi<gt>,
+Jarkko Hietaniemi <jhi@iki.fi>,
 Luther Huffman <lutherh@stratcom.com>,
 Nick Ing-Simmons <nick@ni-s.u-net.com>,
 Andreas J. KE<ouml>nig <koenig@kulturbox.de>,
index c964be8..380bc5f 100644 (file)
@@ -199,20 +199,26 @@ equivalents (if available) are as follows:
     alpha
     alnum
     ascii
+    blank              [1]
     cntrl
     digit       \d
     graph
     lower
     print
     punct
-    space       \s
+    space       \s     [2]
     upper
-    word        \w
+    word        \w     [3]
     xdigit
 
+  [1] A GNU extension equivalent to C<[ \t]>, `all horizontal whitespace'.
+  [2] Not I<exactly equivalent> to C<\s> since the C<[[:space:]]> includes
+      also the (very rare) `vertical tabulator', "\ck", chr(11).
+  [3] A Perl extension. 
+
 For example use C<[:upper:]> to match all the uppercase characters.
-Note that the C<[]> are part of the C<[::]> construct, not part of the whole
-character class.  For example:
+Note that the C<[]> are part of the C<[::]> construct, not part of the
+whole character class.  For example:
 
     [01[:alpha:]%]
 
@@ -224,6 +230,7 @@ If the C<utf8> pragma is used, the following equivalences to Unicode
     alpha       IsAlpha
     alnum       IsAlnum
     ascii       IsASCII
+    blank      IsSpace
     cntrl       IsCntrl
     digit       IsDigit
     graph       IsGraph
@@ -238,8 +245,8 @@ If the C<utf8> pragma is used, the following equivalences to Unicode
 For example C<[:lower:]> and C<\p{IsLower}> are equivalent.
 
 If the C<utf8> pragma is not used but the C<locale> pragma is, the
-classes correlate with the isalpha(3) interface (except for `word',
-which is a Perl extension, mirroring C<\w>).
+classes correlate with the usual isalpha(3) interface (except for
+`word' and `blank').
 
 The assumedly non-obviously named classes are:
 
@@ -353,7 +360,7 @@ everything before the matched string.  And C<$'> returns everything
 after the matched string.
 
 The numbered variables ($1, $2, $3, etc.) and the related punctuation
-set (C<<$+>, C<$&>, C<$`>, and C<$'>) are all dynamically scoped
+set (C<$+>, C<$&>, C<$`>, and C<$'>) are all dynamically scoped
 until the end of the enclosing block or until the next successful
 match, whichever comes first.  (See L<perlsyn/"Compound Statements">.)
 
index 66f8179..2c449f8 100644 (file)
@@ -1672,15 +1672,17 @@ i.e., a non-mark followed by one or more marks.
 
 As if all those classes weren't enough, Perl also defines POSIX style
 character classes.  These have the form C<[:name:]>, with C<name> the
-name of the POSIX class.  The POSIX classes are alpha, alnum, ascii,
-cntrl, digit, graph, lower, print, punct, space, upper, word, and
-xdigit.  If C<utf8> is being used, then these classes are defined the
-same as their corresponding perl Unicode classes: C<[:upper:]> is the
-same as C<\p{IsUpper}>, etc.  The POSIX character classes, however,
-don't require using C<utf8>.  The C<[:digit:]>, C<[:word:]>, and
+name of the POSIX class.  The POSIX classes are C<alpha>, C<alnum>,
+C<ascii>, C<cntrl>, C<digit>, C<graph>, C<lower>, C<print>, C<punct>,
+C<space>, C<upper>, and C<xdigit>, and two extensions, C<word> (a Perl
+extension to match C<\w>), and C<blank> (a GNU extension).  If C<utf8>
+is being used, then these classes are defined the same as their
+corresponding perl Unicode classes: C<[:upper:]> is the same as
+C<\p{IsUpper}>, etc.  The POSIX character classes, however, don't
+require using C<utf8>.  The C<[:digit:]>, C<[:word:]>, and
 C<[:space:]> correspond to the familiar C<\d>, C<\w>, and C<\s>
-character classes.  To negate a POSIX class, put a C<^> in front of the
-name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under
+character classes.  To negate a POSIX class, put a C<^> in front of
+the name, so that, e.g., C<[:^digit:]> corresponds to C<\D> and under
 C<utf8>, C<\P{IsDigit}>.  The Unicode and POSIX character classes can
 be used just like C<\d>, both inside and outside of character classes:
 
@@ -2044,8 +2046,41 @@ in the regexp.  Here are some silly examples:
                                          # prints 'Hi Mom!'
     $x =~ /aaa(?{print "Hi Mom!";})def/; # doesn't match,
                                          # no 'Hi Mom!'
+
+Pay careful attention to the next example:
+
     $x =~ /abc(?{print "Hi Mom!";})ddd/; # doesn't match,
                                          # no 'Hi Mom!'
+                                         # but why not?
+
+At first glance, you'd think that it shouldn't print, because obviously
+the C<ddd> isn't going to match the target string. But look at this
+example:
+
+    $x =~ /abc(?{print "Hi Mom!";})[d]dd/; # doesn't match,
+                                           # but _does_ print
+
+Hmm. What happened here? If you've been following along, you know that
+the above pattern should be effectively the same as the last one --
+enclosing the d in a character class isn't going to change what it
+matches. So why does the first not print while the second one does?
+
+The answer lies in the optimizations the REx engine makes. In the first
+case, all the engine sees are plain old characters (aside from the
+C<?{}> construct). It's smart enough to realize that the string 'ddd'
+doesn't occur in our target string before actually running the pattern
+through. But in the second case, we've tricked it into thinking that our
+pattern is more complicated than it is. It takes a look, sees our
+character class, and decides that it will have to actually run the
+pattern to determine whether or not it matches, and in the process of
+running it hits the print statement before it discovers that we don't
+have a match.
+
+To take a closer look at how the engine does optimizations, see the
+section L<"Pragmas and debugging"> below.
+
+More fun with C<?{}>:
+
     $x =~ /(?{print "Hi Mom!";})/;       # matches,
                                          # prints 'Hi Mom!'
     $x =~ /(?{$c = 1;})(?{print "$c";})/;  # matches,
index e105b00..d8fb12c 100644 (file)
@@ -284,11 +284,15 @@ be skipped.
 
 runs the program under the Perl debugger.  See L<perldebug>.
 
-=item B<-d:>I<foo>
+=item B<-d:>I<foo[=bar,baz]>
 
 runs the program under the control of a debugging, profiling, or
 tracing module installed as Devel::foo. E.g., B<-d:DProf> executes
-the program using the Devel::DProf profiler.  See L<perldebug>.
+the program using the Devel::DProf profiler.  As with the B<-M>
+flag, options may be passed to the Devel::foo package where they
+will be received and interpreted by the Devel::foo::import routine.
+The comma-separated list of options must follow a C<=> character.
+See L<perldebug>.
 
 =item B<-D>I<letters>
 
@@ -573,7 +577,8 @@ recognized by the C preprocessor such as "if", "else", or "define".)
 
 enables rudimentary switch parsing for switches on the command
 line after the program name but before any filename arguments (or before
-a B<-->).  Any switch found there is removed from @ARGV and sets the
+an argument of B<-->).  This means you can have switches with two leading
+dashes (B<--help>).  Any switch found there is removed from @ARGV and sets the
 corresponding variable in the Perl program.  The following program
 prints "1" if the program is invoked with a B<-xyz> switch, and "abc"
 if it is invoked with B<-xyz=abc>.
@@ -581,6 +586,9 @@ if it is invoked with B<-xyz=abc>.
     #!/usr/bin/perl -s
     if ($xyz) { print "$xyz\n" }
 
+Do note that B<--help> creates the variable ${-help}, which is not compliant
+with C<strict refs>.
+
 =item B<-S>
 
 makes Perl use the PATH environment variable to search for the
index 4185e84..6b50b92 100644 (file)
@@ -291,12 +291,6 @@ in C:
 Compile this wrapper into a binary executable and then make I<it> rather
 than your script setuid or setgid.
 
-See the program B<wrapsuid> in the F<eg> directory of your Perl
-distribution for a convenient way to do this automatically for all your
-setuid Perl programs.  It moves setuid scripts into files with the same
-name plus a leading dot, and then compiles a wrapper like the one above
-for each of them.
-
 In recent years, vendors have begun to supply systems free of this
 inherent security bug.  On such systems, when the kernel passes the name
 of the set-id script to open to the interpreter, rather than using a
@@ -308,9 +302,8 @@ program that builds Perl tries to figure this out for itself, so you
 should never have to specify this yourself.  Most modern releases of
 SysVr4 and BSD 4.4 use this approach to avoid the kernel race condition.
 
-Prior to release 5.003 of Perl, a bug in the code of B<suidperl> could
-introduce a security hole in systems compiled with strict POSIX
-compliance.
+Prior to release 5.6.1 of Perl, bugs in the code of B<suidperl> could
+introduce a security hole.
 
 =head2 Protecting Your Programs
 
index 6d820b6..e6b420e 100644 (file)
@@ -309,9 +309,12 @@ The C<foreach> keyword is actually a synonym for the C<for> keyword, so
 you can use C<foreach> for readability or C<for> for brevity.  (Or because
 the Bourne shell is more familiar to you than I<csh>, so writing C<for>
 comes more naturally.)  If VAR is omitted, C<$_> is set to each value.
-If any element of LIST is an lvalue, you can modify it by modifying VAR
-inside the loop.  That's because the C<foreach> loop index variable is
-an implicit alias for each item in the list that you're looping over.
+
+If any element of LIST is an lvalue, you can modify it by modifying
+VAR inside the loop.  Conversely, if any element of LIST is NOT an
+lvalue, any attempt to modify that element will fail.  In other words,
+the C<foreach> loop index variable is an implicit alias for each item
+in the list that you're looping over.
 
 If any part of LIST is an array, C<foreach> will get very confused if
 you add or remove elements within the loop body, for example with
index 3a1cf86..0b7092b 100644 (file)
@@ -991,7 +991,7 @@ the explanation is much longer than the program.
 
 A complete thread tutorial could fill a book (and has, many times),
 but this should get you well on your way.  The final authority on how
-Perl's threads behave is the documention bundled with the Perl
+Perl's threads behave is the documentation bundled with the Perl
 distribution, but with what we've covered in this article, you should
 be well on your way to becoming a threaded Perl expert.
 
index b39d7d5..1a58965 100644 (file)
@@ -48,7 +48,7 @@ for you--you need to do that explicitly yourself.
 =head2 Tying Scalars
 
 A class implementing a tied scalar should define the following methods:
-TIESCALAR, FETCH, STORE, and possibly DESTROY.
+TIESCALAR, FETCH, STORE, and possibly UNTIE and/or DESTROY.
 
 Let's look at each in turn, using as an example a tie class for
 scalars that allows the user to do something like:
@@ -157,6 +157,12 @@ argument--the new value the user is trying to assign.
         return $new_nicety;
     }
 
+=item UNTIE this
+
+This method will be triggered when the C<untie> occurs. This can be useful
+if the class needs to know when no further calls will be made. (Except DESTROY
+of course.) See below for more details.
+
 =item DESTROY this
 
 This method will be triggered when the tied variable needs to be destructed.
@@ -180,7 +186,7 @@ TIESCALAR classes are certainly possible.
 =head2 Tying Arrays
 
 A class implementing a tied ordinary array should define the following
-methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps DESTROY. 
+methods: TIEARRAY, FETCH, STORE, FETCHSIZE, STORESIZE and perhaps UNTIE and/or DESTROY.
 
 FETCHSIZE and STORESIZE are used to provide C<$#array> and
 equivalent C<scalar(@array)> access.
@@ -192,7 +198,7 @@ base class to implement the first five of these in terms of the basic
 methods above.  The default implementations of DELETE and EXISTS in
 B<Tie::Array> simply C<croak>.
 
-In addition EXTEND will be called when perl would have pre-extended 
+In addition EXTEND will be called when perl would have pre-extended
 allocation in a real array.
 
 This means that tied arrays are now I<complete>. The example below needs
@@ -260,10 +266,10 @@ index whose value we're trying to fetch.
       return $self->{ARRAY}[$idx];
     }
 
-If a negative array index is used to read from an array, the index 
+If a negative array index is used to read from an array, the index
 will be translated to a positive one internally by calling FETCHSIZE
-before being passed to FETCH. 
+before being passed to FETCH.
+
 As you may have noticed, the name of the FETCH method (et al.) is the same
 for all accesses, even though the constructors differ in names (TIESCALAR
 vs TIEARRAY).  While in theory you could have the same class servicing
@@ -285,8 +291,12 @@ there.  For example:
       }
       return $self->{ARRAY}[$idx] = $value;
     }
-Negative indexes are treated the same as with FETCH.  
+
+Negative indexes are treated the same as with FETCH.
+
+=item UNTIE this
+
+Will be called when C<untie> happens. (See below.)
 
 =item DESTROY this
 
@@ -316,8 +326,8 @@ the constructor.  FETCH and STORE access the key and value pairs.  EXISTS
 reports whether a key is present in the hash, and DELETE deletes one.
 CLEAR empties the hash by deleting all the key and value pairs.  FIRSTKEY
 and NEXTKEY implement the keys() and each() functions to iterate over all
-the keys.  And DESTROY is called when the tied variable is garbage
-collected.
+the keys.  UNTIE is called when C<untie> happens, and DESTROY is called when
+the tied variable is garbage collected.
 
 If this seems like a lot, then feel free to inherit from merely the
 standard Tie::Hash module for most of your methods, redefining only the
@@ -599,6 +609,10 @@ thing, but we'll have to go through the LIST field indirectly.
        return each %{ $self->{LIST} }
     }
 
+=item UNTIE this
+
+This is called when C<untie> occurs.
+
 =item DESTROY this
 
 This method is triggered when a tied hash is about to go out of
@@ -629,7 +643,7 @@ This is partially implemented now.
 
 A class implementing a tied filehandle should define the following
 methods: TIEHANDLE, at least one of PRINT, PRINTF, WRITE, READLINE, GETC,
-READ, and possibly CLOSE and DESTROY.  The class can also provide: BINMODE, 
+READ, and possibly CLOSE, UNTIE and DESTROY.  The class can also provide: BINMODE,
 OPEN, EOF, FILENO, SEEK, TELL - if the corresponding perl operators are
 used on the handle.
 
@@ -718,6 +732,11 @@ function.
 
     sub CLOSE { print "CLOSE called.\n" }
 
+=item UNTIE this
+
+As with the other types of ties, this method will be called when C<untie> happens.
+It may be appropriate to "auto CLOSE" when this occurs.
+
 =item DESTROY this
 
 As with the other types of ties, this method will be called when the
@@ -736,6 +755,11 @@ Here's how to use our little example:
     print FOO $a, " plus ", $b, " equals ", $a + $b, "\n";
     print <FOO>;
 
+=head2 UNTIE this
+
+You can define for all tie types an UNTIE method that will be called
+at untie().
+
 =head2 The C<untie> Gotcha
 
 If you intend making use of the object returned from either tie() or
@@ -850,7 +874,8 @@ closed.  The reason there is no output is because the file buffers
 have not been flushed to disk.
 
 Now that you know what the problem is, what can you do to avoid it?
-Well, the good old C<-w> flag will spot any instances where you call
+Prior to the introduction of the optional UNTIE method the only way
+was the good old C<-w> flag. Which will spot any instances where you call
 untie() and there are still valid references to the tied object.  If
 the second script above this near the top C<use warnings 'untie'>
 or was run with the C<-w> flag, Perl prints this
@@ -865,6 +890,25 @@ called:
     undef $x;
     untie $fred;
 
+Now that UNTIE exists the class designer can decide which parts of the
+class functionality are really associated with C<untie> and which with
+the object being destroyed. What makes sense for a given class depends
+on whether the inner references are being kept so that non-tie-related
+methods can be called on the object. But in most cases it probably makes
+sense to move the functionality that would have been in DESTROY to the UNTIE
+method.
+
+If the UNTIE method exists then the warning above does not occur. Instead the
+UNTIE method is passed the count of "extra" references and can issue its own
+warning if appropriate. e.g. to replicate the no UNTIE case this method can
+be used:
+
+    sub UNTIE
+    {
+     my ($obj,$count) = @_;
+     carp "untie attempted while $count inner references still exist" if $count;
+    }
+
 =head1 SEE ALSO
 
 See L<DB_File> or L<Config> for some interesting tie() implementations.
@@ -881,8 +925,14 @@ module that does attempt to address this need partially is the MLDBM
 module.  Check your nearest CPAN site as described in L<perlmodlib> for
 source code to MLDBM.
 
+Tied filehandles are still incomplete.  sysopen(), truncate(),
+flock(), fcntl(), stat() and -X can't currently be trapped.
+
 =head1 AUTHOR
 
 Tom Christiansen
 
 TIEHANDLE by Sven Verdoolaege <F<skimo@dns.ufsia.ac.be>> and Doug MacEachern <F<dougm@osf.org>>
+
+UNTIE by Nick Ing-Simmons <F<nick@ing-simmons.net>>
+
index 74c1f4e..b87b3ab 100644 (file)
@@ -564,7 +564,7 @@ binmode FILEHANDLE, DISCIPLINE, binmode FILEHANDLE, bless REF,CLASSNAME,
 bless REF, caller EXPR, caller, chdir EXPR, chmod LIST, chomp VARIABLE,
 chomp LIST, chomp, chop VARIABLE, chop LIST, chop, chown LIST, chr NUMBER,
 chr, chroot FILENAME, chroot, close FILEHANDLE, close, closedir DIRHANDLE,
-connect SOCKET,NAME, continue BLOCK, cos EXPR, crypt PLAINTEXT,SALT,
+connect SOCKET,NAME, continue BLOCK, cos EXPR, cos, crypt PLAINTEXT,SALT,
 dbmclose HASH, dbmopen HASH,DBNAME,MASK, defined EXPR, defined, delete
 EXPR, die LIST, do BLOCK, do SUBROUTINE(LIST), do EXPR, dump LABEL, dump,
 each HASH, eof FILEHANDLE, eof (), eof, eval EXPR, eval BLOCK, exec LIST,
@@ -585,26 +585,25 @@ import, index STR,SUBSTR,POSITION, index STR,SUBSTR, int EXPR, int, ioctl
 FILEHANDLE,FUNCTION,SCALAR, join EXPR,LIST, keys HASH, kill SIGNAL, LIST,
 last LABEL, last, lc EXPR, lc, lcfirst EXPR, lcfirst, length EXPR, length,
 link OLDFILE,NEWFILE, listen SOCKET,QUEUESIZE, local EXPR, localtime EXPR,
-lock, log EXPR, log, lstat FILEHANDLE, lstat EXPR, lstat, m//, map BLOCK
-LIST, map EXPR,LIST, mkdir FILENAME,MASK, mkdir FILENAME, msgctl
-ID,CMD,ARG, msgget KEY,FLAGS, msgrcv ID,VAR,SIZE,TYPE,FLAGS, msgsnd
-ID,MSG,FLAGS, my EXPR, my EXPR : ATTRIBUTES, next LABEL, next, no Module
-LIST, oct EXPR, oct, open FILEHANDLE,MODE,LIST, open FILEHANDLE,EXPR, open
-FILEHANDLE, opendir DIRHANDLE,EXPR, ord EXPR, ord, our EXPR, pack
-TEMPLATE,LIST, package, package NAMESPACE, pipe READHANDLE,WRITEHANDLE, pop
-ARRAY, pop, pos SCALAR, pos, print FILEHANDLE LIST, print LIST, print,
-printf FILEHANDLE FORMAT, LIST, printf FORMAT, LIST, prototype FUNCTION,
-push ARRAY,LIST, q/STRING/, qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/,
-quotemeta EXPR, quotemeta, rand EXPR, rand, read
-FILEHANDLE,SCALAR,LENGTH,OFFSET, read FILEHANDLE,SCALAR,LENGTH, readdir
-DIRHANDLE, readline EXPR, readlink EXPR, readlink, readpipe EXPR, recv
-SOCKET,SCALAR,LENGTH,FLAGS, redo LABEL, redo, ref EXPR, ref, rename
-OLDNAME,NEWNAME, require VERSION, require EXPR, require, reset EXPR, reset,
-return EXPR, return, reverse LIST, rewinddir DIRHANDLE, rindex
-STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME, rmdir, s///, scalar
-EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir DIRHANDLE,POS, select
-FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT, semctl
-ID,SEMNUM,CMD,ARG, semget KEY,NSEMS,FLAGS, semop KEY,OPSTRING, send
+lock, log EXPR, log, lstat EXPR, lstat, m//, map BLOCK LIST, map EXPR,LIST,
+mkdir FILENAME,MASK, mkdir FILENAME, msgctl ID,CMD,ARG, msgget KEY,FLAGS,
+msgrcv ID,VAR,SIZE,TYPE,FLAGS, msgsnd ID,MSG,FLAGS, my EXPR, my EXPR :
+ATTRIBUTES, next LABEL, next, no Module LIST, oct EXPR, oct, open
+FILEHANDLE,MODE,LIST, open FILEHANDLE,EXPR, open FILEHANDLE, opendir
+DIRHANDLE,EXPR, ord EXPR, ord, our EXPR, pack TEMPLATE,LIST, package
+NAMESPACE, package, pipe READHANDLE,WRITEHANDLE, pop ARRAY, pop, pos
+SCALAR, pos, print FILEHANDLE LIST, print LIST, print, printf FILEHANDLE
+FORMAT, LIST, printf FORMAT, LIST, prototype FUNCTION, push ARRAY,LIST,
+q/STRING/, qq/STRING/, qr/STRING/, qx/STRING/, qw/STRING/, quotemeta EXPR,
+quotemeta, rand EXPR, rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET, read
+FILEHANDLE,SCALAR,LENGTH, readdir DIRHANDLE, readline EXPR, readlink EXPR,
+readlink, readpipe EXPR, recv SOCKET,SCALAR,LENGTH,FLAGS, redo LABEL, redo,
+ref EXPR, ref, rename OLDNAME,NEWNAME, require VERSION, require EXPR,
+require, reset EXPR, reset, return EXPR, return, reverse LIST, rewinddir
+DIRHANDLE, rindex STR,SUBSTR,POSITION, rindex STR,SUBSTR, rmdir FILENAME,
+rmdir, s///, scalar EXPR, seek FILEHANDLE,POSITION,WHENCE, seekdir
+DIRHANDLE,POS, select FILEHANDLE, select, select RBITS,WBITS,EBITS,TIMEOUT,
+semctl ID,SEMNUM,CMD,ARG, semget KEY,NSEMS,FLAGS, semop KEY,OPSTRING, send
 SOCKET,MSG,FLAGS,TO, send SOCKET,MSG,FLAGS, setpgrp PID,PGRP, setpriority
 WHICH,WHO,PRIORITY, setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL, shift ARRAY,
 shift, shmctl ID,CMD,ARG, shmget KEY,SIZE,FLAGS, shmread ID,VAR,POS,SIZE,
@@ -960,7 +959,7 @@ OS/2, MS-DOS, Win95/NT, Macintosh, VMS
 
 =item Command Switches
 
-B<-0>[I<digits>], B<-a>, B<-C>, B<-c>, B<-d>, B<-d:>I<foo>,
+B<-0>[I<digits>], B<-a>, B<-C>, B<-c>, B<-d>, B<-d:>I<foo[=bar,baz]>,
 B<-D>I<letters>, B<-D>I<number>, B<-e> I<commandline>, B<-F>I<pattern>,
 B<-h>, B<-i>[I<extension>], B<-I>I<directory>, B<-l>[I<octnum>],
 B<-m>[B<->]I<module>, B<-M>[B<->]I<module>, B<-M>[B<->]I<'module ...'>,
@@ -1020,6 +1019,40 @@ B<-w>, B<-W>, B<-X>
 
 =back
 
+=head2 perldebtut - Perl debugging tutorial
+
+=over
+
+=item DESCRIPTION
+
+=item use strict
+
+=item Looking at data and -w and w
+
+=item help
+
+=item Stepping through code
+
+=item Placeholder for a, w, t, T
+
+=item REGULAR EXPRESSIONS
+
+=item OUTPUT TIPS
+
+=item CGI
+
+=item GUIs
+
+=item SUMMARY
+
+=item SEE ALSO
+
+=item AUTHOR
+
+=item CONTRIBUTORS
+
+=back
+
 =head2 perldebug - Perl debugging
 
 =over
@@ -1354,36 +1387,6 @@ and optimizing the final combined regexp
 
 =back
 
-=head2 perlref - Perl references and nested data structures
-
-=over
-
-=item NOTE
-
-=item DESCRIPTION
-
-=over
-
-=item Making References
-
-=item Using References
-
-=item Symbolic references
-
-=item Not-so-symbolic references
-
-=item Pseudo-hashes: Using an array as a hash
-
-=item Function Templates
-
-=back
-
-=item WARNING
-
-=item SEE ALSO
-
-=back
-
 =head2 perlre - Perl regular expressions
 
 =over
@@ -1430,6 +1433,36 @@ C<(?(condition)yes-pattern|no-pattern)>
 
 =back
 
+=head2 perlref - Perl references and nested data structures
+
+=over
+
+=item NOTE
+
+=item DESCRIPTION
+
+=over
+
+=item Making References
+
+=item Using References
+
+=item Symbolic references
+
+=item Not-so-symbolic references
+
+=item Pseudo-hashes: Using an array as a hash
+
+=item Function Templates
+
+=back
+
+=item WARNING
+
+=item SEE ALSO
+
+=back
+
 =head2 perlform - Perl formats
 
 =over
@@ -1456,108 +1489,217 @@ C<(?(condition)yes-pattern|no-pattern)>
 
 =back
 
-=head2 perllocale - Perl locale handling (internationalization and
-localization)
+=head2 perlboot - Beginner's Object-Oriented Tutorial
 
 =over
 
 =item DESCRIPTION
 
-=item PREPARING TO USE LOCALES
+=over
 
-=item USING LOCALES
+=item If we could talk to the animals...
+
+=item Introducing the method invocation arrow
+
+=item Invoking a barnyard
+
+=item The extra parameter of method invocation
+
+=item Calling a second method to simplify things
+
+=item Inheriting the windpipes
+
+=item A few notes about @ISA
+
+=item Overriding the methods
+
+=item Starting the search from a different place
+
+=item The SUPER way of doing things
+
+=item Where we're at so far...
+
+=item A horse is a horse, of course of course -- or is it?
+
+=item Invoking an instance method
+
+=item Accessing the instance data
+
+=item How to build a horse
+
+=item Inheriting the constructor
+
+=item Making a method work with either classes or instances
+
+=item Adding parameters to a method
+
+=item More interesting instances
+
+=item A horse of a different color
+
+=item Summary
+
+=back
+
+=item SEE ALSO
+
+=item COPYRIGHT
+
+=back
+
+=head2 perltoot - Tom's object-oriented tutorial for perl
 
 =over
 
-=item The use locale pragma
+=item DESCRIPTION
 
-=item The setlocale function
+=item Creating a Class
 
-=item Finding locales
+=over
 
-=item LOCALE PROBLEMS
+=item Object Representation
 
-=item Temporarily fixing locale problems
+=item Class Interface
 
-=item Permanently fixing locale problems
+=item Constructors and Instance Methods
 
-=item Permanently fixing your system's locale configuration
+=item Planning for the Future: Better Constructors
 
-=item Fixing system locale configuration
+=item Destructors
 
-=item The localeconv function
+=item Other Object Methods
 
 =back
 
-=item LOCALE CATEGORIES
+=item Class Data
 
 =over
 
-=item Category LC_COLLATE: Collation
+=item Accessing Class Data
 
-=item Category LC_CTYPE: Character Types
+=item Debugging Methods
 
-=item Category LC_NUMERIC: Numeric Formatting
+=item Class Destructors
 
-=item Category LC_MONETARY: Formatting of monetary amounts
+=item Documenting the Interface
 
-=item LC_TIME
+=back
 
-=item Other categories
+=item Aggregation
+
+=item Inheritance
+
+=over
+
+=item Overridden Methods
+
+=item Multiple Inheritance
+
+=item UNIVERSAL: The Root of All Objects
 
 =back
 
-=item SECURITY
+=item Alternate Object Representations
 
-B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):,
-B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or C<\U>),
-B<Matching operator> (C<m//>):, B<Substitution operator> (C<s///>):,
-B<Output formatting functions> (printf() and write()):, B<Case-mapping
-functions> (lc(), lcfirst(), uc(), ucfirst()):, B<POSIX locale-dependent
-functions> (localeconv(), strcoll(), strftime(), strxfrm()):, B<POSIX
-character class tests> (isalnum(), isalpha(), isdigit(), isgraph(),
-islower(), isprint(), ispunct(), isspace(), isupper(), isxdigit()):
+=over
 
-=item ENVIRONMENT
+=item Arrays as Objects
 
-PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
-LC_NUMERIC, LC_TIME, LANG
+=item Closures as Objects
+
+=back
+
+=item AUTOLOAD: Proxy Methods
+
+=over
+
+=item Autoloaded Data Methods
+
+=item Inherited Autoloaded Data Methods
+
+=back
+
+=item Metaclassical Tools
+
+=over
+
+=item Class::Struct
+
+=item Data Members as Variables
 
 =item NOTES
 
+=item Object Terminology
+
+=back
+
+=item SEE ALSO
+
+=item AUTHOR AND COPYRIGHT
+
+=item COPYRIGHT
+
 =over
 
-=item Backward compatibility
+=item Acknowledgments
 
-=item I18N:Collate obsolete
+=back
 
-=item Sort speed and memory use impacts
+=back
 
-=item write() and LC_NUMERIC
+=head2 perltootc - Tom's OO Tutorial for Class Data in Perl
 
-=item Freely available locale definitions
+=over
 
-=item I18n and l10n
+=item DESCRIPTION
 
-=item An imperfect standard
+=item Class Data as Package Variables
+
+=over
+
+=item Putting All Your Eggs in One Basket
+
+=item Inheritance Concerns
+
+=item The Eponymous Meta-Object
+
+=item Indirect References to Class Data
+
+=item Monadic Classes
+
+=item Translucent Attributes
 
 =back
 
-=item BUGS
+=item Class Data as Lexical Variables
 
 =over
 
-=item Broken systems
+=item Privacy and Responsibility 
+
+=item File-Scoped Lexicals
+
+=item More Inheritance Concerns
+
+=item Locking the Door and Throwing Away the Key
+
+=item Translucency Revisited
 
 =back
 
+=item NOTES
+
 =item SEE ALSO
 
+=item AUTHOR AND COPYRIGHT
+
+=item ACKNOWLEDGEMENTS
+
 =item HISTORY
 
 =back
 
-=head2 perlunicode - Unicode support in Perl
+=head2 perlobj - Perl objects
 
 =over
 
@@ -1565,23 +1707,106 @@ LC_NUMERIC, LC_TIME, LANG
 
 =over
 
-=item Important Caveat
+=item An Object is Simply a Reference
 
-Input and Output Disciplines, Regular Expressions, C<use utf8> still needed
-to enable a few features
+=item A Class is Simply a Package
+
+=item A Method is Simply a Subroutine
+
+=item Method Invocation
+
+=item WARNING
+
+=item Default UNIVERSAL methods
+
+isa(CLASS), can(METHOD), VERSION( [NEED] )
+
+=item Destructors
+
+=item Summary
+
+=item Two-Phased Garbage Collection
+
+=back
+
+=item SEE ALSO
+
+=back
+
+=head2 perlbot - Bag'o Object Tricks (the BOT)
+
+=over
+
+=item DESCRIPTION
+
+=item OO SCALING TIPS
+
+=item INSTANCE VARIABLES
+
+=item SCALAR INSTANCE VARIABLES
+
+=item INSTANCE VARIABLE INHERITANCE
+
+=item OBJECT RELATIONSHIPS
+
+=item OVERRIDING SUPERCLASS METHODS
+
+=item USING RELATIONSHIP WITH SDBM
+
+=item THINKING OF CODE REUSE
+
+=item CLASS CONTEXT AND THE OBJECT
+
+=item INHERITING A CONSTRUCTOR
+
+=item DELEGATION
+
+=back
+
+=head2 perltie - how to hide an object class in a simple variable
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=over
+
+=item Tying Scalars
+
+TIESCALAR classname, LIST, FETCH this, STORE this, value, UNTIE this,
+DESTROY this
+
+=item Tying Arrays
+
+TIEARRAY classname, LIST, FETCH this, index, STORE this, index, value,
+UNTIE this, DESTROY this
+
+=item Tying Hashes
+
+USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST, FETCH this, key, STORE
+this, key, value, DELETE this, key, CLEAR this, EXISTS this, key, FIRSTKEY
+this, NEXTKEY this, lastkey, UNTIE this, DESTROY this
 
-=item Byte and Character semantics
+=item Tying FileHandles
 
-=item Effects of character semantics
+TIEHANDLE classname, LIST, WRITE this, LIST, PRINT this, LIST, PRINTF this,
+LIST, READ this, LIST, READLINE this, GETC this, CLOSE this, UNTIE this,
+DESTROY this
 
-=item Character encodings for input and output
+=item UNTIE this
 
-=back
+=item The C<untie> Gotcha
 
-=item CAVEATS
+=back
 
 =item SEE ALSO
 
+=item BUGS
+
+=item AUTHOR
+
 =back
 
 =head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
@@ -1965,344 +2190,274 @@ v1.23, 10 July 1998
 
 =back
 
-=head2 perlsec - Perl security
+=head2 perllocale - Perl locale handling (internationalization and
+localization)
 
 =over
 
 =item DESCRIPTION
 
-=over
-
-=item Laundering and Detecting Tainted Data
-
-=item Switches On the "#!" Line
-
-=item Cleaning Up Your Path
-
-=item Security Bugs
-
-=item Protecting Your Programs
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlboot - Beginner's Object-Oriented Tutorial
-
-=over
+=item PREPARING TO USE LOCALES
 
-=item DESCRIPTION
+=item USING LOCALES
 
 =over
 
-=item If we could talk to the animals...
-
-=item Introducing the method invocation arrow
-
-=item Invoking a barnyard
-
-=item The extra parameter of method invocation
+=item The use locale pragma
 
-=item Calling a second method to simplify things
+=item The setlocale function
 
-=item Inheriting the windpipes
+=item Finding locales
 
-=item A few notes about @ISA
+=item LOCALE PROBLEMS
 
-=item Overriding the methods
+=item Temporarily fixing locale problems
 
-=item Starting the search from a different place
+=item Permanently fixing locale problems
 
-=item The SUPER way of doing things
+=item Permanently fixing your system's locale configuration
 
-=item Where we're at so far...
+=item Fixing system locale configuration
 
-=item A horse is a horse, of course of course -- or is it?
+=item The localeconv function
 
-=item Invoking an instance method
+=back
 
-=item Accessing the instance data
+=item LOCALE CATEGORIES
 
-=item How to build a horse
+=over
 
-=item Inheriting the constructor
+=item Category LC_COLLATE: Collation
 
-=item Making a method work with either classes or instances
+=item Category LC_CTYPE: Character Types
 
-=item Adding parameters to a method
+=item Category LC_NUMERIC: Numeric Formatting
 
-=item More interesting instances
+=item Category LC_MONETARY: Formatting of monetary amounts
 
-=item A horse of a different color
+=item LC_TIME
 
-=item Summary
+=item Other categories
 
 =back
 
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
+=item SECURITY
 
-=head2 perltoot - Tom's object-oriented tutorial for perl
+B<Comparison operators> (C<lt>, C<le>, C<ge>, C<gt> and C<cmp>):,
+B<Case-mapping interpolation> (with C<\l>, C<\L>, C<\u> or C<\U>),
+B<Matching operator> (C<m//>):, B<Substitution operator> (C<s///>):,
+B<Output formatting functions> (printf() and write()):, B<Case-mapping
+functions> (lc(), lcfirst(), uc(), ucfirst()):, B<POSIX locale-dependent
+functions> (localeconv(), strcoll(), strftime(), strxfrm()):, B<POSIX
+character class tests> (isalnum(), isalpha(), isdigit(), isgraph(),
+islower(), isprint(), ispunct(), isspace(), isupper(), isxdigit()):
 
-=over
+=item ENVIRONMENT
 
-=item DESCRIPTION
+PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
+LC_NUMERIC, LC_TIME, LANG
 
-=item Creating a Class
+=item NOTES
 
 =over
 
-=item Object Representation
+=item Backward compatibility
 
-=item Class Interface
+=item I18N:Collate obsolete
 
-=item Constructors and Instance Methods
+=item Sort speed and memory use impacts
 
-=item Planning for the Future: Better Constructors
+=item write() and LC_NUMERIC
 
-=item Destructors
+=item Freely available locale definitions
 
-=item Other Object Methods
+=item I18n and l10n
+
+=item An imperfect standard
 
 =back
 
-=item Class Data
+=item BUGS
 
 =over
 
-=item Accessing Class Data
+=item Broken systems
 
-=item Debugging Methods
+=back
 
-=item Class Destructors
+=item SEE ALSO
 
-=item Documenting the Interface
+=item HISTORY
 
 =back
 
-=item Aggregation
-
-=item Inheritance
+=head2 perlunicode - Unicode support in Perl
 
 =over
 
-=item Overridden Methods
-
-=item Multiple Inheritance
+=item DESCRIPTION
 
-=item UNIVERSAL: The Root of All Objects
+=over
 
-=back
+=item Important Caveat
 
-=item Alternate Object Representations
+Input and Output Disciplines, Regular Expressions, C<use utf8> still needed
+to enable a few features
 
-=over
+=item Byte and Character semantics
 
-=item Arrays as Objects
+=item Effects of character semantics
 
-=item Closures as Objects
+=item Character encodings for input and output
 
 =back
 
-=item AUTOLOAD: Proxy Methods
-
-=over
-
-=item Autoloaded Data Methods
+=item CAVEATS
 
-=item Inherited Autoloaded Data Methods
+=item SEE ALSO
 
 =back
 
-=item Metaclassical Tools
+=head2 perlebcdic - Considerations for running Perl on EBCDIC platforms
 
 =over
 
-=item Class::Struct
+=item DESCRIPTION
 
-=item Data Members as Variables
+=item COMMON CHARACTER CODE SETS
 
-=item NOTES
+=over
 
-=item Object Terminology
+=item ASCII
 
-=back
+=item ISO 8859
 
-=item SEE ALSO
+=item Latin 1 (ISO 8859-1)
 
-=item AUTHOR AND COPYRIGHT
+=item EBCDIC
 
-=item COPYRIGHT
+=item 13 variant characters
 
-=over
+=item 0037
 
-=item Acknowledgments
+=item 1047
 
-=back
+=item POSIX-BC
 
 =back
 
-=head2 perltootc - Tom's OO Tutorial for Class Data in Perl
+=item SINGLE OCTET TABLES
 
-=over
+recipe 0, recipe 1, recipe 2, recipe 3, recipe 4
 
-=item DESCRIPTION
+=item IDENTIFYING CHARACTER CODE SETS
 
-=item Class Data as Package Variables
+=item CONVERSIONS
 
 =over
 
-=item Putting All Your Eggs in One Basket
-
-=item Inheritance Concerns
-
-=item The Eponymous Meta-Object
-
-=item Indirect References to Class Data
+=item tr///
 
-=item Monadic Classes
+=item iconv
 
-=item Translucent Attributes
+=item C RTL
 
 =back
 
-=item Class Data as Lexical Variables
-
-=over
-
-=item Privacy and Responsibility 
+=item OPERATOR DIFFERENCES
 
-=item File-Scoped Lexicals
+=item FUNCTION DIFFERENCES
 
-=item More Inheritance Concerns
+chr(), ord(), pack(), print(), printf(), sort(), sprintf(), unpack()
 
-=item Locking the Door and Throwing Away the Key
+=item REGULAR EXPRESSION DIFFERENCES
 
-=item Translucency Revisited
+=item SOCKETS
 
-=back
+=item SORTING
 
-=item NOTES
+=over
 
-=item SEE ALSO
+=item Ignore ASCII vs. EBCDIC sort differences.
 
-=item AUTHOR AND COPYRIGHT
+=item MONO CASE then sort data.
 
-=item ACKNOWLEDGEMENTS
+=item Convert, sort data, then re convert.
 
-=item HISTORY
+=item Perform sorting on one type of machine only.
 
 =back
 
-=head2 perlobj - Perl objects
-
-=over
-
-=item DESCRIPTION
+=item TRANFORMATION FORMATS
 
 =over
 
-=item An Object is Simply a Reference
-
-=item A Class is Simply a Package
-
-=item A Method is Simply a Subroutine
-
-=item Method Invocation
-
-=item WARNING
-
-=item Default UNIVERSAL methods
-
-isa(CLASS), can(METHOD), VERSION( [NEED] )
+=item URL decoding and encoding
 
-=item Destructors
+=item uu encoding and decoding
 
-=item Summary
+=item Quoted-Printable encoding and decoding
 
-=item Two-Phased Garbage Collection
+=item Caesarian cyphers
 
 =back
 
-=item SEE ALSO
+=item Hashing order and checksums
 
-=back
+=item I18N AND L10N
 
-=head2 perlbot - Bag'o Object Tricks (the BOT)
+=item MULTI OCTET CHARACTER SETS
 
-=over
+=item OS ISSUES
 
-=item DESCRIPTION
+=over
 
-=item OO SCALING TIPS
+=item OS/400 
 
-=item INSTANCE VARIABLES
+IFS access
 
-=item SCALAR INSTANCE VARIABLES
+=item OS/390 
 
-=item INSTANCE VARIABLE INHERITANCE
+chcp, dataset access, OS/390 iconv, locales
 
-=item OBJECT RELATIONSHIPS
+=item VM/ESA?
 
-=item OVERRIDING SUPERCLASS METHODS
+=item POSIX-BC?
 
-=item USING RELATIONSHIP WITH SDBM
+=back
 
-=item THINKING OF CODE REUSE
+=item BUGS
 
-=item CLASS CONTEXT AND THE OBJECT
+=item SEE ALSO
 
-=item INHERITING A CONSTRUCTOR
+=item REFERENCES
 
-=item DELEGATION
+=item AUTHOR
 
 =back
 
-=head2 perltie - how to hide an object class in a simple variable
-
-=over
-
-=item SYNOPSIS
-
-=item DESCRIPTION
+=head2 perlsec - Perl security
 
 =over
 
-=item Tying Scalars
-
-TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
-
-=item Tying Arrays
+=item DESCRIPTION
 
-TIEARRAY classname, LIST, FETCH this, index, STORE this, index, value,
-DESTROY this
+=over
 
-=item Tying Hashes
+=item Laundering and Detecting Tainted Data
 
-USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST, FETCH this, key, STORE
-this, key, value, DELETE this, key, CLEAR this, EXISTS this, key, FIRSTKEY
-this, NEXTKEY this, lastkey, DESTROY this
+=item Switches On the "#!" Line
 
-=item Tying FileHandles
+=item Cleaning Up Your Path
 
-TIEHANDLE classname, LIST, WRITE this, LIST, PRINT this, LIST, PRINTF this,
-LIST, READ this, LIST, READLINE this, GETC this, CLOSE this, DESTROY this
+=item Security Bugs
 
-=item The C<untie> Gotcha
+=item Protecting Your Programs
 
 =back
 
 =item SEE ALSO
 
-=item BUGS
-
-=item AUTHOR
-
 =back
 
 =head2 perlmod - Perl modules (packages and symbol tables)
@@ -2450,6 +2605,8 @@ module (sometimes unnecessary), B<INSTALL> the module
 
 =back
 
+=item PORTABILITY
+
 =item HEY
 
 =item AUTHOR
@@ -3220,8 +3377,6 @@ complete?
 
 =item How do I fork a daemon process?
 
-=item How do I make my program run with sh and csh?
-
 =item How do I find out if I'm running interactively or not?
 
 =item How do I timeout a slow event?
@@ -3586,6 +3741,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The OUTPUT: Keyword
 
+=item The NO_OUTPUT Keyword
+
 =item The CODE: Keyword
 
 =item The INIT: Keyword
@@ -3602,6 +3759,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The INPUT: Keyword
 
+=item The IN/OUTLIST/IN_OUTLIST Keywords
+
 =item Variable-length Parameter Lists
 
 =item The C_ARGS: Keyword
@@ -3614,6 +3773,8 @@ C<!!!>, C<!!>, C<!>
 
 =item The CLEANUP: Keyword
 
+=item The POST_CALL: Keyword
+
 =item The BOOT: Keyword
 
 =item The VERSIONCHECK: Keyword
@@ -3670,6 +3831,8 @@ C<!!!>, C<!!>, C<!>
 
 =item Working with SVs
 
+=item Offsets
+
 =item What's Really Stored in an SV?
 
 =item Working with AVs
@@ -3770,6 +3933,10 @@ A, p, d, s, n, r, f, m, o, j, x
 
 =over
 
+=item Formatted Printing of IVs, UVs, and NVs
+
+=item Pointer-To-Integer and Integer-To-Pointer
+
 =item Source Documentation
 
 =back
@@ -3994,38 +4161,40 @@ hv_iterval, hv_magic, hv_store, hv_store_ent, hv_undef, isALNUM, isALPHA,
 isDIGIT, isLOWER, isSPACE, isUPPER, items, ix, LEAVE, looks_like_number,
 MARK, mg_clear, mg_copy, mg_find, mg_free, mg_get, mg_length, mg_magical,
 mg_set, Move, New, newAV, Newc, newCONSTSUB, newHV, newRV_inc, newRV_noinc,
-NEWSV, newSViv, newSVnv, newSVpv, newSVpvf, newSVpvn, newSVrv, newSVsv,
-newSVuv, newXS, newXSproto, Newz, Nullav, Nullch, Nullcv, Nullhv, Nullsv,
-ORIGMARK, perl_alloc, perl_construct, perl_destruct, perl_free, perl_parse,
-perl_run, PL_DBsingle, PL_DBsub, PL_DBtrace, PL_dowarn, PL_modglobal,
-PL_na, PL_sv_no, PL_sv_undef, PL_sv_yes, POPi, POPl, POPn, POPp, POPs,
-PUSHi, PUSHMARK, PUSHn, PUSHp, PUSHs, PUSHu, PUTBACK, Renew, Renewc,
-require_pv, RETVAL, Safefree, savepv, savepvn, SAVETMPS, SP, SPAGAIN, ST,
-strEQ, strGE, strGT, strLE, strLT, strNE, strnEQ, strnNE, StructCopy,
-SvCUR, SvCUR_set, SvEND, SvGETMAGIC, SvGROW, SvIOK, SvIOKp, SvIOK_off,
-SvIOK_on, SvIOK_only, SvIV, SvIVX, SvLEN, SvNIOK, SvNIOKp, SvNIOK_off,
-SvNOK, SvNOKp, SvNOK_off, SvNOK_on, SvNOK_only, SvNV, SvNVX, SvOK, SvOOK,
-SvPOK, SvPOKp, SvPOK_off, SvPOK_on, SvPOK_only, SvPV, SvPVX, SvPV_force,
+NEWSV, newSViv, newSVnv, newSVpv, newSVpvf, newSVpvn, newSVpvn_share,
+newSVrv, newSVsv, newSVuv, newXS, newXSproto, Newz, Nullav, Nullch, Nullcv,
+Nullhv, Nullsv, ORIGMARK, perl_alloc, perl_construct, perl_destruct,
+perl_free, perl_parse, perl_run, PL_DBsingle, PL_DBsub, PL_DBtrace,
+PL_dowarn, PL_modglobal, PL_na, PL_sv_no, PL_sv_undef, PL_sv_yes, POPi,
+POPl, POPn, POPp, POPs, PUSHi, PUSHMARK, PUSHn, PUSHp, PUSHs, PUSHu,
+PUTBACK, Renew, Renewc, require_pv, RETVAL, Safefree, savepv, savepvn,
+SAVETMPS, SP, SPAGAIN, ST, strEQ, strGE, strGT, strLE, strLT, strNE,
+strnEQ, strnNE, StructCopy, SvCUR, SvCUR_set, SvEND, SvGETMAGIC, SvGROW,
+SvIOK, SvIOKp, SvIOK_notUV, SvIOK_off, SvIOK_on, SvIOK_only, SvIOK_only_UV,
+SvIOK_UV, SvIV, SvIVX, SvLEN, SvNIOK, SvNIOKp, SvNIOK_off, SvNOK, SvNOKp,
+SvNOK_off, SvNOK_on, SvNOK_only, SvNV, SvNVX, SvOK, SvOOK, SvPOK, SvPOKp,
+SvPOK_off, SvPOK_on, SvPOK_only, SvPOK_only_UTF8, SvPV, SvPVX, SvPV_force,
 SvPV_nolen, SvREFCNT, SvREFCNT_dec, SvREFCNT_inc, SvROK, SvROK_off,
 SvROK_on, SvRV, SvSETMAGIC, SvSetSV, SvSetSV_nosteal, SvSTASH, SvTAINT,
 SvTAINTED, SvTAINTED_off, SvTAINTED_on, SvTRUE, svtype, SvTYPE, SVt_IV,
-SVt_NV, SVt_PV, SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SvUPGRADE, SvUV,
-SvUVX, sv_2mortal, sv_bless, sv_catpv, sv_catpvf, sv_catpvf_mg, sv_catpvn,
-sv_catpvn_mg, sv_catpv_mg, sv_catsv, sv_catsv_mg, sv_chop, sv_clear,
-sv_cmp, sv_cmp_locale, sv_dec, sv_derived_from, sv_eq, sv_free, sv_gets,
-sv_grow, sv_inc, sv_insert, sv_isa, sv_isobject, sv_len, sv_len_utf8,
-sv_magic, sv_mortalcopy, sv_newmortal, sv_pvn_force, sv_pvutf8n_force,
-sv_reftype, sv_replace, sv_rvweaken, sv_setiv, sv_setiv_mg, sv_setnv,
-sv_setnv_mg, sv_setpv, sv_setpvf, sv_setpvf_mg, sv_setpviv, sv_setpviv_mg,
-sv_setpvn, sv_setpvn_mg, sv_setpv_mg, sv_setref_iv, sv_setref_nv,
-sv_setref_pv, sv_setref_pvn, sv_setsv, sv_setsv_mg, sv_setuv, sv_setuv_mg,
-sv_true, sv_unmagic, sv_unref, sv_upgrade, sv_usepvn, sv_usepvn_mg,
+SVt_NV, SVt_PV, SVt_PVAV, SVt_PVCV, SVt_PVHV, SVt_PVMG, SvUPGRADE, SvUTF8,
+SvUTF8_off, SvUTF8_on, SvUV, SvUVX, sv_2mortal, sv_bless, sv_catpv,
+sv_catpvf, sv_catpvf_mg, sv_catpvn, sv_catpvn_mg, sv_catpv_mg, sv_catsv,
+sv_catsv_mg, sv_chop, sv_clear, sv_cmp, sv_cmp_locale, sv_dec,
+sv_derived_from, sv_eq, sv_free, sv_gets, sv_grow, sv_inc, sv_insert,
+sv_isa, sv_isobject, sv_len, sv_len_utf8, sv_magic, sv_mortalcopy,
+sv_newmortal, sv_pvn_force, sv_pvutf8n_force, sv_reftype, sv_replace,
+sv_rvweaken, sv_setiv, sv_setiv_mg, sv_setnv, sv_setnv_mg, sv_setpv,
+sv_setpvf, sv_setpvf_mg, sv_setpviv, sv_setpviv_mg, sv_setpvn,
+sv_setpvn_mg, sv_setpv_mg, sv_setref_iv, sv_setref_nv, sv_setref_pv,
+sv_setref_pvn, sv_setsv, sv_setsv_mg, sv_setuv, sv_setuv_mg, sv_true,
+sv_unmagic, sv_unref, sv_upgrade, sv_usepvn, sv_usepvn_mg,
 sv_utf8_downgrade, sv_utf8_encode, sv_utf8_upgrade, sv_vcatpvfn,
-sv_vsetpvfn, THIS, toLOWER, toUPPER, U8 *s, utf8_to_bytes, warn, XPUSHi,
-XPUSHn, XPUSHp, XPUSHs, XPUSHu, XS, XSRETURN, XSRETURN_EMPTY, XSRETURN_IV,
-XSRETURN_NO, XSRETURN_NV, XSRETURN_PV, XSRETURN_UNDEF, XSRETURN_YES,
-XST_mIV, XST_mNO, XST_mNV, XST_mPV, XST_mUNDEF, XST_mYES, XS_VERSION,
-XS_VERSION_BOOTCHECK, Zero
+sv_vsetpvfn, THIS, toLOWER, toUPPER, U8 *s, utf8_to_bytes, utf8_to_uv,
+utf8_to_uv_chk, warn, XPUSHi, XPUSHn, XPUSHp, XPUSHs, XPUSHu, XS, XSRETURN,
+XSRETURN_EMPTY, XSRETURN_IV, XSRETURN_NO, XSRETURN_NV, XSRETURN_PV,
+XSRETURN_UNDEF, XSRETURN_YES, XST_mIV, XST_mNO, XST_mNV, XST_mPV,
+XST_mUNDEF, XST_mYES, XS_VERSION, XS_VERSION_BOOTCHECK, Zero
 
 =item AUTHORS
 
@@ -4033,7 +4202,7 @@ XS_VERSION_BOOTCHECK, Zero
 
 =back
 
-=head2 perlintern - autogenerated documentation of purely B<internal> 
+=head2 perlintern - autogenerated documentation of purely B<internal>
                 Perl functions
 
 =over
@@ -4438,6 +4607,22 @@ finish, print
 
 =item Patching
 
+=back
+
+=item EXTERNAL TOOLS FOR DEBUGGING PERL
+
+=over
+
+=item Rational Software's Purify
+
+=item Purify on Unix
+
+-Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity
+
+=item Purify on NT
+
+DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug
+
 =item CONCLUSION
 
 I<The Road goes ever on and on, down from the door where it began.>
@@ -4478,46 +4663,91 @@ I<The Road goes ever on and on, down from the door where it began.>
 
 =back
 
-=head2 perldelta - what's new for perl v5.8.0
+=head2 perldelta - what's new for perl v5.7.0
 
 =over
 
 =item DESCRIPTION
 
+=item Security Vulnerability Closed
+
+=item Incompatible Changes
+
 =item Core Enhancements
 
 =item Modules and Pragmata
 
+=over
+
+=item New Modules
+
+=item Updated And Improved Modules and Pragmata
+
+=back
+
 =item Utility Changes
 
-=item Improved Documentation
+=item New Documentation
 
-=item Performance enhancements
+=item Performance Enhancements
+
+sort() has been changed to use mergesort internally as opposed to the
+earlier quicksort.  For very small lists this may result in slightly slower
+sorting times, but in general the speedup should be at least 20%. 
+Additional bonuses are that the worst case behaviour of sort() is now
+better (in computer science terms it now runs in time O(N log N), as
+opposed to quicksort's Theta(N**2) worst-case run time behaviour), and that
+sort() is now stable (meaning that elements with identical keys will stay
+ordered as they were before the sort)
 
 =item Installation and Configuration Improvements
 
 =over
 
-=item gcc automatically tried if 'cc' does not seem to be working
+=item Generic Improvements
 
 =back
 
-=item Platform specific changes
+=item Selected Bug Fixes
 
-=item Significant bug fixes
+sort() arguments are now compiled in the right wantarray context (they were
+accidentally using the context of the sort() itself)
 
-=item New or Changed Diagnostics
+=over
 
-(perhaps you forgot to load "%s"?), Ambiguous range in transliteration
-operator
+=item Platform Specific Changes and Fixes
 
-=item New tests
+=back
 
-=item Incompatible Changes
+=item New or Changed Diagnostics
+
+=item Changed Internals
 
 =item Known Problems
 
-=item Obsolete Diagnostics
+=over
+
+=item Unicode Support Still Far From Perfect
+
+=item EBCDIC Still A Lost Platform
+
+=item Building Extensions Can Fail Because Of Largefiles
+
+=item ftmp-security tests warn 'system possibly insecure'
+
+=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
+
+=item Long Doubles Still Don't Work In Solaris
+
+=item Linux With Sfio Fails op/misc Test 48
+
+=item Storable tests fail in some platforms
+
+=item Threads Are Still Experimental
+
+=item The Compiler Suite Is Still Experimental
+
+=back
 
 =item Reporting Bugs
 
@@ -5291,6 +5521,42 @@ PERL_SH_DIR too long, Process terminated by SIG%s
 
 =back
 
+=head2 perlaix, README.aix - Perl version 5 on IBM Unix (AIX) systems
+
+=over
+
+=item DESCRIPTION
+
+=over
+
+=item Compiling Perl 5 on AIX
+
+=item OS level
+
+=item Building Dynamic Extensions on AIX
+
+=item The IBM ANSI C Compiler
+
+=item Using GNU's gcc for building perl
+
+=item Using Large Files with Perl
+
+=item Threaded Perl
+
+=item 64-bit Perl
+
+=item GDBM and Threads
+
+=item NFS filesystems and utime(2)
+
+=back
+
+=item AUTHOR
+
+=item DATE
+
+=back
+
 =head2 perlamiga - Perl under Amiga OS (possibly very outdated information)
 
 =over
@@ -5394,8 +5660,8 @@ C<-Duse64bitint>, C<-Duselongdouble>, C<-Dusethreads>, C<-Duselargefiles>
 
 =item Suspicious Warnings
 
-Whoa There, I<dlsym()>, Win9x and C<d_eofnblk>, Checking how std your stdio
-is.., Compiler/Preprocessor defines
+I<dlsym()>, Win9x and C<d_eofnblk>, Checking how std your stdio is..,
+Compiler/Preprocessor defines
 
 =back
 
@@ -5669,6 +5935,8 @@ F<lib/io_pipe.t>, F<lib/io_sock.t>, F<op/stat.t>, F<lib/io_udp.t>
 
 =item Segfault in make
 
+=item op/sprintf test failure
+
 =back
 
 =item Specific (mis)features of OS/2 port
@@ -6312,7 +6580,7 @@ is inherited by derived classes
 
 =item Last Resort
 
-=item Fallback 
+=item Fallback
 
 C<undef>, TRUE, defined, but FALSE
 
@@ -6363,6 +6631,9 @@ integer, float, binary, q, qr
 
 =item DIAGNOSTICS
 
+Odd number of arguments for overload::constant, `%s' is not an overloadable
+type, `%s' is not a code reference
+
 =item BUGS
 
 =back
@@ -6459,8 +6730,11 @@ C<strict refs>, C<strict vars>, C<strict subs>
 
 =item DESCRIPTION
 
-use warnings::register, warnings::enabled([$category]),
-warnings::warn([$category,] $message)
+use warnings::register, warnings::enabled(), warnings::enabled($category),
+warnings::enabled($object), warnings::warn($message),
+warnings::warn($category, $message), warnings::warn($object, $message),
+warnings::warnif($message), warnings::warnif($category, $message),
+warnings::warnif($object, $message)
 
 =back
 
@@ -6691,7 +6965,7 @@ bytecode
 
 =item DESCRIPTION
 
-=item AUTHOR
+=item AUTHORS
 
 =back
 
@@ -6718,14 +6992,15 @@ bytecode
 =item OPTIONS
 
 B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
-B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-fstrip-syntax-tree>,
-B<-On>, B<-D>, B<-Do>, B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-m>
+B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>,
+B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage>    Stores package in the
+output.    =back
 
 =item EXAMPLES
 
 =item BUGS
 
-=item AUTHOR
+=item AUTHORS
 
 =back
 
@@ -7019,14 +7294,15 @@ STYLE ] ), cmpthese ( RESULTSHASHREF ), countit(TIME, CODE), disablecache (
 =item OPTIONS
 
 B<-ofilename>, B<-afilename>, B<-->, B<-f>, B<-fcompress-nullops>,
-B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-fstrip-syntax-tree>,
-B<-On>, B<-D>, B<-Do>, B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-m>
+B<-fomit-sequence-numbers>, B<-fbypass-nullops>, B<-On>, B<-D>, B<-Do>,
+B<-Db>, B<-Da>, B<-DC>, B<-S>, B<-upackage>    Stores package in the
+output.    =back
 
 =item EXAMPLES
 
 =item BUGS
 
-=item AUTHOR
+=item AUTHORS
 
 =back
 
@@ -7085,8 +7361,8 @@ B<:standard>, B<:all>
 
 =item PRAGMAS
 
--any, -compile, -nosticky, -nph, -newstyle_urls, -oldstyle_urls, -autoload,
--no_debug, -debug, -private_tempfiles
+-any, -compile, -nosticky, -no_xhtml, -nph, -newstyle_urls, -oldstyle_urls,
+-autoload, -no_debug, -debug, -private_tempfiles
 
 =item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
 
@@ -7115,7 +7391,7 @@ B<Parameters:>, 4, 5, 6..
 =item OBTAINING THE SCRIPT'S URL
 
 B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
-(B<-query_string>)
+(B<-query_string>), B<-base>
 
 =item MIXING POST AND URL PARAMETERS
 
@@ -7229,9 +7505,9 @@ the <FORM> tag
 B<Accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
 B<path_translated()>, B<remote_host()>, B<script_name()> Return the script
 name as a partial URL, for self-refering scripts, B<referer()>, B<auth_type
-()>, B<server_name ()>, B<virtual_host ()>, B<server_software ()>,
-B<remote_user ()>, B<user_name ()>, B<request_method()>, B<content_type()>,
-B<http()>, B<https()>
+()>, B<server_name ()>, B<virtual_host ()>, B<server_port ()>,
+B<server_software ()>, B<remote_user ()>, B<user_name ()>,
+B<request_method()>, B<content_type()>, B<http()>, B<https()>
 
 =item USING NPH SCRIPTS
 
@@ -7311,6 +7587,8 @@ other) error log
 
 =back
 
+=item MAKING WARNINGS APPEAR AS HTML COMMENTS
+
 =item CHANGE LOG
 
 =item AUTHORS
@@ -7451,8 +7729,6 @@ B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
 
 =back
 
-=head2 CGI::Util - various utilities
-
 =head2 CPAN - query, download and build perl modules from CPAN sites
 
 =over
@@ -7477,7 +7753,7 @@ distribution, Signals
 
 =item The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
 
-=item ProgrammerE<39>s interface
+=item Programmer's interface
 
 expand($type,@things), Programming Examples
 
@@ -7520,8 +7796,29 @@ optionE<gt> [shift|pop]>, C<o conf E<lt>list optionE<gt>
 
 =item WORKING WITH CPAN.pm BEHIND FIREWALLS
 
+=over
+
+=item Three basic types of firewalls
+
 http firewall, ftp firewall, One way visibility, SOCKS, IP Masquerade
 
+=item Configuring lynx or ncftp for going through a firewall
+
+=back
+
+=item FAQ
+
+1) I installed a new version of module X but CPAN keeps saying,       I
+have the old version installed, 2) So why is UNINST=1 not the default?, 3)
+When I install bundles or multiple modules with one command      there is
+too much output to keep track of, 4) I am not root, how can I install a
+module in a personal      directory?, 5) How to get a package, unwrap it,
+and make a change before       building it?, 6) I installed a Bundle and
+had a couple of fails. When I      retried, everything resolved nicely.
+Can this be fixed to work      on first try?, 7) In our intranet we have
+many modules for internal use. How      can I integrate these modules with
+CPAN.pm but without uploading      the modules to CPAN?
+
 =item BUGS
 
 =item AUTHOR
@@ -7646,8 +7943,9 @@ C<byacc>, C<byteorder>
 =item c
 
 C<c>, C<castflags>, C<cat>, C<cc>, C<cccdlflags>, C<ccdlflags>, C<ccflags>,
-C<ccsymbols>, C<cf_by>, C<cf_email>, C<cf_time>, C<charsize>, C<chgrp>,
-C<chmod>, C<chown>, C<clocktype>, C<comm>, C<compress>
+C<ccflags_uselargefiles>, C<ccname>, C<ccsymbols>, C<ccversion>, C<cf_by>,
+C<cf_email>, C<cf_time>, C<charsize>, C<chgrp>, C<chmod>, C<chown>,
+C<clocktype>, C<comm>, C<compress>
 
 =item C
 
@@ -7692,22 +7990,23 @@ C<d_msync>, C<d_munmap>, C<d_mymalloc>, C<d_nice>, C<d_nv_preserves_uv>,
 C<d_nv_preserves_uv_bits>, C<d_off64_t>, C<d_old_pthread_create_joinable>,
 C<d_oldpthreads>, C<d_oldsock>, C<d_open3>, C<d_pathconf>, C<d_pause>,
 C<d_perl_otherlibdirs>, C<d_phostname>, C<d_pipe>, C<d_poll>,
-C<d_portable>, C<d_PRId64>, C<d_PRIeldbl>, C<d_PRIEldbl>, C<d_PRIfldbl>,
-C<d_PRIFldbl>, C<d_PRIgldbl>, C<d_PRIGldbl>, C<d_PRIi64>, C<d_PRIo64>,
-C<d_PRIu64>, C<d_PRIx64>, C<d_PRIX64>, C<d_pthread_yield>, C<d_pwage>,
+C<d_portable>, C<d_PRId64>, C<d_PRIeldbl>, C<d_PRIEUldbl>, C<d_PRIfldbl>,
+C<d_PRIFUldbl>, C<d_PRIgldbl>, C<d_PRIGUldbl>, C<d_PRIi64>, C<d_PRIo64>,
+C<d_PRIu64>, C<d_PRIx64>, C<d_PRIXU64>, C<d_pthread_yield>, C<d_pwage>,
 C<d_pwchange>, C<d_pwclass>, C<d_pwcomment>, C<d_pwexpire>, C<d_pwgecos>,
 C<d_pwpasswd>, C<d_pwquota>, C<d_qgcvt>, C<d_quad>, C<d_readdir>,
 C<d_readlink>, C<d_rename>, C<d_rewinddir>, C<d_rmdir>, C<d_safebcpy>,
 C<d_safemcpy>, C<d_sanemcmp>, C<d_sched_yield>, C<d_scm_rights>,
-C<d_seekdir>, C<d_select>, C<d_sem>, C<d_semctl>, C<d_semctl_semid_ds>,
-C<d_semctl_semun>, C<d_semget>, C<d_semop>, C<d_setegid>, C<d_seteuid>,
-C<d_setgrent>, C<d_setgrps>, C<d_sethent>, C<d_setlinebuf>, C<d_setlocale>,
-C<d_setnent>, C<d_setpent>, C<d_setpgid>, C<d_setpgrp2>, C<d_setpgrp>,
-C<d_setprior>, C<d_setpwent>, C<d_setregid>, C<d_setresgid>,
-C<d_setresuid>, C<d_setreuid>, C<d_setrgid>, C<d_setruid>, C<d_setsent>,
-C<d_setsid>, C<d_setvbuf>, C<d_sfio>, C<d_shm>, C<d_shmat>,
-C<d_shmatprototype>, C<d_shmctl>, C<d_shmdt>, C<d_shmget>, C<d_sigaction>,
-C<d_sigsetjmp>, C<d_socket>, C<d_socklen_t>, C<d_sockpair>, C<d_sqrtl>,
+C<d_SCNfldbl>, C<d_seekdir>, C<d_select>, C<d_sem>, C<d_semctl>,
+C<d_semctl_semid_ds>, C<d_semctl_semun>, C<d_semget>, C<d_semop>,
+C<d_setegid>, C<d_seteuid>, C<d_setgrent>, C<d_setgrps>, C<d_sethent>,
+C<d_setlinebuf>, C<d_setlocale>, C<d_setnent>, C<d_setpent>, C<d_setpgid>,
+C<d_setpgrp2>, C<d_setpgrp>, C<d_setprior>, C<d_setproctitle>,
+C<d_setpwent>, C<d_setregid>, C<d_setresgid>, C<d_setresuid>,
+C<d_setreuid>, C<d_setrgid>, C<d_setruid>, C<d_setsent>, C<d_setsid>,
+C<d_setvbuf>, C<d_sfio>, C<d_shm>, C<d_shmat>, C<d_shmatprototype>,
+C<d_shmctl>, C<d_shmdt>, C<d_shmget>, C<d_sigaction>, C<d_sigsetjmp>,
+C<d_socket>, C<d_socklen_t>, C<d_sockpair>, C<d_socks5_init>, C<d_sqrtl>,
 C<d_statblks>, C<d_statfs_f_flags>, C<d_statfs_s>, C<d_statvfs>,
 C<d_stdio_cnt_lval>, C<d_stdio_ptr_lval>, C<d_stdio_stream_array>,
 C<d_stdiobase>, C<d_stdstdio>, C<d_strchr>, C<d_strcoll>, C<d_strctcpy>,
@@ -7735,38 +8034,38 @@ C<fpossize>, C<fpostype>, C<freetype>, C<full_ar>, C<full_csh>, C<full_sed>
 
 =item g
 
-C<gccversion>, C<gidformat>, C<gidsign>, C<gidsize>, C<gidtype>,
-C<glibpth>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
+C<gccosandvers>, C<gccversion>, C<gidformat>, C<gidsign>, C<gidsize>,
+C<gidtype>, C<glibpth>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
 
 =item h
 
-C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>, C<huge>
+C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>
 
 =item i
 
 C<i16size>, C<i16type>, C<i32size>, C<i32type>, C<i64size>, C<i64type>,
 C<i8size>, C<i8type>, C<i_arpainet>, C<i_bsdioctl>, C<i_db>, C<i_dbm>,
 C<i_dirent>, C<i_dld>, C<i_dlfcn>, C<i_fcntl>, C<i_float>, C<i_gdbm>,
-C<i_grp>, C<i_iconv>, C<i_ieeefp>, C<i_inttypes>, C<i_limits>, C<i_locale>,
-C<i_machcthr>, C<i_malloc>, C<i_math>, C<i_memory>, C<i_mntent>, C<i_ndbm>,
-C<i_netdb>, C<i_neterrno>, C<i_netinettcp>, C<i_niin>, C<i_poll>,
-C<i_prot>, C<i_pthread>, C<i_pwd>, C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>,
-C<i_shadow>, C<i_socks>, C<i_stdarg>, C<i_stddef>, C<i_stdlib>,
-C<i_string>, C<i_sunmath>, C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>,
-C<i_sysfilio>, C<i_sysin>, C<i_sysioctl>, C<i_syslog>, C<i_sysmman>,
-C<i_sysmode>, C<i_sysmount>, C<i_sysndir>, C<i_sysparam>, C<i_sysresrc>,
-C<i_syssecrt>, C<i_sysselct>, C<i_syssockio>, C<i_sysstat>, C<i_sysstatfs>,
-C<i_sysstatvfs>, C<i_systime>, C<i_systimek>, C<i_systimes>, C<i_systypes>,
-C<i_sysuio>, C<i_sysun>, C<i_sysutsname>, C<i_sysvfs>, C<i_syswait>,
-C<i_termio>, C<i_termios>, C<i_time>, C<i_unistd>, C<i_ustat>, C<i_utime>,
-C<i_values>, C<i_varargs>, C<i_varhdr>, C<i_vfork>,
-C<ignore_versioned_solibs>, C<inc_version_list>, C<inc_version_list_init>,
-C<incpath>, C<inews>, C<installarchlib>, C<installbin>, C<installman1dir>,
-C<installman3dir>, C<installprefix>, C<installprefixexp>,
-C<installprivlib>, C<installscript>, C<installsitearch>, C<installsitebin>,
-C<installsitelib>, C<installstyle>, C<installusrbinperl>,
-C<installvendorarch>, C<installvendorbin>, C<installvendorlib>, C<intsize>,
-C<ivdformat>, C<ivsize>, C<ivtype>
+C<i_grp>, C<i_iconv>, C<i_ieeefp>, C<i_inttypes>, C<i_libutil>,
+C<i_limits>, C<i_locale>, C<i_machcthr>, C<i_malloc>, C<i_math>,
+C<i_memory>, C<i_mntent>, C<i_ndbm>, C<i_netdb>, C<i_neterrno>,
+C<i_netinettcp>, C<i_niin>, C<i_poll>, C<i_prot>, C<i_pthread>, C<i_pwd>,
+C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>, C<i_shadow>, C<i_socks>,
+C<i_stdarg>, C<i_stddef>, C<i_stdlib>, C<i_string>, C<i_sunmath>,
+C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>, C<i_sysfilio>, C<i_sysin>,
+C<i_sysioctl>, C<i_syslog>, C<i_sysmman>, C<i_sysmode>, C<i_sysmount>,
+C<i_sysndir>, C<i_sysparam>, C<i_sysresrc>, C<i_syssecrt>, C<i_sysselct>,
+C<i_syssockio>, C<i_sysstat>, C<i_sysstatfs>, C<i_sysstatvfs>,
+C<i_systime>, C<i_systimek>, C<i_systimes>, C<i_systypes>, C<i_sysuio>,
+C<i_sysun>, C<i_sysutsname>, C<i_sysvfs>, C<i_syswait>, C<i_termio>,
+C<i_termios>, C<i_time>, C<i_unistd>, C<i_ustat>, C<i_utime>, C<i_values>,
+C<i_varargs>, C<i_varhdr>, C<i_vfork>, C<ignore_versioned_solibs>,
+C<inc_version_list>, C<inc_version_list_init>, C<incpath>, C<inews>,
+C<installarchlib>, C<installbin>, C<installman1dir>, C<installman3dir>,
+C<installprefix>, C<installprefixexp>, C<installprivlib>, C<installscript>,
+C<installsitearch>, C<installsitebin>, C<installsitelib>, C<installstyle>,
+C<installusrbinperl>, C<installvendorarch>, C<installvendorbin>,
+C<installvendorlib>, C<intsize>, C<ivdformat>, C<ivsize>, C<ivtype>
 
 =item k
 
@@ -7774,12 +8073,12 @@ C<known_extensions>, C<ksh>
 
 =item l
 
-C<large>, C<ld>, C<lddlflags>, C<ldflags>, C<ldlibpthname>, C<less>,
-C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
-C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>, C<line>, C<lint>,
-C<lkflags>, C<ln>, C<lns>, C<locincpth>, C<loclibpth>, C<longdblsize>,
-C<longlongsize>, C<longsize>, C<lp>, C<lpr>, C<ls>, C<lseeksize>,
-C<lseektype>
+C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>, C<ldlibpthname>,
+C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
+C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>,
+C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>, C<ln>, C<lns>,
+C<locincpth>, C<loclibpth>, C<longdblsize>, C<longlongsize>, C<longsize>,
+C<lp>, C<lpr>, C<ls>, C<lseeksize>, C<lseektype>
 
 =item m
 
@@ -7789,15 +8088,15 @@ C<man3direxp>, C<man3ext>
 
 =item M
 
-C<Mcc>, C<medium>, C<mips_type>, C<mkdir>, C<mmaptype>, C<models>,
-C<modetype>, C<more>, C<multiarch>, C<mv>, C<myarchname>, C<mydomain>,
-C<myhostname>, C<myuname>
+C<Mcc>, C<mips_type>, C<mkdir>, C<mmaptype>, C<modetype>, C<more>,
+C<multiarch>, C<mv>, C<myarchname>, C<mydomain>, C<myhostname>, C<myuname>
 
 =item n
 
 C<n>, C<netdb_hlen_type>, C<netdb_host_type>, C<netdb_name_type>,
 C<netdb_net_type>, C<nm>, C<nm_opt>, C<nm_so_opt>, C<nonxs_ext>, C<nroff>,
-C<nvsize>, C<nvtype>
+C<nveformat>, C<nvEUformat>, C<nvfformat>, C<nvFUformat>, C<nvgformat>,
+C<nvGUformat>, C<nvsize>, C<nvtype>
 
 =item o
 
@@ -7812,9 +8111,9 @@ C<perl>
 =item P
 
 C<PERL_REVISION>, C<PERL_SUBVERSION>, C<PERL_VERSION>, C<perladmin>,
-C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>, C<pm_apiversion>,
-C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>, C<privlibexp>,
-C<prototype>, C<ptrsize>
+C<perllibs>, C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>,
+C<pm_apiversion>, C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>,
+C<privlibexp>, C<prototype>, C<ptrsize>
 
 =item q
 
@@ -7833,14 +8132,14 @@ C<shmattype>, C<shortsize>, C<shrpenv>, C<shsharp>, C<sig_count>,
 C<sig_name>, C<sig_name_init>, C<sig_num>, C<sig_num_init>, C<signal_t>,
 C<sitearch>, C<sitearchexp>, C<sitebin>, C<sitebinexp>, C<sitelib>,
 C<sitelib_stem>, C<sitelibexp>, C<siteprefix>, C<siteprefixexp>,
-C<sizesize>, C<sizetype>, C<sleep>, C<smail>, C<small>, C<so>,
-C<sockethdr>, C<socketlib>, C<socksizetype>, C<sort>, C<spackage>,
-C<spitshell>, C<split>, C<sPRId64>, C<sPRIeldbl>, C<sPRIEldbl>,
-C<sPRIfldbl>, C<sPRIFldbl>, C<sPRIgldbl>, C<sPRIGldbl>, C<sPRIi64>,
-C<sPRIo64>, C<sPRIu64>, C<sPRIx64>, C<sPRIX64>, C<src>, C<ssizetype>,
-C<startperl>, C<startsh>, C<static_ext>, C<stdchar>, C<stdio_base>,
-C<stdio_bufsiz>, C<stdio_cnt>, C<stdio_filbuf>, C<stdio_ptr>,
-C<stdio_stream_array>, C<strings>, C<submit>, C<subversion>, C<sysman>
+C<sizesize>, C<sizetype>, C<sleep>, C<smail>, C<so>, C<sockethdr>,
+C<socketlib>, C<socksizetype>, C<sort>, C<spackage>, C<spitshell>,
+C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>, C<sPRIfldbl>, C<sPRIFUldbl>,
+C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>, C<sPRIo64>, C<sPRIu64>,
+C<sPRIx64>, C<sPRIXU64>, C<src>, C<sSCNfldbl>, C<ssizetype>, C<startperl>,
+C<startsh>, C<static_ext>, C<stdchar>, C<stdio_base>, C<stdio_bufsiz>,
+C<stdio_cnt>, C<stdio_filbuf>, C<stdio_ptr>, C<stdio_stream_array>,
+C<strings>, C<submit>, C<subversion>, C<sysman>
 
 =item t
 
@@ -7857,13 +8156,13 @@ C<uselongdouble>, C<usemorebits>, C<usemultiplicity>, C<usemymalloc>,
 C<usenm>, C<useopcode>, C<useperlio>, C<useposix>, C<usesfio>,
 C<useshrplib>, C<usesocks>, C<usethreads>, C<usevendorprefix>, C<usevfork>,
 C<usrinc>, C<uuname>, C<uvoformat>, C<uvsize>, C<uvtype>, C<uvuformat>,
-C<uvxformat>
+C<uvxformat>, C<uvXUformat>
 
 =item v
 
 C<vendorarch>, C<vendorarchexp>, C<vendorbin>, C<vendorbinexp>,
 C<vendorlib>, C<vendorlib_stem>, C<vendorlibexp>, C<vendorprefix>,
-C<vendorprefixexp>, C<version>, C<vi>, C<voidflags>
+C<vendorprefixexp>, C<version>, C<versiononly>, C<vi>, C<voidflags>
 
 =item x
 
@@ -8144,6 +8443,12 @@ Dumper
 
 =item DESCRIPTION
 
+=over
+
+=item Memory footprint debugging
+
+=back
+
 =item EXAMPLES
 
 =over
@@ -8255,6 +8560,28 @@ Perl code
 
 =back
 
+=head2 Encode - character encodings
+
+=over
+
+=item TERMINOLOGY
+
+=item bytes
+
+=item chars
+
+=item chars With Encoding
+
+=item Testing For UTF-8
+
+=item Toggling UTF-8-ness
+
+=item UTF-16 and UTF-32 Encodings
+
+=item Handling Malformed Data
+
+=back
+
 =head2 English - use nice English (or awk) names for ugly punctuation
 variables
 
@@ -9145,8 +9472,9 @@ rmscopy($from,$to[,$date_flag])
 
 =item DESCRIPTION
 
-C<wanted>, C<bydepth>, C<follow>, C<follow_fast>, C<follow_skip>,
-C<no_chdir>, C<untaint>, C<untaint_pattern>, C<untaint_skip>
+C<wanted>, C<bydepth>, C<preprocess>, C<postprocess>, C<follow>,
+C<follow_fast>, C<follow_skip>, C<no_chdir>, C<untaint>,
+C<untaint_pattern>, C<untaint_skip>
 
 =item CAVEAT
 
@@ -9421,6 +9749,8 @@ catpath
 
 =over
 
+=item PORTABILITY
+
 =item SYNOPSIS
 
 =item DESCRIPTION
@@ -9615,6 +9945,8 @@ $fh->print, $fh->printf, $fh->getline, $fh->getlines
 
 =over
 
+=item Object oriented interface
+
 =item Documentation and help texts
 
 =item Storing options in a hash
@@ -9629,10 +9961,11 @@ $fh->print, $fh->printf, $fh->getline, $fh->getlines
 
 =item Configuring Getopt::Long
 
-default, auto_abbrev, getopt_compat, require_order, permute, bundling
-(default: reset), bundling_override (default: reset), ignore_case 
-(default: set), ignore_case_always (default: reset), pass_through (default:
-reset), prefix, prefix_pattern, debug (default: reset)
+default, posix_default, auto_abbrev, getopt_compat, gnu_compat, gnu_getopt,
+require_order, permute, bundling (default: disabled), bundling_override
+(default: disabled), ignore_case  (default: enabled), ignore_case_always
+(default: disabled), pass_through (default: disabled), prefix,
+prefix_pattern, debug (default: disabled)
 
 =item Return values and Errors
 
@@ -9648,6 +9981,17 @@ reset), prefix, prefix_pattern, debug (default: reset)
 
 =back
 
+=item Trouble Shooting
+
+=over
+
+=item Warning: Ignoring '!' modifier for short option
+
+=item GetOptions does not return a false result when an option is not
+supplied
+
+=back
+
 =item AUTHOR
 
 =item COPYRIGHT AND DISCLAIMER
@@ -10416,7 +10760,17 @@ cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical
 
 =item SYNOPSIS
 
-=item DESCRIPTION
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over
+
+=item C<ndbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
 
 =back
 
@@ -10531,7 +10885,17 @@ functions
 
 =item SYNOPSIS
 
-=item DESCRIPTION
+C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
+
+=item DIAGNOSTICS
+
+=over
+
+=item C<odbm store returned -1, errno 22, key "..." at ...>
+
+=back
+
+=item BUGS AND WARNINGS
 
 =back
 
@@ -10798,7 +11162,13 @@ argument for =over, previous =item has no contents, preceding non-item
 paragraph(s), =item type mismatch (I<one> vs. I<two>), I<N> unescaped
 C<E<lt>E<gt>> in paragraph, Unknown entity, No items in =over, No argument
 for =item, empty section in previous paragraph, Verbatim paragraph in NAME
-section, Hyperlinks
+section
+
+=item Hyperlinks
+
+collapsing newlines to blanks, ignoring leading/trailing whitespace in
+link, (section) in '$page' deprecated, alternative text/node '%s' contains
+non-escaped | or /
 
 =back
 
@@ -10810,6 +11180,8 @@ section, Hyperlinks
 
 =back
 
+C<Pod::Checker-E<gt>new( %options )>
+
 C<$checker-E<gt>poderror( @args )>, C<$checker-E<gt>poderror( {%opts},
 @args )>
 
@@ -10837,9 +11209,39 @@ C<$checker-E<gt>hyperlink()>
 
 =item DESCRIPTION
 
-=item OPTIONS
+=back
+
+=over
+
+=item C<pod_find( { %opts } , @directories )>
+
+C<-verbose =E<gt> 1>, C<-perl =E<gt> 1>, C<-script =E<gt> 1>, C<-inc =E<gt>
+1>
+
+=back
+
+=over
+
+=item C<simplify_name( $str )>
+
+=back
+
+=over
 
-B<-verbose>, B<-perl>, B<-script>, B<-inc>
+=item C<pod_where( { %opts }, $pod )>
+
+C<-inc =E<gt> 1>, C<-dirs =E<gt> [ $dir1, $dir2, ... ]>, C<-verbose =E<gt>
+1>
+
+=back
+
+=over
+
+=item C<contains_pod( $file , $verbose )>
+
+=back
+
+=over
 
 =item AUTHOR
 
@@ -10886,8 +11288,8 @@ commands, etc.
 
 =item DESCRIPTION
 
-B<Pod::InputSource>, B<Pod::Paragraph>, B<Pod::InteriorSequence>,
-B<Pod::ParseTree>
+package B<Pod::InputSource>, package B<Pod::Paragraph>, package
+B<Pod::InteriorSequence>, package B<Pod::ParseTree>
 
 =back
 
@@ -10929,49 +11331,49 @@ B<Pod::ParseTree>
 
 =over
 
-=item B<new()>
+=item Pod::Paragraph-E<gt>B<new()>
 
 =back
 
 =over
 
-=item B<cmd_name()>
+=item $pod_para-E<gt>B<cmd_name()>
 
 =back
 
 =over
 
-=item B<text()>
+=item $pod_para-E<gt>B<text()>
 
 =back
 
 =over
 
-=item B<raw_text()>
+=item $pod_para-E<gt>B<raw_text()>
 
 =back
 
 =over
 
-=item B<cmd_prefix()>
+=item $pod_para-E<gt>B<cmd_prefix()>
 
 =back
 
 =over
 
-=item B<cmd_separator()>
+=item $pod_para-E<gt>B<cmd_separator()>
 
 =back
 
 =over
 
-=item B<parse_tree()>
+=item $pod_para-E<gt>B<parse_tree()>
 
 =back
 
 =over
 
-=item B<file_line()>
+=item $pod_para-E<gt>B<file_line()>
 
 =back
 
@@ -10983,67 +11385,67 @@ B<Pod::ParseTree>
 
 =over
 
-=item B<new()>
+=item Pod::InteriorSequence-E<gt>B<new()>
 
 =back
 
 =over
 
-=item B<cmd_name()>
+=item $pod_seq-E<gt>B<cmd_name()>
 
 =back
 
 =over
 
-=item B<prepend()>
+=item $pod_seq-E<gt>B<prepend()>
 
 =back
 
 =over
 
-=item B<append()>
+=item $pod_seq-E<gt>B<append()>
 
 =back
 
 =over
 
-=item B<nested()>
+=item $pod_seq-E<gt>B<nested()>
 
 =back
 
 =over
 
-=item B<raw_text()>
+=item $pod_seq-E<gt>B<raw_text()>
 
 =back
 
 =over
 
-=item B<left_delimiter()>
+=item $pod_seq-E<gt>B<left_delimiter()>
 
 =back
 
 =over
 
-=item B<right_delimiter()>
+=item $pod_seq-E<gt>B<right_delimiter()>
 
 =back
 
 =over
 
-=item B<parse_tree()>
+=item $pod_seq-E<gt>B<parse_tree()>
 
 =back
 
 =over
 
-=item B<file_line()>
+=item $pod_seq-E<gt>B<file_line()>
 
 =back
 
 =over
 
-=item B<DESTROY()>
+=item Pod::InteriorSequence::B<DESTROY()>
 
 =back
 
@@ -11055,43 +11457,43 @@ B<Pod::ParseTree>
 
 =over
 
-=item B<new()>
+=item Pod::ParseTree-E<gt>B<new()>
 
 =back
 
 =over
 
-=item B<top()>
+=item $ptree-E<gt>B<top()>
 
 =back
 
 =over
 
-=item B<children()>
+=item $ptree-E<gt>B<children()>
 
 =back
 
 =over
 
-=item B<prepend()>
+=item $ptree-E<gt>B<prepend()>
 
 =back
 
 =over
 
-=item B<append()>
+=item $ptree-E<gt>B<append()>
 
 =back
 
 =over
 
-=item B<raw_text()>
+=item $ptree-E<gt>B<raw_text()>
 
 =back
 
 =over
 
-=item B<DESTROY()>
+=item Pod::ParseTree::B<DESTROY()>
 
 =back
 
@@ -11229,13 +11631,15 @@ B<_clean_latex_commands>
 
 =item DESCRIPTION
 
-center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, release,
-section
+center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, quotes,
+release, section
 
 =item DIAGNOSTICS
 
-roff font should be 1 or 2 chars, not `%s', Invalid link %s, Unknown escape
-EE<lt>%sE<gt>, Unknown sequence %s, Unmatched =back
+roff font should be 1 or 2 chars, not "%s", Invalid link %s, Invalid quote
+specification "%s", %s:%d: Unknown command paragraph "%s", Unknown escape
+EE<lt>%sE<gt>, Unknown sequence %s, %s: Unknown command paragraph "%s" on
+line %d, Unmatched =back
 
 =item BUGS
 
@@ -11259,87 +11663,87 @@ EE<lt>%sE<gt>, Unknown sequence %s, Unmatched =back
 
 =item Pod::List
 
-new()
+Pod::List-E<gt>new()
 
 =back
 
-file()
+$list-E<gt>file()
 
-start()
+$list-E<gt>start()
 
-indent()
+$list-E<gt>indent()
 
-type()
+$list-E<gt>type()
 
-rx()
+$list-E<gt>rx()
 
-item()
+$list-E<gt>item()
 
-parent()
+$list-E<gt>parent()
 
-tag()
+$list-E<gt>tag()
 
 =over
 
 =item Pod::Hyperlink
 
-new()
+Pod::Hyperlink-E<gt>new()
 
 =back
 
-parse($string)
+$link-E<gt>parse($string)
 
-markup($string)
+$link-E<gt>markup($string)
 
-text()
+$link-E<gt>text()
 
-warning()
+$link-E<gt>warning()
 
-line(), file()
+$link-E<gt>file(), $link-E<gt>line()
 
-page()
+$link-E<gt>page()
 
-node()
+$link-E<gt>node()
 
-alttext()
+$link-E<gt>alttext()
 
-type()
+$link-E<gt>type()
 
-link()
+$link-E<gt>link()
 
 =over
 
 =item Pod::Cache
 
-new()
+Pod::Cache-E<gt>new()
 
 =back
 
-item()
+$cache-E<gt>item()
 
-find_page($name)
+$cache-E<gt>find_page($name)
 
 =over
 
 =item Pod::Cache::Item
 
-new()
+Pod::Cache::Item-E<gt>new()
 
 =back
 
-page()
+$cacheitem-E<gt>page()
 
-description()
+$cacheitem-E<gt>description()
 
-path()
+$cacheitem-E<gt>path()
 
-file()
+$cacheitem-E<gt>file()
 
-nodes()
+$cacheitem-E<gt>nodes()
 
-find_node($name)
+$cacheitem-E<gt>find_node($name)
 
-idx()
+$cacheitem-E<gt>idx()
 
 =over
 
@@ -11723,12 +12127,13 @@ B<-output>, B<-sections>, B<-ranges>
 
 =item DESCRIPTION
 
-alt, indent, loose, sentence, width
+alt, indent, loose, quotes, sentence, width
 
 =item DIAGNOSTICS
 
-Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
-Unknown sequence: %s, Unmatched =back
+Bizarre space in item, Can't open %s for reading: %s, Invalid quote
+specification "%s", %s:%d: Unknown command paragraph "%s", Unknown escape:
+%s, Unknown sequence: %s, Unmatched =back
 
 =item RESTRICTIONS
 
@@ -11912,6 +12317,12 @@ Memory, CPU, Snooping, Signals, State Changes
 
 =item DESCRIPTION
 
+=over
+
+=item OBJECT ORIENTED SYNTAX
+
+=back
+
 =item AUTHOR
 
 =back
@@ -11933,6 +12344,60 @@ pack_sockaddr_un PATH, unpack_sockaddr_un SOCKADDR_UN
 
 =back
 
+=head2 Storable - persistency for perl data structures
+
+=over
+
+=item SYNOPSIS
+
+=item DESCRIPTION
+
+=item MEMORY STORE
+
+=item ADVISORY LOCKING
+
+=item SPEED
+
+=item CANONICAL REPRESENTATION
+
+=item ERROR REPORTING
+
+=item WIZARDS ONLY
+
+=over
+
+=item Hooks
+
+C<STORABLE_freeze> I<obj>, I<cloning>, C<STORABLE_thaw> I<obj>, I<cloning>,
+I<serialized>, ..
+
+=item Predicates
+
+C<Storable::last_op_in_netorder>, C<Storable::is_storing>,
+C<Storable::is_retrieving>
+
+=item Recursion
+
+=item Deep Cloning
+
+=back
+
+=item EXAMPLES
+
+=item WARNING
+
+=item BUGS
+
+=item CREDITS
+
+=item TRANSLATIONS
+
+=item AUTHOR
+
+=item SEE ALSO
+
+=back
+
 =head2 Symbol - manipulate Perl symbols and their names
 
 =over
@@ -12007,12 +12472,14 @@ closelog
 
 =item DIAGNOSTICS
 
-Invalid attribute name %s, Identifier %s used only once: possible typo, No
-comma allowed after filehandle, Bareword %s not allowed while "strict subs"
-in use
+Invalid attribute name %s, Name "%s" used only once: possible typo, No
+comma allowed after filehandle, Bareword "%s" not allowed while "strict
+subs" in use
 
 =item RESTRICTIONS
 
+=item NOTES
+
 =item AUTHORS
 
 =back
@@ -12286,9 +12753,9 @@ new, new NUMBER, down, down NUMBER, up, up NUMBER
 
 =over
 
-=item SYNOPSIS 
+=item SYNOPSIS
 
-=item DESCRIPTION      
+=item DESCRIPTION
 
 TIEARRAY classname, LIST, STORE this, index, value, FETCH this, index,
 FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this,
@@ -12297,7 +12764,7 @@ SHIFT this, UNSHIFT this, LIST, SPLICE this, offset, length, LIST
 
 =item CAVEATS
 
-=item AUTHOR 
+=item AUTHOR
 
 =back
 
@@ -12317,6 +12784,8 @@ EOF this, TELL this, SEEK this, offset, whence, DESTROY this
 
 =item MORE INFORMATION
 
+=item COMPATIBILITY
+
 =back
 
 =head2 Tie::Hash, Tie::StdHash - base class definitions for tied hashes
index c59ecc4..753e721 100644 (file)
@@ -4,10 +4,11 @@ perltrap - Perl traps for the unwary
 
 =head1 DESCRIPTION
 
-The biggest trap of all is forgetting to use the B<-w> switch; see
-L<perlrun>.  The second biggest trap is not making your entire program
-runnable under C<use strict>.  The third biggest trap is not reading
-the list of changes in this version of Perl; see L<perldelta>.
+The biggest trap of all is forgetting to C<use warnings> or use the B<-w>
+switch; see L<perllexwarn> and L<perlrun>. The second biggest trap is not
+making your entire program runnable under C<use strict>.  The third biggest
+trap is not reading the list of changes in this version of Perl; see
+L<perldelta>.
 
 =head2 Awk Traps
 
@@ -116,7 +117,7 @@ The C<next>, C<exit>, and C<continue> keywords work differently.
 The following variables work differently:
 
       Awk      Perl
-      ARGC     $#ARGV or scalar @ARGV
+      ARGC     scalar @ARGV (compare with $#ARGV)
       ARGV[0]  $0
       FILENAME $ARGV
       FNR      $. - something
@@ -187,7 +188,7 @@ ends up in C<$0>.
 =item *
 
 System calls such as link(), unlink(), rename(), etc. return nonzero for
-success, not 0.
+success, not 0. (system(), however, returns zero for success.)
 
 =item *
 
@@ -278,8 +279,8 @@ parentheses on function calls, you won't ever get them confused.
 You cannot discern from mere inspection which builtins
 are unary operators (like chop() and chdir())
 and which are list operators (like print() and unlink()).
-(User-defined subroutines can be B<only> list operators, never
-unary ones.)  See L<perlop>.
+(Unless prototyped, user-defined subroutines can B<only> be list
+operators, never unary ones.)  See L<perlop> and L<perlsub>.
 
 =item *
 
@@ -467,7 +468,7 @@ You can't do a C<goto> into a block that is optimized away.  Darn.
     }
 
     # perl4 prints: Here I is!
-    # perl5 dumps core (SEGV)
+    # perl5 errors: Can't "goto" into the middle of a foreach loop
 
 =item * Discontinuance
 
@@ -638,7 +639,7 @@ Better parsing in perl 5
 String interpolation of the C<$#array> construct differs when braces
 are to used around the name.
 
-    @ = (1..3);
+    @a = (1..3);
     print "${#a}";
 
     # perl4 prints: 2
@@ -788,7 +789,19 @@ variable is localized subsequent to the assignment
 
 Assigning C<undef> to a glob has no effect in Perl 5.   In Perl 4
 it undefines the associated scalar (but may have other side effects
-including SEGVs).
+including SEGVs). Perl 5 will also warn if C<undef> is assigned to a
+typeglob. (Note that assigning C<undef> to a typeglob is different
+than calling the C<undef> function on a typeglob (C<undef *foo>), which
+has quite a few effects.
+
+    $foo = "bar";
+    *foo = undef;
+    print $foo;
+
+    # perl4 prints:
+    # perl4 warns: "Use of uninitialized variable" if using -w
+    # perl5 prints: bar
+    # perl5 warns: "Undefined value assigned to typeglob" if using -w
 
 =item * (Scalar String)
 
@@ -922,26 +935,25 @@ scalar context to its arguments.
 
 =item * (list, builtin)
 
-C<sprintf()> funkiness (array argument converted to scalar array count)
-This test could be added to t/op/sprintf.t
+C<sprintf()> is prototyped as ($;@), so its first argument is given scalar
+context. Thus, if passed an array, it will probably not do what you want,
+unlike Perl 4:
 
     @z = ('%s%s', 'foo', 'bar');
     $x = sprintf(@z);
-    if ($x eq 'foobar') {print "ok 2\n";} else {print "not ok 2 '$x'\n";}
+    print $x;
 
-    # perl4 prints: ok 2
-    # perl5 prints: not ok 2
+    # perl4 prints: foobar
+    # perl5 prints: 3
 
-C<printf()> works fine, though:
+C<printf()> works the same as it did in Perl 4, though:
 
+    @z = ('%s%s', 'foo', 'bar');
     printf STDOUT (@z);
-    print "\n";
 
     # perl4 prints: foobar
     # perl5 prints: foobar
 
-Probably a bug.
-
 =back
 
 =head2 Precedence Traps
@@ -1013,7 +1025,7 @@ Otherwise, perl5 leaves the statement as its default precedence:
     open(FOO || die);
 
     # perl4 opens or dies
-    # perl5 errors: Precedence problem: open FOO should be open(FOO)
+    # perl5 opens FOO, dying only if 'FOO' is false, i.e. never
 
 =item * Precedence
 
@@ -1089,7 +1101,7 @@ state of the searched string is lost)
     }
     sub doit{local($_) = shift; print "Got $_ "}
 
-    # perl4 prints: blah blah blah
+    # perl4 prints: Got blah Got blah Got blah Got blah
     # perl5 prints: infinite loop blah...
 
 =item * Regular Expression
@@ -1103,13 +1115,21 @@ the very first time in any such closure.  For instance, if you say
         my($left,$right) = @_;
         return sub { $_[0] =~ /$left stuff $right/o; };
     }
+    $good = build_match('foo','bar');
+    $bad = build_match('baz','blarch');
+    print $good->('foo stuff bar') ? "ok\n" : "not ok\n";
+    print $bad->('baz stuff blarch') ? "ok\n" : "not ok\n";
+    print $bad->('foo stuff bar') ? "not ok\n" : "ok\n";
+
+For most builds of Perl5, this will print:
+ok
+not ok
+not ok
 
 build_match() will always return a sub which matches the contents of
 $left and $right as they were the I<first> time that build_match()
 was called, not as they are in the current call.
 
-This is probably a bug, and may change in future versions of Perl.
-
 =item * Regular Expression
 
 If no parentheses are used in a match, Perl4 sets C<$+> to
@@ -1207,8 +1227,8 @@ calls if a subroutine by that name is defined before the compiler sees them.
     $SIG{'TERM'} = SeeYa;
     print "SIGTERM is now $SIG{'TERM'}\n";
 
-    # perl4 prints: SIGTERM is main'SeeYa
-    # perl5 prints: SIGTERM is now main::1
+    # perl4 prints: SIGTERM is now main'SeeYa
+    # perl5 prints: SIGTERM is now main::1 (and warns "Hasta la vista, baby!")
 
 Use B<-w> to catch this one
 
@@ -1217,10 +1237,11 @@ Use B<-w> to catch this one
 reverse is no longer allowed as the name of a sort subroutine.
 
     sub reverse{ print "yup "; $a <=> $b }
-    print sort reverse a,b,c;
+    print sort reverse (2,1,3);
 
-    # perl4 prints: yup yup yup yup abc
-    # perl5 prints: abc
+    # perl4 prints: yup yup 123
+    # perl5 prints: 123
+    # perl5 warns (if using -w): Ambiguous call resolved as CORE::reverse()
 
 =item * warn() won't let you specify a filehandle.
 
@@ -1337,14 +1358,15 @@ Note that you can C<use strict;> to ward off such trappiness under perl5.
 
 =item * Interpolation
 
-The construct "this is $$x" used to interpolate the pid at that
-point, but now apparently tries to dereference $x.  C<$$> by itself still
-works fine, however.
+The construct "this is $$x" used to interpolate the pid at that point, but
+now tries to dereference $x.  C<$$> by itself still works fine, however.
 
+    $s = "a reference";
+    $x = *s;
     print "this is $$x\n";
 
     # perl4 prints: this is XXXx   (XXX is the current pid)
-    # perl5 prints: this is
+    # perl5 prints: this is a reference
 
 =item * Interpolation
 
@@ -1409,14 +1431,14 @@ You also have to be careful about array references.
 
 Similarly, watch out for:
 
-    $foo = "array";
+    $foo = "baz";
     print "\$$foo{bar}\n";
 
-    # perl4 prints: $array{bar}
+    # perl4 prints: $baz{bar}
     # perl5 prints: $
 
-Perl 5 is looking for C<$array{bar}> which doesn't exist, but perl 4 is
-happy just to expand $foo to "array" by itself.  Watch out for this
+Perl 5 is looking for C<$foo{bar}> which doesn't exist, but perl 4 is
+happy just to expand $foo to "baz" by itself.  Watch out for this
 especially in C<eval>'s.
 
 =item * Interpolation
@@ -1503,7 +1525,7 @@ Same behavior if you replace C<do> with C<require>.
 
 =item * C<split> on empty string with LIMIT specified
 
-       $string = '';
+    $string = '';
     @list = split(/foo/, $string, 2)
 
 Perl4 returns a one element list containing the empty string but Perl5
index c686661..c9954d8 100644 (file)
@@ -157,20 +157,10 @@ C<(?:\PM\pM*)>.
 
 =item *
 
-The C<tr///> operator translates characters instead of bytes.  It can also
-be forced to translate between 8-bit codes and UTF-8.  For instance, if you
-know your input in Latin-1, you can say:
-
-    while (<>) {
-       tr/\0-\xff//CU;         # latin1 char to utf8
-       ...
-    }
-
-Similarly you could translate your output with
-
-    tr/\0-\x{ff}//UC;          # utf8 to latin1 char
-
-No, C<s///> doesn't take /U or /C (yet?).
+The C<tr///> operator translates characters instead of bytes.  Note
+that the C<tr///CU> functionality has been removed, as the interface
+was a mistake.  For similar functionality see pack('U0', ...) and
+pack('C0', ...).
 
 =item *
 
index 1b2c178..7b56a17 100644 (file)
@@ -35,7 +35,7 @@ piped through your favourite pager.
 
 =item L<pod2html|pod2html> and L<pod2latex|pod2latex>
 
-As well as these two, there are two other convertors: F<pod2html> will
+As well as these two, there are two other converters: F<pod2html> will
 produce HTML pages from POD, and F<pod2latex>, which produces LaTeX
 files.
 
index e75cf35..83f4d9c 100644 (file)
@@ -826,7 +826,7 @@ Then
 would allocate a 64K buffer for use in an emergency.  See the
 F<INSTALL> file in the Perl distribution for information on how to
 enable this option.  To discourage casual use of this advanced
-feature, there is no L<English> long name for this variable.
+feature, there is no L<English|English> long name for this variable.
 
 =item $OSNAME
 
index c696e19..781afe6 100644 (file)
@@ -71,9 +71,8 @@ is usually referred to as the XS language.
 See L<perlxstut> for a tutorial on the whole extension creation process.
 
 Note: For some extensions, Dave Beazley's SWIG system may provide a
-significantly more convenient mechanism for creating the extension glue
-code. See L<http://www.swig.org> for more 
-information.
+significantly more convenient mechanism for creating the extension
+glue code.  See http://www.swig.org/ for more information.
 
 =head2 On The Road
 
@@ -167,21 +166,37 @@ argument and returns a single value.
      sin(x)
        double x
 
-When using parameters with C pointer types, as in
+Optionally, one can merge the description of types and the list of
+argument names, rewriting this as
 
-     double string_to_double(char *s);
+     double
+     sin(double x)
+
+This makes this XSUB look similar to an ANSI C declaration.  An optional
+semicolon is allowed after the argument list, as in
+
+     double
+     sin(double x);
+
+Parameters with C pointer types can have different semantic: C functions
+with similar declarations
 
-there may be two ways to describe this argument to B<xsubpp>:
+     bool string_looks_as_a_number(char *s);
+     bool make_char_uppercase(char *c);
+
+are used in absolutely incompatible manner.  Parameters to these functions
+could be described B<xsubpp> like this:
 
      char *  s
-     char    &s
+     char    &c
 
 Both these XS declarations correspond to the C<char*> C type, but they have
-different semantics.  It is convenient to think that the indirection operator
+different semantics, see L<"The & Unary Operator">.
+
+It is convenient to think that the indirection operator
 C<*> should be considered as a part of the type and the address operator C<&>
-should be considered part of the variable.  See L<"The Typemap"> and
-L<"The & Unary Operator"> for more info about handling qualifiers and unary
-operators in C types.
+should be considered part of the variable.  See L<"The Typemap">
+for more info about handling qualifiers and unary operators in C types.
 
 The function name and the return type must be placed on
 separate lines and should be flush left-adjusted.
@@ -192,7 +207,7 @@ separate lines and should be flush left-adjusted.
     double x                       sin(x)
                                     double x
 
-The function body may be indented or left-adjusted.  The following example
+The rest of the function description may be indented or left-adjusted.  The following example
 shows a function with its body left-adjusted.  Most examples in this
 document will indent the body for better readability.
 
@@ -365,6 +380,31 @@ Likewise,  C<SETMAGIC: ENABLE> can be used to reenable it for the
 remainder of the OUTPUT section.  See L<perlguts> for more details
 about 'set' magic.
 
+=head2 The NO_OUTPUT Keyword
+
+The NO_OUTPUT can be placed as the first token of the XSUB.  This keyword
+indicates that while the C subroutine we provide an interface to has
+a non-C<void> return type, the return value of this C subroutine should not
+be returned from the generated Perl subroutine.
+
+With this keyword present L<The RETVAL Variable> is created, and in the
+generated call to the subroutine this variable is assigned to, but the value
+of this variable is not going to be used in the auto-generated code.
+
+This keyword makes sense only if C<RETVAL> is going to be accessed by the
+user-supplied code.  It is especially useful to make a function interface
+more Perl-like, especially when the C return value is just an error condition
+indicator.  For example,
+
+  NO_OUTPUT int
+  delete_file(char *name)
+    POST_CALL:
+      if (RETVAL != 0)
+         croak("Error %d while deleting file '%s'", RETVAL, name);
+
+Here the generated XS function returns nothing on success, and will die()
+with a meaningful error message on error.
+
 =head2 The CODE: Keyword
 
 This keyword is used in more complicated XSUBs which require
@@ -714,6 +754,70 @@ thus C<host> is initialized on the declaration line, and our assignment
 C<h = host> is not performed too early.  Otherwise one would need to have the
 assignment C<h = host> in a CODE: or INIT: section.)
 
+=head2 The IN/OUTLIST/IN_OUTLIST Keywords
+
+In the list of parameters for an XSUB, one can precede parameter names
+by the C<IN>/C<OUTLIST>/C<IN_OUTLIST> keywords.  C<IN> keyword is a default,
+the other two keywords indicate how the Perl interface should differ from
+the C interface.
+
+Parameters preceded by C<OUTLIST>/C<IN_OUTLIST> keywords are considered to
+be used by the C subroutine I<via pointers>.  C<OUTLIST> keyword indicates
+that the C subroutine does not inspect the memory pointed by this parameter,
+but will write through this pointer to provide additional return values.
+Such parameters do not appear in the usage signature of the generated Perl
+function.
+
+Parameters preceded by C<IN_OUTLIST> I<do> appear as parameters to the
+Perl function.  These parameters are converted to the corresponding C type,
+then pointers to these data are given as arguments to the C function.  It
+is expected that the C function will write through these pointers 
+
+The return list of the generated Perl function consists of the C return value
+from the function (unless the XSUB is of C<void> return type or
+C<The NO_INIT Keyword> was used) followed by all the C<OUTLIST>
+and C<IN_OUTLIST> parameters (in the order of appearence).  Say, an XSUB
+
+  void
+  day_month(OUTLIST day, IN unix_time, OUTLIST month)
+    int day
+    int unix_time
+    int month
+
+should be used from Perl as
+
+  my ($day, $month) = day_month(time);
+
+The C signature of the corresponding function should be
+
+  void day_month(int *day, int unix_time, int *month);
+
+The C<in>/C<OUTLIST>/C<IN_OUTLIST> keywords can be mixed with ANSI-style
+declarations, as in
+
+  void
+  day_month(OUTLIST int day, int unix_time, OUTLIST int month)
+
+(here the optional C<IN> keyword is omitted).
+
+The C<IN_OUTLIST> parameters are somewhat similar to parameters introduced
+with L<The & Unary Operator> and put into the C<OUTPUT:> section (see
+L<The OUTPUT: Keyword>).  Say, the same C function can be interfaced with as
+
+  void
+  day_month(day, unix_time, month)
+      int &day = NO_INIT
+      int  unix_time
+      int &month = NO_INIT
+    OUTPUT:
+      day
+      month
+
+However, the generated Perl function is called in very C-ish style:
+
+  my ($day, $month);
+  day_month($day, time, $month);
+
 =head2 Variable-length Parameter Lists
 
 XSUBs can have variable-length parameter lists by specifying an ellipsis
@@ -928,14 +1032,14 @@ rewrite this example as:
        OUTPUT:
          RETVAL
 
-In fact, one can put this check into a CLEANUP: section as well.  Together
+In fact, one can put this check into a POST_CALL: section as well.  Together
 with PREINIT: simplifications, this leads to:
 
      int
      rpcb_gettime(host)
           char *host
           time_t  timep;
-       CLEANUP:
+       POST_CALL:
          if (RETVAL == 0)
                XSRETURN_UNDEF;
 
@@ -956,6 +1060,16 @@ any CODE:, PPCODE:, or OUTPUT: blocks which are present in the XSUB.  The
 code specified for the cleanup block will be added as the last statements
 in the XSUB.
 
+=head2 The POST_CALL: Keyword
+
+This keyword can be used when an XSUB requires special procedures
+executed after the C subroutine call is performed.  When the POST_CALL:
+keyword is used it must precede OUTPUT: and CLEANUP: blocks which are
+present in the XSUB.
+
+The POST_CALL: block does not make a lot of sense when the C subroutine
+call is supplied by user by providing either CODE: or PPCODE: section.
+
 =head2 The BOOT: Keyword
 
 The BOOT: keyword is used to add code to the extension's bootstrap
@@ -1236,7 +1350,7 @@ C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
 =head2 Inserting Comments and C Preprocessor Directives
 
 C preprocessor directives are allowed within BOOT:, PREINIT: INIT:,
-CODE:, PPCODE:, and CLEANUP: blocks, as well as outside the functions.
+CODE:, PPCODE:, POST_CALL:, and CLEANUP: blocks, as well as outside the functions.
 Comments are allowed anywhere after the MODULE keyword.  The compiler
 will pass the preprocessor directives through untouched and will remove
 the commented lines.
@@ -1391,7 +1505,7 @@ of failure.  They may be
 candidates to return undef or an empty list in case of failure.  If the
 failure may be detected without a call to the C function, you may want to use
 an INIT: section to report the failure.  For failures detectable after the C
-function returns one may want to use a CLEANUP: section to process the
+function returns one may want to use a POST_CALL: section to process the
 failure.  In more complicated cases use CODE: or PPCODE: sections.
 
 If many functions use the same failure indication based on the return value,
@@ -1510,10 +1624,10 @@ OUTPUT code fragments should be used to map a given C type to a Perl value.
 The section labels C<TYPEMAP>, C<INPUT>, or C<OUTPUT> must begin
 in the first column on a line by themselves, and must be in uppercase.
 
-The default typemap in the C<ext> directory of the Perl source contains many
-useful types which can be used by Perl extensions.  Some extensions define
-additional typemaps which they keep in their own directory.  These
-additional typemaps may reference INPUT and OUTPUT maps in the main
+The default typemap in the C<lib/ExtUtils> directory of the Perl source
+contains many useful types which can be used by Perl extensions.  Some
+extensions define additional typemaps which they keep in their own directory.
+These additional typemaps may reference INPUT and OUTPUT maps in the main
 typemap.  The B<xsubpp> compiler will allow the extension's own typemap to
 override any mappings which are in the default typemap.
 
@@ -1636,4 +1750,4 @@ This document covers features supported by C<xsubpp> 1.935.
 
 Originally written by Dean Roehrich <F<roehrich@cray.com>>.
 
-Maintained since 1996 by The Perl Porters <F<perlbug@perl.com>>.
+Maintained since 1996 by The Perl Porters <F<perlbug@perl.org>>.
index bf35cff..4c5831b 100644 (file)
@@ -36,7 +36,7 @@ $Config{startperl}
 print OUT <<'!NO!SUBS!';
 
 # pod2man -- Convert POD data to formatted *roff input.
-# $Id: pod2man.PL,v 1.2 2000/03/16 21:08:23 eagle Exp $
+# $Id: pod2man.PL,v 1.3 2000/09/03 09:20:52 eagle Exp $
 #
 # Copyright 1999, 2000 by Russ Allbery <rra@stanford.edu>
 #
@@ -63,7 +63,8 @@ my %options;
 Getopt::Long::config ('bundling_override');
 GetOptions (\%options, 'section|s=s', 'release|r=s', 'center|c=s',
             'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s',
-            'fixedbolditalic=s', 'official|o', 'lax|l', 'help|h') or exit 1;
+            'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l',
+            'help|h') or exit 1;
 pod2usage (0) if $options{help};
 
 # Official sets --center, but don't override things explicitly set.
@@ -86,8 +87,8 @@ pod2man - Convert POD data to formatted *roff input
 pod2man [B<--section>=I<manext>] [B<--release>=I<version>]
 [B<--center>=I<string>] [B<--date>=I<string>] [B<--fixed>=I<font>]
 [B<--fixedbold>=I<font>] [B<--fixeditalic>=I<font>]
-[B<--fixedbolditalic>=I<font>] [B<--official>] [B<--lax>] [I<input>
-[I<output>]]
+[B<--fixedbolditalic>=I<font>] [B<--official>] [B<--lax>]
+[B<--quotes>=I<quotes>] [I<input> [I<output>]]
 
 pod2man B<--help>
 
@@ -173,6 +174,19 @@ POD checking functionality is not yet implemented in Pod::Man.
 Set the default header to indicate that this page is part of the standard
 Perl release, if B<--center> is not also given.
 
+=item B<-q> I<quotes>, B<--quotes>=I<quotes>
+
+Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right
+quote; if I<quotes> is two characters, the first character is used as the
+left quote and the second as the right quoted; and if I<quotes> is four
+characters, the first two are used as the left quote and the second two as
+the right quote.
+
+I<quotes> may also be set to the special value C<none>, in which case no
+quote marks are added around CE<lt>> text (but the font is still changed for
+troff output).
+
 =item B<-r>, B<--release>
 
 Set the centered footer.  By default, this is the version of Perl you run
index c5460ae..b4965cb 100644 (file)
@@ -75,7 +75,8 @@ my %options;
 $options{sentence} = 0;
 Getopt::Long::config ('bundling');
 GetOptions (\%options, 'alt|a', 'color|c', 'help|h', 'indent|i=i',
-            'loose|l', 'sentence|s', 'termcap|t', 'width|w=i') or exit 1;
+            'loose|l', 'quotes|q=s', 'sentence|s', 'termcap|t',
+            'width|w=i') or exit 1;
 pod2usage (1) if $options{help};
 
 # Figure out what formatter we're going to use.  -c overrides -t.
@@ -103,7 +104,8 @@ pod2text - Convert POD data to formatted ASCII text
 
 =head1 SYNOPSIS
 
-pod2text [B<-aclst>] [B<-i> I<indent>] [B<-w> I<width>] [I<input> [I<output>]]
+pod2text [B<-aclst>] [B<-i> I<indent>] [B<-q> I<quotes>] [B<-w> I<width>]
+[I<input> [I<output>]]
 
 pod2text B<-h>
 
@@ -148,6 +150,18 @@ printed after C<=head1>, although one is still printed after C<=head2>,
 because this is the expected formatting for manual pages; if you're
 formatting arbitrary text documents, using this option is recommended.
 
+=item B<-q> I<quotes>, B<--quotes>=I<quotes>
+
+Sets the quote marks used to surround CE<lt>> text to I<quotes>.  If
+I<quotes> is a single character, it is used as both the left and right
+quote; if I<quotes> is two characters, the first character is used as the
+left quote and the second as the right quoted; and if I<quotes> is four
+characters, the first two are used as the left quote and the second two as
+the right quote.
+
+I<quotes> may also be set to the special value C<none>, in which case no
+quote marks are added around CE<lt>> text.
+
 =item B<-s>, B<--sentence>
 
 Assume each sentence ends with two spaces and try to preserve that spacing.
index e0f70b2..1c1296a 100644 (file)
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
 #############################################################################
 # pod2usage -- command to print usage messages from embedded pod docs
 #
-# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved.
 # This file is part of "PodParser". PodParser is free software;
 # you can redistribute it and/or modify it under the same terms
 # as Perl itself.
index a7f9643..20d5e94 100644 (file)
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
 #############################################################################
 # podchecker -- command to invoke the podchecker function in Pod::Checker
 #
-# Copyright (c) 1998-1999 by Bradford Appleton. All rights reserved.
+# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved.
 # This file is part of "PodParser". PodParser is free software;
 # you can redistribute it and/or modify it under the same terms
 # as Perl itself.
@@ -70,7 +70,9 @@ Print the manual page and exit.
 
 =item B<-warnings> B<-nowarnings>
 
-Turn on/off printing of warnings.
+Turn on/off printing of warnings. Repeating B<-warnings> increases the
+warning level, i.e. more warnings are printed. Currently increasing to
+level two causes flagging of unescaped "E<lt>,E<gt>" characters.
 
 =item I<file>
 
@@ -85,6 +87,8 @@ syntax errors in the POD documentation and will print any errors
 it find to STDERR. At the end, it will print a status message
 indicating the number of errors found.
 
+Directories are ignored, an appropriate warning message is printed.
+
 B<podchecker> invokes the B<podchecker()> function exported by B<Pod::Checker>
 Please see L<Pod::Checker/podchecker()> for more details.
 
@@ -124,24 +128,34 @@ use Pod::Usage;
 use Getopt::Long;
 
 ## Define options
-my %options = (
-        "help"     => 0,
-        "man"      => 0,
-        "warnings" => 1,
-);
+my %options;
 
 ## Parse options
-GetOptions(\%options, "help", "man", "warnings!")  ||  pod2usage(2);
+GetOptions(\%options, qw(help man warnings+ nowarnings))  ||  pod2usage(2);
 pod2usage(1)  if ($options{help});
 pod2usage(-verbose => 2)  if ($options{man});
 
+if($options{nowarnings}) {
+  $options{warnings} = 0;
+}
+elsif(!defined $options{warnings}) {
+  $options{warnings} = 1; # default is warnings on
+}
+
 ## Dont default to STDIN if connected to a terminal
 pod2usage(2) if ((@ARGV == 0) && (-t STDIN));
 
 ## Invoke podchecker()
 my $status = 0;
-@ARGV = ("<&STDIN") unless(@ARGV);
+@ARGV = qw(-) unless(@ARGV);
 for (@ARGV) {
+    if($_ eq '-') {
+      $_ = "<&STDIN";
+    }
+    elsif(-d) {
+      warn "podchecker: Warning: Ignoring directory '$_'\n";
+      next;
+    }
     my $s = podchecker($_, undef, '-warnings' => $options{warnings});
     if($s > 0) {
         # errors occurred
index f2ba80a..b6b8c9b 100644 (file)
@@ -39,7 +39,7 @@ print OUT <<'!NO!SUBS!';
 #############################################################################
 # podselect -- command to invoke the podselect function in Pod::Select
 #
-# Copyright (c) 1996-1999 by Bradford Appleton. All rights reserved.
+# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved.
 # This file is part of "PodParser". PodParser is free software;
 # you can redistribute it and/or modify it under the same terms
 # as Perl itself.
diff --git a/pp.c b/pp.c
index 1621df5..9afa96d 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -561,7 +561,11 @@ PP(pp_bless)
     else {
        SV *ssv = POPs;
        STRLEN len;
-       char *ptr = SvPV(ssv,len);
+       char *ptr;
+
+       if (ssv && !SvGMAGICAL(ssv) && !SvAMAGIC(ssv) && SvROK(ssv))
+           Perl_croak(aTHX_ "Attempt to bless into a reference");
+       ptr = SvPV(ssv,len);
        if (ckWARN(WARN_MISC) && len == 0)
            Perl_warner(aTHX_ WARN_MISC, 
                   "Explicit blessing to '' (assuming package main)");
@@ -1064,7 +1068,7 @@ PP(pp_repeat)
 {
   djSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
   {
-    register I32 count = POPi;
+    register IV count = POPi;
     if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
        dMARK;
        I32 items = SP - MARK;
@@ -1464,21 +1468,53 @@ PP(pp_complement)
        }
       }
       else {
-       register char *tmps;
-       register long *tmpl;
+       register U8 *tmps;
        register I32 anum;
        STRLEN len;
 
        SvSetSV(TARG, sv);
-       tmps = SvPV_force(TARG, len);
+       tmps = (U8*)SvPV_force(TARG, len);
        anum = len;
+       if (SvUTF8(TARG)) {
+         /* Calculate exact length, let's not estimate */
+         STRLEN targlen = 0;
+         U8 *result;
+         U8 *send;
+         I32 l;
+
+         send = tmps + len;
+         while (tmps < send) {
+           UV c = utf8_to_uv(tmps, &l);
+           tmps += UTF8SKIP(tmps);
+           targlen += UTF8LEN(~c);
+         }
+
+         /* Now rewind strings and write them. */
+         tmps -= len;
+         Newz(0, result, targlen + 1, U8);
+         while (tmps < send) {
+           UV c = utf8_to_uv(tmps, &l);
+           tmps += UTF8SKIP(tmps);
+           result = uv_to_utf8(result,(UV)~c);
+         }
+         *result = '\0';
+         result -= targlen;
+         sv_setpvn(TARG, (char*)result, targlen);
+         SvUTF8_on(TARG);
+         Safefree(result);
+         SETs(TARG);
+         RETURN;
+       }
 #ifdef LIBERAL
-       for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
-           *tmps = ~*tmps;
-       tmpl = (long*)tmps;
-       for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
-           *tmpl = ~*tmpl;
-       tmps = (char*)tmpl;
+       {
+           register long *tmpl;
+           for ( ; anum && (unsigned long)tmps % sizeof(long); anum--, tmps++)
+               *tmps = ~*tmps;
+           tmpl = (long*)tmps;
+           for ( ; anum >= sizeof(long); anum -= sizeof(long), tmpl++)
+               *tmpl = ~*tmpl;
+           tmps = (U8*)tmpl;
+       }
 #endif
        for ( ; anum > 0; anum--, tmps++)
            *tmps = ~*tmps;
@@ -1816,7 +1852,7 @@ PP(pp_log)
       NV value;
       value = POPn;
       if (value <= 0.0) {
-       RESTORE_NUMERIC_STANDARD();
+       SET_NUMERIC_STANDARD();
        DIE(aTHX_ "Can't take log of %g", value);
       }
       value = Perl_log(value);
@@ -1832,7 +1868,7 @@ PP(pp_sqrt)
       NV value;
       value = POPn;
       if (value < 0.0) {
-       RESTORE_NUMERIC_STANDARD();
+       SET_NUMERIC_STANDARD();
        DIE(aTHX_ "Can't take sqrt of %g", value);
       }
       value = Perl_sqrt(value);
@@ -2068,8 +2104,8 @@ PP(pp_substr)
 PP(pp_vec)
 {
     djSP; dTARGET;
-    register I32 size = POPi;
-    register I32 offset = POPi;
+    register IV size   = POPi;
+    register IV offset = POPi;
     register SV *src = POPs;
     I32 lvalue = PL_op->op_flags & OPf_MOD;
 
@@ -2191,7 +2227,7 @@ PP(pp_ord)
     I32 retlen;
 
     if ((*tmps & 0x80) && DO_UTF8(tmpsv))
-       value = utf8_to_uv(tmps, &retlen);
+       value = utf8_to_uv_chk(tmps, &retlen, 0);
     else
        value = (UV)(*tmps & 255);
     XPUSHu(value);
@@ -2202,7 +2238,7 @@ PP(pp_chr)
 {
     djSP; dTARGET;
     char *tmps;
-    U32 value = POPu;
+    UV value = POPu;
 
     (void)SvUPGRADE(TARG,SVt_PV);
 
@@ -2258,7 +2294,7 @@ PP(pp_ucfirst)
        I32 ulen;
        U8 tmpbuf[UTF8_MAXLEN];
        U8 *tend;
-       UV uv = utf8_to_uv(s, &ulen);
+       UV uv = utf8_to_uv_chk(s, &ulen, 0);
 
        if (PL_op->op_private & OPpLOCALE) {
            TAINT;
@@ -2317,7 +2353,7 @@ PP(pp_lcfirst)
        I32 ulen;
        U8 tmpbuf[UTF8_MAXLEN];
        U8 *tend;
-       UV uv = utf8_to_uv(s, &ulen);
+       UV uv = utf8_to_uv_chk(s, &ulen, 0);
 
        if (PL_op->op_private & OPpLOCALE) {
            TAINT;
@@ -2394,7 +2430,7 @@ PP(pp_uc)
                TAINT;
                SvTAINTED_on(TARG);
                while (s < send) {
-                   d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv(s, &ulen)));
+                   d = uv_to_utf8(d, toUPPER_LC_uni( utf8_to_uv_chk(s, &ulen, 0)));
                    s += ulen;
                }
            }
@@ -2468,7 +2504,7 @@ PP(pp_lc)
                TAINT;
                SvTAINTED_on(TARG);
                while (s < send) {
-                   d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv(s, &ulen)));
+                   d = uv_to_utf8(d, toLOWER_LC_uni( utf8_to_uv_chk(s, &ulen, 0)));
                    s += ulen;
                }
            }
@@ -3610,7 +3646,7 @@ PP(pp_unpack)
                len = strend - s;
            if (checksum) {
                while (len-- > 0 && s < strend) {
-                   auint = utf8_to_uv((U8*)s, &along);
+                   auint = utf8_to_uv_chk((U8*)s, &along, 0);
                    s += along;
                    if (checksum > 32)
                        cdouble += (NV)auint;
@@ -3622,7 +3658,7 @@ PP(pp_unpack)
                EXTEND(SP, len);
                EXTEND_MORTAL(len);
                while (len-- > 0 && s < strend) {
-                   auint = utf8_to_uv((U8*)s, &along);
+                   auint = utf8_to_uv_chk((U8*)s, &along, 0);
                    s += along;
                    sv = NEWSV(37, 0);
                    sv_setuv(sv, (UV)auint);
@@ -4041,7 +4077,7 @@ PP(pp_unpack)
                        char *t;
                        STRLEN n_a;
 
-                       sv = Perl_newSVpvf(aTHX_ "%.*Vu", (int)TYPE_DIGITS(UV), auv);
+                       sv = Perl_newSVpvf(aTHX_ "%.*"UVf, (int)TYPE_DIGITS(UV), auv);
                        while (s < strend) {
                            sv = mul128(sv, *s & 0x7f);
                            if (!(*s++ & 0x80)) {
@@ -4808,8 +4844,9 @@ PP(pp_pack)
                    do {
                        double next = floor(adouble / 128);
                        *--in = (unsigned char)(adouble - (next * 128)) | 0x80;
-                       if (--in < buf)  /* this cannot happen ;-) */
+                       if (in <= buf)  /* this cannot happen ;-) */
                            DIE(aTHX_ "Cannot compress integer");
+                       in--;
                        adouble = next;
                    } while (adouble > 0);
                    buf[sizeof(buf) - 1] &= 0x7f; /* clear continue bit */
@@ -4968,8 +5005,9 @@ PP(pp_split)
 {
     djSP; dTARG;
     AV *ary;
-    register I32 limit = POPi;                 /* note, negative is forever */
+    register IV limit = POPi;                  /* note, negative is forever */
     SV *sv = POPs;
+    bool doutf8 = DO_UTF8(sv);
     STRLEN len;
     register char *s = SvPV(sv, len);
     char *strend = s + len;
@@ -5072,6 +5110,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (doutf8)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
 
            s = m + 1;
@@ -5092,6 +5132,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (doutf8)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
            s = m;
        }
@@ -5101,11 +5143,11 @@ PP(pp_split)
             && !(rx->reganch & ROPT_ANCH)) {
        int tail = (rx->reganch & RE_INTUIT_TAIL);
        SV *csv = CALLREG_INTUIT_STRING(aTHX_ rx);
-       char c;
 
        len = rx->minlen;
        if (len == 1 && !tail) {
-           c = *SvPV(csv,len);
+           STRLEN n_a;
+           char c = *SvPV(csv, n_a);
            while (--limit) {
                /*SUPPRESS 530*/
                for (m = s; m < strend && *m != c; m++) ;
@@ -5115,8 +5157,12 @@ PP(pp_split)
                sv_setpvn(dstr, s, m-s);
                if (make_mortal)
                    sv_2mortal(dstr);
+               if (doutf8)
+                   (void)SvUTF8_on(dstr);
                XPUSHs(dstr);
-               s = m + 1;
+               /* The rx->minlen is in characters but we want to step
+                * s ahead by bytes. */
+               s = m + (doutf8 ? SvCUR(csv) : len);
            }
        }
        else {
@@ -5130,8 +5176,12 @@ PP(pp_split)
                sv_setpvn(dstr, s, m-s);
                if (make_mortal)
                    sv_2mortal(dstr);
+               if (doutf8)
+                   (void)SvUTF8_on(dstr);
                XPUSHs(dstr);
-               s = m + len;            /* Fake \n at the end */
+               /* The rx->minlen is in characters but we want to step
+                * s ahead by bytes. */
+               s = m + (doutf8 ? SvCUR(csv) : len); /* Fake \n at the end */
            }
        }
     }
@@ -5157,6 +5207,8 @@ PP(pp_split)
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
                sv_2mortal(dstr);
+           if (doutf8)
+               (void)SvUTF8_on(dstr);
            XPUSHs(dstr);
            if (rx->nparens) {
                for (i = 1; i <= rx->nparens; i++) {
@@ -5170,6 +5222,8 @@ PP(pp_split)
                        dstr = NEWSV(33, 0);
                    if (make_mortal)
                        sv_2mortal(dstr);
+                   if (doutf8)
+                       (void)SvUTF8_on(dstr);
                    XPUSHs(dstr);
                }
            }
@@ -5184,10 +5238,13 @@ PP(pp_split)
 
     /* keep field after final delim? */
     if (s < strend || (iters && origlimit)) {
-       dstr = NEWSV(34, strend-s);
-       sv_setpvn(dstr, s, strend-s);
+        STRLEN l = strend - s;
+       dstr = NEWSV(34, l);
+       sv_setpvn(dstr, s, l);
        if (make_mortal)
            sv_2mortal(dstr);
+       if (doutf8)
+           (void)SvUTF8_on(dstr);
        XPUSHs(dstr);
        iters++;
     }
diff --git a/pp.h b/pp.h
index 7f396b2..029583a 100644 (file)
--- a/pp.h
+++ b/pp.h
@@ -147,7 +147,7 @@ used, guarantees that there is room for at least C<nitems> to be pushed
 onto the stack.
 
 =for apidoc Am|void|PUSHs|SV* sv
-Push an SV onto the stack.  The stack must have room for this element. 
+Push an SV onto the stack.  The stack must have room for this element.
 Does not handle 'set' magic.  See C<XPUSHs>.
 
 =for apidoc Am|void|PUSHp|char* str|STRLEN len
@@ -185,7 +185,7 @@ Push an integer onto the stack, extending the stack if necessary.  Handles
 'set' magic. See C<PUSHi>.
 
 =for apidoc Am|void|XPUSHu|UV uv
-Push an unsigned integer onto the stack, extending the stack if necessary. 
+Push an unsigned integer onto the stack, extending the stack if necessary.
 See C<PUSHu>.
 
 =cut
@@ -342,10 +342,13 @@ See C<PUSHu>.
            { dTARGETSTACKED;                                           \
                { dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}}
 
-#define setAGAIN(ref) sv = arg = ref;                                  \
-  if (!SvROK(ref))                                                     \
+#define setAGAIN(ref) sv = ref;                                                        \
+  if (!SvROK(ref))                                                             \
       Perl_croak(aTHX_ "Overloaded dereference did not return a reference");   \
-  goto am_again;
+  if (ref != arg && SvRV(ref) != SvRV(arg)) {                                  \
+      arg = ref;                                                               \
+      goto am_again;                                                           \
+  }
 
 #define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0)
 
diff --git a/pp.sym b/pp.sym
index 0e6c056..42b29f6 100644 (file)
--- a/pp.sym
+++ b/pp.sym
@@ -40,6 +40,7 @@ Perl_ck_sort
 Perl_ck_spair
 Perl_ck_split
 Perl_ck_subr
+Perl_ck_substr
 Perl_ck_svconst
 Perl_ck_trunc
 Perl_pp_null
index ce9e198..cf2000e 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -598,7 +598,7 @@ PP(pp_formline)
            value = SvNV(sv);
            /* Formats aren't yet marked for locales, so assume "yes". */
            {
-               RESTORE_NUMERIC_LOCAL();
+               STORE_NUMERIC_STANDARD_SET_LOCAL();
 #if defined(USE_LONG_DOUBLE)
                if (arg & 256) {
                    sprintf(t, "%#*.*" PERL_PRIfldbl,
@@ -1005,10 +1005,17 @@ PP(pp_flip)
     else {
        dTOPss;
        SV *targ = PAD_SV(PL_op->op_targ);
-
-       if ((PL_op->op_private & OPpFLIP_LINENUM)
-         ? (PL_last_in_gv && SvIV(sv) == (IV)IoLINES(GvIOp(PL_last_in_gv)))
-         : SvTRUE(sv) ) {
+       int flip;
+
+       if (PL_op->op_private & OPpFLIP_LINENUM) {
+           struct io *gp_io;
+           flip = PL_last_in_gv
+               && (gp_io = GvIOp(PL_last_in_gv))
+               && SvIV(sv) == (IV)IoLINES(gp_io);
+       } else {
+           flip = SvTRUE(sv);
+       }
+       if (flip) {
            sv_setiv(PAD_SV(cUNOP->op_first->op_targ), 1);
            if (PL_op->op_flags & OPf_SPECIAL) {
                sv_setiv(targ, 1);
@@ -1417,6 +1424,12 @@ Perl_die_where(pTHX_ char *message, STRLEN msglen)
 
            LEAVE;
 
+           /* LEAVE could clobber PL_curcop (see save_re_context())
+            * XXX it might be better to find a way to avoid messing with
+            * PL_curcop in save_re_context() instead, but this is a more
+            * minimal fix --GSAR */
+           PL_curcop = cx->blk_oldcop;
+
            if (optype == OP_REQUIRE) {
                char* msg = SvPVx(ERRSV, n_a);
                DIE(aTHX_ "%sCompilation failed in require",
@@ -2728,7 +2741,9 @@ S_doeval(pTHX_ int gimme, OP** startop)
     AV* comppadlist;
     I32 i;
 
-    PL_in_eval = EVAL_INEVAL;
+    PL_in_eval = ((saveop && saveop->op_type == OP_REQUIRE)
+                 ? (EVAL_INREQUIRE | (PL_in_eval & EVAL_INEVAL))
+                 : EVAL_INEVAL);
 
     PUSHMARK(SP);
 
@@ -2891,6 +2906,7 @@ S_doeval(pTHX_ int gimme, OP** startop)
     CvDEPTH(PL_compcv) = 1;
     SP = PL_stack_base + POPMARK;              /* pop original mark */
     PL_op = saveop;                    /* The caller may need it. */
+    PL_lex_state = LEX_NOTPARSING;     /* $^S needs this. */
 #ifdef USE_THREADS
     MUTEX_LOCK(&PL_eval_mutex);
     PL_eval_owner = 0;
@@ -2959,13 +2975,13 @@ PP(pp_require)
            U8 *s = (U8*)SvPVX(sv);
            U8 *end = (U8*)SvPVX(sv) + SvCUR(sv);
            if (s < end) {
-               rev = utf8_to_uv(s, &len);
+               rev = utf8_to_uv_chk(s, &len, 0);
                s += len;
                if (s < end) {
-                   ver = utf8_to_uv(s, &len);
+                   ver = utf8_to_uv_chk(s, &len, 0);
                    s += len;
                    if (s < end)
-                       sver = utf8_to_uv(s, &len);
+                       sver = utf8_to_uv_chk(s, &len, 0);
                }
            }
            if (PERL_REVISION < rev
@@ -3093,7 +3109,7 @@ trylocal: {
 
                            if (io) {
                                tryrsfp = IoIFP(io);
-                               if (IoTYPE(io) == '|') {
+                               if (IoTYPE(io) == IoTYPE_PIPE) {
                                    /* reading from a child process doesn't
                                       nest -- when returning from reading
                                       the inner module, the outer one is
@@ -3673,682 +3689,369 @@ S_doparseform(pTHX_ SV *sv)
 }
 
 /*
- * The rest of this file was derived from source code contributed
- * by Tom Horsley.
+ * The mergesort implementation is by Peter M. Mcilroy <pmcilroy@lucent.com>.
+ *
+ * The original code was written in conjunction with BSD Computer Software
+ * Research Group at University of California, Berkeley.
+ *
+ * See also: "Optimistic Merge Sort" (SODA '92)
+ *      
+ * The integration to Perl is by John P. Linderman <jpl@research.att.com>.
+ *
+ * The code can be distributed under the same terms as Perl itself.
  *
- * NOTE: this code was derived from Tom Horsley's qsort replacement
- * and should not be confused with the original code.
  */
 
-/* Copyright (C) Tom Horsley, 1997. All rights reserved.
-
-   Permission granted to distribute under the same terms as perl which are
-   (briefly):
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of either:
-
-       a) the GNU General Public License as published by the Free
-       Software Foundation; either version 1, or (at your option) any
-       later version, or
-
-       b) the "Artistic License" which comes with this Kit.
-
-   Details on the perl license can be found in the perl source code which
-   may be located via the www.perl.com web page.
-
-   This is the most wonderfulest possible qsort I can come up with (and
-   still be mostly portable) My (limited) tests indicate it consistently
-   does about 20% fewer calls to compare than does the qsort in the Visual
-   C++ library, other vendors may vary.
+#ifdef TESTHARNESS
+#include <sys/types.h>
+typedef        void SV;
+#define pTHXo_
+#define pTHX_
+#define STATIC
+#define New(ID,VAR,N,TYPE) VAR=(TYPE *)malloc((N)*sizeof(TYPE))
+#define        Safefree(VAR) free(VAR)
+typedef int  (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
+#endif /* TESTHARNESS */
+
+typedef char * aptr;           /* pointer for arithmetic on sizes */
+typedef SV * gptr;             /* pointers in our lists */
+
+/* Binary merge internal sort, with a few special mods
+** for the special perl environment it now finds itself in.
+**
+** Things that were once options have been hotwired
+** to values suitable for this use.  In particular, we'll always
+** initialize looking for natural runs, we'll always produce stable
+** output, and we'll always do Peter McIlroy's binary merge.
+*/
 
-   Some of the ideas in here can be found in "Algorithms" by Sedgewick,
-   others I invented myself (or more likely re-invented since they seemed
-   pretty obvious once I watched the algorithm operate for a while).
+/* Pointer types for arithmetic and storage and convenience casts */
 
-   Most of this code was written while watching the Marlins sweep the Giants
-   in the 1997 National League Playoffs - no Braves fans allowed to use this
-   code (just kidding :-).
+#define        APTR(P) ((aptr)(P))
+#define        GPTP(P) ((gptr *)(P))
+#define GPPP(P) ((gptr **)(P))
 
-   I realize that if I wanted to be true to the perl tradition, the only
-   comment in this file would be something like:
 
-   ...they shuffled back towards the rear of the line. 'No, not at the
-   rear!'  the slave-driver shouted. 'Three files up. And stay there...
+/* byte offset from pointer P to (larger) pointer Q */
+#define        BYTEOFF(P, Q) (APTR(Q) - APTR(P))
 
-   However, I really needed to violate that tradition just so I could keep
-   track of what happens myself, not to mention some poor fool trying to
-   understand this years from now :-).
-*/
+#define PSIZE sizeof(gptr)
 
-/* ********************************************************** Configuration */
+/* If PSIZE is power of 2, make PSHIFT that power, if that helps */
 
-#ifndef QSORT_ORDER_GUESS
-#define QSORT_ORDER_GUESS 2    /* Select doubling version of the netBSD trick */
+#ifdef PSHIFT
+#define        PNELEM(P, Q)    (BYTEOFF(P,Q) >> (PSHIFT))
+#define        PNBYTE(N)       ((N) << (PSHIFT))
+#define        PINDEX(P, N)    (GPTP(APTR(P) + PNBYTE(N)))
+#else
+/* Leave optimization to compiler */
+#define        PNELEM(P, Q)    (GPTP(Q) - GPTP(P))
+#define        PNBYTE(N)       ((N) * (PSIZE))
+#define        PINDEX(P, N)    (GPTP(P) + (N))
 #endif
 
-/* QSORT_MAX_STACK is the largest number of partitions that can be stacked up for
-   future processing - a good max upper bound is log base 2 of memory size
-   (32 on 32 bit machines, 64 on 64 bit machines, etc). In reality can
-   safely be smaller than that since the program is taking up some space and
-   most operating systems only let you grab some subset of contiguous
-   memory (not to mention that you are normally sorting data larger than
-   1 byte element size :-).
-*/
-#ifndef QSORT_MAX_STACK
-#define QSORT_MAX_STACK 32
-#endif
+/* Pointer into other corresponding to pointer into this */
+#define        POTHER(P, THIS, OTHER) GPTP(APTR(OTHER) + BYTEOFF(THIS,P))
 
-/* QSORT_BREAK_EVEN is the size of the largest partition we should insertion sort.
-   Anything bigger and we use qsort. If you make this too small, the qsort
-   will probably break (or become less efficient), because it doesn't expect
-   the middle element of a partition to be the same as the right or left -
-   you have been warned).
-*/
-#ifndef QSORT_BREAK_EVEN
-#define QSORT_BREAK_EVEN 6
-#endif
+#define FROMTOUPTO(src, dst, lim) do *dst++ = *src++; while(src<lim)
 
-/* ************************************************************* Data Types */
 
-/* hold left and right index values of a partition waiting to be sorted (the
-   partition includes both left and right - right is NOT one past the end or
-   anything like that).
+/* Runs are identified by a pointer in the auxilliary list.
+** The pointer is at the start of the list,
+** and it points to the start of the next list.
+** NEXT is used as an lvalue, too.
 */
-struct partition_stack_entry {
-   int left;
-   int right;
-#ifdef QSORT_ORDER_GUESS
-   int qsort_break_even;
-#endif
-};
-
-/* ******************************************************* Shorthand Macros */
 
-/* Note that these macros will be used from inside the qsort function where
-   we happen to know that the variable 'elt_size' contains the size of an
-   array element and the variable 'temp' points to enough space to hold a
-   temp element and the variable 'array' points to the array being sorted
-   and 'compare' is the pointer to the compare routine.
+#define        NEXT(P)         (*GPPP(P))
 
-   Also note that there are very many highly architecture specific ways
-   these might be sped up, but this is simply the most generally portable
-   code I could think of.
-*/
 
-/* Return < 0 == 0 or > 0 as the value of elt1 is < elt2, == elt2, > elt2
+/* PTHRESH is the minimum number of pairs with the same sense to justify
+** checking for a run and extending it.  Note that PTHRESH counts PAIRS,
+** not just elements, so PTHRESH == 8 means a run of 16.
 */
-#define qsort_cmp(elt1, elt2) \
-   ((*compare)(aTHXo_ array[elt1], array[elt2]))
 
-#ifdef QSORT_ORDER_GUESS
-#define QSORT_NOTICE_SWAP swapped++;
-#else
-#define QSORT_NOTICE_SWAP
-#endif
+#define        PTHRESH (8)
 
-/* swaps contents of array elements elt1, elt2.
-*/
-#define qsort_swap(elt1, elt2) \
-   STMT_START { \
-      QSORT_NOTICE_SWAP \
-      temp = array[elt1]; \
-      array[elt1] = array[elt2]; \
-      array[elt2] = temp; \
-   } STMT_END
-
-/* rotate contents of elt1, elt2, elt3 such that elt1 gets elt2, elt2 gets
-   elt3 and elt3 gets elt1.
+/* RTHRESH is the number of elements in a run that must compare low
+** to the low element from the opposing run before we justify
+** doing a binary rampup instead of single stepping.
+** In random input, N in a row low should only happen with
+** probability 2^(1-N), so we can risk that we are dealing
+** with orderly input without paying much when we aren't.
 */
-#define qsort_rotate(elt1, elt2, elt3) \
-   STMT_START { \
-      QSORT_NOTICE_SWAP \
-      temp = array[elt1]; \
-      array[elt1] = array[elt2]; \
-      array[elt2] = array[elt3]; \
-      array[elt3] = temp; \
-   } STMT_END
 
-/* ************************************************************ Debug stuff */
+#define RTHRESH (6)
 
-#ifdef QSORT_DEBUG
 
-static void
-break_here()
-{
-   return; /* good place to set a breakpoint */
-}
+/*
+** Overview of algorithm and variables.
+** The array of elements at list1 will be organized into runs of length 2,
+** or runs of length >= 2 * PTHRESH.  We only try to form long runs when
+** PTHRESH adjacent pairs compare in the same way, suggesting overall order.
+**
+** Unless otherwise specified, pair pointers address the first of two elements.
+**
+** b and b+1 are a pair that compare with sense ``sense''.
+** b is the ``bottom'' of adjacent pairs that might form a longer run.
+**
+** p2 parallels b in the list2 array, where runs are defined by
+** a pointer chain.
+**
+** t represents the ``top'' of the adjacent pairs that might extend
+** the run beginning at b.  Usually, t addresses a pair
+** that compares with opposite sense from (b,b+1).
+** However, it may also address a singleton element at the end of list1,
+** or it may be equal to ``last'', the first element beyond list1.
+**
+** r addresses the Nth pair following b.  If this would be beyond t,
+** we back it off to t.  Only when r is less than t do we consider the
+** run long enough to consider checking.
+**
+** q addresses a pair such that the pairs at b through q already form a run.
+** Often, q will equal b, indicating we only are sure of the pair itself.
+** However, a search on the previous cycle may have revealed a longer run,
+** so q may be greater than b.
+**
+** p is used to work back from a candidate r, trying to reach q,
+** which would mean b through r would be a run.  If we discover such a run,
+** we start q at r and try to push it further towards t.
+** If b through r is NOT a run, we detect the wrong order at (p-1,p).
+** In any event, after the check (if any), we have two main cases.
+**
+** 1) Short run.  b <= q < p <= r <= t.
+**     b through q is a run (perhaps trivial)
+**     q through p are uninteresting pairs
+**     p through r is a run
+**
+** 2) Long run.  b < r <= q < t.
+**     b through q is a run (of length >= 2 * PTHRESH)
+**
+** Note that degenerate cases are not only possible, but likely.
+** For example, if the pair following b compares with opposite sense,
+** then b == q < p == r == t.
+*/
 
-#define qsort_assert(t) (void)( (t) || (break_here(), 0) )
 
 static void
-doqsort_all_asserts(
-   void * array,
-   size_t num_elts,
-   size_t elt_size,
-   int (*compare)(const void * elt1, const void * elt2),
-   int pc_left, int pc_right, int u_left, int u_right)
+dynprep(pTHX_ gptr *list1, gptr *list2, size_t nmemb, SVCOMPARE_t cmp)
 {
-   int i;
-
-   qsort_assert(pc_left <= pc_right);
-   qsort_assert(u_right < pc_left);
-   qsort_assert(pc_right < u_left);
-   for (i = u_right + 1; i < pc_left; ++i) {
-      qsort_assert(qsort_cmp(i, pc_left) < 0);
-   }
-   for (i = pc_left; i < pc_right; ++i) {
-      qsort_assert(qsort_cmp(i, pc_right) == 0);
-   }
-   for (i = pc_right + 1; i < u_left; ++i) {
-      qsort_assert(qsort_cmp(pc_right, i) < 0);
-   }
+    int sense;
+    register gptr *b, *p, *q, *t, *p2;
+    register gptr c, *last, *r;
+    gptr *savep;
+
+    b = list1;
+    last = PINDEX(b, nmemb);
+    sense = (cmp(aTHX_ *b, *(b+1)) > 0);
+    for (p2 = list2; b < last; ) {
+       /* We just started, or just reversed sense.
+       ** Set t at end of pairs with the prevailing sense.
+       */
+       for (p = b+2, t = p; ++p < last; t = ++p) {
+           if ((cmp(aTHX_ *t, *p) > 0) != sense) break;
+       }
+       q = b;
+       /* Having laid out the playing field, look for long runs */
+       do {
+           p = r = b + (2 * PTHRESH);
+           if (r >= t) p = r = t;      /* too short to care about */
+           else {
+               while (((cmp(aTHX_ *(p-1), *p) > 0) == sense) &&
+                      ((p -= 2) > q));
+               if (p <= q) {
+                   /* b through r is a (long) run.
+                   ** Extend it as far as possible.
+                   */
+                   p = q = r;
+                   while (((p += 2) < t) &&
+                          ((cmp(aTHX_ *(p-1), *p) > 0) == sense)) q = p;
+                   r = p = q + 2;      /* no simple pairs, no after-run */
+               }
+           }
+           if (q > b) {                /* run of greater than 2 at b */
+               savep = p;
+               p = q += 2;
+               /* pick up singleton, if possible */
+               if ((p == t) &&
+                   ((t + 1) == last) &&
+                   ((cmp(aTHX_ *(p-1), *p) > 0) == sense))
+                   savep = r = p = q = last;
+               p2 = NEXT(p2) = p2 + (p - b);
+               if (sense) while (b < --p) {
+                   c = *b;
+                   *b++ = *p;
+                   *p = c;
+               }
+               p = savep;
+           }
+           while (q < p) {             /* simple pairs */
+               p2 = NEXT(p2) = p2 + 2;
+               if (sense) {
+                   c = *q++;
+                   *(q-1) = *q;
+                   *q++ = c;
+               } else q += 2;
+           }
+           if (((b = p) == t) && ((t+1) == last)) {
+               NEXT(p2) = p2 + 1;
+               b++;
+           }
+           q = r;
+       } while (b < t);
+       sense = !sense;
+    }
+    return;
 }
 
-#define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) \
-   doqsort_all_asserts(array, num_elts, elt_size, compare, \
-                 PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT)
 
-#else
+/* Overview of bmerge variables:
+**
+** list1 and list2 address the main and auxiliary arrays.
+** They swap identities after each merge pass.
+** Base points to the original list1, so we can tell if
+** the pointers ended up where they belonged (or must be copied).
+**
+** When we are merging two lists, f1 and f2 are the next elements
+** on the respective lists.  l1 and l2 mark the end of the lists.
+** tp2 is the current location in the merged list.
+**
+** p1 records where f1 started.
+** After the merge, a new descriptor is built there.
+**
+** p2 is a ``parallel'' pointer in (what starts as) descriptor space.
+** It is used to identify and delimit the runs.
+**
+** In the heat of determining where q, the greater of the f1/f2 elements,
+** belongs in the other list, b, t and p, represent bottom, top and probe
+** locations, respectively, in the other list.
+** They make convenient temporary pointers in other places.
+*/
 
-#define qsort_assert(t) ((void)0)
+STATIC void
+S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp)
+{
+    int i, run;
+    int sense;
+    register gptr *f1, *f2, *t, *b, *p, *tp2, *l1, *l2, *q;
+    gptr *aux, *list2, *p2, *last;
+    gptr *base = list1;
+    gptr *p1;
+
+    if (nmemb <= 1) return;    /* sorted trivially */
+    New(799,list2,nmemb,gptr); /* allocate auxilliary array */
+    aux = list2;
+    dynprep(aTHX_ list1, list2, nmemb, cmp);
+    last = PINDEX(list2, nmemb);
+    while (NEXT(list2) != last) {
+       /* More than one run remains.  Do some merging to reduce runs. */
+       l2 = p1 = list1;
+       for (tp2 = p2 = list2; p2 != last;) {
+           /* The new first run begins where the old second list ended.
+           ** Use the p2 ``parallel'' pointer to identify the end of the run.
+           */
+           f1 = l2;
+           t = NEXT(p2);
+           f2 = l1 = POTHER(t, list2, list1);
+           if (t != last) t = NEXT(t);
+           l2 = POTHER(t, list2, list1);
+           p2 = t;
+           while (f1 < l1 && f2 < l2) {
+               /* If head 1 is larger than head 2, find ALL the elements
+               ** in list 2 strictly less than head1, write them all,
+               ** then head 1.  Then compare the new heads, and repeat,
+               ** until one or both lists are exhausted.
+               **
+               ** In all comparisons (after establishing
+               ** which head to merge) the item to merge
+               ** (at pointer q) is the first operand of
+               ** the comparison.  When we want to know
+               ** if ``q is strictly less than the other'',
+               ** we can't just do
+               **    cmp(q, other) < 0
+               ** because stability demands that we treat equality
+               ** as high when q comes from l2, and as low when
+               ** q was from l1.  So we ask the question by doing
+               **    cmp(q, other) <= sense
+               ** and make sense == 0 when equality should look low,
+               ** and -1 when equality should look high.
+               */
+
+
+               if (cmp(aTHX_ *f1, *f2) <= 0) {
+                   q = f2; b = f1; t = l1;
+                   sense = -1;
+               } else {
+                   q = f1; b = f2; t = l2;
+                   sense = 0;
+               }
 
-#define qsort_all_asserts(PC_LEFT, PC_RIGHT, U_LEFT, U_RIGHT) ((void)0)
 
-#endif
+               /* ramp up
+               **
+               ** Leave t at something strictly
+               ** greater than q (or at the end of the list),
+               ** and b at something strictly less than q.
+               */
+               for (i = 1, run = 0 ;;) {
+                   if ((p = PINDEX(b, i)) >= t) {
+                       /* off the end */
+                       if (((p = PINDEX(t, -1)) > b) &&
+                           (cmp(aTHX_ *q, *p) <= sense))
+                            t = p;
+                       else b = p;
+                       break;
+                   } else if (cmp(aTHX_ *q, *p) <= sense) {
+                       t = p;
+                       break;
+                   } else b = p;
+                   if (++run >= RTHRESH) i += i;
+               }
 
-/* ****************************************************************** qsort */
 
-STATIC void
-S_qsortsv(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare)
-{
-   register SV * temp;
+               /* q is known to follow b and must be inserted before t.
+               ** Increment b, so the range of possibilities is [b,t).
+               ** Round binary split down, to favor early appearance.
+               ** Adjust b and t until q belongs just before t.
+               */
 
-   struct partition_stack_entry partition_stack[QSORT_MAX_STACK];
-   int next_stack_entry = 0;
+               b++;
+               while (b < t) {
+                   p = PINDEX(b, (PNELEM(b, t) - 1) / 2);
+                   if (cmp(aTHX_ *q, *p) <= sense) {
+                       t = p;
+                   } else b = p + 1;
+               }
 
-   int part_left;
-   int part_right;
-#ifdef QSORT_ORDER_GUESS
-   int qsort_break_even;
-   int swapped;
-#endif
 
-   /* Make sure we actually have work to do.
-   */
-   if (num_elts <= 1) {
-      return;
-   }
-
-   /* Setup the initial partition definition and fall into the sorting loop
-   */
-   part_left = 0;
-   part_right = (int)(num_elts - 1);
-#ifdef QSORT_ORDER_GUESS
-   qsort_break_even = QSORT_BREAK_EVEN;
-#else
-#define qsort_break_even QSORT_BREAK_EVEN
-#endif
-   for ( ; ; ) {
-      if ((part_right - part_left) >= qsort_break_even) {
-         /* OK, this is gonna get hairy, so lets try to document all the
-            concepts and abbreviations and variables and what they keep
-            track of:
-
-            pc: pivot chunk - the set of array elements we accumulate in the
-                middle of the partition, all equal in value to the original
-                pivot element selected. The pc is defined by:
-
-                pc_left - the leftmost array index of the pc
-                pc_right - the rightmost array index of the pc
-
-                we start with pc_left == pc_right and only one element
-                in the pivot chunk (but it can grow during the scan).
-
-            u:  uncompared elements - the set of elements in the partition
-                we have not yet compared to the pivot value. There are two
-                uncompared sets during the scan - one to the left of the pc
-                and one to the right.
-
-                u_right - the rightmost index of the left side's uncompared set
-                u_left - the leftmost index of the right side's uncompared set
-
-                The leftmost index of the left sides's uncompared set
-                doesn't need its own variable because it is always defined
-                by the leftmost edge of the whole partition (part_left). The
-                same goes for the rightmost edge of the right partition
-                (part_right).
-
-                We know there are no uncompared elements on the left once we
-                get u_right < part_left and no uncompared elements on the
-                right once u_left > part_right. When both these conditions
-                are met, we have completed the scan of the partition.
-
-                Any elements which are between the pivot chunk and the
-                uncompared elements should be less than the pivot value on
-                the left side and greater than the pivot value on the right
-                side (in fact, the goal of the whole algorithm is to arrange
-                for that to be true and make the groups of less-than and
-                greater-then elements into new partitions to sort again).
-
-            As you marvel at the complexity of the code and wonder why it
-            has to be so confusing. Consider some of the things this level
-            of confusion brings:
-
-            Once I do a compare, I squeeze every ounce of juice out of it. I
-            never do compare calls I don't have to do, and I certainly never
-            do redundant calls.
-
-            I also never swap any elements unless I can prove there is a
-            good reason. Many sort algorithms will swap a known value with
-            an uncompared value just to get things in the right place (or
-            avoid complexity :-), but that uncompared value, once it gets
-            compared, may then have to be swapped again. A lot of the
-            complexity of this code is due to the fact that it never swaps
-            anything except compared values, and it only swaps them when the
-            compare shows they are out of position.
-         */
-         int pc_left, pc_right;
-         int u_right, u_left;
-
-         int s;
-
-         pc_left = ((part_left + part_right) / 2);
-         pc_right = pc_left;
-         u_right = pc_left - 1;
-         u_left = pc_right + 1;
-
-         /* Qsort works best when the pivot value is also the median value
-            in the partition (unfortunately you can't find the median value
-            without first sorting :-), so to give the algorithm a helping
-            hand, we pick 3 elements and sort them and use the median value
-            of that tiny set as the pivot value.
-
-            Some versions of qsort like to use the left middle and right as
-            the 3 elements to sort so they can insure the ends of the
-            partition will contain values which will stop the scan in the
-            compare loop, but when you have to call an arbitrarily complex
-            routine to do a compare, its really better to just keep track of
-            array index values to know when you hit the edge of the
-            partition and avoid the extra compare. An even better reason to
-            avoid using a compare call is the fact that you can drop off the
-            edge of the array if someone foolishly provides you with an
-            unstable compare function that doesn't always provide consistent
-            results.
-
-            So, since it is simpler for us to compare the three adjacent
-            elements in the middle of the partition, those are the ones we
-            pick here (conveniently pointed at by u_right, pc_left, and
-            u_left). The values of the left, center, and right elements
-            are refered to as l c and r in the following comments.
-         */
-
-#ifdef QSORT_ORDER_GUESS
-         swapped = 0;
-#endif
-         s = qsort_cmp(u_right, pc_left);
-         if (s < 0) {
-            /* l < c */
-            s = qsort_cmp(pc_left, u_left);
-            /* if l < c, c < r - already in order - nothing to do */
-            if (s == 0) {
-               /* l < c, c == r - already in order, pc grows */
-               ++pc_right;
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            } else if (s > 0) {
-               /* l < c, c > r - need to know more */
-               s = qsort_cmp(u_right, u_left);
-               if (s < 0) {
-                  /* l < c, c > r, l < r - swap c & r to get ordered */
-                  qsort_swap(pc_left, u_left);
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               } else if (s == 0) {
-                  /* l < c, c > r, l == r - swap c&r, grow pc */
-                  qsort_swap(pc_left, u_left);
-                  --pc_left;
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               } else {
-                  /* l < c, c > r, l > r - make lcr into rlc to get ordered */
-                  qsort_rotate(pc_left, u_right, u_left);
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               }
-            }
-         } else if (s == 0) {
-            /* l == c */
-            s = qsort_cmp(pc_left, u_left);
-            if (s < 0) {
-               /* l == c, c < r - already in order, grow pc */
-               --pc_left;
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            } else if (s == 0) {
-               /* l == c, c == r - already in order, grow pc both ways */
-               --pc_left;
-               ++pc_right;
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            } else {
-               /* l == c, c > r - swap l & r, grow pc */
-               qsort_swap(u_right, u_left);
-               ++pc_right;
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            }
-         } else {
-            /* l > c */
-            s = qsort_cmp(pc_left, u_left);
-            if (s < 0) {
-               /* l > c, c < r - need to know more */
-               s = qsort_cmp(u_right, u_left);
-               if (s < 0) {
-                  /* l > c, c < r, l < r - swap l & c to get ordered */
-                  qsort_swap(u_right, pc_left);
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               } else if (s == 0) {
-                  /* l > c, c < r, l == r - swap l & c, grow pc */
-                  qsort_swap(u_right, pc_left);
-                  ++pc_right;
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               } else {
-                  /* l > c, c < r, l > r - rotate lcr into crl to order */
-                  qsort_rotate(u_right, pc_left, u_left);
-                  qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-               }
-            } else if (s == 0) {
-               /* l > c, c == r - swap ends, grow pc */
-               qsort_swap(u_right, u_left);
-               --pc_left;
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            } else {
-               /* l > c, c > r - swap ends to get in order */
-               qsort_swap(u_right, u_left);
-               qsort_all_asserts(pc_left, pc_right, u_left + 1, u_right - 1);
-            }
-         }
-         /* We now know the 3 middle elements have been compared and
-            arranged in the desired order, so we can shrink the uncompared
-            sets on both sides
-         */
-         --u_right;
-         ++u_left;
-         qsort_all_asserts(pc_left, pc_right, u_left, u_right);
-
-         /* The above massive nested if was the simple part :-). We now have
-            the middle 3 elements ordered and we need to scan through the
-            uncompared sets on either side, swapping elements that are on
-            the wrong side or simply shuffling equal elements around to get
-            all equal elements into the pivot chunk.
-         */
-
-         for ( ; ; ) {
-            int still_work_on_left;
-            int still_work_on_right;
-
-            /* Scan the uncompared values on the left. If I find a value
-               equal to the pivot value, move it over so it is adjacent to
-               the pivot chunk and expand the pivot chunk. If I find a value
-               less than the pivot value, then just leave it - its already
-               on the correct side of the partition. If I find a greater
-               value, then stop the scan.
-            */
-            while ((still_work_on_left = (u_right >= part_left))) {
-               s = qsort_cmp(u_right, pc_left);
-               if (s < 0) {
-                  --u_right;
-               } else if (s == 0) {
-                  --pc_left;
-                  if (pc_left != u_right) {
-                     qsort_swap(u_right, pc_left);
-                  }
-                  --u_right;
-               } else {
-                  break;
-               }
-               qsort_assert(u_right < pc_left);
-               qsort_assert(pc_left <= pc_right);
-               qsort_assert(qsort_cmp(u_right + 1, pc_left) <= 0);
-               qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
-            }
+               /* Copy all the strictly low elements */
 
-            /* Do a mirror image scan of uncompared values on the right
-            */
-            while ((still_work_on_right = (u_left <= part_right))) {
-               s = qsort_cmp(pc_right, u_left);
-               if (s < 0) {
-                  ++u_left;
-               } else if (s == 0) {
-                  ++pc_right;
-                  if (pc_right != u_left) {
-                     qsort_swap(pc_right, u_left);
-                  }
-                  ++u_left;
-               } else {
-                  break;
-               }
-               qsort_assert(u_left > pc_right);
-               qsort_assert(pc_left <= pc_right);
-               qsort_assert(qsort_cmp(pc_right, u_left - 1) <= 0);
-               qsort_assert(qsort_cmp(pc_left, pc_right) == 0);
-            }
+               if (q == f1) {
+                   FROMTOUPTO(f2, tp2, t);
+                   *tp2++ = *f1++;
+               } else {
+                   FROMTOUPTO(f1, tp2, t);
+                   *tp2++ = *f2++;
+               }
+           }
 
-            if (still_work_on_left) {
-               /* I know I have a value on the left side which needs to be
-                  on the right side, but I need to know more to decide
-                  exactly the best thing to do with it.
-               */
-               if (still_work_on_right) {
-                  /* I know I have values on both side which are out of
-                     position. This is a big win because I kill two birds
-                     with one swap (so to speak). I can advance the
-                     uncompared pointers on both sides after swapping both
-                     of them into the right place.
-                  */
-                  qsort_swap(u_right, u_left);
-                  --u_right;
-                  ++u_left;
-                  qsort_all_asserts(pc_left, pc_right, u_left, u_right);
-               } else {
-                  /* I have an out of position value on the left, but the
-                     right is fully scanned, so I "slide" the pivot chunk
-                     and any less-than values left one to make room for the
-                     greater value over on the right. If the out of position
-                     value is immediately adjacent to the pivot chunk (there
-                     are no less-than values), I can do that with a swap,
-                     otherwise, I have to rotate one of the less than values
-                     into the former position of the out of position value
-                     and the right end of the pivot chunk into the left end
-                     (got all that?).
-                  */
-                  --pc_left;
-                  if (pc_left == u_right) {
-                     qsort_swap(u_right, pc_right);
-                     qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
-                  } else {
-                     qsort_rotate(u_right, pc_left, pc_right);
-                     qsort_all_asserts(pc_left, pc_right-1, u_left, u_right-1);
-                  }
-                  --pc_right;
-                  --u_right;
-               }
-            } else if (still_work_on_right) {
-               /* Mirror image of complex case above: I have an out of
-                  position value on the right, but the left is fully
-                  scanned, so I need to shuffle things around to make room
-                  for the right value on the left.
-               */
-               ++pc_right;
-               if (pc_right == u_left) {
-                  qsort_swap(u_left, pc_left);
-                  qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
-               } else {
-                  qsort_rotate(pc_right, pc_left, u_left);
-                  qsort_all_asserts(pc_left+1, pc_right, u_left+1, u_right);
-               }
-               ++pc_left;
-               ++u_left;
-            } else {
-               /* No more scanning required on either side of partition,
-                  break out of loop and figure out next set of partitions
-               */
-               break;
-            }
-         }
-
-         /* The elements in the pivot chunk are now in the right place. They
-            will never move or be compared again. All I have to do is decide
-            what to do with the stuff to the left and right of the pivot
-            chunk.
-
-            Notes on the QSORT_ORDER_GUESS ifdef code:
-
-            1. If I just built these partitions without swapping any (or
-               very many) elements, there is a chance that the elements are
-               already ordered properly (being properly ordered will
-               certainly result in no swapping, but the converse can't be
-               proved :-).
-
-            2. A (properly written) insertion sort will run faster on
-               already ordered data than qsort will.
-
-            3. Perhaps there is some way to make a good guess about
-               switching to an insertion sort earlier than partition size 6
-               (for instance - we could save the partition size on the stack
-               and increase the size each time we find we didn't swap, thus
-               switching to insertion sort earlier for partitions with a
-               history of not swapping).
-
-            4. Naturally, if I just switch right away, it will make
-               artificial benchmarks with pure ascending (or descending)
-               data look really good, but is that a good reason in general?
-               Hard to say...
-         */
-
-#ifdef QSORT_ORDER_GUESS
-         if (swapped < 3) {
-#if QSORT_ORDER_GUESS == 1
-            qsort_break_even = (part_right - part_left) + 1;
-#endif
-#if QSORT_ORDER_GUESS == 2
-            qsort_break_even *= 2;
-#endif
-#if QSORT_ORDER_GUESS == 3
-            int prev_break = qsort_break_even;
-            qsort_break_even *= qsort_break_even;
-            if (qsort_break_even < prev_break) {
-               qsort_break_even = (part_right - part_left) + 1;
-            }
-#endif
-         } else {
-            qsort_break_even = QSORT_BREAK_EVEN;
-         }
-#endif
 
-         if (part_left < pc_left) {
-            /* There are elements on the left which need more processing.
-               Check the right as well before deciding what to do.
-            */
-            if (pc_right < part_right) {
-               /* We have two partitions to be sorted. Stack the biggest one
-                  and process the smallest one on the next iteration. This
-                  minimizes the stack height by insuring that any additional
-                  stack entries must come from the smallest partition which
-                  (because it is smallest) will have the fewest
-                  opportunities to generate additional stack entries.
-               */
-               if ((part_right - pc_right) > (pc_left - part_left)) {
-                  /* stack the right partition, process the left */
-                  partition_stack[next_stack_entry].left = pc_right + 1;
-                  partition_stack[next_stack_entry].right = part_right;
-#ifdef QSORT_ORDER_GUESS
-                  partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
-#endif
-                  part_right = pc_left - 1;
-               } else {
-                  /* stack the left partition, process the right */
-                  partition_stack[next_stack_entry].left = part_left;
-                  partition_stack[next_stack_entry].right = pc_left - 1;
-#ifdef QSORT_ORDER_GUESS
-                  partition_stack[next_stack_entry].qsort_break_even = qsort_break_even;
-#endif
-                  part_left = pc_right + 1;
-               }
-               qsort_assert(next_stack_entry < QSORT_MAX_STACK);
-               ++next_stack_entry;
-            } else {
-               /* The elements on the left are the only remaining elements
-                  that need sorting, arrange for them to be processed as the
-                  next partition.
-               */
-               part_right = pc_left - 1;
-            }
-         } else if (pc_right < part_right) {
-            /* There is only one chunk on the right to be sorted, make it
-               the new partition and loop back around.
-            */
-            part_left = pc_right + 1;
-         } else {
-            /* This whole partition wound up in the pivot chunk, so
-               we need to get a new partition off the stack.
-            */
-            if (next_stack_entry == 0) {
-               /* the stack is empty - we are done */
-               break;
-            }
-            --next_stack_entry;
-            part_left = partition_stack[next_stack_entry].left;
-            part_right = partition_stack[next_stack_entry].right;
-#ifdef QSORT_ORDER_GUESS
-            qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
-#endif
-         }
-      } else {
-         /* This partition is too small to fool with qsort complexity, just
-            do an ordinary insertion sort to minimize overhead.
-         */
-         int i;
-         /* Assume 1st element is in right place already, and start checking
-            at 2nd element to see where it should be inserted.
-         */
-         for (i = part_left + 1; i <= part_right; ++i) {
-            int j;
-            /* Scan (backwards - just in case 'i' is already in right place)
-               through the elements already sorted to see if the ith element
-               belongs ahead of one of them.
-            */
-            for (j = i - 1; j >= part_left; --j) {
-               if (qsort_cmp(i, j) >= 0) {
-                  /* i belongs right after j
-                  */
-                  break;
-               }
-            }
-            ++j;
-            if (j != i) {
-               /* Looks like we really need to move some things
-               */
-              int k;
-              temp = array[i];
-              for (k = i - 1; k >= j; --k)
-                 array[k + 1] = array[k];
-               array[j] = temp;
-            }
-         }
-
-         /* That partition is now sorted, grab the next one, or get out
-            of the loop if there aren't any more.
-         */
-
-         if (next_stack_entry == 0) {
-            /* the stack is empty - we are done */
-            break;
-         }
-         --next_stack_entry;
-         part_left = partition_stack[next_stack_entry].left;
-         part_right = partition_stack[next_stack_entry].right;
-#ifdef QSORT_ORDER_GUESS
-         qsort_break_even = partition_stack[next_stack_entry].qsort_break_even;
-#endif
-      }
-   }
-
-   /* Believe it or not, the array is sorted at this point! */
+           /* Run out remaining list */
+           if (f1 == l1) {
+                  if (f2 < l2) FROMTOUPTO(f2, tp2, l2);
+           } else              FROMTOUPTO(f1, tp2, l1);
+           p1 = NEXT(p1) = POTHER(tp2, list2, list1);
+       }
+       t = list1;
+       list1 = list2;
+       list2 = t;
+       last = PINDEX(list2, nmemb);
+    }
+    if (base == list2) {
+       last = PINDEX(list1, nmemb);
+       FROMTOUPTO(list1, list2, last);
+    }
+    Safefree(aux);
+    return;
 }
 
 
index fde52c5..9b0573b 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -146,9 +146,17 @@ PP(pp_concat)
     dPOPTOPssrl;
     STRLEN len;
     U8 *s;
-    bool left_utf = DO_UTF8(left);
-    bool right_utf = DO_UTF8(right);
+    bool left_utf;
+    bool right_utf;
 
+    if (TARG == right && SvGMAGICAL(right))
+        mg_get(right);
+    if (SvGMAGICAL(left))
+        mg_get(left);
+
+    left_utf  = DO_UTF8(left);
+    right_utf = DO_UTF8(right);
     if (left_utf != right_utf) {
         if (TARG == right && !right_utf) {
             sv_utf8_upgrade(TARG); /* Now straight binary copy */
@@ -158,15 +166,16 @@ PP(pp_concat)
             /* Set TARG to PV(left), then add right */
             U8 *l, *c, *olds = NULL;
             STRLEN targlen;
+           s = (U8*)SvPV(right,len);
+           right_utf |= DO_UTF8(right);
             if (TARG == right) {
-                /* Need a safe copy elsewhere since we're just about to
-                   write onto TARG */
-               olds = (U8*)SvPV(right,len);
-                s = (U8*)savepv((char*)olds);
+               /* Take a copy since we're about to overwrite TARG */
+               olds = s = (U8*)savepvn((char*)s, len);
            }
-            else
-                s = (U8*)SvPV(right,len);
+           if (!SvOK(left) && SvTYPE(left) <= SVt_PVMG)
+               sv_setpv(left, "");     /* Suppress warning. */
             l = (U8*)SvPV(left, targlen);
+           left_utf |= DO_UTF8(left);
             if (TARG != left)
                 sv_setpvn(TARG, (char*)l, targlen);
             if (!left_utf)
@@ -175,14 +184,14 @@ PP(pp_concat)
             targlen = SvCUR(TARG) + len;
             if (!right_utf) {
                 /* plus one for each hi-byte char if we have to upgrade */
-                for (c = s; *c; c++)  {
+                for (c = s; c < s + len; c++)  {
                     if (*c & 0x80)
                         targlen++;
                 }
             }
             SvGROW(TARG, targlen+1);
             /* And now copy, maybe upgrading right to UTF8 on the fly */
-            for (c = (U8*)SvEND(TARG); *s; s++) {
+            for (c = (U8*)SvEND(TARG); len--; s++) {
                  if (*s & 0x80 && !right_utf)
                      c = uv_to_utf8(c, *s);
                  else
@@ -206,8 +215,6 @@ PP(pp_concat)
        }
        sv_setpvn(TARG, (char *)s, len);
     }
-    else if (SvGMAGICAL(TARG))
-       mg_get(TARG);
     else if (!SvOK(TARG) && SvTYPE(TARG) <= SVt_PVMG)
        sv_setpv(TARG, "");     /* Suppress warning. */
     s = (U8*)SvPV(right,len);
@@ -256,7 +263,7 @@ PP(pp_readline)
     tryAMAGICunTARGET(iter, 0);
     PL_last_in_gv = (GV*)(*PL_stack_sp--);
     if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
-       if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV) 
+       if (SvROK(PL_last_in_gv) && SvTYPE(SvRV(PL_last_in_gv)) == SVt_PVGV)
            PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
        else {
            dSP;
@@ -271,7 +278,7 @@ PP(pp_readline)
 
 PP(pp_eq)
 {
-    djSP; tryAMAGICbinSET(eq,0); 
+    djSP; tryAMAGICbinSET(eq,0);
     {
       dPOPnv;
       SETs(boolSV(TOPn == value));
@@ -309,7 +316,7 @@ PP(pp_or)
 
 PP(pp_add)
 {
-    djSP; dATARGET; tryAMAGICbin(add,opASSIGN); 
+    djSP; dATARGET; tryAMAGICbin(add,opASSIGN);
     {
       dPOPTOPnnrl_ul;
       SETn( left + right );
@@ -376,8 +383,9 @@ PP(pp_print)
     else
        gv = PL_defoutgv;
     if ((mg = SvTIED_mg((SV*)gv, 'q'))) {
+      had_magic:
        if (MARK == ORIGMARK) {
-           /* If using default handle then we need to make space to 
+           /* If using default handle then we need to make space to
             * pass object as 1st arg, so move other args up ...
             */
            MEXTEND(SP, 1);
@@ -398,26 +406,33 @@ PP(pp_print)
        RETURN;
     }
     if (!(io = GvIO(gv))) {
-       if (ckWARN(WARN_UNOPENED)) {
-           SV* sv = sv_newmortal();
-           gv_efullname4(sv, gv, Nullch, FALSE);
-            Perl_warner(aTHX_ WARN_UNOPENED, "Filehandle %s never opened",
-                       SvPV(sv,n_a));
-        }
+        dTHR;
+        if ((GvEGV(gv)) && (mg = SvTIED_mg((SV*)GvEGV(gv),'q')))
+            goto had_magic;
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
        SETERRNO(EBADF,RMS$_IFI);
        goto just_say_no;
     }
     else if (!(fp = IoOFP(io))) {
        if (ckWARN2(WARN_CLOSED, WARN_IO))  {
            if (IoIFP(io)) {
-               SV* sv = sv_newmortal();
-               gv_efullname4(sv, gv, Nullch, FALSE);
-               Perl_warner(aTHX_ WARN_IO,
-                           "Filehandle %s opened only for input",
-                           SvPV(sv,n_a));
+               /* integrate with report_evil_fh()? */
+               char *name = NULL;
+               if (isGV(gv)) {
+                   SV* sv = sv_newmortal();
+                   gv_efullname4(sv, gv, Nullch, FALSE);
+                   name = SvPV_nolen(sv);
+               }
+               if (name && *name)
+                 Perl_warner(aTHX_ WARN_IO,
+                             "Filehandle %s opened only for input", name);
+               else
+                   Perl_warner(aTHX_ WARN_IO,
+                               "Filehandle opened only for input");
            }
-           else if (ckWARN(WARN_CLOSED))
-               report_closed_fh(gv, io, "print", "filehandle");
+           else if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+               report_evil_fh(gv, io, PL_op->op_type);
        }
        SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
        goto just_say_no;
@@ -493,7 +508,7 @@ PP(pp_rv2av)
        }
        else {
            GV *gv;
-           
+       
            if (SvTYPE(sv) != SVt_PVGV) {
                char *sym;
                STRLEN len;
@@ -549,14 +564,14 @@ PP(pp_rv2av)
     if (GIMME == G_ARRAY) {
        I32 maxarg = AvFILL(av) + 1;
        (void)POPs;                     /* XXXX May be optimized away? */
-       EXTEND(SP, maxarg);          
+       EXTEND(SP, maxarg);
        if (SvRMAGICAL(av)) {
-           U32 i; 
+           U32 i;
            for (i=0; i < maxarg; i++) {
                SV **svp = av_fetch(av, i, FALSE);
                SP[i+1] = (svp) ? *svp : &PL_sv_undef;
            }
-       } 
+       }
        else {
            Copy(AvARRAY(av), SP+1, maxarg, SV*);
        }
@@ -597,7 +612,7 @@ PP(pp_rv2hv)
        }
        else {
            GV *gv;
-           
+       
            if (SvTYPE(sv) != SVt_PVGV) {
                char *sym;
                STRLEN len;
@@ -1032,10 +1047,10 @@ PP(pp_match)
            MAGIC* mg = mg_find(TARG, 'g');
            if (mg && mg->mg_len >= 0) {
                if (!(rx->reganch & ROPT_GPOS_SEEN))
-                   rx->endp[0] = rx->startp[0] = mg->mg_len; 
+                   rx->endp[0] = rx->startp[0] = mg->mg_len;
                else if (rx->reganch & ROPT_ANCH_GPOS) {
                    r_flags |= REXEC_IGNOREPOS;
-                   rx->endp[0] = rx->startp[0] = mg->mg_len; 
+                   rx->endp[0] = rx->startp[0] = mg->mg_len;
                }
                minmatch = (mg->mg_flags & MGf_MINMATCH);
                update_minmatch = 0;
@@ -1045,7 +1060,7 @@ PP(pp_match)
     if ((gimme != G_ARRAY && !global && rx->nparens)
            || SvTEMP(TARG) || PL_sawampersand)
        r_flags |= REXEC_COPY_STR;
-    if (SvSCREAM(TARG)) 
+    if (SvSCREAM(TARG))
        r_flags |= REXEC_SCREAM;
 
     if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
@@ -1067,7 +1082,7 @@ play_it_again:
        if (!s)
            goto nope;
        if ( (rx->reganch & ROPT_CHECK_ALL)
-            && !PL_sawampersand 
+            && !PL_sawampersand
             && ((rx->reganch & ROPT_NOSCAN)
                 || !((rx->reganch & RE_INTUIT_TAIL)
                      && (r_flags & REXEC_SCREAM)))
@@ -1163,7 +1178,7 @@ yup:                                      /* Confirmed by INTUIT */
        rx->endp[0] = s - truebase + rx->minlen;
        rx->sublen = strend - truebase;
        goto gotcha;
-    } 
+    }
     if (PL_sawampersand) {
        I32 off;
 
@@ -1324,7 +1339,7 @@ Perl_do_readline(pTHX)
                        }
                        else {
                           PerlIO_rewind(tmpfp);
-                          IoTYPE(io) = '<';
+                          IoTYPE(io) = IoTYPE_RDONLY;
                           IoIFP(io) = fp = tmpfp;
                           IoFLAGS(io) &= ~IOf_UNTAINT;  /* maybe redundant */
                        }
@@ -1378,23 +1393,33 @@ Perl_do_readline(pTHX)
        else if (type == OP_GLOB)
            SP--;
        else if (ckWARN(WARN_IO)        /* stdout/stderr or other write fh */
-                && (IoTYPE(io) == '>' || fp == PerlIO_stdout()
+                && (IoTYPE(io) == IoTYPE_WRONLY || fp == PerlIO_stdout()
                     || fp == PerlIO_stderr()))
        {
-           SV* sv = sv_newmortal();
-           gv_efullname4(sv, PL_last_in_gv, Nullch, FALSE);
-           Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
-                       SvPV_nolen(sv));
+           /* integrate with report_evil_fh()? */
+           char *name = NULL;
+           if (isGV(PL_last_in_gv)) { /* can this ever fail? */
+               SV* sv = sv_newmortal();
+               gv_efullname4(sv, PL_last_in_gv, Nullch, FALSE);
+               name = SvPV_nolen(sv);
+           }
+           if (name && *name)
+               Perl_warner(aTHX_ WARN_IO,
+                           "Filehandle %s opened only for output", name);
+           else
+               Perl_warner(aTHX_ WARN_IO,
+                           "Filehandle opened only for output");
        }
     }
     if (!fp) {
-       if (ckWARN2(WARN_GLOB,WARN_CLOSED) && io && !(IoFLAGS(io) & IOf_START)) {
+       if (ckWARN2(WARN_GLOB, WARN_CLOSED)
+               && (!io || !(IoFLAGS(io) & IOf_START))) {
            if (type == OP_GLOB)
                Perl_warner(aTHX_ WARN_GLOB,
                            "glob failed (can't start child: %s)",
                            Strerror(errno));
            else
-               report_closed_fh(PL_last_in_gv, io, "readline", "filehandle");
+               report_evil_fh(PL_last_in_gv, io, PL_op->op_type);
        }
        if (gimme == G_SCALAR) {
            (void)SvOK_off(TARG);
@@ -1530,15 +1555,16 @@ PP(pp_helem)
     U32 lval = PL_op->op_flags & OPf_MOD;
     U32 defer = PL_op->op_private & OPpLVAL_DEFER;
     SV *sv;
+    U32 hash = (SvFAKE(keysv) && SvREADONLY(keysv)) ? SvUVX(keysv) : 0;
 
     if (SvTYPE(hv) == SVt_PVHV) {
-       he = hv_fetch_ent(hv, keysv, lval && !defer, 0);
+       he = hv_fetch_ent(hv, keysv, lval && !defer, hash);
        svp = he ? &HeVAL(he) : 0;
     }
     else if (SvTYPE(hv) == SVt_PVAV) {
        if (PL_op->op_private & OPpLVAL_INTRO)
            DIE(aTHX_ "Can't localize pseudo-hash element");
-       svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0);
+       svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, hash);
     }
     else {
        RETPUSHUNDEF;
@@ -1667,7 +1693,7 @@ PP(pp_iter)
                    /* safe to reuse old SV */
                    sv_setsv(*itersvp, cur);
                }
-               else 
+               else
 #endif
                {
                    /* we need a fresh SV every time so that loop body sees a
@@ -1693,7 +1719,7 @@ PP(pp_iter)
            /* safe to reuse old SV */
            sv_setiv(*itersvp, cx->blk_loop.iterix++);
        }
-       else 
+       else
 #endif
        {
            /* we need a fresh SV every time so that loop body sees a
@@ -1712,7 +1738,7 @@ PP(pp_iter)
     SvREFCNT_dec(*itersvp);
 
     if ((sv = SvMAGICAL(av)
-             ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE) 
+             ? *av_fetch(av, ++cx->blk_loop.iterix, FALSE)
              : AvARRAY(av)[++cx->blk_loop.iterix]))
        SvTEMP_off(sv);
     else
@@ -1772,7 +1798,9 @@ PP(pp_subst)
     else {
        TARG = DEFSV;
        EXTEND(SP,1);
-    }                  
+    }
+    if (SvFAKE(TARG) && SvREADONLY(TARG))
+       sv_force_normal(TARG);
     if (SvREADONLY(TARG)
        || (SvTYPE(TARG) > SVt_PVLV
            && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
@@ -1793,7 +1821,7 @@ PP(pp_subst)
        DIE(aTHX_ "panic: do_subst");
 
     strend = s + len;
-    maxiters = 2*(strend - s) + 10;    /* We can match twice at each 
+    maxiters = 2*(strend - s) + 10;    /* We can match twice at each
                                           position, once with zero-length,
                                           second time with non-zero. */
 
@@ -1817,7 +1845,7 @@ PP(pp_subst)
            goto nope;
        /* How to do it in subst? */
 /*     if ( (rx->reganch & ROPT_CHECK_ALL)
-            && !PL_sawampersand 
+            && !PL_sawampersand
             && ((rx->reganch & ROPT_NOSCAN)
                 || !((rx->reganch & RE_INTUIT_TAIL)
                      && (r_flags & REXEC_SCREAM))))
@@ -1995,7 +2023,7 @@ PP(pp_subst)
     goto ret_no;
 
 nope:
-ret_no:         
+ret_no:
     SPAGAIN;
     PUSHs(&PL_sv_no);
     LEAVE_SCOPE(oldsave);
@@ -2054,7 +2082,7 @@ PP(pp_leavesub)
     SV *sv;
 
     POPBLOCK(cx,newpm);
+
     TAINT_NOT;
     if (gimme == G_SCALAR) {
        MARK = newsp + 1;
@@ -2090,7 +2118,7 @@ PP(pp_leavesub)
        }
     }
     PUTBACK;
-    
+
     POPSUB(cx,sv);     /* Stack values are safe: release CV and @_ ... */
     PL_curpm = newpm;  /* ... and pop $1 et al */
 
@@ -2112,7 +2140,7 @@ PP(pp_leavesublv)
     SV *sv;
 
     POPBLOCK(cx,newpm);
+
     TAINT_NOT;
 
     if (cx->blk_sub.lval & OPpENTERSUB_INARGS) {
@@ -2243,7 +2271,7 @@ PP(pp_leavesublv)
        }
     }
     PUTBACK;
-    
+
     POPSUB(cx,sv);     /* Stack values are safe: release CV and @_ ... */
     PL_curpm = newpm;  /* ... and pop $1 et al */
 
@@ -2264,7 +2292,7 @@ S_get_db_sub(pTHX_ SV **svp, CV *cv)
 
        save_item(dbsv);
        if ( (CvFLAGS(cv) & (CVf_ANON | CVf_CLONED))
-            || strEQ(GvNAME(gv), "END") 
+            || strEQ(GvNAME(gv), "END")
             || ((GvCV(gv) != cv) && /* Could be imported, and old sub redefined. */
                 !( (SvTYPE(*svp) == SVt_PVGV) && (GvCV((GV*)*svp) == cv)
                    && (gv = (GV*)*svp) ))) {
@@ -2542,7 +2570,7 @@ try_autoload:
            }
            PL_stack_sp = mark + 1;
            fp3 = (I32(*)(int,int,int))CvXSUB(cv);
-           items = (*fp3)(CvXSUBANY(cv).any_i32, 
+           items = (*fp3)(CvXSUBANY(cv).any_i32,
                           MARK - PL_stack_base + 1,
                           items);
            PL_stack_sp = PL_stack_base + items;
@@ -2572,7 +2600,7 @@ try_autoload:
                    EXTEND(SP, items);
                    Copy(AvARRAY(av), SP + 1, items, SV*);
                    SP += items;
-                   PUTBACK ;               
+                   PUTBACK ;           
                }
            }
            /* We assume first XSUB in &DB::sub is the called one. */
@@ -2666,7 +2694,7 @@ try_autoload:
                EXTEND(SP, items);
                Copy(AvARRAY(av), SP + 1, items, SV*);
                SP += items;
-               PUTBACK ;                   
+               PUTBACK ;               
            }
        }
 #endif /* USE_THREADS */               
@@ -2714,7 +2742,7 @@ try_autoload:
            }
            Copy(MARK,AvARRAY(av),items,SV*);
            AvFILLp(av) = items - 1;
-           
+       
            while (items--) {
                if (*MARK)
                    SvTEMP_off(*MARK);
@@ -2744,7 +2772,7 @@ Perl_sub_crush_depth(pTHX_ CV *cv)
     else {
        SV* tmpstr = sv_newmortal();
        gv_efullname3(tmpstr, CvGV(cv), Nullch);
-       Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"", 
+       Perl_warner(aTHX_ WARN_RECURSION, "Deep recursion on subroutine \"%s\"",
                SvPVX(tmpstr));
     }
 }
@@ -2753,7 +2781,7 @@ PP(pp_aelem)
 {
     djSP;
     SV** svp;
-    I32 elem = POPi;
+    IV elem = POPi;
     AV* av = (AV*)POPs;
     U32 lval = PL_op->op_flags & OPf_MOD;
     U32 defer = (PL_op->op_private & OPpLVAL_DEFER) && (elem > AvFILL(av));
@@ -2864,6 +2892,9 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
     name = SvPV(meth, namelen);
     sv = *(PL_stack_base + TOPMARK + 1);
 
+    if (!sv)
+       Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
+
     if (SvGMAGICAL(sv))
         mg_get(sv);
     if (SvROK(sv))
@@ -2877,7 +2908,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
            !(iogv = gv_fetchpv(packname, FALSE, SVt_PVIO)) ||
            !(ob=(SV*)GvIO(iogv)))
        {
-           if (!packname || 
+           if (!packname ||
                ((*(U8*)packname >= 0xc0 && DO_UTF8(sv))
                    ? !isIDFIRST_utf8((U8*)packname)
                    : !isIDFIRST(*packname)
index 4ce9d74..c249ecb 100644 (file)
@@ -39,6 +39,7 @@ PERL_CKDEF(Perl_ck_sort)
 PERL_CKDEF(Perl_ck_spair)
 PERL_CKDEF(Perl_ck_split)
 PERL_CKDEF(Perl_ck_subr)
+PERL_CKDEF(Perl_ck_substr)
 PERL_CKDEF(Perl_ck_svconst)
 PERL_CKDEF(Perl_ck_trunc)
 
index aa6d0bd..9329ffd 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -29,7 +29,7 @@
  * --jhi */
 #   ifdef __hpux__
 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
- * and another MAXINT from "perl.h" <- <sys/param.h>. */ 
+ * and another MAXINT from "perl.h" <- <sys/param.h>. */
 #       undef MAXINT
 #   endif
 #   include <shadow.h>
@@ -40,8 +40,8 @@
 # include <unistd.h>
 #endif
 
-#ifdef HAS_SYSCALL   
-#ifdef __cplusplus              
+#ifdef HAS_SYSCALL
+#ifdef __cplusplus
 extern "C" int syscall(unsigned long,...);
 #endif
 #endif
@@ -58,7 +58,7 @@ extern "C" int syscall(unsigned long,...);
 # include <sys/socket.h>
 # if defined(USE_SOCKS) && defined(I_SOCKS)
 #   include <socks.h>
-# endif 
+# endif
 # ifdef I_NETDB
 #  include <netdb.h>
 # endif
@@ -508,7 +508,7 @@ PP(pp_open)
     djSP; dTARGET;
     GV *gv;
     SV *sv;
-    SV *name;
+    SV *name = Nullsv;
     I32 have_name = 0;
     char *tmps;
     STRLEN len;
@@ -612,8 +612,8 @@ PP(pp_pipe_op)
     IoIFP(rstio) = PerlIO_fdopen(fd[0], "r");
     IoOFP(wstio) = PerlIO_fdopen(fd[1], "w");
     IoIFP(wstio) = IoOFP(wstio);
-    IoTYPE(rstio) = '<';
-    IoTYPE(wstio) = '>';
+    IoTYPE(rstio) = IoTYPE_RDONLY;
+    IoTYPE(wstio) = IoTYPE_WRONLY;
 
     if (!IoIFP(rstio) || !IoOFP(wstio)) {
        if (IoIFP(rstio)) PerlIO_close(IoIFP(rstio));
@@ -703,7 +703,7 @@ PP(pp_binmode)
     if (MAXARG > 1)
        discp = POPs;
 
-    gv = (GV*)POPs; 
+    gv = (GV*)POPs;
 
     if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
        PUSHMARK(SP);
@@ -722,7 +722,7 @@ PP(pp_binmode)
     if (!(io = GvIO(gv)) || !(fp = IoIFP(io)))
        RETPUSHUNDEF;
 
-    if (do_binmode(fp,IoTYPE(io),mode_from_discipline(discp))) 
+    if (do_binmode(fp,IoTYPE(io),mode_from_discipline(discp)))
        RETPUSHYES;
     else
        RETPUSHUNDEF;
@@ -769,7 +769,7 @@ PP(pp_tie)
            PUSHs(*MARK++);
        PUTBACK;
        call_method(methname, G_SCALAR);
-    } 
+    }
     else {
        /* Not clear why we don't call call_method here too.
         * perhaps to get different error message ?
@@ -777,7 +777,7 @@ PP(pp_tie)
        stash = gv_stashsv(*MARK, FALSE);
        if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
            DIE(aTHX_ "Can't locate object method \"%s\" via package \"%s\"",
-                methname, SvPV(*MARK,n_a));                   
+                methname, SvPV(*MARK,n_a));
        }
        ENTER;
        PUSHSTACKi(PERLSI_MAGIC);
@@ -794,7 +794,10 @@ PP(pp_tie)
     POPSTACK;
     if (sv_isobject(sv)) {
        sv_unmagic(varsv, how);
-       sv_magic(varsv, (SvRV(sv) == varsv ? Nullsv : sv), how, Nullch, 0);
+       /* Croak if a self-tie is attempted */
+       if (varsv == SvRV(sv))
+           Perl_croak(aTHX_ "Self-ties are not supported");
+       sv_magic(varsv, sv, how, Nullch, 0);
     }
     LEAVE;
     SP = PL_stack_base + markoff;
@@ -808,16 +811,29 @@ PP(pp_untie)
     SV *sv = POPs;
     char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV) ? 'P' : 'q';
 
-    if (ckWARN(WARN_UNTIE)) {
         MAGIC * mg ;
         if ((mg = SvTIED_mg(sv, how))) {
-            if (mg && SvREFCNT(SvRV(mg->mg_obj)) > 1)  
+       SV *obj = SvRV(mg->mg_obj);
+       GV *gv;
+       CV *cv = NULL;
+       if ((gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE)) &&
+            isGV(gv) && (cv = GvCV(gv))) {
+           PUSHMARK(SP);
+           XPUSHs(SvTIED_obj((SV*)gv, mg));
+           XPUSHs(sv_2mortal(newSViv(SvREFCNT(obj)-1)));
+           PUTBACK;
+           ENTER;
+           call_sv((SV *)cv, G_VOID);
+           LEAVE;
+           SPAGAIN;
+        }
+        else if (ckWARN(WARN_UNTIE)) {
+           if (mg && SvREFCNT(obj) > 1)
                Perl_warner(aTHX_ WARN_UNTIE,
                    "untie attempted while %"UVuf" inner references still exist",
-                   (UV)SvREFCNT(SvRV(mg->mg_obj)) - 1 ) ;
+                   (UV)SvREFCNT(obj) - 1 ) ;
         }
     }
     sv_unmagic(sv, how);
     RETPUSHYES;
 }
@@ -889,7 +905,7 @@ PP(pp_dbmopen)
     }
 
     if (sv_isobject(TOPs)) {
-       sv_unmagic((SV *) hv, 'P');            
+       sv_unmagic((SV *) hv, 'P');
        sv_magic((SV*)hv, TOPs, 'P', Nullch, 0);
     }
     LEAVE;
@@ -1070,7 +1086,7 @@ PP(pp_select)
     else {
        GV **gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
        if (gvp && *gvp == egv) {
-           gv_efullname4(TARG, PL_defoutgv, Nullch, FALSE);
+           gv_efullname4(TARG, PL_defoutgv, Nullch, TRUE);
            XPUSHTARG;
        }
        else {
@@ -1174,11 +1190,14 @@ PP(pp_enterwrite)
 
     cv = GvFORM(fgv);
     if (!cv) {
+        char *name = NULL;
        if (fgv) {
            SV *tmpsv = sv_newmortal();
            gv_efullname4(tmpsv, fgv, Nullch, FALSE);
-           DIE(aTHX_ "Undefined format \"%s\" called",SvPVX(tmpsv));
+           name = SvPV_nolen(tmpsv);
        }
+       if (name && *name)
+           DIE(aTHX_ "Undefined format \"%s\" called", name);
        DIE(aTHX_ "Not a format reference");
     }
     if (CvCLONE(cv))
@@ -1255,10 +1274,19 @@ PP(pp_leavewrite)
        if (!fgv)
            DIE(aTHX_ "bad top format reference");
        cv = GvFORM(fgv);
-       if (!cv) {
-           SV *tmpsv = sv_newmortal();
-           gv_efullname4(tmpsv, fgv, Nullch, FALSE);
-           DIE(aTHX_ "Undefined top format \"%s\" called",SvPVX(tmpsv));
+       {
+           char *name = NULL;
+           if (!cv) {
+               SV *sv = sv_newmortal();
+               gv_efullname4(sv, fgv, Nullch, FALSE);
+               name = SvPV_nolen(sv);
+           }
+           if (name && *name)
+               DIE(aTHX_ "Undefined top format \"%s\" called",name);
+           /* why no:
+           else
+               DIE(aTHX_ "Undefined top format called");
+           ?*/
        }
        if (CvCLONE(cv))
            cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
@@ -1274,14 +1302,22 @@ PP(pp_leavewrite)
     if (!fp) {
        if (ckWARN2(WARN_CLOSED,WARN_IO)) {
            if (IoIFP(io)) {
-               SV* sv = sv_newmortal();
-               gv_efullname4(sv, gv, Nullch, FALSE);
-               Perl_warner(aTHX_ WARN_IO,
-                           "Filehandle %s opened only for input",
-                           SvPV_nolen(sv));
+               /* integrate with report_evil_fh()? */
+               char *name = NULL;
+               if (isGV(gv)) {
+                   SV* sv = sv_newmortal();
+                   gv_efullname4(sv, gv, Nullch, FALSE);
+                   name = SvPV_nolen(sv);
+               }
+               if (name && *name)
+                   Perl_warner(aTHX_ WARN_IO,
+                               "Filehandle %s opened only for input", name);
+               else
+                   Perl_warner(aTHX_ WARN_IO,
+                               "Filehandle opened only for input");
            }
            else if (ckWARN(WARN_CLOSED))
-               report_closed_fh(gv, io, "write", "filehandle");
+               report_evil_fh(gv, io, PL_op->op_type);
        }
        PUSHs(&PL_sv_no);
     }
@@ -1344,24 +1380,30 @@ PP(pp_prtf)
 
     sv = NEWSV(0,0);
     if (!(io = GvIO(gv))) {
-       if (ckWARN(WARN_UNOPENED)) {
-           gv_efullname4(sv, gv, Nullch, FALSE);
-           Perl_warner(aTHX_ WARN_UNOPENED,
-                       "Filehandle %s never opened", SvPV(sv,n_a));
-       }
+        dTHR;
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
        SETERRNO(EBADF,RMS$_IFI);
        goto just_say_no;
     }
     else if (!(fp = IoOFP(io))) {
        if (ckWARN2(WARN_CLOSED,WARN_IO))  {
+           /* integrate with report_evil_fh()? */
            if (IoIFP(io)) {
-               gv_efullname4(sv, gv, Nullch, FALSE);
-               Perl_warner(aTHX_ WARN_IO,
-                           "Filehandle %s opened only for input",
-                           SvPV(sv,n_a));
+               char *name = NULL;
+               if (isGV(gv)) {
+                   gv_efullname4(sv, gv, Nullch, FALSE);
+                   name = SvPV_nolen(sv);
+               }
+               if (name && *name)
+                   Perl_warner(aTHX_ WARN_IO,
+                               "Filehandle %s opened only for input", name);
+               else
+                   Perl_warner(aTHX_ WARN_IO,
+                               "Filehandle opened only for input");
            }
            else if (ckWARN(WARN_CLOSED))
-               report_closed_fh(gv, io, "printf", "filehandle");
+               report_evil_fh(gv, io, PL_op->op_type);
        }
        SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
        goto just_say_no;
@@ -1515,7 +1557,7 @@ PP(pp_sysread)
     }
     if (PL_op->op_type == OP_SYSREAD) {
 #ifdef PERL_SOCK_SYSREAD_IS_RECV
-       if (IoTYPE(io) == 's') {
+       if (IoTYPE(io) == IoTYPE_SOCKET) {
            length = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
                                   buffer+offset, length, 0);
        }
@@ -1528,7 +1570,7 @@ PP(pp_sysread)
     }
     else
 #ifdef HAS_SOCKET__bad_code_maybe
-    if (IoTYPE(io) == 's') {
+    if (IoTYPE(io) == IoTYPE_SOCKET) {
        char namebuf[MAXPATHLEN];
 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
        bufsize = sizeof (struct sockaddr_in);
@@ -1547,13 +1589,22 @@ PP(pp_sysread)
            length = -1;
     }
     if (length < 0) {
-       if ((IoTYPE(io) == '>' || IoIFP(io) == PerlIO_stdout()
+       if ((IoTYPE(io) == IoTYPE_WRONLY || IoIFP(io) == PerlIO_stdout()
            || IoIFP(io) == PerlIO_stderr()) && ckWARN(WARN_IO))
        {
-           SV* sv = sv_newmortal();
-           gv_efullname4(sv, gv, Nullch, FALSE);
-           Perl_warner(aTHX_ WARN_IO, "Filehandle %s opened only for output",
-                       SvPV_nolen(sv));
+           /* integrate with report_evil_fh()? */
+           char *name = NULL;
+           if (isGV(gv)) {
+               SV* sv = sv_newmortal();
+               gv_efullname4(sv, gv, Nullch, FALSE);
+               name = SvPV_nolen(sv);
+           }
+           if (name && *name)
+               Perl_warner(aTHX_ WARN_IO,
+                           "Filehandle %s opened only for output", name);
+           else
+               Perl_warner(aTHX_ WARN_IO,
+                           "Filehandle opened only for output");
        }
        goto say_undef;
     }
@@ -1630,12 +1681,8 @@ PP(pp_send)
     io = GvIO(gv);
     if (!io || !IoIFP(io)) {
        retval = -1;
-       if (ckWARN(WARN_CLOSED)) {
-           if (PL_op->op_type == OP_SYSWRITE)
-               report_closed_fh(gv, io, "syswrite", "filehandle");
-           else
-               report_closed_fh(gv, io, "send", "socket");
-       }
+       if (ckWARN(WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
     }
     else if (PL_op->op_type == OP_SYSWRITE) {
        if (MARK < SP) {
@@ -1651,7 +1698,7 @@ PP(pp_send)
        if (length > blen - offset)
            length = blen - offset;
 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
-       if (IoTYPE(io) == 's') {
+       if (IoTYPE(io) == IoTYPE_SOCKET) {
            retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
                                   buffer+offset, length, 0);
        }
@@ -1745,7 +1792,7 @@ PP(pp_eof)
 PP(pp_tell)
 {
     djSP; dTARGET;
-    GV *gv;     
+    GV *gv;
     MAGIC *mg;
 
     if (MAXARG == 0)
@@ -1847,7 +1894,7 @@ PP(pp_truncate)
     len = (Off_t)POPi;
 #endif
     /* Checking for length < 0 is problematic as the type might or
-     * might not be signed: if it is not, clever compilers will moan. */ 
+     * might not be signed: if it is not, clever compilers will moan. */
     /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
     SETERRNO(0,0);
 #if defined(HAS_TRUNCATE) || defined(HAS_CHSIZE) || defined(F_FREESP)
@@ -1861,7 +1908,7 @@ PP(pp_truncate)
            PerlIO_flush(IoIFP(GvIOp(tmpgv)));
 #ifdef HAS_TRUNCATE
            if (ftruncate(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
-#else 
+#else
            if (my_chsize(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0)
 #endif
                result = 0;
@@ -1962,7 +2009,7 @@ PP(pp_ioctl)
        retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
 #else
        retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
-#endif 
+#endif
 #else
        DIE(aTHX_ "fcntl is not implemented");
 #endif
@@ -1992,6 +2039,7 @@ PP(pp_flock)
     I32 value;
     int argtype;
     GV *gv;
+    IO *io = NULL;
     PerlIO *fp;
 
 #ifdef FLOCK
@@ -2000,19 +2048,21 @@ PP(pp_flock)
        gv = PL_last_in_gv;
     else
        gv = (GV*)POPs;
-    if (gv && GvIO(gv))
-       fp = IoIFP(GvIOp(gv));
-    else
+    if (gv && (io = GvIO(gv)))
+       fp = IoIFP(io);
+    else {
        fp = Nullfp;
+       io = NULL;
+    }
     if (fp) {
        (void)PerlIO_flush(fp);
        value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
     }
     else {
+       if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+           report_evil_fh(gv, io, PL_op->op_type);
        value = 0;
        SETERRNO(EBADF,RMS$_IFI);
-       if (ckWARN(WARN_CLOSED))
-           report_closed_fh(gv, GvIO(gv), "flock", "filehandle");
     }
     PUSHi(value);
     RETURN;
@@ -2051,7 +2101,7 @@ PP(pp_socket)
        RETPUSHUNDEF;
     IoIFP(io) = PerlIO_fdopen(fd, "r");        /* stdio gets confused about sockets */
     IoOFP(io) = PerlIO_fdopen(fd, "w");
-    IoTYPE(io) = 's';
+    IoTYPE(io) = IoTYPE_SOCKET;
     if (!IoIFP(io) || !IoOFP(io)) {
        if (IoIFP(io)) PerlIO_close(IoIFP(io));
        if (IoOFP(io)) PerlIO_close(IoOFP(io));
@@ -2098,10 +2148,10 @@ PP(pp_sockpair)
        RETPUSHUNDEF;
     IoIFP(io1) = PerlIO_fdopen(fd[0], "r");
     IoOFP(io1) = PerlIO_fdopen(fd[0], "w");
-    IoTYPE(io1) = 's';
+    IoTYPE(io1) = IoTYPE_SOCKET;
     IoIFP(io2) = PerlIO_fdopen(fd[1], "r");
     IoOFP(io2) = PerlIO_fdopen(fd[1], "w");
-    IoTYPE(io2) = 's';
+    IoTYPE(io2) = IoTYPE_SOCKET;
     if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
        if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
        if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
@@ -2173,7 +2223,7 @@ PP(pp_bind)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io, "bind", "socket");
+       report_evil_fh(gv, io, PL_op->op_type);
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2203,7 +2253,7 @@ PP(pp_connect)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io, "connect", "socket");
+       report_evil_fh(gv, io, PL_op->op_type);
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2229,7 +2279,7 @@ PP(pp_listen)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io, "listen", "socket");
+       report_evil_fh(gv, io, PL_op->op_type);
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2270,7 +2320,7 @@ PP(pp_accept)
        goto badexit;
     IoIFP(nstio) = PerlIO_fdopen(fd, "r");
     IoOFP(nstio) = PerlIO_fdopen(fd, "w");
-    IoTYPE(nstio) = 's';
+    IoTYPE(nstio) = IoTYPE_SOCKET;
     if (!IoIFP(nstio) || !IoOFP(nstio)) {
        if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
        if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
@@ -2281,12 +2331,16 @@ PP(pp_accept)
     fcntl(fd, F_SETFD, fd > PL_maxsysfd);      /* ensure close-on-exec */
 #endif
 
+#ifdef EPOC
+    len = sizeof saddr;  /* EPOC somehow truncates info */
+#endif
+
     PUSHp((char *)&saddr, len);
     RETURN;
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(ggv, ggv ? GvIO(ggv) : 0, "accept", "socket");
+       report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
     SETERRNO(EBADF,SS$_IVCHAN);
 
 badexit:
@@ -2313,7 +2367,7 @@ PP(pp_shutdown)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io, "shutdown", "socket");
+       report_evil_fh(gv, io, PL_op->op_type);
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2392,9 +2446,7 @@ PP(pp_ssockopt)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io,
-                        optype == OP_GSOCKOPT ? "getsockopt" : "setsockopt",
-                        "socket");
+       report_evil_fh(gv, io, optype);
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
     RETPUSHUNDEF;
@@ -2448,7 +2500,7 @@ PP(pp_getpeername)
            if (((struct sockaddr *)SvPVX(sv))->sa_family == AF_INET &&
                !memcmp((char *)SvPVX(sv) + sizeof(u_short), nowhere,
                        sizeof(u_short) + sizeof(struct in_addr))) {
-               goto nuts2;         
+               goto nuts2;     
            }
        }
 #endif
@@ -2467,10 +2519,7 @@ PP(pp_getpeername)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       report_closed_fh(gv, io,
-                        optype == OP_GETSOCKNAME ? "getsockname"
-                                                 : "getpeername",
-                        "socket");
+       report_evil_fh(gv, io, optype);
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
     RETPUSHUNDEF;
@@ -2490,32 +2539,39 @@ PP(pp_lstat)
 PP(pp_stat)
 {
     djSP;
-    GV *tmpgv;
+    GV *gv;
     I32 gimme;
     I32 max = 13;
     STRLEN n_a;
 
     if (PL_op->op_flags & OPf_REF) {
-       tmpgv = cGVOP_gv;
+       gv = cGVOP_gv;
+       if (PL_op->op_type == OP_LSTAT && ckWARN(WARN_IO))
+           Perl_warner(aTHX_ WARN_IO,
+                       "lstat() on filehandle %s", GvENAME(gv));
       do_fstat:
-       if (tmpgv != PL_defgv) {
+       if (gv != PL_defgv) {
            PL_laststype = OP_STAT;
-           PL_statgv = tmpgv;
+           PL_statgv = gv;
            sv_setpv(PL_statname, "");
-           PL_laststatval = (GvIO(tmpgv) && IoIFP(GvIOp(tmpgv))
-               ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), &PL_statcache) : -1);
+           PL_laststatval = (GvIO(gv) && IoIFP(GvIOp(gv))
+               ? PerlLIO_fstat(PerlIO_fileno(IoIFP(GvIOn(gv))), &PL_statcache) : -1);
        }
-       if (PL_laststatval < 0)
+       if (PL_laststatval < 0) {
+           dTHR;
+           if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
+               report_evil_fh(gv, GvIO(gv), PL_op->op_type);
            max = 0;
+       }
     }
     else {
        SV* sv = POPs;
        if (SvTYPE(sv) == SVt_PVGV) {
-           tmpgv = (GV*)sv;
+           gv = (GV*)sv;
            goto do_fstat;
        }
        else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
-           tmpgv = (GV*)SvRV(sv);
+           gv = (GV*)SvRV(sv);
            goto do_fstat;
        }
        sv_setpv(PL_statname, SvPV(sv,n_a));
@@ -2556,7 +2612,7 @@ PP(pp_stat)
        PUSHs(sv_2mortal(newSVuv(PL_statcache.st_uid)));
 #   endif
 #endif
-#if Gid_t_size > IVSIZE 
+#if Gid_t_size > IVSIZE
        PUSHs(sv_2mortal(newSVnv(PL_statcache.st_gid)));
 #else
 #   if Gid_t_sign <= 0
@@ -3057,10 +3113,10 @@ PP(pp_fttext)
                len = 512;
        }
        else {
-           if (ckWARN(WARN_UNOPENED)) {
+           dTHR;
+           if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
                gv = cGVOP_gv;
-               Perl_warner(aTHX_ WARN_UNOPENED, "Test on unopened file %s",
-                           GvENAME(gv));
+               report_evil_fh(gv, GvIO(gv), PL_op->op_type);
            }
            SETERRNO(EBADF,RMS$_IFI);
            RETPUSHUNDEF;
@@ -3108,7 +3164,7 @@ PP(pp_fttext)
            break;
        }
 #ifdef EBCDIC
-        else if (!(isPRINT(*s) || isSPACE(*s))) 
+        else if (!(isPRINT(*s) || isSPACE(*s)))
             odd++;
 #else
        else if (*s & 128) {
@@ -3696,13 +3752,18 @@ PP(pp_fork)
 
 PP(pp_wait)
 {
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) 
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
     djSP; dTARGET;
     Pid_t childpid;
     int argflags;
 
     childpid = wait4pid(-1, &argflags, 0);
+#  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
+    /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
+    STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);
+#  else
     STATUS_NATIVE_SET((childpid > 0) ? argflags : -1);
+#  endif
     XPUSHi(childpid);
     RETURN;
 #else
@@ -3712,7 +3773,7 @@ PP(pp_wait)
 
 PP(pp_waitpid)
 {
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) 
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
     djSP; dTARGET;
     Pid_t childpid;
     int optype;
@@ -3721,7 +3782,12 @@ PP(pp_waitpid)
     optype = POPi;
     childpid = TOPi;
     childpid = wait4pid(childpid, &argflags, optype);
+#  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
+    /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
+    STATUS_NATIVE_SET((childpid && childpid != -1) ? argflags : -1);
+#  else
     STATUS_NATIVE_SET((childpid > 0) ? argflags : -1);
+#  endif
     SETi(childpid);
     RETURN;
 #else
@@ -3822,6 +3888,8 @@ PP(pp_system)
     }
     PerlProc__exit(-1);
 #else /* ! FORK or VMS or OS/2 */
+    PL_statusvalue = 0;
+    result = 0;
     if (PL_op->op_flags & OPf_STACKED) {
        SV *really = *++MARK;
        value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
@@ -3831,10 +3899,12 @@ PP(pp_system)
     else {
        value = (I32)do_spawn(SvPVx(sv_mortalcopy(*SP), n_a));
     }
+    if (PL_statusvalue == -1)  /* hint that value must be returned as is */
+       result = 1;
     STATUS_NATIVE_SET(value);
     do_execfree();
     SP = ORIGMARK;
-    PUSHi(STATUS_CURRENT);
+    PUSHi(result ? value : STATUS_CURRENT);
 #endif /* !FORK or VMS */
     RETURN;
 }
@@ -4497,7 +4567,7 @@ PP(pp_gprotoent)
 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
     I32 which = PL_op->op_type;
     register char **elem;
-    register SV *sv;  
+    register SV *sv;
 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
     struct protoent *PerlSock_getprotobyname(Netdb_name_t);
     struct protoent *PerlSock_getprotobynumber(int);
@@ -4782,7 +4852,7 @@ PP(pp_gpwent)
     register SV *sv;
     STRLEN n_a;
     struct passwd *pwent  = NULL;
-    /* 
+    /*
      * We currently support only the SysV getsp* shadow password interface.
      * The interface is declared in <shadow.h> and often one needs to link
      * with -lsecurity or some such.
@@ -4823,7 +4893,7 @@ PP(pp_gpwent)
      *
      * Note that <sys/security.h> is already probed for, but currently
      * it is only included in special cases.
-     * 
+     *
      * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
      * be preferred interface, even though also the getprpw*() interface
      * is available) one needs to link with -lsecurity -ldb -laud -lm.
@@ -4905,8 +4975,10 @@ PP(pp_gpwent)
                sv_setpv(sv, spwent->sp_pwdp);
        }
 #   endif
+#   ifdef PWPASSWD
        if (!SvPOK(sv)) /* Use the standard password, then. */
            sv_setpv(sv, pwent->pw_passwd);
+#   endif
 
 #   ifndef INCOMPLETE_TAINTS
        /* passwd is tainted because user himself can diddle with it.
@@ -5154,7 +5226,7 @@ PP(pp_syscall)
            a[i++] = SvIV(*MARK);
        else if (*MARK == &PL_sv_undef)
            a[i++] = 0;
-       else 
+       else
            a[i++] = (unsigned long)SvPV_force(*MARK, n_a);
        if (i > 15)
            break;
@@ -5222,7 +5294,7 @@ PP(pp_syscall)
 }
 
 #ifdef FCNTL_EMULATE_FLOCK
+
 /*  XXX Emulate flock() with fcntl().
     What's really needed is a good file locking module.
 */
@@ -5231,7 +5303,7 @@ static int
 fcntl_emulate_flock(int fd, int operation)
 {
     struct flock flock;
+
     switch (operation & ~LOCK_NB) {
     case LOCK_SH:
        flock.l_type = F_RDLCK;
@@ -5248,7 +5320,7 @@ fcntl_emulate_flock(int fd, int operation)
     }
     flock.l_whence = SEEK_SET;
     flock.l_start = flock.l_len = (Off_t)0;
+
     return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
 }
 
diff --git a/proto.h b/proto.h
index 28597ea..1b3c280 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -130,11 +130,7 @@ PERL_CALLCONV char*        Perl_form_nocontext(const char* pat, ...)
  __attribute__((format(printf,1,2)))
 #endif
 ;
-PERL_CALLCONV void     Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...)
-#ifdef CHECK_FORMAT
- __attribute__((format(printf,3,4)))
-#endif
-;
+PERL_CALLCONV void     Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...);
 PERL_CALLCONV SV*      Perl_mess_nocontext(const char* pat, ...)
 #ifdef CHECK_FORMAT
  __attribute__((format(printf,1,2)))
@@ -394,11 +390,7 @@ PERL_CALLCONV void Perl_lex_start(pTHX_ SV* line);
 PERL_CALLCONV OP*      Perl_linklist(pTHX_ OP* o);
 PERL_CALLCONV OP*      Perl_list(pTHX_ OP* o);
 PERL_CALLCONV OP*      Perl_listkids(pTHX_ OP* o);
-PERL_CALLCONV void     Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...)
-#ifdef CHECK_FORMAT
- __attribute__((format(printf,pTHX_3,pTHX_4)))
-#endif
-;
+PERL_CALLCONV void     Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...);
 PERL_CALLCONV void     Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args);
 PERL_CALLCONV OP*      Perl_localize(pTHX_ OP* arg, I32 lexical);
 PERL_CALLCONV I32      Perl_looks_like_number(pTHX_ SV* sv);
@@ -427,6 +419,7 @@ PERL_CALLCONV int   Perl_magic_mutexfree(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV int      Perl_magic_nextpack(pTHX_ SV* sv, MAGIC* mg, SV* key);
 PERL_CALLCONV U32      Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV int      Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg);
+PERL_CALLCONV int      Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV int      Perl_magic_set(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV int      Perl_magic_setamagic(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV int      Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg);
@@ -550,6 +543,7 @@ PERL_CALLCONV SV*   Perl_newSVuv(pTHX_ UV u);
 PERL_CALLCONV SV*      Perl_newSVnv(pTHX_ NV n);
 PERL_CALLCONV SV*      Perl_newSVpv(pTHX_ const char* s, STRLEN len);
 PERL_CALLCONV SV*      Perl_newSVpvn(pTHX_ const char* s, STRLEN len);
+PERL_CALLCONV SV*      Perl_newSVpvn_share(pTHX_ const char* s, STRLEN len, U32 hash);
 PERL_CALLCONV SV*      Perl_newSVpvf(pTHX_ const char* pat, ...)
 #ifdef CHECK_FORMAT
  __attribute__((format(printf,pTHX_1,pTHX_2)))
@@ -813,14 +807,15 @@ PERL_CALLCONV U8* Perl_utf16_to_utf8(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newle
 PERL_CALLCONV U8*      Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newlen);
 PERL_CALLCONV I32      Perl_utf8_distance(pTHX_ U8 *a, U8 *b);
 PERL_CALLCONV U8*      Perl_utf8_hop(pTHX_ U8 *s, I32 off);
-PERL_CALLCONV U8*      Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN len);
+PERL_CALLCONV U8*      Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *len);
 PERL_CALLCONV U8*      Perl_bytes_to_utf8(pTHX_ U8 *s, STRLEN *len);
 PERL_CALLCONV UV       Perl_utf8_to_uv(pTHX_ U8 *s, I32* retlen);
+PERL_CALLCONV UV       Perl_utf8_to_uv_chk(pTHX_ U8 *s, I32* retlen, bool checking);
 PERL_CALLCONV U8*      Perl_uv_to_utf8(pTHX_ U8 *d, UV uv);
 PERL_CALLCONV void     Perl_vivify_defelem(pTHX_ SV* sv);
 PERL_CALLCONV void     Perl_vivify_ref(pTHX_ SV* sv, U32 to_what);
 PERL_CALLCONV I32      Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags);
-PERL_CALLCONV void     Perl_report_closed_fh(pTHX_ GV *gv, IO *io, const char *func, const char *obj);
+PERL_CALLCONV void     Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op);
 PERL_CALLCONV void     Perl_report_uninit(pTHX);
 PERL_CALLCONV void     Perl_warn(pTHX_ const char* pat, ...)
 #ifdef CHECK_FORMAT
index f092e7e..e7042ea 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -201,6 +201,185 @@ static scan_data_t zero_scan_data = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 #define CHR_SVLEN(sv) (UTF ? sv_len_utf8(sv) : SvCUR(sv))
 #define CHR_DIST(a,b) (UTF ? utf8_distance(a,b) : a - b)
 
+
+/* length of regex to show in messages that don't mark a position within */
+#define RegexLengthToShowInErrorMessages 127
+
+/*
+ * If MARKER[12] are adjusted, be sure to adjust the constants at the top
+ * of t/op/regmesg.t, the tests in t/op/re_tests, and those in
+ * op/pragma/warn/regcomp.
+ */
+#define MARKER1 "HERE"      /* marker as it appears in the description */
+#define MARKER2 " << HERE "  /* marker as it appears within the regex */
+   
+#define REPORT_LOCATION " before " MARKER1 " mark in regex m/%.*s" MARKER2 "%s/"
+
+/*
+ * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
+ * arg. Show regex, up to a maximum length. If it's too long, chop and add
+ * "...".
+ */
+#define        FAIL(msg)                                                             \
+    STMT_START {                                                             \
+        char *ellipses = "";                                                 \
+        unsigned len = strlen(PL_regprecomp);                                \
+                                                                             \
+       if (!SIZE_ONLY)                                                      \
+           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
+                                                                             \
+       if (len > RegexLengthToShowInErrorMessages) {                        \
+            /* chop 10 shorter than the max, to ensure meaning of "..." */   \
+           len = RegexLengthToShowInErrorMessages - 10;                     \
+           ellipses = "...";                                                \
+       }                                                                    \
+       Perl_croak(aTHX_ "%s in regex m/%.*s%s/",                            \
+                  msg, (int)len, PL_regprecomp, ellipses);                  \
+    } STMT_END
+
+/*
+ * Calls SAVEDESTRUCTOR_X if needed, then calls Perl_croak with the given
+ * args. Show regex, up to a maximum length. If it's too long, chop and add
+ * "...".
+ */
+#define        FAIL2(pat,msg)                                                        \
+    STMT_START {                                                             \
+        char *ellipses = "";                                                 \
+        unsigned len = strlen(PL_regprecomp);                                \
+                                                                             \
+       if (!SIZE_ONLY)                                                      \
+           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
+                                                                             \
+       if (len > RegexLengthToShowInErrorMessages) {                        \
+            /* chop 10 shorter than the max, to ensure meaning of "..." */   \
+           len = RegexLengthToShowInErrorMessages - 10;                     \
+           ellipses = "...";                                                \
+       }                                                                    \
+       S_re_croak2(aTHX_ pat, " in regex m/%.*s%s/",                        \
+                   msg, (int)len, PL_regprecomp, ellipses);                \
+    } STMT_END
+
+
+/*
+ * Simple_vFAIL -- like FAIL, but marks the current location in the scan
+ */
+#define        Simple_vFAIL(m)                                                      \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
+                                                                             \
+      Perl_croak(aTHX_ "%s" REPORT_LOCATION,               \
+                m, (int)offset, PL_regprecomp, PL_regprecomp + offset);     \
+    } STMT_END
+
+/*
+ * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL()
+ */
+#define        vFAIL(m)                                                             \
+    STMT_START {                                                             \
+      if (!SIZE_ONLY)                                                        \
+           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
+      Simple_vFAIL(m);                                                       \
+    } STMT_END
+
+/*
+ * Like Simple_vFAIL(), but accepts two arguments.
+ */
+#define        Simple_vFAIL2(m,a1)                                                  \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
+                                                                             \
+      S_re_croak2(aTHX_ m, REPORT_LOCATION, a1,       \
+                 (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
+    } STMT_END
+
+/*
+ * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL2().
+ */
+#define        vFAIL2(m,a1)                                                         \
+    STMT_START {                                                             \
+      if (!SIZE_ONLY)                                                        \
+           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
+      Simple_vFAIL2(m, a1);                                                  \
+    } STMT_END
+
+
+/*
+ * Like Simple_vFAIL(), but accepts three arguments.
+ */
+#define        Simple_vFAIL3(m, a1, a2)                                             \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
+                                                                             \
+      S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2,   \
+                 (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
+    } STMT_END
+
+/*
+ * Calls SAVEDESTRUCTOR_X if needed, then Simple_vFAIL3().
+ */
+#define        vFAIL3(m,a1,a2)                                                      \
+    STMT_START {                                                             \
+      if (!SIZE_ONLY)                                                        \
+           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);                 \
+      Simple_vFAIL3(m, a1, a2);                                              \
+    } STMT_END
+
+/*
+ * Like Simple_vFAIL(), but accepts four arguments.
+ */
+#define        Simple_vFAIL4(m, a1, a2, a3)                                         \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
+                                                                             \
+      S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3,\
+                 (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
+    } STMT_END
+
+/*
+ * Like Simple_vFAIL(), but accepts five arguments.
+ */
+#define        Simple_vFAIL5(m, a1, a2, a3, a4)                                     \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-PL_regcomp_parse); \
+      S_re_croak2(aTHX_ m, REPORT_LOCATION, a1, a2, a3, a4,\
+                 (int)offset, PL_regprecomp, PL_regprecomp + offset);       \
+    } STMT_END
+
+
+#define        vWARN(loc,m)                                                         \
+    STMT_START {                                                             \
+        unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));          \
+       Perl_warner(aTHX_ WARN_REGEXP, "%s" REPORT_LOCATION,\
+                m, (int)offset, PL_regprecomp, PL_regprecomp + offset);          \
+    } STMT_END                                                               \
+
+
+#define        vWARN2(loc, m, a1)                                                   \
+    STMT_START {                                                             \
+        unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));          \
+       Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,\
+                 a1,                                                         \
+                (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
+    } STMT_END
+
+#define        vWARN3(loc, m, a1, a2)                                               \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp) - (PL_regxend - (loc));        \
+       Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,                    \
+                 a1, a2,                                                     \
+                (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
+    } STMT_END
+
+#define        vWARN4(loc, m, a1, a2, a3)                                           \
+    STMT_START {                                                             \
+      unsigned offset = strlen(PL_regprecomp)-(PL_regxend-(loc));            \
+       Perl_warner(aTHX_ WARN_REGEXP, m REPORT_LOCATION,\
+                 a1, a2, a3,                                                 \
+                (int)offset, PL_regprecomp, PL_regprecomp + offset);        \
+    } STMT_END
+
+
+
 /* Allow for side effects in s */
 #define REGC(c,s) STMT_START { if (!SIZE_ONLY) *(s) = (c); else (s);} STMT_END
 
@@ -264,7 +443,7 @@ S_cl_is_anything(pTHX_ struct regnode_charclass_class *cl)
 {
     int value;
 
-    for (value = 0; value < ANYOF_MAX; value += 2)
+    for (value = 0; value <= ANYOF_MAX; value += 2)
        if (ANYOF_CLASS_TEST(cl, value) && ANYOF_CLASS_TEST(cl, value + 1))
            return 1;
     for (value = 0; value < 256; ++value)
@@ -764,8 +943,11 @@ S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *da
                if (ckWARN(WARN_REGEXP) && (minnext + deltanext == 0) 
                    && !(data->flags & (SF_HAS_PAR|SF_IN_PAR))
                    && maxcount <= REG_INFTY/3) /* Complement check for big count */
-                   Perl_warner(aTHX_ WARN_REGEXP,
-                               "Strange *+?{} on zero-length expression");
+               {
+                   vWARN(PL_regcomp_parse,
+                         "Quantifier unexpected on zero-length expression");
+               }
+
                min += minnext * mincount;
                is_inf_internal |= ((maxcount == REG_INFTY 
                                     && (minnext + deltanext) > 0)
@@ -828,7 +1010,7 @@ S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *da
                        regnode *nxt1 = NEXTOPER(oscan) + EXTRA_STEP_2ARGS; /* OPEN*/
 
                        if (OP(nxt) != CLOSE) 
-                           FAIL("panic opt close");
+                           FAIL("Panic opt close");
                        oscan->flags = ARG(nxt);
                        OP(nxt1) = OPTIMIZED;   /* was OPEN. */
                        OP(nxt) = OPTIMIZED;    /* was CLOSE. */
@@ -1193,10 +1375,10 @@ S_study_chunk(pTHX_ regnode **scanp, I32 *deltap, regnode *last, scan_data_t *da
            minnext = study_chunk(&nscan, &deltanext, last, &data_fake, f);
            if (scan->flags) {
                if (deltanext) {
-                   FAIL("variable length lookbehind not implemented");
+                   vFAIL("Variable length lookbehind not implemented");
                }
                else if (minnext > U8_MAX) {
-                   FAIL2("lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
+                   vFAIL2("Lookbehind longer than %"UVuf" not implemented", (UV)U8_MAX);
                }
                scan->flags = minnext;
            }
@@ -1307,6 +1489,7 @@ Perl_reginitcolors(pTHX)
     PL_colorset = 1;
 }
 
+
 /*
  - pregcomp - compile a regular expression into internal code
  *
@@ -1389,7 +1572,8 @@ Perl_pregcomp(pTHX_ char *exp, char *xend, PMOP *pm)
     Newc(1001, r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode),
         char, regexp);
     if (r == NULL)
-       FAIL("regexp out of space");
+       FAIL("Regexp out of space");
+
 #ifdef DEBUGGING
     /* avoid reading uninitialized memory in DEBUGGING code in study_chunk() */
     Zero(r, sizeof(regexp) + (unsigned)PL_regsize * sizeof(regnode), char);
@@ -1696,6 +1880,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
     register regnode *ender = 0;
     register I32 parno = 0;
     I32 flags, oregflags = PL_regflags, have_branch = 0, open = 0;
+    char *oregcomp_parse = PL_regcomp_parse;
     char c;
 
     *flagp = 0;                                /* Tentatively. */
@@ -1706,6 +1891,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
            U16 posflags = 0, negflags = 0;
            U16 *flagsp = &posflags;
            int logical = 0;
+           char *seqstart = PL_regcomp_parse;
 
            PL_regcomp_parse++;
            paren = *PL_regcomp_parse++;
@@ -1726,7 +1912,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                break;
            case '$':
            case '@':
-               FAIL2("Sequence (?%c...) not implemented", (int)paren);
+               vFAIL2("Sequence (?%c...) not implemented", (int)paren);
                break;
            case '#':
                while (*PL_regcomp_parse && *PL_regcomp_parse != ')')
@@ -1738,8 +1924,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                return NULL;
            case 'p':
                if (SIZE_ONLY)
-                   Perl_warner(aTHX_ WARN_REGEXP,
-                               "(?p{}) is deprecated - use (??{})");
+                   vWARN(PL_regcomp_parse, "(?p{}) is deprecated - use (??{})");
                /* FALL THROUGH*/
            case '?':
                logical = 1;
@@ -1766,7 +1951,10 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                    PL_regcomp_parse++;
                }
                if (*PL_regcomp_parse != ')')
-                   FAIL("Sequence (?{...}) not terminated or not {}-balanced");
+               {
+                   PL_regcomp_parse = s;                   
+                   vFAIL("Sequence (?{...}) not terminated or not {}-balanced");
+               }
                if (!SIZE_ONLY) {
                    AV *av;
                    
@@ -1775,7 +1963,10 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                    else
                        sv = newSVpvn("", 0);
 
+                   ENTER;
+                   Perl_save_re_context(aTHX);
                    rop = sv_compile_2op(sv, &sop, "re", &av);
+                   LEAVE;
 
                    n = add_data(3, "nop");
                    PL_regcomp_rx->data->data[n] = (void*)rop;
@@ -1825,7 +2016,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                        PL_regcomp_parse++;
                    ret = reganode(GROUPP, parno);
                    if ((c = *nextchar()) != ')')
-                       FAIL2("Switch (?(number%c not recognized", c);
+                       vFAIL("Switch condition not recognized");
                  insert_if:
                    regtail(ret, reganode(IFTHEN, 0));
                    br = regbranch(&flags, 1);
@@ -1847,7 +2038,7 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                    else
                        lastbr = NULL;
                    if (c != ')')
-                       FAIL("Switch (?(condition)... contains too many branches");
+                       vFAIL("Switch (?(condition)... contains too many branches");
                    ender = reg_node(TAIL);
                    regtail(br, ender);
                    if (lastbr) {
@@ -1859,11 +2050,12 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                    return ret;
                }
                else {
-                   FAIL2("Unknown condition for (?(%.2s", PL_regcomp_parse);
+                   vFAIL2("Unknown switch condition (?(%.2s", PL_regcomp_parse);
                }
            }
             case 0:
-                FAIL("Sequence (? incomplete");
+               PL_regcomp_parse--; /* for vFAIL to print correctly */
+                vFAIL("Sequence (? incomplete");
                 break;
            default:
                --PL_regcomp_parse;
@@ -1886,8 +2078,10 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
                    break;
                }               
              unknown:
-               if (*PL_regcomp_parse != ')')
-                   FAIL2("Sequence (?%c...) not recognized", *PL_regcomp_parse);
+               if (*PL_regcomp_parse != ')') {
+                   PL_regcomp_parse++;
+                   vFAIL3("Sequence (%.*s...) not recognized", PL_regcomp_parse-seqstart, seqstart);
+               }
                nextchar();
                *flagp = TRYAGAIN;
                return NULL;
@@ -1999,15 +2193,17 @@ S_reg(pTHX_ I32 paren, I32 *flagp)
     if (paren) {
        PL_regflags = oregflags;
        if (PL_regcomp_parse >= PL_regxend || *nextchar() != ')') {
-           FAIL("unmatched () in regexp");
+           PL_regcomp_parse = oregcomp_parse;
+           vFAIL("Unmatched (");
        }
     }
     else if (!paren && PL_regcomp_parse < PL_regxend) {
        if (*PL_regcomp_parse == ')') {
-           FAIL("unmatched () in regexp");
+           PL_regcomp_parse++;
+           vFAIL("Unmatched )");
        }
        else
-           FAIL("junk on end of regexp");      /* "Can't happen". */
+           FAIL("Junk on end of regexp");      /* "Can't happen". */
        /* NOTREACHED */
     }
 
@@ -2132,7 +2328,7 @@ S_regpiece(pTHX_ I32 *flagp)
            if (!max && *maxpos != '0')
                max = REG_INFTY;                /* meaning "infinity" */
            else if (max >= REG_INFTY)
-               FAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
+               vFAIL2("Quantifier in {,} bigger than %d", REG_INFTY - 1);
            PL_regcomp_parse = next;
            nextchar();
 
@@ -2166,7 +2362,7 @@ S_regpiece(pTHX_ I32 *flagp)
            if (max > 0)
                *flagp |= HASWIDTH;
            if (max && max < min)
-               FAIL("Can't do {n,m} with n > m");
+               vFAIL("Can't do {n,m} with n > m");
            if (!SIZE_ONLY) {
                ARG1_SET(ret, min);
                ARG2_SET(ret, max);
@@ -2182,8 +2378,19 @@ S_regpiece(pTHX_ I32 *flagp)
     }
 
 #if 0                          /* Now runtime fix should be reliable. */
+
+    /* if this is reinstated, don't forget to put this back into perldiag:
+
+           =item Regexp *+ operand could be empty at {#} in regex m/%s/
+
+          (F) The part of the regexp subject to either the * or + quantifier
+           could match an empty string. The {#} shows in the regular
+           expression about where the problem was discovered.
+
+    */
+
     if (!(flags&HASWIDTH) && op != '?')
-      FAIL("regexp *+ operand could be empty");
+      vFAIL("Regexp *+ operand could be empty");
 #endif 
 
     nextchar();
@@ -2214,8 +2421,10 @@ S_regpiece(pTHX_ I32 *flagp)
     }
   nest_check:
     if (ckWARN(WARN_REGEXP) && !SIZE_ONLY && !(flags&HASWIDTH) && max > REG_INFTY/3) {
-       Perl_warner(aTHX_ WARN_REGEXP, "%.*s matches null string many times",
-           PL_regcomp_parse - origparse, origparse);
+       vWARN3(PL_regcomp_parse,
+              "%.*s matches null string many times",
+              PL_regcomp_parse - origparse,
+              origparse);
     }
 
     if (*PL_regcomp_parse == '?') {
@@ -2223,8 +2432,10 @@ S_regpiece(pTHX_ I32 *flagp)
        reginsert(MINMOD, ret);
        regtail(ret, ret + NODE_STEP_REGNODE);
     }
-    if (ISMULT2(PL_regcomp_parse))
-       FAIL("nested *?+ in regexp");
+    if (ISMULT2(PL_regcomp_parse)) {
+       PL_regcomp_parse++;
+       vFAIL("Nested quantifiers");
+    }
 
     return(ret);
 }
@@ -2237,8 +2448,7 @@ S_regpiece(pTHX_ I32 *flagp)
  * faster to run.  Backslashed characters are exceptions, each becoming a
  * separate node; the code is simpler that way and it's not worth fixing.
  *
- * [Yes, it is worth fixing, some scripts can run twice the speed.]
- */
+ * [Yes, it is worth fixing, some scripts can run twice the speed.] */
 STATIC regnode *
 S_regatom(pTHX_ I32 *flagp)
 {
@@ -2261,9 +2471,9 @@ tryagain:
            ret = reg_node(BOL);
        break;
     case '$':
-       if (PL_regcomp_parse[1]) 
-           PL_seen_zerolen++;
        nextchar();
+       if (*PL_regcomp_parse) 
+           PL_seen_zerolen++;
        if (PL_regflags & PMf_MULTILINE)
            ret = reg_node(MEOL);
        else if (PL_regflags & PMf_SINGLELINE)
@@ -2290,13 +2500,17 @@ tryagain:
        PL_regnaughty++;
        break;
     case '[':
-       PL_regcomp_parse++;
+    {
+       char *oregcomp_parse = ++PL_regcomp_parse;
        ret = (UTF ? regclassutf8() : regclass());
-       if (*PL_regcomp_parse != ']')
-           FAIL("unmatched [] in regexp");
+       if (*PL_regcomp_parse != ']') {
+           PL_regcomp_parse = oregcomp_parse;
+           vFAIL("Unmatched [");
+       }
        nextchar();
        *flagp |= HASWIDTH|SIMPLE;
        break;
+    }
     case '(':
        nextchar();
        ret = reg(1, &flags);
@@ -2319,7 +2533,7 @@ tryagain:
            *flagp |= TRYAGAIN;
            return NULL;
        }
-       FAIL2("internal urp in regexp at /%s/", PL_regcomp_parse);
+       vFAIL("Internal urp");
                                /* Supposed to be caught earlier. */
        break;
     case '{':
@@ -2331,7 +2545,8 @@ tryagain:
     case '?':
     case '+':
     case '*':
-       FAIL("?+*{} follows nothing in regexp");
+       PL_regcomp_parse++;
+       vFAIL("Quantifier follows nothing");
        break;
     case '\\':
        switch (*++PL_regcomp_parse) {
@@ -2455,8 +2670,11 @@ tryagain:
 
                if (PL_regcomp_parse[1] == '{') {
                    PL_regxend = strchr(PL_regcomp_parse, '}');
-                   if (!PL_regxend)
-                       FAIL("Missing right brace on \\p{}");
+                   if (!PL_regxend) {
+                       PL_regcomp_parse += 2;
+                       PL_regxend = oldregxend;
+                       vFAIL("Missing right brace on \\p{}");
+                   }
                    PL_regxend++;
                }
                else
@@ -2489,15 +2707,16 @@ tryagain:
                if (num > 9 && num >= PL_regnpar)
                    goto defchar;
                else {
+                   while (isDIGIT(*PL_regcomp_parse))
+                       PL_regcomp_parse++;
+
                    if (!SIZE_ONLY && num > PL_regcomp_rx->nparens)
-                       FAIL("reference to nonexistent group");
+                       vFAIL("Reference to nonexistent group");
                    PL_regsawback = 1;
                    ret = reganode(FOLD
                                   ? (LOC ? REFFL : REFF)
                                   : REF, num);
                    *flagp |= HASWIDTH;
-                   while (isDIGIT(*PL_regcomp_parse))
-                       PL_regcomp_parse++;
                    PL_regcomp_parse--;
                    nextchar();
                }
@@ -2505,7 +2724,7 @@ tryagain:
            break;
        case '\0':
            if (PL_regcomp_parse >= PL_regxend)
-               FAIL("trailing \\ in regexp");
+               FAIL("Trailing \\");
            /* FALL THROUGH */
        default:
            /* Do not generate `unrecognized' warnings here, we fall
@@ -2607,8 +2826,10 @@ tryagain:
                        if (*++p == '{') {
                            char* e = strchr(p, '}');
         
-                           if (!e)
-                               FAIL("Missing right brace on \\x{}");
+                           if (!e) {
+                               PL_regcomp_parse = p + 1;
+                               vFAIL("Missing right brace on \\x{}");
+                           }
                            else if (UTF) {
                                numlen = 1;     /* allow underscores */
                                ender = (UV)scan_hex(p + 1, e - p - 1, &numlen);
@@ -2620,7 +2841,11 @@ tryagain:
                                p = e + 1;
                            }
                            else
-                               FAIL("Can't use \\x{} without 'use utf8' declaration");
+                           {
+                               PL_regcomp_parse = e + 1;
+                               vFAIL("Can't use \\x{} without 'use utf8' declaration");
+                           }
+
                        }
                        else {
                            numlen = 0;         /* disallow underscores */
@@ -2648,21 +2873,18 @@ tryagain:
                        break;
                    case '\0':
                        if (p >= PL_regxend)
-                           FAIL("trailing \\ in regexp");
+                           FAIL("Trailing \\");
                        /* FALL THROUGH */
                    default:
                        if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(*p))
-                           Perl_warner(aTHX_ WARN_REGEXP, 
-                                       "/%.127s/: Unrecognized escape \\%c passed through",
-                                       PL_regprecomp,
-                                       *p);
+                           vWARN2(p +1, "Unrecognized escape \\%c passed through", *p);
                        goto normal_default;
                    }
                    break;
                default:
                  normal_default:
                    if ((*p & 0xc0) == 0xc0 && UTF) {
-                       ender = utf8_to_uv((U8*)p, &numlen);
+                       ender = utf8_to_uv_chk((U8*)p, &numlen, 0);
                        p += numlen;
                    }
                    else
@@ -2703,7 +2925,7 @@ tryagain:
            PL_regcomp_parse = p - 1;
            nextchar();
            if (len < 0)
-               FAIL("internal disaster in regexp");
+               vFAIL("Internal disaster");
            if (len > 0)
                *flagp |= HASWIDTH;
            if (len == 1)
@@ -2785,6 +3007,11 @@ S_regpposixcc(pTHX_ I32 value)
                            namedclass =
                                complement ? ANYOF_NASCII : ANYOF_ASCII;
                        break;
+                   case 'b':
+                       if (strnEQ(posixcc, "blank", 5))
+                           namedclass =
+                               complement ? ANYOF_NBLANK : ANYOF_BLANK;
+                       break;
                    case 'c':
                        if (strnEQ(posixcc, "cntrl", 5))
                            namedclass =
@@ -2816,7 +3043,7 @@ S_regpposixcc(pTHX_ I32 value)
                    case 's':
                        if (strnEQ(posixcc, "space", 5))
                            namedclass =
-                               complement ? ANYOF_NSPACE : ANYOF_SPACE;
+                               complement ? ANYOF_NPSXSPC : ANYOF_PSXSPC;
                        break;
                    case 'u':
                        if (strnEQ(posixcc, "upper", 5))
@@ -2841,13 +3068,19 @@ S_regpposixcc(pTHX_ I32 value)
                    if (namedclass == OOB_NAMEDCLASS ||
                        posixcc[skip] != ':' ||
                        posixcc[skip+1] != ']')
-                       Perl_croak(aTHX_
-                                  "Character class [:%.*s:] unknown",
-                                  t - s - 1, s + 1);
-               } else if (!SIZE_ONLY)
+                   {
+                       Simple_vFAIL3("POSIX class [:%.*s:] unknown",
+                                     t - s - 1, s + 1);
+                   }
+               } else if (!SIZE_ONLY) {
                    /* [[=foo=]] and [[.foo.]] are still future. */
-                   Perl_croak(aTHX_
-                              "Character class syntax [%c %c] is reserved for future extensions", c, c);
+
+                   /* adjust PL_regcomp_parse so the warning shows after
+                      the class closes */
+                   while (*PL_regcomp_parse && *PL_regcomp_parse != ']')
+                       PL_regcomp_parse++;
+                   Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
+               }
            } else {
                /* Maternal grandfather:
                 * "[:" ending in ":" but not in ":]" */
@@ -2872,11 +3105,17 @@ S_checkposixcc(pTHX)
        while(*s && isALNUM(*s))
            s++;
        if (*s && c == *s && s[1] == ']') {
-           Perl_warner(aTHX_ WARN_REGEXP,
-                       "Character class syntax [%c %c] belongs inside character classes", c, c);
+           vWARN3(s+2, "POSIX syntax [%c %c] belongs inside character classes", c, c);
+
+           /* [[=foo=]] and [[.foo.]] are still future. */
            if (c == '=' || c == '.')
-               Perl_croak(aTHX_
-                          "Character class syntax [%c %c] is reserved for future extensions", c, c);
+           {
+               /* adjust PL_regcomp_parse so the error shows after
+                  the class closes */
+               while (*PL_regcomp_parse && *PL_regcomp_parse++ != ']')
+                   ;
+               Simple_vFAIL3("POSIX syntax [%c %c] is reserved for future extensions", c, c);
+           }
        }
     }
 }
@@ -2929,7 +3168,7 @@ S_regclass(pTHX)
        else if (value == '\\') {
            value = UCHARAT(PL_regcomp_parse++);
            /* Some compilers cannot handle switching on 64-bit integer
-            * values, therefore value cannot be an UV. --jhi */
+            * values, therefore the 'value' cannot be an UV. --jhi */
            switch (value) {
            case 'w':   namedclass = ANYOF_ALNUM;       break;
            case 'W':   namedclass = ANYOF_NALNUM;      break;
@@ -2966,10 +3205,8 @@ S_regclass(pTHX)
                break;
            default:
                if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
-                   Perl_warner(aTHX_ WARN_REGEXP, 
-                               "/%.127s/: Unrecognized escape \\%c in character class passed through",
-                               PL_regprecomp,
-                               (int)value);
+
+                   vWARN2(PL_regcomp_parse, "Unrecognized escape \\%c in character class passed through", (int)value);
                break;
            }
        }
@@ -2980,12 +3217,11 @@ S_regclass(pTHX)
            if (range) { /* a-\d, a-[:digit:] */
                if (!SIZE_ONLY) {
                    if (ckWARN(WARN_REGEXP))
-                       Perl_warner(aTHX_ WARN_REGEXP,
-                                   "/%.127s/: false [] range \"%*.*s\" in regexp",
-                                   PL_regprecomp,
-                                   PL_regcomp_parse - rangebegin,
-                                   PL_regcomp_parse - rangebegin,
-                                   rangebegin);
+                       vWARN4(PL_regcomp_parse,
+                              "False [] range \"%*.*s\"",
+                              PL_regcomp_parse - rangebegin,
+                              PL_regcomp_parse - rangebegin,
+                              rangebegin);
                    ANYOF_BITMAP_SET(ret, lastvalue);
                    ANYOF_BITMAP_SET(ret, '-');
                }
@@ -3111,6 +3347,24 @@ S_regclass(pTHX)
 #endif /* EBCDIC */
                    }
                    break;
+               case ANYOF_BLANK:
+                   if (LOC)
+                       ANYOF_CLASS_SET(ret, ANYOF_BLANK);
+                   else {
+                       for (value = 0; value < 256; value++)
+                           if (isBLANK(value))
+                               ANYOF_BITMAP_SET(ret, value);
+                   }
+                   break;
+               case ANYOF_NBLANK:
+                   if (LOC)
+                       ANYOF_CLASS_SET(ret, ANYOF_NBLANK);
+                   else {
+                       for (value = 0; value < 256; value++)
+                           if (!isBLANK(value))
+                               ANYOF_BITMAP_SET(ret, value);
+                   }
+                   break;
                case ANYOF_CNTRL:
                    if (LOC)
                        ANYOF_CLASS_SET(ret, ANYOF_CNTRL);
@@ -3184,6 +3438,24 @@ S_regclass(pTHX)
                                ANYOF_BITMAP_SET(ret, value);
                    }
                    break;
+               case ANYOF_PSXSPC:
+                   if (LOC)
+                       ANYOF_CLASS_SET(ret, ANYOF_PSXSPC);
+                   else {
+                       for (value = 0; value < 256; value++)
+                           if (isPSXSPC(value))
+                               ANYOF_BITMAP_SET(ret, value);
+                   }
+                   break;
+               case ANYOF_NPSXSPC:
+                   if (LOC)
+                       ANYOF_CLASS_SET(ret, ANYOF_NPSXSPC);
+                   else {
+                       for (value = 0; value < 256; value++)
+                           if (!isPSXSPC(value))
+                               ANYOF_BITMAP_SET(ret, value);
+                   }
+                   break;
                case ANYOF_PUNCT:
                    if (LOC)
                        ANYOF_CLASS_SET(ret, ANYOF_PUNCT);
@@ -3239,7 +3511,7 @@ S_regclass(pTHX)
                    }
                    break;
                default:
-                   FAIL("invalid [::] class in regexp");
+                   vFAIL("Invalid [::] class");
                    break;
                }
                if (LOC)
@@ -3249,12 +3521,10 @@ S_regclass(pTHX)
        }
        if (range) {
            if (lastvalue > value) /* b-a */ {
-               Perl_croak(aTHX_
-                          "/%.127s/: invalid [] range \"%*.*s\" in regexp",
-                          PL_regprecomp,
-                          PL_regcomp_parse - rangebegin,
-                          PL_regcomp_parse - rangebegin,
-                          rangebegin);
+               Simple_vFAIL4("Invalid [] range \"%*.*s\"",
+                             PL_regcomp_parse - rangebegin,
+                             PL_regcomp_parse - rangebegin,
+                             rangebegin);
            }
            range = 0;
        }
@@ -3265,12 +3535,11 @@ S_regclass(pTHX)
                PL_regcomp_parse++;
                if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
                    if (ckWARN(WARN_REGEXP))
-                       Perl_warner(aTHX_ WARN_REGEXP,
-                                   "/%.127s/: false [] range \"%*.*s\" in regexp",
-                                   PL_regprecomp,
-                                   PL_regcomp_parse - rangebegin,
-                                   PL_regcomp_parse - rangebegin,
-                                   rangebegin);
+                       vWARN4(PL_regcomp_parse,
+                              "False [] range \"%*.*s\"",
+                              PL_regcomp_parse - rangebegin,
+                              PL_regcomp_parse - rangebegin,
+                              rangebegin);
                    if (!SIZE_ONLY)
                        ANYOF_BITMAP_SET(ret, '-');
                } else
@@ -3369,12 +3638,12 @@ S_regclassutf8(pTHX)
        namedclass = OOB_NAMEDCLASS;
        if (!range)
            rangebegin = PL_regcomp_parse;
-       value = utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
+       value = utf8_to_uv_chk((U8*)PL_regcomp_parse, &numlen, 0);
        PL_regcomp_parse += numlen;
        if (value == '[')
            namedclass = regpposixcc(value);
        else if (value == '\\') {
-           value = (U32)utf8_to_uv((U8*)PL_regcomp_parse, &numlen);
+           value = (U32)utf8_to_uv_chk((U8*)PL_regcomp_parse, &numlen, 0);
            PL_regcomp_parse += numlen;
            /* Some compilers cannot handle switching on 64-bit integer
             * values, therefore value cannot be an UV.  Yes, this will
@@ -3391,7 +3660,7 @@ S_regclassutf8(pTHX)
                if (*PL_regcomp_parse == '{') {
                    e = strchr(PL_regcomp_parse++, '}');
                     if (!e)
-                        FAIL("Missing right brace on \\p{}");
+                        vFAIL("Missing right brace on \\p{}");
                    n = e - PL_regcomp_parse;
                }
                else {
@@ -3424,8 +3693,8 @@ S_regclassutf8(pTHX)
            case 'x':
                if (*PL_regcomp_parse == '{') {
                    e = strchr(PL_regcomp_parse++, '}');
-                    if (!e)
-                        FAIL("Missing right brace on \\x{}");
+                    if (!e) 
+                        vFAIL("Missing right brace on \\x{}");
                    numlen = 1;         /* allow underscores */
                    value = (UV)scan_hex(PL_regcomp_parse,
                                     e - PL_regcomp_parse,
@@ -3450,10 +3719,9 @@ S_regclassutf8(pTHX)
                break;
            default:
                if (!SIZE_ONLY && ckWARN(WARN_REGEXP) && isALPHA(value))
-                   Perl_warner(aTHX_ WARN_REGEXP, 
-                               "/%.127s/: Unrecognized escape \\%c in character class passed through",
-                               PL_regprecomp,
-                               (int)value);
+                   vWARN2(PL_regcomp_parse,
+                          "Unrecognized escape \\%c in character class passed through",
+                          (int)value);
                break;
            }
        }
@@ -3461,12 +3729,11 @@ S_regclassutf8(pTHX)
            if (range) { /* a-\d, a-[:digit:] */
                if (!SIZE_ONLY) {
                    if (ckWARN(WARN_REGEXP))
-                       Perl_warner(aTHX_ WARN_REGEXP,
-                                   "/%.127s/: false [] range \"%*.*s\" in regexp",
-                                   PL_regprecomp,
-                                   PL_regcomp_parse - rangebegin,
-                                   PL_regcomp_parse - rangebegin,
-                                   rangebegin);
+                       vWARN4(PL_regcomp_parse,
+                              "False [] range \"%*.*s\"",
+                              PL_regcomp_parse - rangebegin,
+                              PL_regcomp_parse - rangebegin,
+                              rangebegin);
                    Perl_sv_catpvf(aTHX_ listsv,
                                   /* 0x002D is Unicode for '-' */
                                   "%04"UVxf"\n002D\n", (UV)lastvalue);
@@ -3516,8 +3783,12 @@ S_regclassutf8(pTHX)
                case ANYOF_NPUNCT:
                    Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPunct\n");   break;
                case ANYOF_SPACE:
+               case ANYOF_PSXSPC:
+               case ANYOF_BLANK:
                    Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsSpace\n");   break;
                case ANYOF_NSPACE:
+               case ANYOF_NPSXSPC:
+               case ANYOF_NBLANK:
                    Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsSpace\n");   break;
                case ANYOF_UPPER:
                    Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsUpper\n");   break;
@@ -3533,12 +3804,10 @@ S_regclassutf8(pTHX)
        }
         if (range) {
            if (lastvalue > value) { /* b-a */
-               Perl_croak(aTHX_
-                          "/%.127s/: invalid [] range \"%*.*s\" in regexp",
-                          PL_regprecomp,
-                          PL_regcomp_parse - rangebegin,
-                          PL_regcomp_parse - rangebegin,
-                          rangebegin);
+               Simple_vFAIL4("invalid [] range \"%*.*s\"",
+                             PL_regcomp_parse - rangebegin,
+                             PL_regcomp_parse - rangebegin,
+                             rangebegin);
            }
            range = 0;
        }
@@ -3549,12 +3818,11 @@ S_regclassutf8(pTHX)
                PL_regcomp_parse++;
                if (namedclass > OOB_NAMEDCLASS) { /* \w-, [:word:]- */
                    if (ckWARN(WARN_REGEXP))
-                       Perl_warner(aTHX_ WARN_REGEXP,
-                                   "/%.127s/: false [] range \"%*.*s\" in regexp",
-                                   PL_regprecomp,
-                                   PL_regcomp_parse - rangebegin,
-                                   PL_regcomp_parse - rangebegin,
-                                   rangebegin);
+                       vWARN4(PL_regcomp_parse,
+                              "False [] range \"%*.*s\"",
+                              PL_regcomp_parse - rangebegin,
+                              PL_regcomp_parse - rangebegin,
+                              rangebegin);
                    if (!SIZE_ONLY)
                        Perl_sv_catpvf(aTHX_ listsv,
                                       /* 0x002D is Unicode for '-' */
@@ -3951,7 +4219,7 @@ Perl_regprop(pTHX_ SV *sv, regnode *o)
 
     sv_setpvn(sv, "", 0);
     if (OP(o) >= reg_num)              /* regnode.type is unsigned */
-       FAIL("corrupted regexp opcode");
+       FAIL("Corrupted regexp opcode");
     sv_catpv(sv, (char*)reg_name[OP(o)]); /* Take off const! */
 
     k = PL_regkind[(U8)OP(o)];
@@ -3973,7 +4241,7 @@ Perl_regprop(pTHX_ SV *sv, regnode *o)
     else if (k == ANYOF) {
        int i, rangestart = -1;
        const char * const out[] = {    /* Should be syncronized with
-                                          a table in regcomp.h */
+                                          ANYOF_ #xdefines in regcomp.h */
            "\\w",
            "\\W",
            "\\s",
@@ -3997,9 +4265,13 @@ Perl_regprop(pTHX_ SV *sv, regnode *o)
            "[:punct:]",
            "[:^punct:]",
            "[:upper:]",
-           "[:!upper:]",
+           "[:^upper:]",
            "[:xdigit:]",
-           "[:^xdigit:]"
+           "[:^xdigit:]",
+           "[:space:]",
+           "[:^space:]",
+           "[:blank:]",
+           "[:^blank:]"
        };
 
        if (o->flags & ANYOF_LOCALE)
@@ -4103,8 +4375,13 @@ Perl_pregfree(pTHX_ struct regexp *r)
                    Perl_croak(aTHX_ "panic: pregfree comppad");
                old_comppad = PL_comppad;
                old_curpad = PL_curpad;
-               PL_comppad = new_comppad;
-               PL_curpad = AvARRAY(new_comppad);
+               /* Watch out for global destruction's random ordering. */
+               if (SvTYPE(new_comppad) == SVt_PVAV) {
+                   PL_comppad = new_comppad;
+                   PL_curpad = AvARRAY(new_comppad);
+               }
+               else
+                   PL_curpad = NULL;
                op_free((OP_4tree*)r->data->data[n]);
                PL_comppad = old_comppad;
                PL_curpad = old_curpad;
index 3624917..225ff74 100644 (file)
--- a/regcomp.h
+++ b/regcomp.h
@@ -192,13 +192,13 @@ struct regnode_charclass_class {
 /* Should be synchronized with a table in regprop() */
 /* 2n should pair with 2n+1 */
 
-#define ANYOF_ALNUM     0      /* \w, utf8::IsWord, isALNUM() */
+#define ANYOF_ALNUM     0      /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */
 #define ANYOF_NALNUM    1
-#define ANYOF_SPACE     2
+#define ANYOF_SPACE     2      /* \s */
 #define ANYOF_NSPACE    3
 #define ANYOF_DIGIT     4
 #define ANYOF_NDIGIT    5
-#define ANYOF_ALNUMC    6      /* isalnum(3), utf8::IsAlnum, isALNUMC() */
+#define ANYOF_ALNUMC    6      /* isalnum(3), utf8::IsAlnum, ALNUMC */
 #define ANYOF_NALNUMC   7
 #define ANYOF_ALPHA     8
 #define ANYOF_NALPHA    9
@@ -218,8 +218,12 @@ struct regnode_charclass_class {
 #define ANYOF_NUPPER   23
 #define ANYOF_XDIGIT   24
 #define ANYOF_NXDIGIT  25
+#define ANYOF_PSXSPC   26      /* POSIX space: \s plus the vertical tab */
+#define ANYOF_NPSXSPC  27
+#define ANYOF_BLANK    28      /* GNU extension: space and tab */
+#define ANYOF_NBLANK   29
 
-#define ANYOF_MAX      31
+#define ANYOF_MAX      32
 
 /* Backward source code compatibility. */
 
@@ -269,20 +273,6 @@ struct regnode_charclass_class {
 #define UCHARAT(p)     PL_regdummy
 #endif /* lint */
 
-#define        FAIL(m) \
-    STMT_START {                                                       \
-       if (!SIZE_ONLY)                                                 \
-           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);            \
-       Perl_croak(aTHX_ "/%.127s/: %s",  PL_regprecomp,m);             \
-    } STMT_END
-
-#define        FAIL2(pat,m) \
-    STMT_START {                                                       \
-       if (!SIZE_ONLY)                                                 \
-           SAVEDESTRUCTOR_X(clear_re,(void*)PL_regcomp_rx);            \
-       S_re_croak2(aTHX_ "/%.127s/: ",pat,PL_regprecomp,m);            \
-    } STMT_END
-
 #define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode))
 
 #define REG_SEEN_ZERO_LEN      1
index d7d0733..6ae8478 100644 (file)
@@ -57,7 +57,7 @@ print OUT <<EOP;
 
 
 #ifdef REG_COMP_C
-const static U8 regarglen[] = {
+static const U8 regarglen[] = {
 EOP
 
 $ind = 0;
@@ -73,7 +73,7 @@ EOP
 print OUT <<EOP;
 };
 
-const static char reg_off_by_arg[] = {
+static const char reg_off_by_arg[] = {
 EOP
 
 $ind = 0;
@@ -89,7 +89,7 @@ print OUT <<EOP;
 };
 
 #ifdef DEBUGGING
-const static char * const reg_name[] = {
+static const char * const reg_name[] = {
 EOP
 
 $ind = 0;
@@ -105,7 +105,7 @@ EOP
 print OUT <<EOP;
 };
 
-const static int reg_num = $tot;
+static const int reg_num = $tot;
 
 #endif /* DEBUGGING */
 #endif /* REG_COMP_C */
index 002b66a..d3f2065 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -357,17 +357,18 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                     || ( (prog->reganch & ROPT_ANCH_BOL)
                          && !PL_multiline ) ); /* Check after \n? */
 
-       if ((prog->check_offset_min == prog->check_offset_max) && !ml_anch) {
+       if (!ml_anch) {
+         if ( !(prog->reganch & ROPT_ANCH_GPOS) /* Checked by the caller */
+              /* SvCUR is not set on references: SvRV and SvPVX overlap */
+              && sv && !SvROK(sv)
+              && (strpos + SvCUR(sv) != strend)) {
+             DEBUG_r(PerlIO_printf(Perl_debug_log, "Not at start...\n"));
+             goto fail;
+         }
+         if (prog->check_offset_min == prog->check_offset_max) {
            /* Substring at constant offset from beg-of-str... */
            I32 slen;
 
-           if ( !(prog->reganch & ROPT_ANCH_GPOS) /* Checked by the caller */
-                /* SvCUR is not set on references: SvRV and SvPVX overlap */
-                && sv && !SvROK(sv)
-                && (strpos + SvCUR(sv) != strend)) {
-               DEBUG_r(PerlIO_printf(Perl_debug_log, "Not at start...\n"));
-               goto fail;
-           }
            PL_regeol = strend;                 /* Used in HOP() */
            s = HOPc(strpos, prog->check_offset_min);
            if (SvTAIL(check)) {
@@ -393,6 +394,7 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                         && memNE(SvPVX(check), s, slen)))
                goto report_neq;
            goto success_at_start;
+         }
        }
        /* Match is anchored, but substr is not anchored wrt beg-of-str. */
        s = strpos;
@@ -690,6 +692,7 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
            SvREFCNT_dec(prog->check_substr);
            prog->check_substr = Nullsv;        /* disable */
            prog->float_substr = Nullsv;        /* clear */
+           check = Nullsv;                     /* abort */
            s = strpos;
            /* XXXX This is a remnant of the old implementation.  It
                    looks wasteful, since now INTUIT can use many
@@ -752,6 +755,8 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                                               "Could not match STCLASS...\n") );
                        goto fail;
                    }
+                   if (!check)
+                       goto giveup;
                    DEBUG_r( PerlIO_printf(Perl_debug_log,
                                "Looking for %s substr starting at offset %ld...\n",
                                 what, (long)(s + start_shift - i_strpos)) );
@@ -762,6 +767,8 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                    goto retry_floating_check;
                /* Recheck anchored substring, but not floating... */
                s = check_at; 
+               if (!check)
+                   goto giveup;
                DEBUG_r( PerlIO_printf(Perl_debug_log,
                          "Looking for anchored substr starting at offset %ld...\n",
                          (long)(other_last - i_strpos)) );
@@ -771,6 +778,8 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                current position only: */
            if (ml_anch) {
                s = t = t + 1;
+               if (!check)
+                   goto giveup;
                DEBUG_r( PerlIO_printf(Perl_debug_log,
                          "Looking for /%s^%s/m starting at offset %ld...\n",
                          PL_colors[0],PL_colors[1], (long)(t - i_strpos)) );
@@ -792,8 +801,10 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
                     PerlIO_printf(Perl_debug_log, 
                        "Does not contradict STCLASS...\n") );
     }
-    DEBUG_r(PerlIO_printf(Perl_debug_log, "%sGuessed:%s match at offset %ld\n",
-                         PL_colors[4], PL_colors[5], (long)(s - i_strpos)) );
+  giveup:
+    DEBUG_r(PerlIO_printf(Perl_debug_log, "%s%s:%s match at offset %ld\n",
+                         PL_colors[4], (check ? "Guessed" : "Giving up"),
+                         PL_colors[5], (long)(s - i_strpos)) );
     return s;
 
   fail_finish:                         /* Substring not found */
@@ -905,7 +916,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            PL_reg_flags |= RF_tainted;
            /* FALL THROUGH */
        case BOUNDUTF8:
-           tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1), 0) : '\n';
+           tmp = (I32)(s != startpos) ? utf8_to_uv_chk(reghop((U8*)s, -1), 0, 0) : '\n';
            tmp = ((OP(c) == BOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
            while (s < strend) {
                if (tmp == !(OP(c) == BOUNDUTF8 ?
@@ -941,7 +952,7 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
            PL_reg_flags |= RF_tainted;
            /* FALL THROUGH */
        case NBOUNDUTF8:
-           tmp = (I32)(s != startpos) ? utf8_to_uv(reghop((U8*)s, -1), 0) : '\n';
+           tmp = (I32)(s != startpos) ? utf8_to_uv_chk(reghop((U8*)s, -1), 0, 0) : '\n';
            tmp = ((OP(c) == NBOUNDUTF8 ? isALNUM_uni(tmp) : isALNUM_LC_uni(tmp)) != 0);
            while (s < strend) {
                if (tmp == !(OP(c) == NBOUNDUTF8 ?
@@ -1986,7 +1997,7 @@ S_regmatch(pTHX_ regnode *prog)
                while (s < e) {
                    if (l >= PL_regeol)
                        sayNO;
-                   if (utf8_to_uv((U8*)s, 0) != (c1 ?
+                   if (utf8_to_uv_chk((U8*)s, 0, 0) != (c1 ?
                                                  toLOWER_utf8((U8*)l) :
                                                  toLOWER_LC_utf8((U8*)l)))
                    {
@@ -2124,7 +2135,7 @@ S_regmatch(pTHX_ regnode *prog)
        case NBOUNDUTF8:
            /* was last char in word? */
            ln = (locinput != PL_regbol)
-               ? utf8_to_uv(reghop((U8*)locinput, -1), 0) : PL_regprev;
+               ? utf8_to_uv_chk(reghop((U8*)locinput, -1), 0, 0) : PL_regprev;
            if (OP(scan) == BOUNDUTF8 || OP(scan) == NBOUNDUTF8) {
                ln = isALNUM_uni(ln);
                n = swash_fetch(PL_utf8_alnum, (U8*)locinput);
@@ -3616,7 +3627,11 @@ S_reginclass(pTHX_ register regnode *p, register I32 c)
            (ANYOF_CLASS_TEST(p, ANYOF_UPPER)   &&  isUPPER_LC(c))  ||
            (ANYOF_CLASS_TEST(p, ANYOF_NUPPER)  && !isUPPER_LC(c))  ||
            (ANYOF_CLASS_TEST(p, ANYOF_XDIGIT)  &&  isXDIGIT(c))    ||
-           (ANYOF_CLASS_TEST(p, ANYOF_NXDIGIT) && !isXDIGIT(c))
+           (ANYOF_CLASS_TEST(p, ANYOF_NXDIGIT) && !isXDIGIT(c))    ||
+           (ANYOF_CLASS_TEST(p, ANYOF_PSXSPC)  &&  isPSXSPC(c))    ||
+           (ANYOF_CLASS_TEST(p, ANYOF_NPSXSPC) && !isPSXSPC(c))    ||
+           (ANYOF_CLASS_TEST(p, ANYOF_BLANK)   &&  isBLANK(c))    ||
+           (ANYOF_CLASS_TEST(p, ANYOF_NBLANK)  && !isBLANK(c))
            ) /* How's that for a conditional? */
        {
            match = TRUE;
@@ -3722,4 +3737,3 @@ restore_pos(pTHXo_ void *arg)
        PL_curpm = PL_reg_oldcurpm;
     }  
 }
-
index c5725cd..89c78e6 100644 (file)
@@ -173,7 +173,7 @@ EXTCONST U8 PL_regkind[] = {
 
 
 #ifdef REG_COMP_C
-const static U8 regarglen[] = {
+static const U8 regarglen[] = {
        0,              /* END */
        0,              /* SUCCEED */
        0,              /* BOL */
@@ -256,7 +256,7 @@ const static U8 regarglen[] = {
        0,              /* OPTIMIZED */
 };
 
-const static char reg_off_by_arg[] = {
+static const char reg_off_by_arg[] = {
        0,              /* END */
        0,              /* SUCCEED */
        0,              /* BOL */
@@ -340,7 +340,7 @@ const static char reg_off_by_arg[] = {
 };
 
 #ifdef DEBUGGING
-const static char * const reg_name[] = {
+static const char * const reg_name[] = {
        "END",          /*    0 */
        "SUCCEED",              /*  0x1 */
        "BOL",          /*  0x2 */
@@ -423,7 +423,7 @@ const static char * const reg_name[] = {
        "OPTIMIZED",            /* 0x4f */
 };
 
-const static int reg_num = 80;
+static const int reg_num = 80;
 
 #endif /* DEBUGGING */
 #endif /* REG_COMP_C */
diff --git a/sv.c b/sv.c
index 20b387c..b795b29 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -834,7 +834,7 @@ S_more_xpvbm(pTHX)
 
 #define new_XPVHV()    my_safemalloc(sizeof(XPVHV))
 #define del_XPVHV(p)   my_safefree(p)
-  
+
 #define new_XPVMG()    my_safemalloc(sizeof(XPVMG))
 #define del_XPVMG(p)   my_safefree(p)
 
@@ -872,7 +872,7 @@ S_more_xpvbm(pTHX)
 
 #define new_XPVHV()    (void*)new_xpvhv()
 #define del_XPVHV(p)   del_xpvhv((XPVHV *)p)
-  
+
 #define new_XPVMG()    (void*)new_xpvmg()
 #define del_XPVMG(p)   del_xpvmg((XPVMG *)p)
 
@@ -886,10 +886,10 @@ S_more_xpvbm(pTHX)
 
 #define new_XPVGV()    my_safemalloc(sizeof(XPVGV))
 #define del_XPVGV(p)   my_safefree(p)
+
 #define new_XPVFM()    my_safemalloc(sizeof(XPVFM))
 #define del_XPVFM(p)   my_safefree(p)
-  
+
 #define new_XPVIO()    my_safemalloc(sizeof(XPVIO))
 #define del_XPVIO(p)   my_safefree(p)
 
@@ -913,6 +913,10 @@ Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
     MAGIC*     magic;
     HV*                stash;
 
+    if (mt != SVt_PV && SvREADONLY(sv) && SvFAKE(sv)) {
+       sv_force_normal(sv);
+    }
+
     if (SvTYPE(sv) == mt)
        return TRUE;
 
@@ -1488,7 +1492,8 @@ Perl_sv_2iv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvIV(tmpstr);
          return PTR2IV(SvRV(sv));
        }
@@ -1523,7 +1528,7 @@ Perl_sv_2iv(pTHX_ register SV *sv)
            SvUVX(sv) = U_V(SvNVX(sv));
            SvIsUV_on(sv);
          ret_iv_max:
-           DEBUG_c(PerlIO_printf(Perl_debug_log, 
+           DEBUG_c(PerlIO_printf(Perl_debug_log,
                                  "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
                                  PTR2UV(sv),
                                  SvUVX(sv),
@@ -1537,7 +1542,7 @@ Perl_sv_2iv(pTHX_ register SV *sv)
        /* We want to avoid a possible problem when we cache an IV which
           may be later translated to an NV, and the resulting NV is not
           the translation of the initial data.
-         
+       
           This means that if we cache such an IV, we need to cache the
           NV as well.  Moreover, we trade speed for space, and do not
           cache the NV if not needed.
@@ -1569,22 +1574,13 @@ Perl_sv_2iv(pTHX_ register SV *sv)
                goto ret_iv_max;
            }
        }
-       else if (numtype) {
-           /* The NV may be reconstructed from IV - safe to cache IV,
-              which may be calculated by atol(). */
-           if (SvTYPE(sv) == SVt_PV)
-               sv_upgrade(sv, SVt_PVIV);
-           (void)SvIOK_on(sv);
-           SvIVX(sv) = Atol(SvPVX(sv));
-       }
-       else {                          /* Not a number.  Cache 0. */
-           dTHR;
-
+       else {  /* The NV may be reconstructed from IV - safe to cache IV,
+                  which may be calculated by atol(). */
            if (SvTYPE(sv) < SVt_PVIV)
                sv_upgrade(sv, SVt_PVIV);
            (void)SvIOK_on(sv);
-           SvIVX(sv) = 0;
-           if (ckWARN(WARN_NUMERIC))
+           SvIVX(sv) = Atol(SvPVX(sv));
+           if (! numtype && ckWARN(WARN_NUMERIC))
                not_a_number(sv);
        }
     }
@@ -1627,7 +1623,8 @@ Perl_sv_2uv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvUV(tmpstr);
          return PTR2UV(SvRV(sv));
        }
@@ -1661,7 +1658,7 @@ Perl_sv_2uv(pTHX_ register SV *sv)
        else {
            SvIVX(sv) = I_V(SvNVX(sv));
          ret_zero:
-           DEBUG_c(PerlIO_printf(Perl_debug_log, 
+           DEBUG_c(PerlIO_printf(Perl_debug_log,
                                  "0x%"UVxf" 2uv(%"IVdf" => %"IVdf") (as signed)\n",
                                  PTR2UV(sv),
                                  SvIVX(sv),
@@ -1675,7 +1672,7 @@ Perl_sv_2uv(pTHX_ register SV *sv)
        /* We want to avoid a possible problem when we cache a UV which
           may be later translated to an NV, and the resulting NV is not
           the translation of the initial data.
-         
+       
           This means that if we cache such a UV, we need to cache the
           NV as well.  Moreover, we trade speed for space, and do not
           cache the NV if not needed.
@@ -1777,7 +1774,7 @@ Perl_sv_2nv(pTHX_ register SV *sv)
            return Atof(SvPVX(sv));
        }
        if (SvIOKp(sv)) {
-           if (SvIsUV(sv)) 
+           if (SvIsUV(sv))
                return (NV)SvUVX(sv);
            else
                return (NV)SvIVX(sv);
@@ -1794,7 +1791,8 @@ Perl_sv_2nv(pTHX_ register SV *sv)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
          SV* tmpstr;
-         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
+          if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+                  (SvRV(tmpstr) != SvRV(sv)))
              return SvNV(tmpstr);
          return PTR2NV(SvRV(sv));
        }
@@ -1812,7 +1810,7 @@ Perl_sv_2nv(pTHX_ register SV *sv)
            sv_upgrade(sv, SVt_NV);
 #if defined(USE_LONG_DOUBLE)
        DEBUG_c({
-           RESTORE_NUMERIC_STANDARD();
+           STORE_NUMERIC_LOCAL_SET_STANDARD();
            PerlIO_printf(Perl_debug_log,
                          "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
                          PTR2UV(sv), SvNVX(sv));
@@ -1820,7 +1818,7 @@ Perl_sv_2nv(pTHX_ register SV *sv)
        });
 #else
        DEBUG_c({
-           RESTORE_NUMERIC_STANDARD();
+           STORE_NUMERIC_LOCAL_SET_STANDARD();
            PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
                          PTR2UV(sv), SvNVX(sv));
            RESTORE_NUMERIC_LOCAL();
@@ -1852,14 +1850,14 @@ Perl_sv_2nv(pTHX_ register SV *sv)
     SvNOK_on(sv);
 #if defined(USE_LONG_DOUBLE)
     DEBUG_c({
-       RESTORE_NUMERIC_STANDARD();
+       STORE_NUMERIC_LOCAL_SET_STANDARD();
        PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
                      PTR2UV(sv), SvNVX(sv));
        RESTORE_NUMERIC_LOCAL();
     });
 #else
     DEBUG_c({
-       RESTORE_NUMERIC_STANDARD();
+       STORE_NUMERIC_LOCAL_SET_STANDARD();
        PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
                      PTR2UV(sv), SvNVX(sv));
        RESTORE_NUMERIC_LOCAL();
@@ -1937,7 +1935,7 @@ Perl_looks_like_number(pTHX_ SV *sv)
     STRLEN len;
 
     if (SvPOK(sv)) {
-       sbegin = SvPVX(sv); 
+       sbegin = SvPVX(sv);
        len = SvCUR(sv);
     }
     else if (SvPOKp(sv))
@@ -1975,7 +1973,7 @@ Perl_looks_like_number(pTHX_ SV *sv)
            numtype |= IS_NUMBER_TO_INT_BY_ATOL;
 
         if (*s == '.'
-#ifdef USE_LOCALE_NUMERIC 
+#ifdef USE_LOCALE_NUMERIC
            || IS_NUMERIC_RADIX(*s)
 #endif
            ) {
@@ -1986,7 +1984,7 @@ Perl_looks_like_number(pTHX_ SV *sv)
         }
     }
     else if (*s == '.'
-#ifdef USE_LOCALE_NUMERIC 
+#ifdef USE_LOCALE_NUMERIC
            || IS_NUMERIC_RADIX(*s)
 #endif
            ) {
@@ -2096,7 +2094,7 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
            return SvPVX(sv);
        }
        if (SvIOKp(sv)) {
-           if (SvIsUV(sv)) 
+           if (SvIsUV(sv))
                (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
            else
                (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
@@ -2121,7 +2119,8 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
     if (SvTHINKFIRST(sv)) {
        if (SvROK(sv)) {
            SV* tmpstr;
-           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
+            if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
+                    (SvRV(tmpstr) != SvRV(sv)))
                return SvPV(tmpstr,*lp);
            sv = (SV*)SvRV(sv);
            if (!sv)
@@ -2132,7 +2131,7 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
                switch (SvTYPE(sv)) {
                case SVt_PVMG:
                    if ( ((SvFLAGS(sv) &
-                          (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG)) 
+                          (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
                          == (SVs_OBJECT|SVs_RMG))
                         && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
                         && (mg = mg_find(sv, 'r'))) {
@@ -2182,7 +2181,10 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
                case SVt_PV:
                case SVt_PVIV:
                case SVt_PVNV:
-               case SVt_PVBM:  s = "SCALAR";                   break;
+               case SVt_PVBM:  if (SvROK(sv))
+                                   s = "REF";
+                               else
+                                   s = "SCALAR";               break;
                case SVt_PVLV:  s = "LVALUE";                   break;
                case SVt_PVAV:  s = "ARRAY";                    break;
                case SVt_PVHV:  s = "HASH";                     break;
@@ -2213,12 +2215,13 @@ Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
     }
     if (SvNOKp(sv)) {                  /* See note in sv_2uv() */
        /* XXXX 64-bit?  IV may have better precision... */
-       /* I tried changing this for to be 64-bit-aware and
+       /* I tried changing this to be 64-bit-aware and
         * the t/op/numconvert.t became very, very, angry.
         * --jhi Sep 1999 */
        if (SvTYPE(sv) < SVt_PVNV)
            sv_upgrade(sv, SVt_PVNV);
-       SvGROW(sv, 28);
+       /* The +20 is pure guesswork.  Configure test needed. --jhi */
+       SvGROW(sv, NV_DIG + 20);
        s = SvPVX(sv);
        olderrno = errno;       /* some Xenix systems wipe out errno here */
 #ifdef apollo
@@ -2351,7 +2354,7 @@ Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
     sv_utf8_upgrade(sv);
     return sv_2pv(sv,lp);
 }
+
 /* This function is only called on magical items */
 bool
 Perl_sv_2bool(pTHX_ register SV *sv)
@@ -2364,7 +2367,8 @@ Perl_sv_2bool(pTHX_ register SV *sv)
     if (SvROK(sv)) {
        dTHR;
        SV* tmpsv;
-       if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
+        if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
+                (SvRV(tmpsv) != SvRV(sv)))
            return SvTRUE(tmpsv);
       return SvRV(sv) != 0;
     }
@@ -2401,41 +2405,26 @@ Convert the PV of an SV to its UTF8-encoded form.
 void
 Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
 {
-    int hicount;
-    char *c;
+    char *s, *t;
+    bool hibit;
 
     if (!sv || !SvPOK(sv) || SvUTF8(sv))
        return;
 
-    /* This function could be much more efficient if we had a FLAG
-     * to signal if there are any hibit chars in the string
+    /* This function could be much more efficient if we had a FLAG in SVs
+     * to signal if there are any hibit chars in the PV.
      */
-    hicount = 0;
-    for (c = SvPVX(sv); c < SvEND(sv); c++) {
-       if (*c & 0x80)
-           hicount++;
-    }
-
-    if (hicount) {
-       char *src, *dst;
-       SvGROW(sv, SvCUR(sv) + hicount + 1);
-
-       src = SvEND(sv) - 1;
-       SvCUR_set(sv, SvCUR(sv) + hicount);
-       dst = SvEND(sv) - 1;
-
-       while (src < dst) {
-           if (*src & 0x80) {
-               dst--;
-               uv_to_utf8((U8*)dst, (U8)*src--);
-               dst--;
-           }
-           else {
-               *dst-- = *src--;
-           }
-       }
-
+    for (s = t = SvPVX(sv), hibit = FALSE; t < SvEND(sv) && !hibit; t++)
+       if (*t & 0x80)
+           hibit = TRUE;
+
+    if (hibit) {
+       STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
+       SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
+       SvCUR(sv) = len - 1;
+       SvLEN(sv) = len; /* No longer know the real size. */
        SvUTF8_on(sv);
+       Safefree(s); /* No longer using what was there before. */
     }
 }
 
@@ -2455,46 +2444,20 @@ Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
 {
     if (SvPOK(sv) && SvUTF8(sv)) {
         char *c = SvPVX(sv);
-        char *first_hi = 0;
-        /* need to figure out if this is possible at all first */
-        while (c < SvEND(sv)) {
-            if (*c & 0x80) {
-                I32 len;
-                UV uv = utf8_to_uv((U8*)c, &len);
-                if (uv >= 256) {
-                   if (fail_ok)
-                       return FALSE;
-                   else {
-                       /* XXX might want to make a callback here instead */
-                       Perl_croak(aTHX_ "Big byte");
-                   }
-               }
-                if (!first_hi)
-                    first_hi = c;
-                c += len;
-            }
-            else {
-                c++;
-            }
-        }
-
-        if (first_hi) {
-            char *src = first_hi;
-            char *dst = first_hi;
-            while (src < SvEND(sv)) {
-                if (*src & 0x80) {
-                    I32 len;
-                    U8 u = (U8)utf8_to_uv((U8*)src, &len);
-                    *dst++ = u;
-                    src += len;
-                }
-                else {
-                    *dst++ = *src++;
-                }
-            }
-            SvCUR_set(sv, dst - SvPVX(sv));
-        }
-        SvUTF8_off(sv);
+       STRLEN len = SvCUR(sv) + 1;     /* include trailing NUL */
+        if (!utf8_to_bytes((U8*)c, &len)) {
+           if (fail_ok)
+               return FALSE;
+           else {
+               if (PL_op)
+                   Perl_croak(aTHX_ "Wide character in %s",
+                              PL_op_desc[PL_op->op_type]);
+               else
+                   Perl_croak(aTHX_ "Wide character");
+           }
+       }
+       SvCUR(sv) = len - 1;
+       SvUTF8_off(sv);
     }
     return TRUE;
 }
@@ -2503,7 +2466,7 @@ Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
 =for apidoc sv_utf8_encode
 
 Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
-flag so that it looks like bytes again. Nothing calls this. 
+flag so that it looks like bytes again. Nothing calls this.
 
 =cut
 */
@@ -2528,24 +2491,15 @@ Perl_sv_utf8_decode(pTHX_ register SV *sv)
          * we want to make sure everything inside is valid utf8 first.
          */
         c = SvPVX(sv);
+       if (!is_utf8_string((U8*)c, SvCUR(sv)+1))
+           return FALSE;
+
         while (c < SvEND(sv)) {
-            if (*c & 0x80) {
-                I32 len;
-                (void)utf8_to_uv((U8*)c, &len);
-                if (len == 1) {
-                    /* bad utf8 */
-                    return FALSE;
-                }
-                c += len;
-                has_utf = TRUE;
-            }
-            else {
-                c++;
-            }
+            if (*c++ & 0x80) {
+               SvUTF8_on(sv);
+               break;
+           }
         }
-
-        if (has_utf)
-            SvUTF8_on(sv);
     }
     return TRUE;
 }
@@ -2792,22 +2746,22 @@ Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
                                (CvROOT(cv) || CvXSUB(cv)))
                            {
                                SV *const_sv = cv_const_sv(cv);
-                               bool const_changed = TRUE; 
+                               bool const_changed = TRUE;
                                if(const_sv)
-                                   const_changed = sv_cmp(const_sv, 
-                                          op_const_sv(CvSTART((CV*)sref), 
+                                   const_changed = sv_cmp(const_sv,
+                                          op_const_sv(CvSTART((CV*)sref),
                                                       (CV*)sref));
                                /* ahem, death to those who redefine
                                 * active sort subs */
                                if (PL_curstackinfo->si_type == PERLSI_SORT &&
                                      PL_sortcop == CvSTART(cv))
-                                   Perl_croak(aTHX_ 
+                                   Perl_croak(aTHX_
                                    "Can't redefine active sort subroutine %s",
                                          GvENAME((GV*)dstr));
                                if ((const_changed && const_sv) || ckWARN(WARN_REDEFINE))
-                                   Perl_warner(aTHX_ WARN_REDEFINE, const_sv ? 
+                                   Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
                                             "Constant subroutine %s redefined"
-                                            : "Subroutine %s redefined", 
+                                            : "Subroutine %s redefined",
                                             GvENAME((GV*)dstr));
                            }
                            cv_ckproto(cv, (GV*)dstr,
@@ -2893,7 +2847,8 @@ Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
 
        if (SvTEMP(sstr) &&             /* slated for free anyway? */
            SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
-           !(sflags & SVf_OOK))        /* and not involved in OOK hack? */
+           !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
+           SvLEN(sstr))                        /* and really is a string */
        {
            if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
                if (SvOOK(dstr)) {
@@ -3075,7 +3030,7 @@ Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
 =for apidoc sv_usepvn
 
 Tells an SV to use C<ptr> to find its string value.  Normally the string is
-stored inside the SV but sv_usepvn allows the SV to use an outside string. 
+stored inside the SV but sv_usepvn allows the SV to use an outside string.
 The C<ptr> should point to memory that was allocated by C<malloc>.  The
 string length, C<len>, must be supplied.  This function will realloc the
 memory pointed to by C<ptr>, so that pointer should not be freed or used by
@@ -3126,7 +3081,18 @@ Perl_sv_force_normal(pTHX_ register SV *sv)
 {
     if (SvREADONLY(sv)) {
        dTHR;
-       if (PL_curcop != &PL_compiling)
+       if (SvFAKE(sv)) {
+           char *pvx = SvPVX(sv);
+           STRLEN len = SvCUR(sv);
+            U32 hash   = SvUVX(sv);
+           SvGROW(sv, len + 1);
+           Move(pvx,SvPVX(sv),len,char);
+           *SvEND(sv) = '\0';
+           SvFAKE_off(sv);
+           SvREADONLY_off(sv);
+           unsharepvn(pvx,len,hash);
+       }
+       else if (PL_curcop != &PL_compiling)
            Perl_croak(aTHX_ PL_no_modify);
     }
     if (SvROK(sv))
@@ -3134,11 +3100,11 @@ Perl_sv_force_normal(pTHX_ register SV *sv)
     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
        sv_unglob(sv);
 }
-    
+
 /*
 =for apidoc sv_chop
 
-Efficient removal of characters from the beginning of the string buffer. 
+Efficient removal of characters from the beginning of the string buffer.
 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
 the string buffer.  The C<ptr> becomes the first character of the adjusted
 string.
@@ -3148,8 +3114,8 @@ string.
 
 void
 Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)        /* like set but assuming ptr is in sv */
-                
-                   
+
+
 {
     register STRLEN delta;
 
@@ -3310,7 +3276,7 @@ SV *
 Perl_newSV(pTHX_ STRLEN len)
 {
     register SV *sv;
-    
+
     new_SV(sv);
     if (len) {
        sv_upgrade(sv, SVt_PV);
@@ -3333,7 +3299,7 @@ void
 Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
 {
     MAGIC* mg;
-    
+
     if (SvREADONLY(sv)) {
        dTHR;
        if (PL_curcop != &PL_compiling && !strchr("gBf", how))
@@ -3367,7 +3333,7 @@ Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 nam
            mg->mg_ptr = savepvn(name, namlen);
        else if (namlen == HEf_SVKEY)
            mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
-    
+
     switch (how) {
     case 0:
        mg->mg_virtual = &PL_vtbl_sv;
@@ -3553,7 +3519,7 @@ Perl_sv_rvweaken(pTHX_ SV *sv)
     tsv = SvRV(sv);
     sv_add_backref(tsv, sv);
     SvWEAKREF_on(sv);
-    SvREFCNT_dec(tsv);              
+    SvREFCNT_dec(tsv);
     return sv;
 }
 
@@ -3572,7 +3538,7 @@ S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
     av_push(av,sv);
 }
 
-STATIC void 
+STATIC void
 S_sv_del_backref(pTHX_ SV *sv)
 {
     AV *av;
@@ -3611,7 +3577,7 @@ Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN
     register char *bigend;
     register I32 i;
     STRLEN curlen;
-    
+
 
     if (!bigstr)
        Perl_croak(aTHX_ "Can't modify non-existent substring");
@@ -3848,6 +3814,10 @@ Perl_sv_clear(pTHX_ register SV *sv)
        }
        else if (SvPVX(sv) && SvLEN(sv))
            Safefree(SvPVX(sv));
+       else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
+           unsharepvn(SvPVX(sv),SvCUR(sv),SvUVX(sv));
+           SvFAKE_off(sv);
+       }
        break;
 /*
     case SVt_NV:
@@ -4086,7 +4056,7 @@ Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
     }
     if (s != send) {
         dTHR;
-       if (ckWARN_d(WARN_UTF8))    
+       if (ckWARN_d(WARN_UTF8))
            Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
        --len;
     }
@@ -4129,7 +4099,7 @@ Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
        pv2 = SvPV(sv2, cur2);
 
     /* do not utf8ize the comparands as a side-effect */
-    if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE && 0) {
+    if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
        if (SvUTF8(sv1)) {
            pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
            pv2tmp = TRUE;
@@ -4166,7 +4136,7 @@ Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
 {
     STRLEN cur1, cur2;
     char *pv1, *pv2;
-    I32  cmp; 
+    I32  cmp;
     bool pv1tmp = FALSE;
     bool pv2tmp = FALSE;
 
@@ -4405,7 +4375,7 @@ Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
     /* See if we know enough about I/O mechanism to cheat it ! */
 
     /* This used to be #ifdef test - it is made run-time test for ease
-       of abstracting out stdio interface. One call should be cheap 
+       of abstracting out stdio interface. One call should be cheap
        enough here - and may even be a macro allowing compile
        time optimization.
      */
@@ -4453,7 +4423,7 @@ Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
        "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
     DEBUG_P(PerlIO_printf(Perl_debug_log,
        "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
-              PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), 
+              PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
               PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
     for (;;) {
       screamer:
@@ -4466,8 +4436,8 @@ Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
                }
            }
            else {
-               Copy(ptr, bp, cnt, char);            /* this     |  eat */    
-               bp += cnt;                           /* screams  |  dust */   
+               Copy(ptr, bp, cnt, char);            /* this     |  eat */
+               bp += cnt;                           /* screams  |  dust */
                ptr += cnt;                          /* louder   |  sed :-) */
                cnt = 0;
            }
@@ -4489,15 +4459,15 @@ Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
        PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
        DEBUG_P(PerlIO_printf(Perl_debug_log,
            "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
-           PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), 
+           PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
            PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
-       /* This used to call 'filbuf' in stdio form, but as that behaves like 
+       /* This used to call 'filbuf' in stdio form, but as that behaves like
           getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
           another abstraction.  */
        i   = PerlIO_getc(fp);          /* get more characters */
        DEBUG_P(PerlIO_printf(Perl_debug_log,
            "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
-           PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), 
+           PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
            PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
        cnt = PerlIO_get_cnt(fp);
        ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
@@ -4530,7 +4500,7 @@ thats_really_all_folks:
     PerlIO_set_ptrcnt(fp, ptr, cnt);   /* put these back or we're in trouble */
     DEBUG_P(PerlIO_printf(Perl_debug_log,
        "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
-       PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp), 
+       PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
        PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
     *bp = '\0';
     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));   /* set length */
@@ -4594,7 +4564,7 @@ screamer2:
        }
     }
 
-    if (RsPARA(PL_rs)) {               /* have to do this both before and after */  
+    if (RsPARA(PL_rs)) {               /* have to do this both before and after */
         while (i != EOF) {     /* to make sure file boundaries work right */
            i = PerlIO_getc(fp);
            if (i != '\n') {
@@ -4660,7 +4630,7 @@ Perl_sv_inc(pTHX_ register SV *sv)
            else {
                (void)SvIOK_only(sv);
                ++SvIVX(sv);
-           }       
+           }   
        }
        return;
     }
@@ -4690,7 +4660,7 @@ Perl_sv_inc(pTHX_ register SV *sv)
            /* MKS: The original code here died if letters weren't consecutive.
             * at least it didn't have to worry about non-C locales.  The
             * new code assumes that ('z'-'a')==('Z'-'A'), letters are
-            * arranged in order (although not consecutively) and that only 
+            * arranged in order (although not consecutively) and that only
             * [A-Za-z] are accepted by isALPHA in the C locale.
             */
            if (*d != 'z' && *d != 'Z') {
@@ -4764,14 +4734,14 @@ Perl_sv_dec(pTHX_ register SV *sv)
            else {
                (void)SvIOK_only_UV(sv);
                --SvUVX(sv);
-           }       
+           }   
        } else {
            if (SvIVX(sv) == IV_MIN)
                sv_setnv(sv, (NV)IV_MIN - 1.0);
            else {
                (void)SvIOK_only(sv);
                --SvIVX(sv);
-           }       
+           }   
        }
        return;
     }
@@ -4885,7 +4855,7 @@ Perl_newSVpv(pTHX_ const char *s, STRLEN len)
 =for apidoc newSVpvn
 
 Creates a new SV and copies a string into it.  The reference count for the
-SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length 
+SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
 string.  You are responsible for ensuring that the source string is at least
 C<len> bytes long.
 
@@ -4902,6 +4872,36 @@ Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
     return sv;
 }
 
+/*
+=for apidoc newSVpvn_share
+
+Creates a new SV and populates it with a string from
+the string table. Turns on READONLY and FAKE.
+The idea here is that as string table is used for shared hash
+keys these strings will have SvPVX == HeKEY and hash lookup
+will avoid string compare.
+
+=cut
+*/
+
+SV *
+Perl_newSVpvn_share(pTHX_ const char *src, STRLEN len, U32 hash)
+{
+    register SV *sv;
+    if (!hash)
+       PERL_HASH(hash, src, len);
+    new_SV(sv);
+    sv_upgrade(sv, SVt_PVIV);
+    SvPVX(sv) = sharepvn(src, len, hash);
+    SvCUR(sv) = len;
+    SvUVX(sv) = hash;
+    SvLEN(sv) = 0;
+    SvREADONLY_on(sv);
+    SvFAKE_on(sv);
+    SvPOK_on(sv);
+    return sv;
+}
+
 #if defined(PERL_IMPLICIT_CONTEXT)
 SV *
 Perl_newSVpvf_nocontext(const char* pat, ...)
@@ -5128,7 +5128,7 @@ Perl_sv_reset(pTHX_ register char *s, HV *stash)
                }
                if (GvHV(gv) && !HvNAME(GvHV(gv))) {
                    hv_clear(GvHV(gv));
-#ifndef VMS  /* VMS has no environ array */
+#if !defined( VMS) && !defined(EPOC)  /* VMS has no environ array */
                    if (gv == PL_envgv)
                        environ[0] = Nullch;
 #endif
@@ -5346,7 +5346,7 @@ Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
 
     if (SvTHINKFIRST(sv) && !SvROK(sv))
        sv_force_normal(sv);
-    
+
     if (SvPOK(sv)) {
        *lp = SvCUR(sv);
     }
@@ -5360,7 +5360,7 @@ Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
            s = sv_2pv(sv, lp);
        if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
            STRLEN len = *lp;
-           
+       
            if (SvROK(sv))
                sv_unref(sv);
            (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
@@ -5540,8 +5540,23 @@ Perl_newSVrv(pTHX_ SV *rv, const char *classname)
     SV_CHECK_THINKFIRST(rv);
     SvAMAGIC_off(rv);
 
+    if (SvTYPE(rv) >= SVt_PVMG) {
+       U32 refcnt = SvREFCNT(rv);
+       SvREFCNT(rv) = 0;
+       sv_clear(rv);
+       SvFLAGS(rv) = 0;
+       SvREFCNT(rv) = refcnt;
+    }
+
     if (SvTYPE(rv) < SVt_RV)
-      sv_upgrade(rv, SVt_RV);
+       sv_upgrade(rv, SVt_RV);
+    else if (SvTYPE(rv) > SVt_RV) {
+       (void)SvOOK_off(rv);
+       if (SvPVX(rv) && SvLEN(rv))
+           Safefree(SvPVX(rv));
+       SvCUR_set(rv, 0);
+       SvLEN_set(rv, 0);
+    }
 
     (void)SvOK_off(rv);
     SvRV(rv) = sv;
@@ -6183,16 +6198,19 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
        /* SIZE */
 
        switch (*q) {
-#ifdef HAS_QUAD
+#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
        case 'L':                       /* Ld */
+           /* FALL THROUGH */
+#endif
+#ifdef HAS_QUAD
        case 'q':                       /* qd */
            intsize = 'q';
            q++;
            break;
 #endif
        case 'l':
-#ifdef HAS_QUAD
-             if (*(q + 1) == 'l') {    /* lld */
+#if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
+             if (*(q + 1) == 'l') {    /* lld, llf */
                intsize = 'q';
                q += 2;
                break;
@@ -6314,7 +6332,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                    break;
                }
                if (utf)
-                   iv = (IV)utf8_to_uv(vecstr, &ulen);
+                   iv = (IV)utf8_to_uv_chk(vecstr, &ulen, 0);
                else {
                    iv = *vecstr;
                    ulen = 1;
@@ -6396,7 +6414,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                    break;
                }
                if (utf)
-                   uv = utf8_to_uv(vecstr, &ulen);
+                   uv = utf8_to_uv_chk(vecstr, &ulen, 0);
                else {
                    uv = *vecstr;
                    ulen = 1;
@@ -6534,11 +6552,14 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
            eptr = ebuf + sizeof ebuf;
            *--eptr = '\0';
            *--eptr = c;
-#ifdef USE_LONG_DOUBLE
+#if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
            {
-               static char const my_prifldbl[] = PERL_PRIfldbl;
-               char const *p = my_prifldbl + sizeof my_prifldbl - 3;
-               while (p >= my_prifldbl) { *--eptr = *p--; }
+               /* Copy the one or more characters in a long double
+                * format before the 'base' ([efgEFG]) character to
+                * the format string. */
+               static char const prifldbl[] = PERL_PRIfldbl;
+               char const *p = prifldbl + sizeof(prifldbl) - 3;
+               while (p >= prifldbl) { *--eptr = *p--; }
            }
 #endif
            if (has_precis) {
@@ -6561,9 +6582,13 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
            *--eptr = '%';
 
            {
-               RESTORE_NUMERIC_STANDARD();
+               STORE_NUMERIC_STANDARD_SET_LOCAL();
+#ifdef USE_LOCALE_NUMERIC
+               if (!was_standard && maybe_tainted)
+                   *maybe_tainted = TRUE;
+#endif
                (void)sprintf(PL_efloatbuf, eptr, nv);
-               RESTORE_NUMERIC_LOCAL();
+               RESTORE_NUMERIC_STANDARD();
            }
 
            eptr = PL_efloatbuf;
@@ -6602,7 +6627,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV
                          (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
                if (c) {
                    if (isPRINT(c))
-                       Perl_sv_catpvf(aTHX_ msg, 
+                       Perl_sv_catpvf(aTHX_ msg,
                                       "\"%%%c\"", c & 0xFF);
                    else
                        Perl_sv_catpvf(aTHX_ msg,
@@ -8316,9 +8341,15 @@ do_clean_objs(pTHXo_ SV *sv)
 
     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
        DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
-       SvROK_off(sv);
-       SvRV(sv) = 0;
-       SvREFCNT_dec(rv);
+       if (SvWEAKREF(sv)) {
+           sv_del_backref(sv);
+           SvWEAKREF_off(sv);
+           SvRV(sv) = 0;
+       } else {
+           SvROK_off(sv);
+           SvRV(sv) = 0;
+           SvREFCNT_dec(rv);
+       }
     }
 
     /* XXX Might want to check arrays, etc. */
diff --git a/sv.h b/sv.h
index 6625730..425acc3 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -61,7 +61,7 @@ typedef enum {
 
 /* Using C's structural equivalence to help emulate C++ inheritance here... */
 
-struct sv {
+struct STRUCT_SV {
     void*      sv_any;         /* pointer to something */
     U32                sv_refcnt;      /* how many references to us */
     U32                sv_flags;       /* what we are */
@@ -442,6 +442,15 @@ Unsets the IV status of an SV.
 =for apidoc Am|void|SvIOK_only|SV* sv
 Tells an SV that it is an integer and disables all other OK bits.
 
+=for apidoc Am|void|SvIOK_only_UV|SV* sv
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+=for apidoc Am|void|SvIOK_UV|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+=for apidoc Am|void|SvIOK_notUV|SV* sv
+Returns a boolean indicating whether the SV contains an signed integer.
+
 =for apidoc Am|bool|SvNOK|SV* sv
 Returns a boolean indicating whether the SV contains a double.
 
@@ -566,6 +575,23 @@ Set the length of the string which is in the SV.  See C<SvCUR>.
 #define SvNOK_only(sv)         ((void)SvOK_off(sv), \
                                    SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
 
+/*
+=for apidoc Am|void|SvUTF8|SV* sv
+Returns a boolean indicating whether the SV contains UTF-8 encoded data.
+
+=for apidoc Am|void|SvUTF8_on|SV *sv
+Tells an SV that it is a string and encoded in UTF8.  Do not use frivolously.
+
+=for apidoc Am|void|SvUTF8_off|SV *sv
+Unsets the UTF8 status of an SV.
+
+=for apidoc Am|void|SvPOK_only_UTF8|SV* sv
+Tells an SV that it is a UTF8 string (do not use frivolously)
+and disables all other OK bits.
+  
+=cut
+ */
+
 #define SvUTF8(sv)             (SvFLAGS(sv) & SVf_UTF8)
 #define SvUTF8_on(sv)          (SvFLAGS(sv) |= (SVf_UTF8))
 #define SvUTF8_off(sv)         (SvFLAGS(sv) &= ~(SVf_UTF8))
@@ -612,6 +638,8 @@ Set the length of the string which is in the SV.  See C<SvCUR>.
 #define SvAMAGIC_on(sv)                (SvFLAGS(sv) |= SVf_AMAGIC)
 #define SvAMAGIC_off(sv)       (SvFLAGS(sv) &= ~SVf_AMAGIC)
 
+#define SvGAMAGIC(sv)           (SvFLAGS(sv) & (SVs_GMG|SVf_AMAGIC)) 
+
 /*
 #define Gv_AMG(stash) \
         (HV_AMAGICmb(stash) && \
@@ -734,18 +762,15 @@ Set the length of the string which is in the SV.  See C<SvCUR>.
 #define IoTYPE(sv)     ((XPVIO*)  SvANY(sv))->xio_type
 #define IoFLAGS(sv)    ((XPVIO*)  SvANY(sv))->xio_flags
 
-/*
-IoTYPE(sv) is a single character saying what type of I/O connection
-this is:
-    |        pipe
-    -        stdin or stdout
-    <        read-only
-    >        write-only
-    a        append
-    +        read and write
-    s        socket
-    space    closed
-*/
+/* IoTYPE(sv) is a single character telling the type of I/O connection. */
+#define IoTYPE_RDONLY  '<'
+#define IoTYPE_WRONLY  '>'
+#define IoTYPE_RDWR    '+'
+#define IoTYPE_APPEND  'a'
+#define IoTYPE_PIPE    '|'
+#define IoTYPE_STD     '-'     /* stdin or stdout */
+#define IoTYPE_SOCKET  's'
+#define IoTYPE_CLOSED  ' '
 
 /*
 =for apidoc Am|bool|SvTAINTED|SV* sv
index 8384349..0953026 100644 (file)
--- a/t/README
+++ b/t/README
@@ -13,4 +13,4 @@ will fail, you may want to use Test::Harness thusly:
        ./perl -I../lib harness
 This method pinpoints failed tests automatically.
 
-If you come up with new tests, please send them to larry@wall.org.
+If you come up with new tests, please send them to perlbug@perl.org.
diff --git a/t/TEST b/t/TEST
index 0b674af..ef3d312 100755 (executable)
--- a/t/TEST
+++ b/t/TEST
@@ -90,9 +90,10 @@ EOT
            open(RESULTS,"./perl$switch $test |") or print "can't run.\n";
        }
        else {
-           open(RESULTS, "./perl -I../lib ../utils/perlcc ./$test "
-                        ."-run -verbose dcf -log ../compilelog |")
+           open(RESULTS, "./perl -I../lib ../utils/perlcc -o ./$test.plc ./$test "
+                        ." && ./$test.plc |")
                or print "can't compile.\n";
+        unlink "./$test.plc";
        }
 
        $ok = 0;
diff --git a/t/UTEST b/t/UTEST
index b5f285b..9c1dfc0 100755 (executable)
--- a/t/UTEST
+++ b/t/UTEST
@@ -81,7 +81,10 @@ EOT
            if ($type eq 'perl') {
                open(RESULTS, "./$test |") || (print "can't run.\n"); }
            else { 
-               open(RESULTS, "./perl -I../lib ../utils/perlcc ./$test -run -verbose dcf -log ../compilelog |") or print "can't compile.\n";
+        open(RESULTS, "./perl -I../lib ../utils/perlcc -o ./$test.plc ./$test "
+                 ." && ./$test.plc |")
+        or print "can't compile.\n";
+        unlink "./$test.plc";
            }
        }
        else {
index 021d699..e470f3a 100755 (executable)
@@ -6,6 +6,8 @@ print "1..14\n";
 $teststring = "1\n12\n123\n1234\n1234\n12345\n\n123456\n1234567\n";
 
 # Create our test datafile
+1 while unlink 'foo';                # in case junk left around
+rmdir 'foo';
 open TESTFILE, ">./foo" or die "error $! $^E opening";
 binmode TESTFILE;
 print TESTFILE $teststring;
index 6380694..e96313d 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Config;
index 01efb84..70748be 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..10\n";
index dee5330..d2c64fe 100755 (executable)
@@ -9,7 +9,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use strict;
index bbff38c..5b061ee 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Config;
index a77db9b..f9731ee 100755 (executable)
@@ -11,7 +11,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use strict;
index bfd4a37..eaea3ad 100755 (executable)
@@ -2,7 +2,8 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, ('.', '../lib');
+    @INC = '.';
+    push @INC, '../lib';
 }
 
 # don't make this lexical
index 1f5fae3..fb59777 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..27\n";
index 2595fa6..2b8f23b 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..21\n";
index 970e2f3..7182c24 100755 (executable)
--- a/t/io/fs.t
+++ b/t/io/fs.t
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Config;
index 30db598..0190281 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }    
 
 # $RCSfile$    
@@ -268,13 +268,13 @@ ok;
 {
     local *F;
     for (1..2) {
-        open(F, "echo #foo|") or print "not ";
+        open(F, "echo \\#foo|") or print "not ";
        print <F>;
        close F;
     }
     ok;
     for (1..2) {
-       open(F, "-|", "echo #foo") or print "not ";
+       open(F, "-|", "echo \\#foo") or print "not ";
        print <F>;
        close F;
     }
index 80c6bde..3871e0b 100755 (executable)
@@ -9,7 +9,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     if ($^O eq 'dos') {
         print "1..0 # Skip: no multitasking\n";
         exit 0;
@@ -78,7 +78,6 @@ print "ok 8\n";
 # send one expected line of text to child process and then wait for it
 autoflush FH4 1;
 print FH4 "ok 9\n";
-print "ok 9 # skip VMS\n" if $^O eq 'VMS';
 print "# waiting for process $pid4 to exit\n";
 $reap_pid = waitpid $pid4, 0;
 print "# reaped pid $reap_pid != $pid4\nnot "
index 4559624..96935e3 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     unless ($Config{'d_fork'}) {
        print "1..0 # Skip: no fork\n";
index 05e5c70..fb5a984 100755 (executable)
@@ -4,7 +4,7 @@ print "1..7\n";
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Text::Abbrev;
index 3e16dce..f38e905 100755 (executable)
@@ -1,8 +1,6 @@
-#!./perl
-
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 # Test suite for the Term::ANSIColor Perl module.  Before `make install' is
@@ -13,7 +11,7 @@ BEGIN {
 # Ensure module can be loaded
 ############################################################################
 
-BEGIN { $| = 1; print "1..7\n" }
+BEGIN { $| = 1; print "1..8\n" }
 END   { print "not ok 1\n" unless $loaded }
 use Term::ANSIColor qw(:constants color colored);
 $loaded = 1;
@@ -71,3 +69,13 @@ if (colored ("test\ntest\r\r\n\r\n", 'bold')
 } else {
     print "not ok 7\n";
 }
+
+# Test the array ref form.
+$Term::ANSIColor::EACHLINE = "\n";
+if (colored (['bold', 'on_green'], "test\n", "\n", "test")
+    eq "\e[1;42mtest\e[0m\n\n\e[1;42mtest\e[0m") {
+    print "ok 8\n";
+} else {
+    print colored (['bold', 'on_green'], "test\n", "\n", "test");
+    print "not ok 8\n";
+}
index e304766..40c4366 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (($Config{'extensions'} !~ /\b(DB|[A-Z]DBM)_File\b/) ){
       print "1..0 # Skipping (no DB_File or [A-Z]DBM_File)\n";
index eb8c8c4..440122c 100644 (file)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     eval 'require attrs; 1' or do {
        print "1..0\n";
        exit 0;
index 3bf690b..b53b9fe 100755 (executable)
@@ -3,7 +3,8 @@
 BEGIN {
     chdir 't' if -d 't';
     $dir = "auto-$$";
-    unshift @INC, ("./$dir", "../lib");
+    @INC = $dir;
+    push @INC, '../lib';
 }
 
 print "1..11\n";
index 96ba126..2be4d10 100755 (executable)
--- a/t/lib/b.t
+++ b/t/lib/b.t
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 $|  = 1;
@@ -10,7 +10,7 @@ use warnings;
 use strict;
 use Config;
 
-print "1..10\n";
+print "1..13\n";
 
 my $test = 1;
 
@@ -30,16 +30,32 @@ ok;
 print "not " if "{\n    \$test /= 2 if ++\$test;\n}" ne
                     $deparse->coderef2text(sub {++$test and $test/=2;});
 ok;
+{
+my $a = <<'EOF';
+{
+    $test = sub : lvalue {
+        1;
+    }
+    ;
+}
+EOF
+chomp $a;
+print "not " if $deparse->coderef2text(sub{$test = sub : lvalue { 1 }}) ne $a;
+ok;
+
+$a =~ s/lvalue/method/;
+print "not " if $deparse->coderef2text(sub{$test = sub : method { 1 }}) ne $a;
+ok;
+
+$a =~ s/method/locked method/;
+print "not " if $deparse->coderef2text(sub{$test = sub : method locked { 1 }})
+                                     ne $a;
+ok;
+}
 
 my $a;
 my $Is_VMS = $^O eq 'VMS';
-if ($Is_VMS) { 
-    $^X = "MCR $^X";
-    $a = `$^X "-I../lib" "-MO=Deparse" -anle "1"`;
-}
-else {
-    $a = `$^X -I../lib -MO=Deparse -anle 1 2>&1`;
-}
+$a = `$^X "-I../lib" "-MO=Deparse" -anle 1 2>&1`;
 $a =~ s/-e syntax OK\n//g;
 $b = <<'EOF';
 
@@ -57,33 +73,18 @@ print "# [$a]\n\# vs\n# [$b]\nnot " if $a ne $b;
 ok;
 
 #6
-if ($Is_VMS) { 
-    $a = `$^X "-I../lib" "-MO=Debug" -e "1"`;
-}
-else {
-    $a = `$^X -I../lib -MO=Debug -e 1 2>&1`;
-}
+$a = `$^X "-I../lib" "-MO=Debug" -e 1 2>&1`;
 print "not " unless $a =~
 /\bLISTOP\b.*\bOP\b.*\bCOP\b.*\bOP\b/s;
 ok;
 
 #7
-if ($Is_VMS) { 
-    $a = `$^X "-I../lib" "-MO=Terse" -e "1"`;
-}
-else {
-    $a = `$^X -I../lib -MO=Terse -e 1 2>&1`;
-}
+$a = `$^X "-I../lib" "-MO=Terse" -e 1 2>&1`;
 print "not " unless $a =~
 /\bLISTOP\b.*leave.*\bOP\b.*enter.*\bCOP\b.*nextstate.*\bOP\b.*null/s;
 ok;
 
-if ($Is_VMS) { 
-    $a = `$^X "-I../lib" "-MO=Terse" -ane "s/foo/bar/"`;
-}
-else {
-    $a = `$^X -I../lib -MO=Terse -ane "s/foo/bar/" 2>&1`;
-}
+$a = `$^X "-I../lib" "-MO=Terse" -ane "s/foo/bar/" 2>&1`;
 $a =~ s/\(0x[^)]+\)//g;
 $a =~ s/\[[^\]]+\]//g;
 $a =~ s/-e syntax OK//;
@@ -92,26 +93,30 @@ $a =~ s/\s+/ /g;
 $a =~ s/\b(s|foo|bar|ullsv)\b\s?//g;
 $a =~ s/^\s+//;
 $a =~ s/\s+$//;
-$b=<<EOF;
+my $is_thread = $Config{use5005threads} && $Config{use5005threads} eq 'define';
+if ($is_thread) {
+    $b=<<EOF;
+leave enter nextstate label leaveloop enterloop null and defined null
+threadsv readline gv lineseq nextstate aassign null pushmark split pushre
+threadsv const null pushmark rvav gv nextstate subst const unstack nextstate
+EOF
+} else {
+    $b=<<EOF;
 leave enter nextstate label leaveloop enterloop null and defined null
 null gvsv readline gv lineseq nextstate aassign null pushmark split pushre
-null gvsv const null pushmark rvav gv nextstate subst const unstack
-nextstate
+null gvsv const null pushmark rvav gv nextstate subst const unstack nextstate
 EOF
+}
 $b=~s/\n/ /g;$b=~s/\s+/ /g;
 $b =~ s/\s+$//;
-print "# [$a] vs [$b]\nnot " if $a ne $b;
+print "# [$a]\n# vs\n# [$b]\nnot " if $a ne $b;
 ok;
 
-if ($Is_VMS) {
-    chomp($a = `$^X "-I../lib" "-MB::Stash" "-Mwarnings" -e "1"`);
-}
-else {
-    chomp($a = `$^X -I../lib -MB::Stash -Mwarnings -e1`);
-}
+chomp($a = `$^X "-I../lib" "-MB::Stash" "-Mwarnings" -e1`);
 $a = join ',', sort split /,/, $a;
 $a =~ s/-uWin32,// if $^O eq 'MSWin32';
 $a =~ s/-u(Cwd|File|File::Copy|OS2),//g if $^O eq 'os2';
+$a =~ s/-uCwd,// if $^O eq 'cygwin';
 if ($Config{static_ext} eq ' ') {
   $b = '-uCarp,-uCarp::Heavy,-uDB,-uExporter,-uExporter::Heavy,-uattributes,'
      . '-umain,-uwarnings';
@@ -121,11 +126,10 @@ if ($Config{static_ext} eq ' ') {
   print "ok $test # skipped: one or more static extensions\n"; $test++;
 }
 
-if ($Is_VMS) {
-    $a = `$^X "-I../lib" "-MO=Showlex" -e "my %one"`;
-}
-else {
-    $a = `$^X -I../lib -MO=Showlex -e "my %one" 2>&1`;
+if ($is_thread) {
+    print "# use5005threads: test $test skipped\n";
+} else {
+    $a = `$^X "-I../lib" "-MO=Showlex" -e "my %one" 2>&1`;
+    print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
 }
-print "# [$a]\nnot " unless $a =~ /sv_undef.*PVNV.*%one.*sv_undef.*HV/s;
 ok;
index 478e26a..a02aa32 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use File::Basename qw(fileparse basename dirname);
index 5d97f1b..2081694 100755 (executable)
@@ -164,15 +164,15 @@ $Math::BigFloat::rnd_mode = 'odd'
 -50123456789:5:-50123000000
 +50123456789:9:50123456800
 -50123456789:9:-50123456800
-+501234500:6:501235000
--501234500:6:-501235000
++501234500:6:501234000
+-501234500:6:-501234000
 $Math::BigFloat::rnd_mode = 'even'
 +60123456789:5:60123000000
 -60123456789:5:-60123000000
 +60123456789:9:60123456800
 -60123456789:9:-60123456800
-+601234500:6:601234000
--601234500:6:-601234000
++601234500:6:601235000
+-601234500:6:-601235000
 &ffround
 $Math::BigFloat::rnd_mode = 'trunc'
 +1.23:-1:1.2
@@ -235,13 +235,13 @@ $Math::BigFloat::rnd_mode = 'odd'
 -5.23:-1:/-5.2(?:0{5}\d+)?
 +5.27:-1:/5.(?:3|29{5}\d+)
 -5.27:-1:/-5.(?:3|29{5}\d+)
-+5.25:-1:/5.(?:3|29{5}\d+)
--5.25:-1:/-5.(?:3|29{5}\d+)
-+5.35:-1:/5.(?:3|29{5}\d+)
--5.35:-1:/-5.(?:3|29{5}\d+)
++5.25:-1:/5.(?:2|29{5}\d+)
+-5.25:-1:/-5.(?:2|29{5}\d+)
++5.35:-1:/5.(?:4|29{5}\d+)
+-5.35:-1:/-5.(?:4|29{5}\d+)
 -0.0065:-1:0
 -0.0065:-2:/-0\.01|-1e-02
--0.0065:-3:/-0\.007|-7e-03
+-0.0065:-3:/-0\.006|-6e-03
 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
 $Math::BigFloat::rnd_mode = 'even'
@@ -249,13 +249,13 @@ $Math::BigFloat::rnd_mode = 'even'
 -6.23:-1:/-6.2(?:0{5}\d+)?
 +6.27:-1:/6.(?:3|29{5}\d+)
 -6.27:-1:/-6.(?:3|29{5}\d+)
-+6.25:-1:/6.2(?:0{5}\d+)?
--6.25:-1:/-6.2(?:0{5}\d+)?
-+6.35:-1:/6.(?:4|39{5}\d+)
--6.35:-1:/-6.(?:4|39{5}\d+)
++6.25:-1:/6.(?:3(?:0{5}\d+)?|29{5}\d+)
+-6.25:-1:/-6.(?:3(?:0{5}\d+)?|29{5}\d+)
++6.35:-1:/6.(?:3|39{5}\d+|29{8}\d+)
+-6.35:-1:/-6.(?:3|39{5}\d+|29{8}\d+)
 -0.0065:-1:0
 -0.0065:-2:/-0\.01|-1e-02
--0.0065:-3:/-0\.006|-6e-03
+-0.0065:-3:/-0\.007|-7e-03
 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
 &fcmp
index d2d520e..034c5c6 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl
 
-BEGIN { unshift @INC, '../lib' }
+BEGIN { @INC = '../lib' }
 require "bigint.pl";
 
 $test = 0;
index ae362e2..e76f246 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Math::BigInt;
index e3cba5f..6bdd7de 100755 (executable)
@@ -1,13 +1,14 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
 BEGIN {$| = 1; print "1..17\n"; }
 END {print "not ok 1\n" unless $loaded;}
 use CGI (':standard','-no_debug');
@@ -33,49 +34,48 @@ $ENV{SERVER_PROTOCOL} = 'HTTP/1.0';
 $ENV{SERVER_PORT} = 8080;
 $ENV{SERVER_NAME} = 'the.good.ship.lollypop.com';
 
-test(2,start_form(-action=>'foobar',-method=>GET) eq 
-     qq(<FORM METHOD="GET" ACTION="foobar" ENCTYPE="application/x-www-form-urlencoded">\n),
+test(2,start_form(-action=>'foobar',-method=>'get') eq 
+     qq(<form method="get" action="foobar" enctype="application/x-www-form-urlencoded">\n),
      "start_form()");
 
-test(3,submit() eq qq(<INPUT TYPE="submit" NAME=".submit">),"submit()");
-test(4,submit(-name=>'foo',-value=>'bar') eq qq(<INPUT TYPE="submit" NAME="foo" VALUE="bar">),"submit(-name,-value)");
-test(5,submit({-name=>'foo',-value=>'bar'}) eq qq(<INPUT TYPE="submit" NAME="foo" VALUE="bar">),"submit({-name,-value})");
-test(6,textfield(-name=>'weather') eq qq(<INPUT TYPE="text" NAME="weather" VALUE="dull">),"textfield({-name})");
-test(7,textfield(-name=>'weather',-value=>'nice') eq qq(<INPUT TYPE="text" NAME="weather" VALUE="dull">),"textfield({-name,-value})");
-test(8,textfield(-name=>'weather',-value=>'nice',-override=>1) eq qq(<INPUT TYPE="text" NAME="weather" VALUE="nice">),
+test(3,submit() eq qq(<input type="submit" name=".submit" />),"submit()");
+test(4,submit(-name=>'foo',-value=>'bar') eq qq(<input type="submit" name="foo" value="bar" />),"submit(-name,-value)");
+test(5,submit({-name=>'foo',-value=>'bar'}) eq qq(<input type="submit" name="foo" value="bar" />),"submit({-name,-value})");
+test(6,textfield(-name=>'weather') eq qq(<input type="text" name="weather" value="dull" />),"textfield({-name})");
+test(7,textfield(-name=>'weather',-value=>'nice') eq qq(<input type="text" name="weather" value="dull" />),"textfield({-name,-value})");
+test(8,textfield(-name=>'weather',-value=>'nice',-override=>1) eq qq(<input type="text" name="weather" value="nice" />),
      "textfield({-name,-value,-override})");
-test(9,checkbox(-name=>'weather',-value=>'nice') eq qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">weather),
+test(9,checkbox(-name=>'weather',-value=>'nice') eq qq(<input type="checkbox" name="weather" value="nice" />weather),
      "checkbox()");
 test(10,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast') eq 
-     qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice">forecast),
+     qq(<input type="checkbox" name="weather" value="nice" />forecast),
      "checkbox()");
 test(11,checkbox(-name=>'weather',-value=>'nice',-label=>'forecast',-checked=>1,-override=>1) eq 
-     qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="nice" CHECKED>forecast),
+     qq(<input type="checkbox" name="weather" value="nice" checked />forecast),
      "checkbox()");
 test(12,checkbox(-name=>'weather',-value=>'dull',-label=>'forecast') eq 
-     qq(<INPUT TYPE="checkbox" NAME="weather" VALUE="dull" CHECKED>forecast),
+     qq(<input type="checkbox" name="weather" value="dull" checked />forecast),
      "checkbox()");
 
 test(13,radio_group(-name=>'game') eq 
-     qq(<INPUT TYPE="radio" NAME="game" VALUE="chess" CHECKED>chess <INPUT TYPE="radio" NAME="game" VALUE="checkers">checkers),
+     qq(<input type="radio" name="game" value="chess" checked />chess <input type="radio" name="game" value="checkers" />checkers),
      'radio_group()');
 test(14,radio_group(-name=>'game',-labels=>{'chess'=>'ping pong'}) eq 
-     qq(<INPUT TYPE="radio" NAME="game" VALUE="chess" CHECKED>ping pong <INPUT TYPE="radio" NAME="game" VALUE="checkers">checkers),
+     qq(<input type="radio" name="game" value="chess" checked />ping pong <input type="radio" name="game" value="checkers" />checkers),
      'radio_group()');
 
 test(15, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/]) eq 
-     qq(<INPUT TYPE="checkbox" NAME="game" VALUE="checkers" CHECKED>checkers <INPUT TYPE="checkbox" NAME="game" VALUE="chess" CHECKED>chess <INPUT TYPE="checkbox" NAME="game" VALUE="cribbage">cribbage),
+     qq(<input type="checkbox" name="game" value="checkers" checked />checkers <input type="checkbox" name="game" value="chess" checked />chess <input type="checkbox" name="game" value="cribbage" />cribbage),
      'checkbox_group()');
 
-test(16, checkbox_group(-name=>'game',-Values=>[qw/checkers chess cribbage/],-Defaults=>['cribbage'],-override=>1) eq 
-     qq(<INPUT TYPE="checkbox" NAME="game" VALUE="checkers">checkers <INPUT TYPE="checkbox" NAME="game" VALUE="chess">chess <INPUT TYPE="checkbox" NAME="game" VALUE="cribbage" CHECKED>cribbage),
+test(16, checkbox_group(-name=>'game',-values=>[qw/checkers chess cribbage/],-defaults=>['cribbage'],-override=>1) eq 
+     qq(<input type="checkbox" name="game" value="checkers" />checkers <input type="checkbox" name="game" value="chess" />chess <input type="checkbox" name="game" value="cribbage" checked />cribbage),
      'checkbox_group()');
-
-test(17, popup_menu(-name=>'game',-Values=>[qw/checkers chess cribbage/],-Default=>'cribbage',-override=>1) eq <<END,'checkbox_group()');
-<SELECT NAME="game">
-<OPTION  VALUE="checkers">checkers
-<OPTION  VALUE="chess">chess
-<OPTION SELECTED VALUE="cribbage">cribbage
-</SELECT>
+test(17, popup_menu(-name=>'game',-values=>[qw/checkers chess cribbage/],-default=>'cribbage',-override=>1) eq <<END,'checkbox_group()');
+<select name="game">
+<option  value="checkers">checkers</option>
+<option  value="chess">chess</option>
+<option selected value="cribbage">cribbage</option>
+</select>
 END
 
index 934e27c..653c4e5 100755 (executable)
@@ -1,13 +1,14 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
 BEGIN {$| = 1; print "1..27\n"; }
 END {print "not ok 1\n" unless $loaded;}
 use Config;
@@ -26,6 +27,15 @@ sub test {
 
 my $CRLF = "\015\012";
 
+# A peculiarity of sending "\n" through MBX|Socket|web-server on VMS 
+# is that a CR character gets inserted automatically in the web server 
+# case but not internal to perl's double quoted strings "\n".  This
+# test would need to be modified to use the "\015\012" on VMS if it
+# were actually run through a web server.
+# Thanks to Peter Prymmer for this
+
+if ($^O eq 'VMS') { $CRLF = "\n"; }
+
 # Set up a CGI environment
 $ENV{REQUEST_METHOD}='GET';
 $ENV{QUERY_STRING}  ='game=chess&game=checkers&weather=dull';
@@ -80,12 +90,12 @@ if ($Config{d_fork}) {
   }
   # at this point, we're in a new (child) process
   test(23,param('weather') eq 'nice',"CGI::param() from POST");
-  test(24,url_param('big_balls') eq 'basketball',"CGI::url_param()");
+  test(24,(url_param('big_balls') eq 'basketball'),"CGI::url_param()");
 } else {
   print "ok 23 # Skip\n";
   print "ok 24 # Skip\n";
 }
-
-test(25,redirect('http://somewhere.else') eq "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}${CRLF}","CGI::redirect() 1");
-test(26,redirect(-Location=>'http://somewhere.else',-Type=>'text/html') eq "Status: 302 Moved${CRLF}Location: http://somewhere.else${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
-test(27,redirect(-Location=>'http://somewhere.else/bin/foo&bar',-Type=>'text/html') eq "Status: 302 Moved${CRLF}Location: http://somewhere.else/bin/foo&bar${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
+test(25,redirect('http://somewhere.else') eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}${CRLF}","CGI::redirect() 1");
+my $h = redirect(-Location=>'http://somewhere.else',-Type=>'text/html');
+test(26,$h eq "Status: 302 Moved${CRLF}location: http://somewhere.else${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
+test(27,redirect(-Location=>'http://somewhere.else/bin/foo&bar',-Type=>'text/html') eq "Status: 302 Moved${CRLF}location: http://somewhere.else/bin/foo&bar${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","CGI::redirect() 2");
index 1e20a31..50c8408 100755 (executable)
@@ -1,14 +1,14 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
-    require Config; import Config;
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
 BEGIN {$| = 1; print "1..24\n"; }
 END {print "not ok 1\n" unless $loaded;}
 use CGI (':standard','-no_debug','*h3','start_table');
@@ -17,8 +17,14 @@ print "ok 1\n";
 
 ######################### End of black magic.
 
-my $Is_EBCDIC = $Config{'ebcdic'} eq 'define';
-my $crlf = $CGI::CRLF;
+my $CRLF = "\015\012";
+if ($^O eq 'VMS') { 
+  $CRLF = "\n";  # via web server carriage is inserted automatically
+}
+if (ord("\t") != 9) { # EBCDIC?
+  $CRLF = "\r\n";
+}
+
 
 # util
 sub test {
@@ -28,53 +34,55 @@ sub test {
 }
 
 # all the automatic tags
-test(2,h1() eq '<H1>',"single tag");
-test(3,h1('fred') eq '<H1>fred</H1>',"open/close tag");
-test(4,h1('fred','agnes','maura') eq '<H1>fred agnes maura</H1>',"open/close tag multiple");
-test(5,h1({-align=>'CENTER'},'fred') eq '<H1 ALIGN="CENTER">fred</H1>',"open/close tag with attribute");
-test(6,h1({-align=>undef},'fred') eq '<H1 ALIGN>fred</H1>',"open/close tag with orphan attribute");
+test(2,h1() eq '<h1 />',"single tag");
+test(3,h1('fred') eq '<h1>fred</h1>',"open/close tag");
+test(4,h1('fred','agnes','maura') eq '<h1>fred agnes maura</h1>',"open/close tag multiple");
+test(5,h1({-align=>'CENTER'},'fred') eq '<h1 align="CENTER">fred</h1>',"open/close tag with attribute");
+test(6,h1({-align=>undef},'fred') eq '<h1 align>fred</h1>',"open/close tag with orphan attribute");
 test(7,h1({-align=>'CENTER'},['fred','agnes']) eq 
-     '<H1 ALIGN="CENTER">fred</H1> <H1 ALIGN="CENTER">agnes</H1>',
+     '<h1 align="CENTER">fred</h1> <h1 align="CENTER">agnes</h1>',
      "distributive tag with attribute");
 {
     local($") = '-'; 
-    test(8,h1('fred','agnes','maura') eq '<H1>fred-agnes-maura</H1>',"open/close tag \$\" interpolation");
+    test(8,h1('fred','agnes','maura') eq '<h1>fred-agnes-maura</h1>',"open/close tag \$\" interpolation");
 }
-
-test(9,header() eq "Content-Type: text/html; charset=ISO-8859-1$crlf$crlf","header()");
-test(10,header(-type=>'image/gif') eq "Content-Type: image/gif; charset=ISO-8859-1$crlf$crlf","header()");
-test(11,header(-type=>'image/gif',-status=>'500 Sucks') eq "Status: 500 Sucks${crlf}Content-Type: image/gif; charset=ISO-8859-1$crlf$crlf","header()");
-test(12,header(-nph=>1) eq "HTTP/1.0 200 OK${crlf}Content-Type: text/html; charset=ISO-8859-1$crlf$crlf","header()");
+test(9,header() eq "Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","header()");
+test(10,header(-type=>'image/gif') eq "Content-Type: image/gif${CRLF}${CRLF}","header()");
+test(11,header(-type=>'image/gif',-status=>'500 Sucks') eq "Status: 500 Sucks${CRLF}Content-Type: image/gif${CRLF}${CRLF}","header()");
+test(12,header(-nph=>1) eq "HTTP/1.0 200 OK${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}","header()");
 test(13,start_html() ."\n" eq <<END,"start_html()");
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-       "http://www.w3.org/TR/html4/loose.dtd">
-<HTML><HEAD><TITLE>Untitled Document</TITLE>
-</HEAD><BODY>
+<!DOCTYPE html
+       PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>Untitled Document</title>
+</head><body>
 END
     ;
 test(14,start_html(-dtd=>"-//IETF//DTD HTML 3.2//FR") ."\n" eq <<END,"start_html()");
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//FR">
-<HTML><HEAD><TITLE>Untitled Document</TITLE>
-</HEAD><BODY>
+<!DOCTYPE html
+       PUBLIC "-//IETF//DTD HTML 3.2//FR">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>Untitled Document</title>
+</head><body>
 END
     ;
 test(15,start_html(-Title=>'The world of foo') ."\n" eq <<END,"start_html()");
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-       "http://www.w3.org/TR/html4/loose.dtd">
-<HTML><HEAD><TITLE>The world of foo</TITLE>
-</HEAD><BODY>
+<!DOCTYPE html
+       PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US"><head><title>The world of foo</title>
+</head><body>
 END
     ;
-test(16,($cookie=cookie(-name=>'fred',-value=>['chocolate','chip'],-path=>'/')) eq 
-     'fred=chocolate&chip; path=/',"cookie()");
-test(17,header(-Cookie=>$cookie) =~ m!^Set-Cookie: fred=chocolate&chip\; path=/${crlf}Date:.*${crlf}Content-Type: text/html$crlf$crlf!s,
-     "header(-cookie)");
-test(18,start_h3 eq '<H3>');
-test(19,end_h3 eq '</H3>');
-test(20,start_table({-border=>undef}) eq '<TABLE BORDER>');
-test(21,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<H1>this is &lt;not&gt; &#139;right&#155;</H1>');
+test(16,($cookie=cookie(-name=>'fred',-value=>['chocolate','chip'],-path=>'/')) eq 'fred=chocolate&chip; path=/',"cookie()");
+my $h = header(-Cookie=>$cookie);
+test(17,$h =~ m!^Set-Cookie: fred=chocolate&chip\; path=/${CRLF}Date:.*${CRLF}Content-Type: text/html; charset=ISO-8859-1${CRLF}${CRLF}!s, 
+  "header(-cookie)");
+test(18,start_h3 eq '<h3>');
+test(19,end_h3 eq '</h3>');
+test(20,start_table({-border=>undef}) eq '<table border>');
+test(21,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<h1>this is &lt;not&gt; &#139;right&#155;</h1>');
 charset('utf-8');
-test(22,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<H1>&#116;&#104;&#105;&#115;&#32;&#105;&#115;&#32;&#60;&#110;&#111;&#116;&#62;&#32;&#139;&#114;&#105;&#103;&#104;&#116;&#155;</H1>');
-test(23,i(p('hello there')) eq '<I><P>hello there</P></I>');
+test(22,h1(escapeHTML("this is <not> \x8bright\x9b")) eq '<h1>this is &lt;not&gt; ‹right›</h1>');
+test(23,i(p('hello there')) eq '<i><p>hello there</p></i>');
 my $q = new CGI;
-test(24,$q->h1('hi') eq '<H1>hi</H1>');
+test(24,$q->h1('hi') eq '<h1>hi</h1>');
index e217a7d..14f6447 100755 (executable)
@@ -1,12 +1,14 @@
-#!./perl
+#!/usr/local/bin/perl -w
 
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
 BEGIN {$| = 1; print "1..5\n"; }
 END {print "not ok 1\n" unless $loaded;}
 use CGI::Pretty (':standard','-no_debug','*h3','start_table');
@@ -23,17 +25,17 @@ sub test {
 }
 
 # all the automatic tags
-test(2,h1() eq '<H1>',"single tag");
-test(3,ol(li('fred'),li('ethel')) eq "<OL>\n\t<LI>\n\t\tfred\n\t</LI>\n\t <LI>\n\t\tethel\n\t</LI>\n</OL>\n","basic indentation");
+test(2,h1() eq '<h1>',"single tag");
+test(3,ol(li('fred'),li('ethel')) eq "<ol>\n\t<li>\n\t\tfred\n\t</li>\n\t <li>\n\t\tethel\n\t</li>\n</ol>\n","basic indentation");
 test(4,p('hi',pre('there'),'frog') eq 
-'<P>
-       hi <PRE>there</PRE>
+'<p>
+       hi <pre>there</pre>
         frog
-</P>
+</p>
 ',"<pre> tags");
 test(5,p('hi',a({-href=>'frog'},'there'),'frog') eq 
-'<P>
-       hi <A HREF="frog">there</A>
+'<p>
+       hi <a href="frog">there</a>
         frog
-</P>
+</p>
 ',"as-is");
index 390c08c..fde3fd0 100755 (executable)
@@ -1,13 +1,14 @@
-#!./perl
-
-# Test ability to retrieve HTTP request info
-######################### We start with some black magic to print on failure.
+#!/usr/local/bin/perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
+# Test ability to retrieve HTTP request info
+######################### We start with some black magic to print on failure.
+use lib '../blib/lib','../blib/arch';
+
 BEGIN {$| = 1; print "1..33\n"; }
 END {print "not ok 1\n" unless $loaded;}
 use CGI ();
index 2e6a818..1d08ad0 100644 (file)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 7603575..b5426ca 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..1\n";
index b659142..334374d 100755 (executable)
@@ -9,12 +9,14 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Math::Complex;
 
-my $VERSION = sprintf("%s", q$Id: complex.t,v 1.9 1998/11/01 00:00:00 dsl Exp $ =~ /(\d+\.d+)/);
+use vars qw($VERSION);
+
+$VERSION = 1.91;
 
 my ($args, $op, $target, $test, $test_set, $try, $val, $zvalue, @set, @val);
 
@@ -194,6 +196,13 @@ EOT
 test_broot(qw(-3 -2.1 0 0.99));
 
 sub test_display_format {
+    $test++;
+    push @script, <<EOS;
+    print "# package display_format cartesian?\n";
+    print "not " unless Math::Complex->display_format eq 'cartesian';
+    print "ok $test\n";
+EOS
+
     push @script, <<EOS;
     my \$j = (root(1,3))[1];
 
@@ -202,7 +211,7 @@ EOS
 
     $test++;
     push @script, <<EOS;
-    print "# display_format polar?\n";
+    print "# j display_format polar?\n";
     print "not " unless \$j->display_format eq 'polar';
     print "ok $test\n";
 EOS
@@ -276,12 +285,20 @@ EOS
 
     \$j->display_format('style' => 'cartesian', 'format' => '(%.5g)');
 EOS
+
     $test++;
     push @script, <<EOS;
     print "# j = \$j\n";
     print "not " unless "\$j" eq "(-0.5)+(0.86603)i";
     print "ok $test\n";
 EOS
+
+    $test++;
+    push @script, <<EOS;
+    print "# j display_format cartesian?\n";
+    print "not " unless \$j->display_format eq 'cartesian';
+    print "ok $test\n";
+EOS
 }
 
 test_display_format();
index b13e50e..75c661b 100755 (executable)
@@ -1,7 +1,7 @@
 #!./perl -w
 
 BEGIN {
-    unshift @INC, '../lib' if -d '../lib' ;
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bDB_File\b/) {
        print "1..0 # Skip: DB_File was not built\n";
index c52d8ae..b701874 100755 (executable)
@@ -1,7 +1,7 @@
 #!./perl -w
 
 BEGIN {
-    unshift @INC, '../lib' if -d '../lib' ;
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bDB_File\b/) {
        print "1..0 # Skip: DB_File was not built\n";
index 276f38b..18fb45b 100755 (executable)
@@ -1,7 +1,7 @@
 #!./perl -w
 
 BEGIN {
-    unshift @INC, '../lib' if -d '../lib' ;
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bDB_File\b/) {
        print "1..0 # Skip: DB_File was not built\n";
index a8683c7..aa7be35 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (not $Config{'d_readdir'}) {
        print "1..0\n";
index ea537bf..fd9bb1d 100755 (executable)
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..10\n";
@@ -39,7 +39,7 @@ while (defined($_ = <*/a*.t>)) {
 print "not " if @r != $r;
 print "ok 4\n";
 
-# check if array context works
+# check if list context works
 @r = ();
 for (<*/a*.t>) {
     print "# $_\n";
index fc5bd05..10c9b0f 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir( 't' ) if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bDevel\/DProf\b/){
       print "1..0 # Skip: Devel::DProf was not built\n";
index b8c8719..d4b3a92 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
       print "1..0 # Skip: Data::Dumper was not built\n";
index 7b5a611..be9732f 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bData\/Dumper\b/) {
       print "1..0 # Skip: Data::Dumper was not built\n";
@@ -262,11 +262,14 @@ EOT
 ##
 $WANT = <<'EOT';
 #$VAR1 = {
-#  "abc\0'\efg" => "mno\0"
+#  "abc\0'\efg" => "mno\0",
+#  "reftest" => \\1
 #};
 EOT
 
-$foo = { "abc\000\'\efg" => "mno\000" };
+$foo = { "abc\000\'\efg" => "mno\000",
+         "reftest" => \\1,
+       };
 {
   local $Data::Dumper::Useqq = 1;
   TEST q(Dumper($foo));
@@ -274,7 +277,8 @@ $foo = { "abc\000\'\efg" => "mno\000" };
 
   $WANT = <<"EOT";
 #\$VAR1 = {
-#  'abc\0\\'\efg' => 'mno\0'
+#  'abc\0\\'\efg' => 'mno\0',
+#  'reftest' => \\\\1
 #};
 EOT
 
diff --git a/t/lib/encode.t b/t/lib/encode.t
new file mode 100644 (file)
index 0000000..568efd3
--- /dev/null
@@ -0,0 +1,43 @@
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\Encode\b/) {
+      print "1..0 # Skip: Encode was not built\n";
+      exit 0;
+    }
+}
+use Test;
+use Encode qw(from_to);
+use charnames qw(greek);
+my @encodings = grep(/iso8859/,Encode::encodings());
+my $n = 2;
+plan test => 13+$n*@encodings;
+my $str = join('',map(chr($_),0x20..0x7E));
+my $cpy = $str;
+ok(length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong");
+ok($cpy,$str,"ASCII mangled by translating from iso8859-1 to Unicode");
+$cpy = $str;
+ok(from_to($cpy,'Unicode','iso8859-1'),length($str),"Length wrong");
+ok($cpy,$str,"ASCII mangled by translating from Unicode to iso8859-1");
+
+$str = join('',map(chr($_),0xa0..0xff));
+$cpy = $str;
+ok(length($str),from_to($cpy,'iso8859-1','Unicode'),"Length Wrong");
+
+my $sym = Encode->getEncoding('symbol');
+my $uni = $sym->toUnicode('a');
+ok("\N{alpha}",substr($uni,0,1),"alpha does not map so symbol 'a'");
+$str = $sym->fromUnicode("\N{Beta}");
+ok("B",substr($str,0,1),"Symbol 'B' does not map to Beta");
+
+foreach my $enc (qw(symbol dingbats ascii),@encodings)
+ {
+  my $tab = Encode->getEncoding($enc);
+  ok(1,defined($tab),"Could not load $enc");
+  $str = join('',map(chr($_),0x20..0x7E));
+  $uni = $tab->toUnicode($str);
+  $cpy = $tab->fromUnicode($uni);
+  ok($cpy,$str,"$enc mangled translating to Unicode and back");
+ }
+
index 6438d13..459dc3b 100755 (executable)
@@ -2,7 +2,7 @@
 
 print "1..22\n";
 
-BEGIN { unshift @INC, '../lib' }
+BEGIN { @INC = '../lib' }
 use English qw( -no_match_vars ) ;
 use Config;
 my $threads = $Config{'use5005threads'} || 0;
index d90d892..c5068fd 100755 (executable)
@@ -4,7 +4,7 @@ $| = 1;
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 if ($^O eq 'VMS') {
index 2573164..ff6af2e 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 BEGIN {
index 6320f6b..d173cd9 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 4013fbd..f00b876 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
    chdir 't' if -d 't';
-   unshift @INC, '../lib';
+   @INC = '../lib';
    print "1..15\n";
 }
 
index 7709ee5..a3f591a 100755 (executable)
@@ -4,7 +4,7 @@ my $w;
 
 BEGIN {
    chdir 't' if -d 't';
-   unshift @INC, '../lib' if -d '../lib';
+   @INC = '../lib';
    $SIG{__WARN__} = sub {
        if ($_[0] =~ /^Hides field 'b1' in base class/) {
            $w++;
index 019f374..a97fdd5 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..1\n";
index b6fcbea..3072c54 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 $| = 1;
index ca12e74..362c1eb 100755 (executable)
@@ -6,7 +6,7 @@ my $symlink_exists = eval { symlink("",""); 1 };
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 if ( $symlink_exists ) { print "1..117\n"; }
index 46a1e35..9268122 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     $^O = '';
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..1\n";
index 22cff0e..827410a 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bIO\b/ && $^O ne 'VMS') {
        print "1..0\n";
index 5628d0c..42e0ae9 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use File::Path;
index da52ec5..c6d155f 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     $^O = '';
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 # Each element in this array is a single test. Storing them this way makes
index f0939e9..3e742f9 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..1\n";
index 35ab59c..9503ea7 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        require Test; import Test;
        plan(tests => 9);
 }
index 6802374..2e45586 100755 (executable)
@@ -3,7 +3,7 @@
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        require Test; import Test;
        plan(tests => 7);
 }
@@ -25,11 +25,11 @@ ok( !(-e $tmpnam ));
 
 print "# TMPNAM file name: $tmpnam\n";
 
-# TMPNAM array context
+# TMPNAM list context
 # Not strict posix behaviour
 (my $fh, $tmpnam) = tmpnam();
 
-print "# TMPNAM: in array context: $fh $tmpnam\n";
+print "# TMPNAM: in list context: $fh $tmpnam\n";
 
 # File is opened - make sure it exists
 ok( (-e $tmpnam ));
index 5f30f96..96b2c42 100755 (executable)
@@ -7,7 +7,7 @@
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        require Test; import Test;
        plan(tests => 13);
 }
@@ -24,8 +24,11 @@ END { foreach (@files) { ok( !(-e $_) )} }
 use File::Temp qw/ tempfile unlink0 /;
 ok(1);
 
-# The high security tests must currently be skipped on Windows
-my $skipplat = ( ($^O eq 'MSWin32' || $^O eq 'os2') ? 1 : 0 );
+# The high security tests must currently be skipped on some platforms
+my $skipplat = ( (
+                 # No sticky bits.
+                 $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'dos'
+                 ) ? 1 : 0 );
 
 # Can not run high security tests in perls before 5.6.0
 my $skipperl  = ($] < 5.006 ? 1 : 0 );
@@ -93,22 +96,45 @@ sub test_security {
   }
 
   # Create the tempfile
-  my $template = "temptestXXXXXXXX";
-  my ($fh1, $fname1) = tempfile ( $template, 
-                                 DIR => File::Spec->curdir,
+  my $template = "tmpXXXXX";
+  my ($fh1, $fname1) = eval { tempfile ( $template, 
+                                 DIR => File::Spec->tmpdir,
                                  UNLINK => 1,
                                );
-  print "# Fname1 = $fname1\n";
-  ok( ( -e $fname1) );
+                           };
+
+  if (defined $fname1) {
+      print "# fname1 = $fname1\n";
+      ok( (-e $fname1) );
+      push(@files, $fname1); # store for end block
+  } elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
+      my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+      skip($skip2, 1);
+      # plus we need an end block so the tests come out in the right order
+      eval q{ END { skip($skip2,1); } 1; } || die;
+  } else {
+      ok(0);
+  }
 
   # Explicitly 
-  my ($fh2, $fname2) = tempfile ($template,  UNLINK => 1 );
-  ok( (-e $fname2) );
-  close($fh2);
-
-  # Store filenames for the end block
-  push(@files, $fname1, $fname2);
-
-
+  if ( $< < File::Temp->top_system_uid() ){
+      skip("Skip Test inappropriate for root", 1);
+      eval q{ END { skip($skip,1); } 1; } || die;
+      return;
+  }
+  my ($fh2, $fname2) = eval { tempfile ($template,  UNLINK => 1 ); };
+  if (defined $fname2) {
+      print "# fname2 = $fname2\n";
+      ok( (-e $fname2) );
+      push(@files, $fname2); # store for end block
+      close($fh2);
+  } elsif (File::Temp->safe_level() != File::Temp::STANDARD) {
+      my $skip2 = "Skip system possibly insecure, see INSTALL, section 'make test'";
+      skip($skip2, 1);
+      # plus we need an end block so the tests come out in the right order
+      eval q{ END { skip($skip2,1); } 1; } || die;
+  } else {
+      ok(0);
+  }
 
 }
index 3cb73c2..48a52b3 100755 (executable)
@@ -1,26 +1,37 @@
-#!/usr/bin/perl -w
+#!/usr/local/bin/perl -w
 # Test for File::Temp - tempfile function
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        require Test; import Test;
-       plan(tests => 11);
+       plan(tests => 16);
 }
 
 use strict;
 use File::Spec;
 
 # Will need to check that all files were unlinked correctly
-# Set up an END block here to do it 
-
-my (@files, @dirs); # Array containing list of dirs/files to test
+# Set up an END block here to do it
+
+# Arrays containing list of dirs/files to test
+my (@files, @dirs, @still_there);
+
+# And a test for files that should still be around
+# These are tidied up
+END {
+  foreach (@still_there) {
+    ok( -f $_ );
+    ok( unlink( $_ ) );
+    ok( !(-f $_) );
+  }
+}
 
 # Loop over an array hoping that the files dont exist
 END { foreach (@files) { ok( !(-e $_) )} }
 
 # And a test for directories
-END { foreach (@dirs)  { ok( !(-d $_) )} } 
+END { foreach (@dirs)  { ok( !(-d $_) )} }
 
 # Need to make sure that the END blocks are setup before
 # the ones that File::Temp configures since END blocks are evaluated
@@ -93,5 +104,14 @@ print "# TEMPFILE: Created $tempfile\n";
 ok( (-f $tempfile) );
 push(@files, $tempfile);
 
+
+# Create a temporary file that should stay around after
+# it has been closed
+($fh, $tempfile) = tempfile( 'permXXXXXXX', UNLINK => 0 );
+print "# TEMPFILE: Created $tempfile\n";
+ok( -f $tempfile );
+ok( close( $fh ) );
+push( @still_there, $tempfile); # check at END
+
 # Now END block will execute to test the removal of directories
 
index dc4e96e..54f5994 100755 (executable)
@@ -3,7 +3,7 @@
 # $RCSfile: dbm.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:43 $
 
 BEGIN {
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bGDBM_File\b/) {
        print "1..0 # Skip: GDBM_File was not built\n";
index 0354627..fb70f10 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..11\n";
index cbb1263..e8a2905 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
         print "1..0\n";
index 3d5c816..56d35f3 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
         print "1..0\n";
index 9d273bd..a82408c 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
         print "1..0\n";
@@ -56,7 +56,7 @@ while (defined($_ = <*/*.t>)) {
 print "not " if @r != $r;
 print "ok 5\n";
 
-# check if array context works
+# check if list context works
 @r = ();
 for (<*/*.t>) {
     #print "# $_\n";
index 586357f..fe2fa23 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) {
         print "1..0\n";
index 4b25322..c5d857d 100755 (executable)
@@ -1,16 +1,18 @@
 #!./perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
-use Getopt::Long 2.17;
+use Getopt::Long qw(:config no_ignore_case);
+die("Getopt::Long version 2.24 required--this is only version ".
+    $Getopt::Long::VERSION)
+  unless $Getopt::Long::VERSION >= 2.24;
 
 print "1..9\n";
 
 @ARGV = qw(-Foo -baR --foo bar);
-Getopt::Long::Configure ("no_ignore_case");
 undef $opt_baR;
 undef $opt_bar;
 print "ok 1\n" if GetOptions ("foo", "Foo=s");
index a4f807c..0bbe386 100755 (executable)
@@ -1,8 +1,8 @@
 #!./perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
 require "newgetopt.pl";
index a1b2c05..3bd81a3 100755 (executable)
@@ -1,8 +1,8 @@
 #!./perl -w
 
 BEGIN {
-    chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    chdir('t') if -d 't';
+    @INC = '../lib';
 }
 
 use Getopt::Long;
diff --git a/t/lib/gol-oo.t b/t/lib/gol-oo.t
new file mode 100644 (file)
index 0000000..98f3eaa
--- /dev/null
@@ -0,0 +1,26 @@
+#!./perl -w
+
+BEGIN {
+    chdir('t') if -d 't';
+    @INC = '../lib';
+}
+
+use Getopt::Long;
+die("Getopt::Long version 2.24 required--this is only version ".
+    $Getopt::Long::VERSION)
+  unless $Getopt::Long::VERSION >= 2.24;
+print "1..9\n";
+
+@ARGV = qw(-Foo -baR --foo bar);
+my $p = new Getopt::Long::Parser (config => ["no_ignore_case"]);
+undef $opt_baR;
+undef $opt_bar;
+print "ok 1\n" if $p->getoptions ("foo", "Foo=s");
+print ((defined $opt_foo)   ? "" : "not ", "ok 2\n");
+print (($opt_foo == 1)      ? "" : "not ", "ok 3\n");
+print ((defined $opt_Foo)   ? "" : "not ", "ok 4\n");
+print (($opt_Foo eq "-baR") ? "" : "not ", "ok 5\n");
+print ((@ARGV == 1)         ? "" : "not ", "ok 6\n");
+print (($ARGV[0] eq "bar")  ? "" : "not ", "ok 7\n");
+print (!(defined $opt_baR)  ? "" : "not ", "ok 8\n");
+print (!(defined $opt_bar)  ? "" : "not ", "ok 9\n");
index acb150d..15dc2b5 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..2\n";
index 8a34e9c..85a04cd 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bSys\/Hostname\b/) {
       print "1..0 # Skip: Sys::Hostname was not built\n";
index 48cb6b5..db1a322 100755 (executable)
@@ -2,7 +2,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 11ec8bc..3689871 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
         chdir 't' if -d 't';
-        unshift @INC, '../lib' if -d '../lib';
+        @INC = '../lib';
     }
     require Config; import Config;
     if ($] < 5.00326 || not $Config{'d_readdir'}) {
index c895fb4..0f17264 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 3503215..cf55c98 100755 (executable)
@@ -13,7 +13,7 @@ BEGIN
     chdir 't';
     $File =~ s/^t\W+//;                                 # Remove first directory
   }
-  unshift @INC, '../lib' if -d '../lib';
+  @INC = '../lib';
   require strict; import strict;
 }
 
index 7337a5f..55030b5 100644 (file)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index bcb89a0..ae18224 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 925830e..d391566 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
         chdir 't' if -d 't';
-        unshift @INC, '../lib' if -d '../lib';
+        @INC = '../lib';
     }
 }
 
index 85e14ab..5d1dce3 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
         chdir 't' if -d 't';
-        unshift @INC, '../lib' if -d '../lib';
+        @INC = '../lib';
     }
 }
 
index 056d131..5a8e16c 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index deaa6c7..19afa2f 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 8d75242..3aa4b03 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
        $tell_file = "TEST";
     }
     else {
index 3d5145e..9df62cf 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index 247647a..2f6def0 100644 (file)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
         chdir 't' if -d 't';
-        unshift @INC, '../lib' if -d '../lib';
+        @INC = '../lib';
     }
 }
 
index 6bbba16..9305c31 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     unless(grep /blib/, @INC) {
        chdir 't' if -d 't';
-       unshift @INC, '../lib' if -d '../lib';
+       @INC = '../lib';
     }
 }
 
index d2991e3..795ad5d 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     chdir 't' if -d 't';
 
-    unshift @INC, '../lib';
+    @INC = '../lib';
 
     require Config; import Config;
 
index 39c3f40..4937a8c 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bNDBM_File\b/) {
        print "1..0 # Skip: NDBM_File was not built\n";
index f8b8a11..ccd3e60 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bODBM_File\b/) {
        print "1..0 # Skip: ODBM_File was not built\n";
index f83a689..a785fce 100755 (executable)
@@ -4,7 +4,7 @@ $|=1;
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
         print "1..0\n";
index 6443112..85b807c 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (!$Config{'d_fork'}
        # open2/3 supported on win32 (but not Borland due to CRT bugs)
index bf042bf..a0da34f 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (!$Config{'d_fork'}
        # open2/3 supported on win32 (but not Borland due to CRT bugs)
index ce8b6d0..56b1bac 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
         print "1..0\n";
index 2c936f1..261d81f 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use warnings;
index 86fd74a..a90574f 100644 (file)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bPeek\b/) {
         print "1..0 # Skip: Devel::Peek was not built\n";
@@ -30,7 +30,7 @@ sub do_test {
            print $pattern, "\n" if $DEBUG;
            my $dump = <IN>;
            print $dump, "\n"    if $DEBUG;
-           print "[$dump] vs [$pattern]\nnot " unless $dump =~ /$pattern/m;
+           print "[$dump] vs [$pattern]\nnot " unless $dump =~ /$pattern/ms;
            print "ok $_[0]\n";
            close(IN);
        } else {
@@ -44,7 +44,7 @@ sub do_test {
 our   $a;
 our   $b;
 my    $c;
-local $d;
+local $d = 0;
 
 do_test( 1,
        $a = "foo",
@@ -204,10 +204,12 @@ do_test(13,
     ROOT = $ADDR
     XSUB = 0x0
     XSUBANY = 0
-    GVGV::GV = $ADDR\\t"main" :: "__ANON__"
-    FILE = ".+\\b(?i:peek\\.t)"
+    GVGV::GV = $ADDR\\t"main" :: "__ANON__[^"]*"
+    FILE = ".*\\b(?i:peek\\.t)"
     DEPTH = 0
-    FLAGS = 0x4
+(?:    MUTEXP = $ADDR
+    OWNER = $ADDR
+)?    FLAGS = 0x4
     PADLIST = $ADDR
     OUTSIDE = $ADDR \\(MAIN\\)');
 
@@ -218,7 +220,7 @@ do_test(14,
   FLAGS = \\(ROK\\)
   RV = $ADDR
   SV = PVCV\\($ADDR\\) at $ADDR
-    REFCNT = 3
+    REFCNT = (3|4)
     FLAGS = \\(\\)
     IV = 0
     NV = 0
@@ -228,9 +230,11 @@ do_test(14,
     XSUB = 0x0
     XSUBANY = 0
     GVGV::GV = $ADDR\\t"main" :: "do_test"
-    FILE = ".+\\b(?i:peek\\.t)"
+    FILE = ".*\\b(?i:peek\\.t)"
     DEPTH = 1
-    FLAGS = 0x0
+(?:    MUTEXP = $ADDR
+    OWNER = $ADDR
+)?    FLAGS = 0x0
     PADLIST = $ADDR
       \\d+\\. $ADDR \\("\\$pattern" \\d+-\\d+\\)
      \\d+\\. $ADDR \\(FAKE "\\$DEBUG" 0-\\d+\\)
@@ -278,7 +282,7 @@ do_test(17,
        *a,
 'SV = PVGV\\($ADDR\\) at $ADDR
   REFCNT = 5
-  FLAGS = \\(GMG,SMG,MULTI\\)
+  FLAGS = \\(GMG,SMG,MULTI(?:,IN_PAD)?\\)
   IV = 0
   NV = 0
   MAGIC = $ADDR
@@ -299,10 +303,10 @@ do_test(17,
     CVGEN = 0x0
     GPFLAGS = 0x0
     LINE = \\d+
-    FILE = ".+\\b(?i:peek\\.t)"
+    FILE = ".*\\b(?i:peek\\.t)"
     FLAGS = $ADDR
     EGV = $ADDR\\t"a"');
 
 END {
-  unlink("peek$$");
+  1 while unlink("peek$$");
 }
index dd24c79..de27dee 100755 (executable)
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 # All the constants which Socket.pm tries to make available:
index abc4563..994704a 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($^O ne 'VMS' and $Config{'extensions'} !~ /\bPOSIX\b/) {
        print "1..0\n";
@@ -17,6 +17,7 @@ $| = 1;
 print "1..27\n";
 
 $Is_W32 = $^O eq 'MSWin32';
+$Is_Dos = $^O eq 'dos';
 
 $testfd = open("TEST", O_RDONLY, 0) and print "ok 1\n";
 read($testfd, $buffer, 9) if $testfd > 2;
@@ -24,6 +25,11 @@ print $buffer eq "#!./perl\n" ? "ok 2\n" : "not ok 2\n";
 
 write(1,"ok 3\nnot ok 3\n", 5);
 
+if ($Is_Dos) {
+    for (4..5) {
+        print "ok $_ # skipped, no pipe() support on dos\n";
+    }
+} else {
 @fds = POSIX::pipe();
 print $fds[0] > $testfd ? "ok 4\n" : "not ok 4\n";
 CORE::open($reader = \*READER, "<&=".$fds[0]);
@@ -32,10 +38,11 @@ print $writer "ok 5\n";
 close $writer;
 print <$reader>;
 close $reader;
+}
 
-if ($Is_W32) {
+if ($Is_W32 || $Is_Dos) {
     for (6..11) {
-       print "ok $_ # skipped, no sigaction support on win32\n";
+       print "ok $_ # skipped, no sigaction support on win32/dos\n";
     }
 }
 else {
index 6e12873..27993d9 100755 (executable)
@@ -2,7 +2,7 @@
 $|=1;
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
         print "1..0\n";
index 293b515..4d6c84a 100755 (executable)
@@ -2,7 +2,7 @@
 $|=1;
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
         print "1..0\n";
index 2689d19..b6a1a69 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (($Config{'extensions'} !~ /\bSDBM_File\b/) && ($^O ne 'VMS')){
        print "1..0\n";
index 46cea39..c36fdb8 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..4\n";
index 677caec..3b58d70 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..3\n";
index 75d6561..6b9c244 100755 (executable)
@@ -3,7 +3,8 @@
 BEGIN {
     chdir 't' if -d 't';
     $dir = "self-$$";
-    unshift @INC, ("./$dir", "../lib");
+    @INC = $dir;
+    push @INC, '../lib';
 
     print "1..19\n";
 
index d5e1848..7017a54 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bSocket\b/ && 
         !(($^O eq 'VMS') && $Config{d_socket})) {
index a04cccd..d35f264 100755 (executable)
@@ -18,7 +18,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Text::Soundex;
diff --git a/t/lib/st-06compat.t b/t/lib/st-06compat.t
new file mode 100644 (file)
index 0000000..e1a0780
--- /dev/null
@@ -0,0 +1,132 @@
+#!./perl
+
+# $Id: compat-0.6.t,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: compat-0.6.t,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+BEGIN {
+    chdir('t') if -d 't';    
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+print "1..8\n";
+
+use Storable qw(freeze nfreeze thaw);
+
+package TIED_HASH;
+
+sub TIEHASH {
+       my $self = bless {}, shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($key) = @_;
+       $main::hash_fetch++;
+       return $self->{$key};
+}
+
+sub STORE {
+       my $self = shift;
+       my ($key, $val) = @_;
+       $self->{$key} = $val;
+}
+
+package SIMPLE;
+
+sub make {
+       my $self = bless [], shift;
+       my ($x) = @_;
+       $self->[0] = $x;
+       return $self;
+}
+
+package ROOT;
+
+sub make {
+       my $self = bless {}, shift;
+       my $h = tie %hash, TIED_HASH;
+       $self->{h} = $h;
+       $self->{ref} = \%hash;
+       my @pool;
+       for (my $i = 0; $i < 5; $i++) {
+               push(@pool, SIMPLE->make($i));
+       }
+       $self->{obj} = \@pool;
+       my @a = ('string', $h, $self);
+       $self->{a} = \@a;
+       $self->{num} = [1, 0, -3, -3.14159, 456, 4.5];
+       $h->{key1} = 'val1';
+       $h->{key2} = 'val2';
+       return $self;
+};
+
+sub num { $_[0]->{num} }
+sub h   { $_[0]->{h} }
+sub ref { $_[0]->{ref} }
+sub obj { $_[0]->{obj} }
+
+package main;
+
+my $r = ROOT->make;
+
+my $data = '';
+while (<DATA>) {
+       next if /^#/;
+       $data .= unpack("u", $_);
+}
+
+ok 1, length $data == 278;
+
+my $y = thaw($data);
+ok 2, 1;
+ok 3, ref $y eq 'ROOT';
+
+$Storable::canonical = 1;              # Prevent "used once" warning
+$Storable::canonical = 1;
+# Allow for long double string conversions.
+$y->{num}->[3] += 0;
+$r->{num}->[3] += 0;
+ok 4, nfreeze($y) eq nfreeze($r);
+
+ok 5, $y->ref->{key1} eq 'val1';
+ok 6, $y->ref->{key2} eq 'val2';
+ok 7, $hash_fetch == 2;
+
+my $num = $r->num;
+my $ok = 1;
+for (my $i = 0; $i < @$num; $i++) {
+       do { $ok = 0; last } unless $num->[$i] == $y->num->[$i];
+}
+ok 8, $ok;
+
+__END__
+#
+# using Storable-0.6@11, output of: print pack("u", nfreeze(ROOT->make));
+# original size: 278 bytes
+#
+M`P,````%!`(````&"(%8"(!8"'U8"@@M,RXQ-#$U.5@)```!R%@*`S0N-5A8
+M6`````-N=6T$`P````(*!'9A;#%8````!&ME>3$*!'9A;#)8````!&ME>3)B
+M"51)141?2$%32%A8`````6@$`@````,*!G-T<FEN9U@$``````I8!```````
+M6%A8`````6$$`@````4$`@````$(@%AB!E-)35!,15A8!`(````!"(%88@93
+M24U03$586`0"`````0B"6&(&4TE-4$Q%6%@$`@````$(@UAB!E-)35!,15A8
+M!`(````!"(188@9324U03$586%A8`````V]B:@0,!``````*6%A8`````W)E
+(9F($4D]/5%@`
diff --git a/t/lib/st-blessed.t b/t/lib/st-blessed.t
new file mode 100644 (file)
index 0000000..b1a18e6
--- /dev/null
@@ -0,0 +1,104 @@
+#!./perl
+
+# $Id: blessed.t,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: blessed.t,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(freeze thaw);
+
+print "1..10\n";
+
+package SHORT_NAME;
+
+sub make { bless [], shift }
+
+package SHORT_NAME_WITH_HOOK;
+
+sub make { bless [], shift }
+
+sub STORABLE_freeze {
+       my $self = shift;
+       return ("", $self);
+}
+
+sub STORABLE_thaw {
+       my $self = shift;
+       my $cloning = shift;
+       my ($x, $obj) = @_;
+       die "STORABLE_thaw" unless $obj eq $self;
+}
+
+package main;
+
+# Still less than 256 bytes, so long classname logic not fully exercised
+# Wait until Perl removes the restriction on identifier lengths.
+my $name = "LONG_NAME_" . 'xxxxxxxxxxxxx::' x 14 . "final";
+
+eval <<EOC;
+package $name;
+
+\@ISA = ("SHORT_NAME");
+EOC
+die $@ if $@;
+ok 1, $@ eq '';
+
+eval <<EOC;
+package ${name}_WITH_HOOK;
+
+\@ISA = ("SHORT_NAME_WITH_HOOK");
+EOC
+ok 2, $@ eq '';
+
+# Construct a pool of objects
+my @pool;
+
+for (my $i = 0; $i < 10; $i++) {
+       push(@pool, SHORT_NAME->make);
+       push(@pool, SHORT_NAME_WITH_HOOK->make);
+       push(@pool, $name->make);
+       push(@pool, "${name}_WITH_HOOK"->make);
+}
+
+my $x = freeze \@pool;
+ok 3, 1;
+
+my $y = thaw $x;
+ok 4, ref $y eq 'ARRAY';
+ok 5, @{$y} == @pool;
+
+ok 6, ref $y->[0] eq 'SHORT_NAME';
+ok 7, ref $y->[1] eq 'SHORT_NAME_WITH_HOOK';
+ok 8, ref $y->[2] eq $name;
+ok 9, ref $y->[3] eq "${name}_WITH_HOOK";
+
+my $good = 1;
+for (my $i = 0; $i < 10; $i++) {
+       do { $good = 0; last } unless ref $y->[4*$i]   eq 'SHORT_NAME';
+       do { $good = 0; last } unless ref $y->[4*$i+1] eq 'SHORT_NAME_WITH_HOOK';
+       do { $good = 0; last } unless ref $y->[4*$i+2] eq $name;
+       do { $good = 0; last } unless ref $y->[4*$i+3] eq "${name}_WITH_HOOK";
+}
+ok 10, $good;
+
diff --git a/t/lib/st-canonical.t b/t/lib/st-canonical.t
new file mode 100644 (file)
index 0000000..b55669b
--- /dev/null
@@ -0,0 +1,153 @@
+#!./perl
+
+# $Id: canonical.t,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#  
+# $Log: canonical.t,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+}
+
+
+use Storable qw(freeze thaw dclone);
+use vars qw($debugging $verbose);
+
+print "1..8\n";
+
+sub ok {
+    my($testno, $ok) = @_;
+    print "not " unless $ok;
+    print "ok $testno\n";
+}
+
+
+# Uncomment the folowing line to get a dump of the constructed data structure
+# (you may want to reduce the size of the hashes too)
+# $debugging = 1;
+
+$hashsize = 100;
+$maxhash2size = 100;
+$maxarraysize = 100;
+
+# Use MD5 if its available to make random string keys
+
+eval { require "MD5.pm" };
+$gotmd5 = !$@;
+
+# Use Data::Dumper if debugging and it is available to create an ASCII dump
+
+if ($debugging) {
+    eval { require "Data/Dumper.pm" };
+    $gotdd  = !$@;
+}
+
+@fixed_strings = ("January", "February", "March", "April", "May", "June",
+                 "July", "August", "September", "October", "November", "December" );
+
+# Build some arbitrarily complex data structure starting with a top level hash
+# (deeper levels contain scalars, references to hashes or references to arrays);
+
+for (my $i = 0; $i < $hashsize; $i++) {
+       my($k) = int(rand(1_000_000));
+       $k = MD5->hexhash($k) if $gotmd5 and int(rand(2));
+       $a1{$k} = { key => "$k", value => $i };
+
+       # A third of the elements are references to further hashes
+
+       if (int(rand(1.5))) {
+               my($hash2) = {};
+               my($hash2size) = int(rand($maxhash2size));
+               while ($hash2size--) {
+                       my($k2) = $k . $i . int(rand(100));
+                       $hash2->{$k2} = $fixed_strings[rand(int(@fixed_strings))];
+               }
+               $a1{$k}->{value} = $hash2;
+       }
+
+       # A further third are references to arrays
+
+       elsif (int(rand(2))) {
+               my($arr_ref) = [];
+               my($arraysize) = int(rand($maxarraysize));
+               while ($arraysize--) {
+                       push(@$arr_ref, $fixed_strings[rand(int(@fixed_strings))]);
+               }
+               $a1{$k}->{value} = $arr_ref;
+       }       
+}
+
+
+print STDERR Data::Dumper::Dumper(\%a1) if ($verbose and $gotdd);
+
+
+# Copy the hash, element by element in order of the keys
+
+foreach $k (sort keys %a1) {
+    $a2{$k} = { key => "$k", value => $a1{$k}->{value} };
+}
+
+# Deep clone the hash
+
+$a3 = dclone(\%a1);
+
+# In canonical mode the frozen representation of each of the hashes
+# should be identical
+
+$Storable::canonical = 1;
+
+$x1 = freeze(\%a1);
+$x2 = freeze(\%a2);
+$x3 = freeze($a3);
+
+ok 1, (length($x1) > $hashsize);       # sanity check
+ok 2, length($x1) == length($x2);      # idem
+ok 3, $x1 eq $x2;
+ok 4, $x1 eq $x3;
+
+# In normal mode it is exceedingly unlikely that the frozen
+# representaions of all the hashes will be the same (normally the hash
+# elements are frozen in the order they are stored internally,
+# i.e. pseudo-randomly).
+
+$Storable::canonical = 0;
+
+$x1 = freeze(\%a1);
+$x2 = freeze(\%a2);
+$x3 = freeze($a3);
+
+
+# Two out of three the same may be a coincidence, all three the same
+# is much, much more unlikely.  Still it could happen, so this test
+# may report a false negative.
+
+ok 5, ($x1 ne $x2) || ($x1 ne $x3);    
+
+
+# Ensure refs to "undef" values are properly shared
+# Same test as in t/dclone.t to ensure the "canonical" code is also correct
+
+my $hash;
+push @{$$hash{''}}, \$$hash{a};
+ok 6, $$hash{''}[0] == \$$hash{a};
+
+my $cloned = dclone(dclone($hash));
+ok 7, $$cloned{''}[0] == \$$cloned{a};
+
+$$cloned{a} = "blah";
+ok 8, $$cloned{''}[0] == \$$cloned{a};
+
diff --git a/t/lib/st-dclone.t b/t/lib/st-dclone.t
new file mode 100644 (file)
index 0000000..38c82eb
--- /dev/null
@@ -0,0 +1,82 @@
+#!./perl
+
+# $Id: dclone.t,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: dclone.t,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+
+use Storable qw(dclone);
+
+print "1..9\n";
+
+$a = 'toto';
+$b = \$a;
+$c = bless {}, CLASS;
+$c->{attribute} = 'attrval';
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$c);
+@a = ('first', undef, 3, -4, -3.14159, 456, 4.5,
+       $b, \$a, $a, $c, \$c, \%a);
+
+print "not " unless defined ($aref = dclone(\@a));
+print "ok 1\n";
+
+$dumped = &dump(\@a);
+print "ok 2\n";
+
+$got = &dump($aref);
+print "ok 3\n";
+
+print "not " unless $got eq $dumped; 
+print "ok 4\n";
+
+package FOO; @ISA = qw(Storable);
+
+sub make {
+       my $self = bless {};
+       $self->{key} = \%main::a;
+       return $self;
+};
+
+package main;
+
+$foo = FOO->make;
+print "not " unless defined($r = $foo->dclone);
+print "ok 5\n";
+
+print "not " unless &dump($foo) eq &dump($r);
+print "ok 6\n";
+
+# Ensure refs to "undef" values are properly shared during cloning
+my $hash;
+push @{$$hash{''}}, \$$hash{a};
+print "not " unless $$hash{''}[0] == \$$hash{a};
+print "ok 7\n";
+
+my $cloned = dclone(dclone($hash));
+print "not " unless $$cloned{''}[0] == \$$cloned{a};
+print "ok 8\n";
+
+$$cloned{a} = "blah";
+print "not " unless $$cloned{''}[0] == \$$cloned{a};
+print "ok 9\n";
+
diff --git a/t/lib/st-dump.pl b/t/lib/st-dump.pl
new file mode 100644 (file)
index 0000000..9b1f3d1
--- /dev/null
@@ -0,0 +1,146 @@
+;# $Id: dump.pl,v 1.0 2000/09/01 19:40:41 ram Exp $
+;#
+;#  Copyright (c) 1995-2000, Raphael Manfredi
+;#  
+;#  You may redistribute only under the same terms as Perl 5, as specified
+;#  in the README file that comes with the distribution.
+;#
+;# $Log: dump.pl,v $
+;# Revision 1.0  2000/09/01 19:40:41  ram
+;# Baseline for first official release.
+;#
+
+sub ok {
+       my ($num, $ok) = @_;
+       print "not " unless $ok;
+       print "ok $num\n";
+}
+
+package dump;
+use Carp;
+
+%dump = (
+       'SCALAR'        => 'dump_scalar',
+       'ARRAY'         => 'dump_array',
+       'HASH'          => 'dump_hash',
+       'REF'           => 'dump_ref',
+);
+
+# Given an object, dump its transitive data closure
+sub main'dump {
+       my ($object) = @_;
+       croak "Not a reference!" unless ref($object);
+       local %dumped;
+       local %object;
+       local $count = 0;
+       local $dumped = '';
+       &recursive_dump($object, 1);
+       return $dumped;
+}
+
+# This is the root recursive dumping routine that may indirectly be
+# called by one of the routine it calls...
+# The link parameter is set to false when the reference passed to
+# the routine is an internal temporay variable, implying the object's
+# address is not to be dumped in the %dumped table since it's not a
+# user-visible object.
+sub recursive_dump {
+       my ($object, $link) = @_;
+
+       # Get something like SCALAR(0x...) or TYPE=SCALAR(0x...).
+       # Then extract the bless, ref and address parts of that string.
+
+       my $what = "$object";           # Stringify
+       my ($bless, $ref, $addr) = $what =~ /^(\w+)=(\w+)\((0x.*)\)$/;
+       ($ref, $addr) = $what =~ /^(\w+)\((0x.*)\)$/ unless $bless;
+
+       # Special case for references to references. When stringified,
+       # they appear as being scalars. However, ref() correctly pinpoints
+       # them as being references indirections. And that's it.
+
+       $ref = 'REF' if ref($object) eq 'REF';
+
+       # Make sure the object has not been already dumped before.
+       # We don't want to duplicate data. Retrieval will know how to
+       # relink from the previously seen object.
+
+       if ($link && $dumped{$addr}++) {
+               my $num = $object{$addr};
+               $dumped .= "OBJECT #$num seen\n";
+               return;
+       }
+
+       my $objcount = $count++;
+       $object{$addr} = $objcount;
+
+       # Call the appropriate dumping routine based on the reference type.
+       # If the referenced was blessed, we bless it once the object is dumped.
+       # The retrieval code will perform the same on the last object retrieved.
+
+       croak "Unknown simple type '$ref'" unless defined $dump{$ref};
+
+       &{$dump{$ref}}($object);        # Dump object
+       &bless($bless) if $bless;       # Mark it as blessed, if necessary
+
+       $dumped .= "OBJECT $objcount\n";
+}
+
+# Indicate that current object is blessed
+sub bless {
+       my ($class) = @_;
+       $dumped .= "BLESS $class\n";
+}
+
+# Dump single scalar
+sub dump_scalar {
+       my ($sref) = @_;
+       my $scalar = $$sref;
+       unless (defined $scalar) {
+               $dumped .= "UNDEF\n";
+               return;
+       }
+       my $len = length($scalar);
+       $dumped .= "SCALAR len=$len $scalar\n";
+}
+
+# Dump array
+sub dump_array {
+       my ($aref) = @_;
+       my $items = 0 + @{$aref};
+       $dumped .= "ARRAY items=$items\n";
+       foreach $item (@{$aref}) {
+               unless (defined $item) {
+                       $dumped .= 'ITEM_UNDEF' . "\n";
+                       next;
+               }
+               $dumped .= 'ITEM ';
+               &recursive_dump(\$item, 1);
+       }
+}
+
+# Dump hash table
+sub dump_hash {
+       my ($href) = @_;
+       my $items = scalar(keys %{$href});
+       $dumped .= "HASH items=$items\n";
+       foreach $key (sort keys %{$href}) {
+               $dumped .= 'KEY ';
+               &recursive_dump(\$key, undef);
+               unless (defined $href->{$key}) {
+                       $dumped .= 'VALUE_UNDEF' . "\n";
+                       next;
+               }
+               $dumped .= 'VALUE ';
+               &recursive_dump(\$href->{$key}, 1);
+       }
+}
+
+# Dump reference to reference
+sub dump_ref {
+       my ($rref) = @_;
+       my $deref = $$rref;                             # Follow reference to reference
+       $dumped .= 'REF ';
+       &recursive_dump($deref, 1);             # $dref is a reference
+}
+
+1;
diff --git a/t/lib/st-forgive.t b/t/lib/st-forgive.t
new file mode 100644 (file)
index 0000000..5881098
--- /dev/null
@@ -0,0 +1,67 @@
+#!./perl
+
+# $Id: forgive.t,v 1.0.1.1 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# Original Author: Ulrich Pfeifer
+# (C) Copyright 1997, Universitat Dortmund, all rights reserved.
+#
+# $Log: forgive.t,v $
+# Revision 1.0.1.1  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+}
+
+use Storable qw(store retrieve);
+use File::Spec;
+
+print "1..8\n";
+
+my $test = 1;
+my $bad = ['foo', sub { 1 },  'bar'];
+my $result;
+
+eval {$result = store ($bad , 'store')};
+print ((!defined $result)?"ok $test\n":"not ok $test\n"); $test++;
+print (($@ ne '')?"ok $test\n":"not ok $test\n"); $test++;
+
+$Storable::forgive_me=1;
+
+my $devnull = File::Spec->devnull;
+
+open(SAVEERR, ">&STDERR");
+open(STDERR, ">$devnull") or 
+  ( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
+
+eval {$result = store ($bad , 'store')};
+
+open(STDERR, ">&SAVEERR");
+
+print ((defined $result)?"ok $test\n":"not ok $test\n"); $test++;
+print (($@ eq '')?"ok $test\n":"not ok $test\n"); $test++;
+
+my $ret = retrieve('store');
+print ((defined $ret)?"ok $test\n":"not ok $test\n"); $test++;
+print (($ret->[0] eq 'foo')?"ok $test\n":"not ok $test\n"); $test++;
+print (($ret->[2] eq 'bar')?"ok $test\n":"not ok $test\n"); $test++;
+print ((ref $ret->[1] eq 'SCALAR')?"ok $test\n":"not ok $test\n"); $test++;
+
+
+END { 1 while unlink 'store' }
diff --git a/t/lib/st-freeze.t b/t/lib/st-freeze.t
new file mode 100644 (file)
index 0000000..37631ed
--- /dev/null
@@ -0,0 +1,119 @@
+#!./perl
+
+# $Id: freeze.t,v 1.0 2000/09/01 19:40:41 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: freeze.t,v $
+# Revision 1.0  2000/09/01 19:40:41  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+
+use Storable qw(freeze nfreeze thaw);
+
+print "1..15\n";
+
+$a = 'toto';
+$b = \$a;
+$c = bless {}, CLASS;
+$c->{attribute} = $b;
+$d = {};
+$e = [];
+$d->{'a'} = $e;
+$e->[0] = $d;
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$c);
+@a = ('first', undef, 3, -4, -3.14159, 456, 4.5, $d, \$d, \$e, $e,
+       $b, \$a, $a, $c, \$c, \%a);
+
+print "not " unless defined ($f1 = freeze(\@a));
+print "ok 1\n";
+
+$dumped = &dump(\@a);
+print "ok 2\n";
+
+$root = thaw($f1);
+print "not " unless defined $root;
+print "ok 3\n";
+
+$got = &dump($root);
+print "ok 4\n";
+
+print "not " unless $got eq $dumped; 
+print "ok 5\n";
+
+package FOO; @ISA = qw(Storable);
+
+sub make {
+       my $self = bless {};
+       $self->{key} = \%main::a;
+       return $self;
+};
+
+package main;
+
+$foo = FOO->make;
+print "not " unless $f2 = $foo->freeze;
+print "ok 6\n";
+
+print "not " unless $f3 = $foo->nfreeze;
+print "ok 7\n";
+
+$root3 = thaw($f3);
+print "not " unless defined $root3;
+print "ok 8\n";
+
+print "not " unless &dump($foo) eq &dump($root3);
+print "ok 9\n";
+
+$root = thaw($f2);
+print "not " unless &dump($foo) eq &dump($root);
+print "ok 10\n";
+
+print "not " unless &dump($root3) eq &dump($root);
+print "ok 11\n";
+
+$other = freeze($root);
+print "not " unless length($other) == length($f2);
+print "ok 12\n";
+
+$root2 = thaw($other);
+print "not " unless &dump($root2) eq &dump($root);
+print "ok 13\n";
+
+$VAR1 = [
+       'method',
+       1,
+       'prepare',
+       'SELECT table_name, table_owner, num_rows FROM iitables
+                  where table_owner != \'$ingres\' and table_owner != \'DBA\''
+];
+
+$x = nfreeze($VAR1);
+$VAR2 = thaw($x);
+print "not " unless $VAR2->[3] eq $VAR1->[3];
+print "ok 14\n";
+
+# Test the workaround for LVALUE bug in perl 5.004_04 -- from Gisle Aas
+sub foo { $_[0] = 1 }
+$foo = [];
+foo($foo->[1]);
+eval { freeze($foo) };
+print "not " if $@;
+print "ok 15\n";
+
diff --git a/t/lib/st-lock.t b/t/lib/st-lock.t
new file mode 100644 (file)
index 0000000..28fe664
--- /dev/null
@@ -0,0 +1,50 @@
+#!./perl
+
+# $Id: lock.t,v 1.0.1.1 2000/09/28 21:44:06 ram Exp $
+#
+#  @COPYRIGHT@
+#
+# $Log: lock.t,v $
+# Revision 1.0.1.1  2000/09/28 21:44:06  ram
+# patch2: created.
+#
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    if (!$Config{'d_flock'} && !$Config{'d_fcntl'} && !$Config{'d_lockf'}) {
+        print "1..0 # Skip: no flock or flock emulation on this platform\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(lock_store lock_retrieve);
+
+print "1..5\n";
+
+@a = ('first', undef, 3, -4, -3.14159, 456, 4.5);
+
+#
+# We're just ensuring things work, we're not validating locking.
+#
+
+ok 1, defined lock_store(\@a, 'store');
+ok 2, $dumped = &dump(\@a);
+
+$root = lock_retrieve('store');
+ok 3, ref $root eq 'ARRAY';
+ok 4, @a == @$root;
+ok 5, &dump($root) eq $dumped; 
+
+unlink 't/store';
+
diff --git a/t/lib/st-overload.t b/t/lib/st-overload.t
new file mode 100644 (file)
index 0000000..8224a05
--- /dev/null
@@ -0,0 +1,55 @@
+#!./perl
+
+# $Id: overload.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#  
+# $Log: overload.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(freeze thaw);
+
+print "1..7\n";
+
+package OVERLOADED;
+
+use overload
+       '""' => sub { $_[0][0] };
+
+package main;
+
+$a = bless [77], OVERLOADED;
+
+$b = thaw freeze $a;
+ok 1, ref $b eq 'OVERLOADED';
+ok 2, "$b" eq "77";
+
+$c = thaw freeze \$a;
+ok 3, ref $c eq 'REF';
+ok 4, ref $$c eq 'OVERLOADED';
+ok 5, "$$c" eq "77";
+
+$d = thaw freeze [$a, $a];
+ok 6, "$d->[0]" eq "77";
+$d->[0][0]++;
+ok 7, "$d->[1]" eq "78";
+
diff --git a/t/lib/st-recurse.t b/t/lib/st-recurse.t
new file mode 100644 (file)
index 0000000..dcf6d1a
--- /dev/null
@@ -0,0 +1,235 @@
+#!./perl
+
+# $Id: recurse.t,v 1.0.1.1 2000/09/17 16:48:05 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#  
+# $Log: recurse.t,v $
+# Revision 1.0.1.1  2000/09/17 16:48:05  ram
+# patch1: added test case for store hook bug
+#
+# $Log: recurse.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(freeze thaw dclone);
+
+print "1..28\n";
+
+package OBJ_REAL;
+
+use Storable qw(freeze thaw);
+
+@x = ('a', 1);
+
+sub make { bless [], shift }
+
+sub STORABLE_freeze {
+       my $self = shift;
+       my $cloning = shift;
+       die "STORABLE_freeze" unless Storable::is_storing;
+       return (freeze(\@x), $self);
+}
+
+sub STORABLE_thaw {
+       my $self = shift;
+       my $cloning = shift;
+       my ($x, $obj) = @_;
+       die "STORABLE_thaw #1" unless $obj eq $self;
+       my $len = length $x;
+       my $a = thaw $x;
+       die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
+       die "STORABLE_thaw #3" unless @$a == 2 && $a->[0] eq 'a' && $a->[1] == 1;
+       @$self = @$a;
+       die "STORABLE_thaw #4" unless Storable::is_retrieving;
+}
+
+package OBJ_SYNC;
+
+@x = ('a', 1);
+
+sub make { bless {}, shift }
+
+sub STORABLE_freeze {
+       my $self = shift;
+       my ($cloning) = @_;
+       return if $cloning;
+       return ("", \@x, $self);
+}
+
+sub STORABLE_thaw {
+       my $self = shift;
+       my ($cloning, $undef, $a, $obj) = @_;
+       die "STORABLE_thaw #1" unless $obj eq $self;
+       die "STORABLE_thaw #2" unless ref $a eq 'ARRAY' || @$a != 2;
+       $self->{ok} = $self;
+}
+
+package OBJ_SYNC2;
+
+use Storable qw(dclone);
+
+sub make {
+       my $self = bless {}, shift;
+       my ($ext) = @_;
+       $self->{sync} = OBJ_SYNC->make;
+       $self->{ext} = $ext;
+       return $self;
+}
+
+sub STORABLE_freeze {
+       my $self = shift;
+       my $t = dclone($self->{sync});
+       return ("", [$t, $self->{ext}], $self, $self->{ext});
+}
+
+sub STORABLE_thaw {
+       my $self = shift;
+       my ($cloning, $undef, $a, $obj, $ext) = @_;
+       die "STORABLE_thaw #1" unless $obj eq $self;
+       die "STORABLE_thaw #2" unless ref $a eq 'ARRAY';
+       $self->{ok} = $self;
+       ($self->{sync}, $self->{ext}) = @$a;
+}
+
+package OBJ_REAL2;
+
+use Storable qw(freeze thaw);
+
+$MAX = 20;
+$recursed = 0;
+$hook_called = 0;
+
+sub make { bless [], shift }
+
+sub STORABLE_freeze {
+       my $self = shift;
+       $hook_called++;
+       return (freeze($self), $self) if ++$recursed < $MAX;
+       return ("no", $self);
+}
+
+sub STORABLE_thaw {
+       my $self = shift;
+       my $cloning = shift;
+       my ($x, $obj) = @_;
+       die "STORABLE_thaw #1" unless $obj eq $self;
+       $self->[0] = thaw($x) if $x ne "no";
+       $recursed--;
+}
+
+package main;
+
+my $real = OBJ_REAL->make;
+my $x = freeze $real;
+ok 1, 1;
+
+my $y = thaw $x;
+ok 2, 1;
+ok 3, $y->[0] eq 'a';
+ok 4, $y->[1] == 1;
+
+my $sync = OBJ_SYNC->make;
+$x = freeze $sync;
+ok 5, 1;
+
+$y = thaw $x;
+ok 6, 1;
+ok 7, $y->{ok} == $y;
+
+my $ext = [1, 2];
+$sync = OBJ_SYNC2->make($ext);
+$x = freeze [$sync, $ext];
+ok 8, 1;
+
+my $z = thaw $x;
+$y = $z->[0];
+ok 9, 1;
+ok 10, $y->{ok} == $y;
+ok 11, ref $y->{sync} eq 'OBJ_SYNC';
+ok 12, $y->{ext} == $z->[1];
+
+$real = OBJ_REAL2->make;
+$x = freeze $real;
+ok 13, 1;
+ok 14, $OBJ_REAL2::recursed == $OBJ_REAL2::MAX;
+ok 15, $OBJ_REAL2::hook_called == $OBJ_REAL2::MAX;
+
+$y = thaw $x;
+ok 16, 1;
+ok 17, $OBJ_REAL2::recursed == 0;
+
+$x = dclone $real;
+ok 18, 1;
+ok 19, ref $x eq 'OBJ_REAL2';
+ok 20, $OBJ_REAL2::recursed == 0;
+ok 21, $OBJ_REAL2::hook_called == 2 * $OBJ_REAL2::MAX;
+
+ok 22, !Storable::is_storing;
+ok 23, !Storable::is_retrieving;
+
+#
+# The following was a test-case that Salvador Ortiz Garcia <sog@msg.com.mx>
+# sent me, along with a proposed fix.
+#
+
+package Foo;
+
+sub new {
+       my $class = shift;
+       my $dat = shift;
+       return bless {dat => $dat}, $class;
+}
+
+package Bar;
+sub new {
+       my $class = shift;
+       return bless {
+               a => 'dummy',
+               b => [ 
+                       Foo->new(1),
+                       Foo->new(2), # Second instance of a Foo 
+               ]
+       }, $class;
+}
+
+sub STORABLE_freeze {
+       my($self,$clonning) = @_;
+       return "$self->{a}", $self->{b};
+}
+
+sub STORABLE_thaw {
+       my($self,$clonning,$dummy,$o) = @_;
+       $self->{a} = $dummy;
+       $self->{b} = $o;
+}
+
+package main;
+
+my $bar = new Bar;
+my $bar2 = thaw freeze $bar;
+
+ok 24, ref($bar2) eq 'Bar';
+ok 25, ref($bar->{b}[0]) eq 'Foo';
+ok 26, ref($bar->{b}[1]) eq 'Foo';
+ok 27, ref($bar2->{b}[0]) eq 'Foo';
+ok 28, ref($bar2->{b}[1]) eq 'Foo';
+
diff --git a/t/lib/st-retrieve.t b/t/lib/st-retrieve.t
new file mode 100644 (file)
index 0000000..c968485
--- /dev/null
@@ -0,0 +1,78 @@
+#!./perl
+
+# $Id: retrieve.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: retrieve.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+
+use Storable qw(store retrieve nstore);
+
+print "1..14\n";
+
+$a = 'toto';
+$b = \$a;
+$c = bless {}, CLASS;
+$c->{attribute} = 'attrval';
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$c);
+@a = ('first', '', undef, 3, -4, -3.14159, 456, 4.5,
+       $b, \$a, $a, $c, \$c, \%a);
+
+print "not " unless defined store(\@a, 'store');
+print "ok 1\n";
+print "not " if Storable::last_op_in_netorder();
+print "ok 2\n";
+print "not " unless defined nstore(\@a, 'nstore');
+print "ok 3\n";
+print "not " unless Storable::last_op_in_netorder();
+print "ok 4\n";
+print "not " unless Storable::last_op_in_netorder();
+print "ok 5\n";
+
+$root = retrieve('store');
+print "not " unless defined $root;
+print "ok 6\n";
+print "not " if Storable::last_op_in_netorder();
+print "ok 7\n";
+
+$nroot = retrieve('nstore');
+print "not " unless defined $nroot;
+print "ok 8\n";
+print "not " unless Storable::last_op_in_netorder();
+print "ok 9\n";
+
+$d1 = &dump($root);
+print "ok 10\n";
+$d2 = &dump($nroot);
+print "ok 11\n";
+
+print "not " unless $d1 eq $d2; 
+print "ok 12\n";
+
+# Make sure empty string is defined at retrieval time
+print "not " unless defined $root->[1];
+print "ok 13\n";
+print "not " if length $root->[1];
+print "ok 14\n";
+
+END { 1 while unlink('store', 'nstore') }
+
diff --git a/t/lib/st-store.t b/t/lib/st-store.t
new file mode 100644 (file)
index 0000000..d26755f
--- /dev/null
@@ -0,0 +1,119 @@
+#!./perl
+
+# $Id: store.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: store.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+use Storable qw(store retrieve store_fd nstore_fd fd_retrieve);
+
+print "1..20\n";
+
+$a = 'toto';
+$b = \$a;
+$c = bless {}, CLASS;
+$c->{attribute} = 'attrval';
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$c);
+@a = ('first', undef, 3, -4, -3.14159, 456, 4.5,
+       $b, \$a, $a, $c, \$c, \%a);
+
+print "not " unless defined store(\@a, 'store');
+print "ok 1\n";
+
+$dumped = &dump(\@a);
+print "ok 2\n";
+
+$root = retrieve('store');
+print "not " unless defined $root;
+print "ok 3\n";
+
+$got = &dump($root);
+print "ok 4\n";
+
+print "not " unless $got eq $dumped; 
+print "ok 5\n";
+
+1 while unlink 'store';
+
+package FOO; @ISA = qw(Storable);
+
+sub make {
+       my $self = bless {};
+       $self->{key} = \%main::a;
+       return $self;
+};
+
+package main;
+
+$foo = FOO->make;
+print "not " unless $foo->store('store');
+print "ok 6\n";
+
+print "not " unless open(OUT, '>>store');
+print "ok 7\n";
+binmode OUT;
+
+print "not " unless defined store_fd(\@a, ::OUT);
+print "ok 8\n";
+print "not " unless defined nstore_fd($foo, ::OUT);
+print "ok 9\n";
+print "not " unless defined nstore_fd(\%a, ::OUT);
+print "ok 10\n";
+
+print "not " unless close(OUT);
+print "ok 11\n";
+
+print "not " unless open(OUT, 'store');
+binmode OUT;
+
+$r = fd_retrieve(::OUT);
+print "not " unless defined $r;
+print "ok 12\n";
+print "not " unless &dump($foo) eq &dump($r);
+print "ok 13\n";
+
+$r = fd_retrieve(::OUT);
+print "not " unless defined $r;
+print "ok 14\n";
+print "not " unless &dump(\@a) eq &dump($r);
+print "ok 15\n";
+
+$r = fd_retrieve(main::OUT);
+print "not " unless defined $r;
+print "ok 16\n";
+print "not " unless &dump($foo) eq &dump($r);
+print "ok 17\n";
+
+$r = fd_retrieve(::OUT);
+print "not " unless defined $r;
+print "ok 18\n";
+print "not " unless &dump(\%a) eq &dump($r);
+print "ok 19\n";
+
+eval { $r = fd_retrieve(::OUT); };
+print "not " unless $@;
+print "ok 20\n";
+
+close OUT;
+END { 1 while unlink 'store' }
+
+
diff --git a/t/lib/st-tied.t b/t/lib/st-tied.t
new file mode 100644 (file)
index 0000000..88131fe
--- /dev/null
@@ -0,0 +1,213 @@
+#!./perl
+
+# $Id: tied.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: tied.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(freeze thaw);
+
+print "1..22\n";
+
+($scalar_fetch, $array_fetch, $hash_fetch) = (0, 0, 0);
+
+package TIED_HASH;
+
+sub TIEHASH {
+       my $self = bless {}, shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($key) = @_;
+       $main::hash_fetch++;
+       return $self->{$key};
+}
+
+sub STORE {
+       my $self = shift;
+       my ($key, $value) = @_;
+       $self->{$key} = $value;
+}
+
+sub FIRSTKEY {
+       my $self = shift;
+       scalar keys %{$self};
+       return each %{$self};
+}
+
+sub NEXTKEY {
+       my $self = shift;
+       return each %{$self};
+}
+
+package TIED_ARRAY;
+
+sub TIEARRAY {
+       my $self = bless [], shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($idx) = @_;
+       $main::array_fetch++;
+       return $self->[$idx];
+}
+
+sub STORE {
+       my $self = shift;
+       my ($idx, $value) = @_;
+       $self->[$idx] = $value;
+}
+
+sub FETCHSIZE {
+       my $self = shift;
+       return @{$self};
+}
+
+package TIED_SCALAR;
+
+sub TIESCALAR {
+       my $scalar;
+       my $self = bless \$scalar, shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       $main::scalar_fetch++;
+       return $$self;
+}
+
+sub STORE {
+       my $self = shift;
+       my ($value) = @_;
+       $$self = $value;
+}
+
+package FAULT;
+
+$fault = 0;
+
+sub TIESCALAR {
+       my $pkg = shift;
+       return bless [@_], $pkg;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($href, $key) = @$self;
+       $fault++;
+       untie $href->{$key};
+       return $href->{$key} = 1;
+}
+
+package main;
+
+$a = 'toto';
+$b = \$a;
+
+$c = tie %hash, TIED_HASH;
+$d = tie @array, TIED_ARRAY;
+tie $scalar, TIED_SCALAR;
+
+#$scalar = 'foo';
+#$hash{'attribute'} = \$d;
+#$array[0] = $c;
+#$array[1] = \$scalar;
+
+### If I say
+###   $hash{'attribute'} = $d;
+### below, then dump() incorectly dumps the hash value as a string the second
+### time it is reached. I have not investigated enough to tell whether it's
+### a bug in my dump() routine or in the Perl tieing mechanism.
+$scalar = 'foo';
+$hash{'attribute'} = 'plain value';
+$array[0] = \$scalar;
+$array[1] = $c;
+$array[2] = \@array;
+
+@tied = (\$scalar, \@array, \%hash);
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$a, 'scalarref', \$scalar);
+@a = ('first', 3, -4, -3.14159, 456, 4.5, $d, \$d,
+       $b, \$a, $a, $c, \$c, \%a, \@array, \%hash, \@tied);
+
+ok 1, defined($f = freeze(\@a));
+
+$dumped = &dump(\@a);
+ok 2, 1;
+
+$root = thaw($f);
+ok 3, defined $root;
+
+$got = &dump($root);
+ok 4, 1;
+
+### Used to see the manifestation of the bug documented above.
+### print "original: $dumped";
+### print "--------\n";
+### print "got: $got";
+### print "--------\n";
+
+ok 5, $got eq $dumped; 
+
+$g = freeze($root);
+ok 6, length($f) == length($g);
+
+# Ensure the tied items in the retrieved image work
+@old = ($scalar_fetch, $array_fetch, $hash_fetch);
+@tied = ($tscalar, $tarray, $thash) = @{$root->[$#{$root}]};
+@type = qw(SCALAR  ARRAY  HASH);
+
+ok 7, tied $$tscalar;
+ok 8, tied @{$tarray};
+ok 9, tied %{$thash};
+
+@new = ($$tscalar, $tarray->[0], $thash->{'attribute'});
+@new = ($scalar_fetch, $array_fetch, $hash_fetch);
+
+# Tests 10..15
+for ($i = 0; $i < @new; $i++) {
+       print "not " unless $new[$i] == $old[$i] + 1;
+       printf "ok %d\n", 10 + 2*$i;    # Tests 10,12,14
+       print "not " unless ref $tied[$i] eq $type[$i];
+       printf "ok %d\n", 11 + 2*$i;    # Tests 11,13,15
+}
+
+# Check undef ties
+my $h = {};
+tie $h->{'x'}, 'FAULT', $h, 'x';
+my $hf = freeze($h);
+ok 16, defined $hf;
+ok 17, $FAULT::fault == 0;
+ok 18, $h->{'x'} == 1;
+ok 19, $FAULT::fault == 1;
+
+my $ht = thaw($hf);
+ok 20, defined $ht;
+ok 21, $ht->{'x'} == 1;
+ok 22, $FAULT::fault == 2;
+
diff --git a/t/lib/st-tiedhook.t b/t/lib/st-tiedhook.t
new file mode 100644 (file)
index 0000000..455cb05
--- /dev/null
@@ -0,0 +1,215 @@
+#!./perl
+
+# $Id: tied_hook.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: tied_hook.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(freeze thaw);
+
+print "1..21\n";
+
+($scalar_fetch, $array_fetch, $hash_fetch) = (0, 0, 0);
+
+package TIED_HASH;
+
+sub TIEHASH {
+       my $self = bless {}, shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($key) = @_;
+       $main::hash_fetch++;
+       return $self->{$key};
+}
+
+sub STORE {
+       my $self = shift;
+       my ($key, $value) = @_;
+       $self->{$key} = $value;
+}
+
+sub FIRSTKEY {
+       my $self = shift;
+       scalar keys %{$self};
+       return each %{$self};
+}
+
+sub NEXTKEY {
+       my $self = shift;
+       return each %{$self};
+}
+
+sub STORABLE_freeze {
+       my $self = shift;
+       $main::hash_hook1++;
+       return join(":", keys %$self) . ";" . join(":", values %$self);
+}
+
+sub STORABLE_thaw {
+       my ($self, $cloning, $frozen) = @_;
+       my ($keys, $values) = split(/;/, $frozen);
+       my @keys = split(/:/, $keys);
+       my @values = split(/:/, $values);
+       for (my $i = 0; $i < @keys; $i++) {
+               $self->{$keys[$i]} = $values[$i];
+       }
+       $main::hash_hook2++;
+}
+
+package TIED_ARRAY;
+
+sub TIEARRAY {
+       my $self = bless [], shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       my ($idx) = @_;
+       $main::array_fetch++;
+       return $self->[$idx];
+}
+
+sub STORE {
+       my $self = shift;
+       my ($idx, $value) = @_;
+       $self->[$idx] = $value;
+}
+
+sub FETCHSIZE {
+       my $self = shift;
+       return @{$self};
+}
+
+sub STORABLE_freeze {
+       my $self = shift;
+       $main::array_hook1++;
+       return join(":", @$self);
+}
+
+sub STORABLE_thaw {
+       my ($self, $cloning, $frozen) = @_;
+       @$self = split(/:/, $frozen);
+       $main::array_hook2++;
+}
+
+package TIED_SCALAR;
+
+sub TIESCALAR {
+       my $scalar;
+       my $self = bless \$scalar, shift;
+       return $self;
+}
+
+sub FETCH {
+       my $self = shift;
+       $main::scalar_fetch++;
+       return $$self;
+}
+
+sub STORE {
+       my $self = shift;
+       my ($value) = @_;
+       $$self = $value;
+}
+
+sub STORABLE_freeze {
+       my $self = shift;
+       $main::scalar_hook1++;
+       return $$self;
+}
+
+sub STORABLE_thaw {
+       my ($self, $cloning, $frozen) = @_;
+       $$self = $frozen;
+       $main::scalar_hook2++;
+}
+
+package main;
+
+$a = 'toto';
+$b = \$a;
+
+$c = tie %hash, TIED_HASH;
+$d = tie @array, TIED_ARRAY;
+tie $scalar, TIED_SCALAR;
+
+$scalar = 'foo';
+$hash{'attribute'} = 'plain value';
+$array[0] = \$scalar;
+$array[1] = $c;
+$array[2] = \@array;
+$array[3] = "plaine scalaire";
+
+@tied = (\$scalar, \@array, \%hash);
+%a = ('key', 'value', 1, 0, $a, $b, 'cvar', \$a, 'scalarref', \$scalar);
+@a = ('first', 3, -4, -3.14159, 456, 4.5, $d, \$d,
+       $b, \$a, $a, $c, \$c, \%a, \@array, \%hash, \@tied);
+
+ok 1, defined($f = freeze(\@a));
+
+$dumped = &dump(\@a);
+ok 2, 1;
+
+$root = thaw($f);
+ok 3, defined $root;
+
+$got = &dump($root);
+ok 4, 1;
+
+ok 5, $got ne $dumped;         # our hooks did not handle refs in array
+
+$g = freeze($root);
+ok 6, length($f) == length($g);
+
+# Ensure the tied items in the retrieved image work
+@old = ($scalar_fetch, $array_fetch, $hash_fetch);
+@tied = ($tscalar, $tarray, $thash) = @{$root->[$#{$root}]};
+@type = qw(SCALAR  ARRAY  HASH);
+
+ok 7, tied $$tscalar;
+ok 8, tied @{$tarray};
+ok 9, tied %{$thash};
+
+@new = ($$tscalar, $tarray->[0], $thash->{'attribute'});
+@new = ($scalar_fetch, $array_fetch, $hash_fetch);
+
+# Tests 10..15
+for ($i = 0; $i < @new; $i++) {
+       ok 10 + 2*$i, $new[$i] == $old[$i] + 1;         # Tests 10,12,14
+       ok 11 + 2*$i, ref $tied[$i] eq $type[$i];       # Tests 11,13,15
+}
+
+ok 16, $$tscalar eq 'foo';
+ok 17, $tarray->[3] eq 'plaine scalaire';
+ok 18, $thash->{'attribute'} eq 'plain value';
+
+# Ensure hooks were called
+ok 19, ($scalar_hook1 && $scalar_hook2);
+ok 20, ($array_hook1 && $array_hook2);
+ok 21, ($hash_hook1 && $hash_hook2);
+
diff --git a/t/lib/st-tieditems.t b/t/lib/st-tieditems.t
new file mode 100644 (file)
index 0000000..3d0abf7
--- /dev/null
@@ -0,0 +1,68 @@
+#!./perl
+
+# $Id: tied_items.t,v 1.0 2000/09/01 19:40:42 ram Exp $
+#
+#  Copyright (c) 1995-2000, Raphael Manfredi
+#  
+#  You may redistribute only under the same terms as Perl 5, as specified
+#  in the README file that comes with the distribution.
+#
+# $Log: tied_items.t,v $
+# Revision 1.0  2000/09/01 19:40:42  ram
+# Baseline for first official release.
+#
+
+#
+# Tests ref to items in tied hash/array structures.
+#
+
+sub BEGIN {
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+$^W = 0;
+
+print "1..8\n";
+
+use Storable qw(dclone);
+
+$h_fetches = 0;
+
+sub H::TIEHASH { bless \(my $x), "H" }
+sub H::FETCH { $h_fetches++; $_[1] - 70 }
+
+tie %h, "H";
+
+$ref = \$h{77};
+$ref2 = dclone $ref;
+
+ok 1, $h_fetches == 0;
+ok 2, $$ref2 eq $$ref;
+ok 3, $$ref2 == 7;
+ok 4, $h_fetches == 2;
+
+$a_fetches = 0;
+
+sub A::TIEARRAY { bless \(my $x), "A" }
+sub A::FETCH { $a_fetches++; $_[1] - 70 }
+
+tie @a, "A";
+
+$ref = \$a[78];
+$ref2 = dclone $ref;
+
+ok 5, $a_fetches == 0;
+ok 6, $$ref2 eq $$ref;
+ok 7, $$ref2 == 8;
+# I don't understand why it's 3 and not 2
+ok 8, $a_fetches == 3;
+
diff --git a/t/lib/st-utf8.t b/t/lib/st-utf8.t
new file mode 100644 (file)
index 0000000..2160308
--- /dev/null
@@ -0,0 +1,40 @@
+#!./perl
+
+# $Id: utf8.t,v 1.0.1.2 2000/09/28 21:44:17 ram Exp $
+#
+#  @COPYRIGHT@
+#
+# $Log: utf8.t,v $
+# Revision 1.0.1.2  2000/09/28 21:44:17  ram
+# patch2: fixed stupid typo
+#
+# Revision 1.0.1.1  2000/09/17 16:48:12  ram
+# patch1: created.
+#
+#
+
+sub BEGIN {
+    if ($] < 5.006) {
+       print "1..0 # Skip: no utf8 support\n";
+       exit 0;
+    }
+    chdir('t') if -d 't';
+    @INC = '.'; 
+    push @INC, '../lib';
+    require Config; import Config;
+    if ($Config{'extensions'} !~ /\bStorable\b/) {
+        print "1..0 # Skip: Storable was not built\n";
+        exit 0;
+    }
+    require 'lib/st-dump.pl';
+}
+
+sub ok;
+
+use Storable qw(thaw freeze);
+
+print "1..1\n";
+
+$x = chr(1234);
+ok 1, $x eq ${thaw freeze \$x};
+
index 14c919c..03449a3 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..8\n";
index 3cfe302..96625f2 100644 (file)
@@ -4,7 +4,7 @@
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        require Config; import Config;
        # Don't bother if there are no quad offsets.
        if ($Config{lseeksize} < 8) {
index e1927bc..7ad4204 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bSyslog\b/) {
        print "1..0 # Skip: Sys::Syslog was not built\n";
index daeee23..5ff3850 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Text::Wrap qw(&fill);
index 80395f4..ea9012c 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..3\n";
index bb1d5ca..af24036 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 use Text::Wrap qw(&wrap);
 
index 6b3c800..680e1af 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     if (! $Config{'use5005threads'}) {
        print "1..0 # Skip: not use5005threads\n";
@@ -13,7 +13,7 @@ BEGIN {
     $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
 }
 $| = 1;
-print "1..21\n";
+print "1..22\n";
 use Thread 'yield';
 print "ok 1\n";
 
@@ -89,6 +89,18 @@ my $long  = "This is short.";
 my $longe  = " short.";
 my $thr1 = new Thread \&threaded, $short, $shorte, "19";
 my $thr2 = new Thread \&threaded, $long, $longe, "20";
+my $thr3 = new Thread \&testsprintf, "21";
+
+sub testsprintf {
+  my $testno = shift;
+  # this may coredump if thread vars are not properly initialised
+  my $same = sprintf "%.0f", $testno;
+  if ($testno eq $same) {
+    print "ok $testno\n";
+  } else {
+    print "not ok $testno\t# '$testno' ne '$same'\n";
+  }
+}
 
 sub threaded {
   my ($string, $string_end, $testno) = @_;
@@ -115,4 +127,5 @@ EOT
 }
 $thr1->join;
 $thr2->join;
-print "ok 21\n";
+$thr3->join;
+print "ok 22\n";
index 23a0a94..b19aa0d 100755 (executable)
@@ -2,7 +2,8 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '.'; 
+    push @INC, '../lib';
 }    
 
 {
index 5a678a5..c4ae071 100755 (executable)
@@ -2,7 +2,8 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '.'; 
+    push @INC, '../lib';
 }
 
 use Tie::Array;
index cf3a183..f03f5d9 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Tie::Handle;
@@ -10,16 +10,16 @@ tie *tst,Tie::StdHandle;
 
 $f = 'tst';
 
-print "1..13\n";   
+print "1..13\n";
 
 # my $file tests
 
-unlink("afile.new") if -f "afile";     
-print "$!\nnot " unless open($f,"+>afile");
+unlink("afile.new") if -f "afile";
+print "$!\nnot " unless open($f,"+>afile") && open($f, "+<", "afile");
 print "ok 1\n";
 print "$!\nnot " unless binmode($f);
 print "ok 2\n";
-print "not " unless -f "afile";     
+print "not " unless -f "afile";
 print "ok 3\n";
 print "not " unless print $f "SomeData\n";
 print "ok 4\n";
@@ -44,4 +44,4 @@ print "not " unless eof($f);
 print "ok 12\n";
 print "not " unless close($f);
 print "ok 13\n";
-unlink("afile");     
+unlink("afile");
index 35ae1b8..31af30c 100755 (executable)
@@ -2,7 +2,8 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '.'; 
+    push @INC, '../lib';
 }
 
 use Tie::Array;
index 359d71e..100e076 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Time::Local;
index 20669f0..6949622 100755 (executable)
@@ -10,7 +10,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Math::Trig;
@@ -26,10 +26,11 @@ if ($^O eq 'unicos') { # See lib/Math/Complex.pm and t/lib/complex.t.
 }
 
 sub near ($$;$) {
-    abs($_[0] - $_[1]) < (defined $_[2] ? $_[2] : $eps);
+    my $e = defined $_[2] ? $_[2] : $eps;
+    $_[1] ? (abs($_[0]/$_[1] - 1) < $e) : abs($_[0]) < $e;
 }
 
-print "1..20\n";
+print "1..23\n";
 
 $x = 0.9;
 print 'not ' unless (near(tan($x), sin($x) / cos($x)));
@@ -137,24 +138,42 @@ use Math::Trig ':radial';
 }
 
 {
-        use Math::Trig 'great_circle_distance';
+    use Math::Trig 'great_circle_distance';
 
-       print 'not '
-           unless (near(great_circle_distance(0, 0, 0, pi/2), pi/2));
-       print "ok 18\n";
+    print 'not '
+       unless (near(great_circle_distance(0, 0, 0, pi/2), pi/2));
+    print "ok 18\n";
 
-       print 'not '
-           unless (near(great_circle_distance(0, 0, pi, pi), pi));
-       print "ok 19\n";
+    print 'not '
+       unless (near(great_circle_distance(0, 0, pi, pi), pi));
+    print "ok 19\n";
 
-       # London to Tokyo.
-       my @L = (deg2rad(-0.5), deg2rad(90 - 51.3));
-        my @T = (deg2rad(139.8),deg2rad(90 - 35.7));
+    # London to Tokyo.
+    my @L = (deg2rad(-0.5), deg2rad(90 - 51.3));
+    my @T = (deg2rad(139.8),deg2rad(90 - 35.7));
 
-       my $km = great_circle_distance(@L, @T, 6378);
+    my $km = great_circle_distance(@L, @T, 6378);
 
-        print 'not ' unless (near($km, 9605.26637021388));
-       print "ok 20\n";
+    print 'not ' unless (near($km, 9605.26637021388));
+    print "ok 20\n";
+}
+
+{
+    my $R2D = 57.295779513082320876798154814169;
+
+    sub frac { $_[0] - int($_[0]) }
+
+    my $lotta_radians = deg2rad(1E+20, 1);
+    print "not " unless near($lotta_radians,  1E+20/$R2D);
+    print "ok 21\n";
+
+    my $negat_degrees = rad2deg(-1E20, 1);
+    print "not " unless near($negat_degrees, -1E+20*$R2D);
+    print "ok 22\n";
+
+    my $posit_degrees = rad2deg(-10000, 1);
+    print "not " unless near($posit_degrees, -10000*$R2D);
+    print "ok 23\n";
 }
 
 # eof
index 691d44e..88fbc55 100644 (file)
@@ -3,11 +3,11 @@
 BEGIN {
        eval { my $q = pack "q", 0 };
        if ($@) {
-               print "1..0\n# no 64-bit types\n";
+               print "1..0\n# Skip: no 64-bit types\n";
                exit(0);
        }
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
 }
 
 # This could use many more tests.
@@ -16,7 +16,7 @@ BEGIN {
 # 32+ bit integers don't cause noise
 no warnings qw(overflow portable);
 
-print "1..52\n";
+print "1..55\n";
 
 my $q = 12345678901;
 my $r = 23456789012;
@@ -220,7 +220,7 @@ if ($^O ne 'unicos') {
     # especially if operating near the UV/IV limits the low-order bits
     # become mangled even by simple arithmetic operations.
     for (23..37) {
-       print "ok #_ # skipped: too imprecise numbers\n";
+       print "ok $_ # skipped: too imprecise numbers\n";
     }
 }
 
@@ -279,4 +279,19 @@ print "ok 51\n";
 print "not " unless (sprintf "%u", ~0)    eq '18446744073709551615';
 print "ok 52\n";
 
+# If the 53..55 fail you have problems in the parser's string->int conversion,
+# see toke.c:scan_num().
+
+$q = -9223372036854775808;
+print "# $q ne\n# -9223372036854775808\nnot " unless "$q" eq "-9223372036854775808";
+print "ok 53\n";
+
+$q =  9223372036854775807;
+print "# $q ne\n# 9223372036854775807\nnot " unless "$q" eq "9223372036854775807";
+print "ok 54\n";
+
+$q = 18446744073709551615;
+print "# $q ne\n# 18446744073709551615\nnot " unless "$q" eq "18446744073709551615";
+print "ok 55\n";
+
 # eof
index d115146..afaf6a1 100755 (executable)
@@ -2,7 +2,7 @@
 
 # $RCSfile: append.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:36 $
 
-print "1..3\n";
+print "1..13\n";
 
 $a = 'ab' . 'c';       # compile time
 $b = 'def';
@@ -19,3 +19,38 @@ $_ = $a;
 $_ .= $b;
 print "#3\t:$_: eq :abcdef:\n";
 if ($_ eq 'abcdef') {print "ok 3\n";} else {print "not ok 3\n";}
+
+# test that when right argument of concat is UTF8, and is the same
+# variable as the target, and the left argument is not UTF8, it no
+# longer frees the wrong string.
+{
+    sub r2 {
+       my $string = '';
+       $string .= pack("U0a*", 'mnopqrstuvwx');
+       $string = "abcdefghijkl$string";
+    }
+
+    r2() and print "ok $_\n" for qw/ 4 5 /;
+}
+
+# test that nul bytes get copied
+{
+    my($a, $ab) = ("a", "a\000b");
+    my($u, $ub) = map pack("U0a*", $_), $a, $ab;
+    my $t1 = $a; $t1 .= $ab;
+    print $t1 =~ /b/ ? "ok 6\n" : "not ok 6\t# $t1\n";
+    my $t2 = $a; $t2 .= $ub;
+    print $t2 =~ /b/ ? "ok 7\n" : "not ok 7\t# $t2\n";
+    my $t3 = $u; $t3 .= $ab;
+    print $t3 =~ /b/ ? "ok 8\n" : "not ok 8\t# $t3\n";
+    my $t4 = $u; $t4 .= $ub;
+    print $t4 =~ /b/ ? "ok 9\n" : "not ok 9\t# $t4\n";
+    my $t5 = $a; $t5 = $ab . $t5;
+    print $t5 =~ /b/ ? "ok 10\n" : "not ok 10\t# $t5\n";
+    my $t6 = $a; $t6 = $ub . $t6;
+    print $t6 =~ /b/ ? "ok 11\n" : "not ok 11\t# $t6\n";
+    my $t7 = $u; $t7 = $ab . $t7;
+    print $t7 =~ /b/ ? "ok 12\n" : "not ok 12\t# $t7\n";
+    my $t8 = $u; $t8 = $ub . $t8;
+    print $t8 =~ /b/ ? "ok 13\n" : "not ok 13\t# $t8\n";
+}
index 97a4a40..7cc84e3 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..66\n";
+print "1..70\n";
 
 #
 # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@@ -216,3 +216,16 @@ reify('ok');
 print "not " unless qw(foo bar snorfle)[2] eq 'snorfle';
 print "ok 66\n";
 
+@ary = (12,23,34,45,56);
+
+print "not " unless shift(@ary) == 12;
+print "ok 67\n";
+
+print "not " unless pop(@ary) == 56;
+print "ok 68\n";
+
+print "not " unless push(@ary,56) == 4;
+print "ok 69\n";
+
+print "not " unless unshift(@ary,12) == 5;
+print "ok 70\n";
index b95cec5..2d05b82 100755 (executable)
@@ -8,7 +8,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use strict;
index 615e4d3..2702004 100644 (file)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 sub NTESTS () ;
index cd7c957..5b91fd2 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 require Tie::Array;
diff --git a/t/op/bless.t b/t/op/bless.t
new file mode 100644 (file)
index 0000000..3aaceb8
--- /dev/null
@@ -0,0 +1,127 @@
+#!./perl
+
+print "1..31\n";
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+sub expected {
+    my($object, $package, $type) = @_;
+    return "" if (
+       ref($object) eq $package
+       && "$object" =~ /^\Q$package\E=(\w+)\(0x([0-9a-f]+)\)$/
+       && $1 eq $type
+       # in 64-bit platforms hex warns for 32+ -bit values
+       && do { no warnings 'portable'; hex($2) == $object }
+    );
+    print "# $object $package $type\n";
+    return "not ";
+}
+
+# test blessing simple types
+
+$a1 = bless {}, "A";
+print expected($a1, "A", "HASH"), "ok 1\n";
+$b1 = bless [], "B";
+print expected($b1, "B", "ARRAY"), "ok 2\n";
+$c1 = bless \(map "$_", "test"), "C";
+print expected($c1, "C", "SCALAR"), "ok 3\n";
+our $test = "foo"; $d1 = bless \*test, "D";
+print expected($d1, "D", "GLOB"), "ok 4\n";
+$e1 = bless sub { 1 }, "E";
+print expected($e1, "E", "CODE"), "ok 5\n";
+$f1 = bless \[], "F";
+print expected($f1, "F", "REF"), "ok 6\n";
+$g1 = bless \substr("test", 1, 2), "G";
+print expected($g1, "G", "LVALUE"), "ok 7\n";
+
+# blessing ref to object doesn't modify object
+
+print expected(bless(\$a1, "F"), "F", "REF"), "ok 8\n";
+print expected($a1, "A", "HASH"), "ok 9\n";
+
+# reblessing does modify object
+
+bless $a1, "A2";
+print expected($a1, "A2", "HASH"), "ok 10\n";
+
+# local and my
+{
+    local $a1 = bless $a1, "A3";       # should rebless outer $a1
+    local $b1 = bless [], "B3";
+    my $c1 = bless $c1, "C3";          # should rebless outer $c1
+    our $test2 = ""; my $d1 = bless \*test2, "D3";
+    print expected($a1, "A3", "HASH"), "ok 11\n";
+    print expected($b1, "B3", "ARRAY"), "ok 12\n";
+    print expected($c1, "C3", "SCALAR"), "ok 13\n";
+    print expected($d1, "D3", "GLOB"), "ok 14\n";
+}
+print expected($a1, "A3", "HASH"), "ok 15\n";
+print expected($b1, "B", "ARRAY"), "ok 16\n";
+print expected($c1, "C3", "SCALAR"), "ok 17\n";
+print expected($d1, "D", "GLOB"), "ok 18\n";
+
+# class is magic
+"E" =~ /(.)/;
+print expected(bless({}, $1), "E", "HASH"), "ok 19\n";
+{
+    local $! = 1;
+    my $string = "$!";
+    $! = 2;    # attempt to avoid cached string
+    $! = 1;
+    print expected(bless({}, $!), $string, "HASH"), "ok 20\n";
+
+# ref is ref to magic
+    {
+       {
+           package F;
+           sub test { ${$_[0]} eq $string or print "not " }
+       }
+       $! = 2;
+       $f1 = bless \$!, "F";
+       $! = 1;
+       $f1->test;
+       print "ok 21\n";
+    }
+}
+
+# ref is magic
+### example of magic variable that is a reference??
+
+# no class, or empty string (with a warning), or undef (with two)
+print expected(bless([]), 'main', "ARRAY"), "ok 22\n";
+{
+    local $SIG{__WARN__} = sub { push @w, join '', @_ };
+    use warnings;
+
+    $m = bless [];
+    print expected($m, 'main', "ARRAY"), "ok 23\n";
+    print @w ? "not ok 24\t# @w\n" : "ok 24\n";
+
+    @w = ();
+    $m = bless [], '';
+    print expected($m, 'main', "ARRAY"), "ok 25\n";
+    print @w != 1 ? "not ok 26\t# @w\n" : "ok 26\n";
+
+    @w = ();
+    $m = bless [], undef;
+    print expected($m, 'main', "ARRAY"), "ok 27\n";
+    print @w != 2 ? "not ok 28\t# @w\n" : "ok 28\n";
+}
+
+# class is a ref
+$a1 = bless {}, "A4";
+$b1 = eval { bless {}, $a1 };
+print $@ ? "ok 29\n" : "not ok 29\t# $b1\n";
+
+# class is an overloaded ref
+{
+    package H4;
+    use overload '""' => sub { "C4" };
+}
+$h1 = bless {}, "H4";
+$c4 = eval { bless \$test, $h1 };
+print expected($c4, 'C4', "SCALAR"), "ok 30\n";
+print $@ ? "not ok 31\t# $@" : "ok 31\n";
index 22a5bc9..fd080e6 100755 (executable)
@@ -6,10 +6,10 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
-print "1..30\n";
+print "1..38\n";
 
 # numerics
 print ((0xdead & 0xbeef) == 0x9ead ? "ok 1\n" : "not ok 1\n");
@@ -81,3 +81,53 @@ print "ok 27\n" if sprintf("%vd", v4095 ^ v801) eq 3294;
 print "ok 28\n" if sprintf("%vd", v4095.801.4095 & v801.4095) eq '801.801';
 print "ok 29\n" if sprintf("%vd", v4095.801.4095 | v801.4095) eq '4095.4095.4095';
 print "ok 30\n" if sprintf("%vd", v801.4095 ^ v4095.801.4095) eq '3294.3294.4095';
+#
+print "ok 31\n" if sprintf("%vd", v120.300 & v200.400) eq '72.256';
+print "ok 32\n" if sprintf("%vd", v120.300 | v200.400) eq '248.444';
+print "ok 33\n" if sprintf("%vd", v120.300 ^ v200.400) eq '176.188';
+#
+my $a = v120.300;
+my $b = v200.400;
+$a ^= $b;
+print "ok 34\n" if sprintf("%vd", $a) eq '176.188';
+my $a = v120.300;
+my $b = v200.400;
+$a |= $b;
+print "ok 35\n" if sprintf("%vd", $a) eq '248.444';
+
+#
+# UTF8 ~ behaviour
+#
+
+my @not36;
+
+for (0x100...0xFFF) {
+  $a = ~(chr $_);
+  push @not36, sprintf("%#03X", $_)
+      if $a ne chr(~$_) or length($a) != 1 or ~$a ne chr($_);
+}
+if (@not36) {
+    print "# test 36 failed: @not36\n";
+    print "not ";
+}
+print "ok 36\n";
+
+my @not37;
+
+for my $i (0xEEE...0xF00) {
+  for my $j (0x0..0x120) {
+    $a = ~(chr ($i) . chr $j);
+    push @not37, sprintf("%#03X %#03X", $i, $j)
+       if $a ne chr(~$i).chr(~$j) or
+          length($a) != 2 or 
+          ~$a ne chr($i).chr($j);
+  }
+}
+if (@not37) {
+    print "# test 37 failed: @not37\n";
+    print "not ";
+}
+print "ok 37\n";
+
+print "not " unless ~chr(~0) eq "\0";
+print "ok 38\n";
index c691d6f..5f3245f 100755 (executable)
@@ -7,7 +7,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Config;
index 9e714a7..33c74ea 100755 (executable)
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $SIG{__WARN__} = sub { $warns++; warn $_[0] };
     print "1..14\n";
 }
index cb0478b..a389946 100755 (executable)
@@ -7,7 +7,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -e '../lib';
+    @INC = '../lib';
 }
 
 if ($^O eq 'mpeix') {
index 3363dfd..d4aa292 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..9\n";
index e00d5fb..f757c79 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 use Config;
index 20167f3..f66af27 100755 (executable)
@@ -2,7 +2,7 @@
 
 # $RCSfile: flip.t,v $$Revision: 4.1 $$Date: 92/08/07 18:27:52 $
 
-print "1..9\n";
+print "1..10\n";
 
 @a = (1,2,3,4,5,6,7,8,9,10,11,12);
 
@@ -27,3 +27,10 @@ if ($x eq 3) {print "ok 8\n";} else {print "not ok 8 $x:$foo:\n";}
 
 $x = 3.14;
 if (($x...$x) eq "1") {print "ok 9\n";} else {print "not ok 9\n";}
+
+{
+    # coredump reported in bug 20001018.008
+    readline(UNKNOWN);
+    $. = 1;
+    print "ok 10\n" unless 1 .. 10;
+}
index 80c0b72..93cf673 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     require Config; import Config;
     unless ($Config{'d_fork'}
            or ($^O eq 'MSWin32' and $Config{useithreads}
@@ -374,3 +374,28 @@ else {
 EXPECT
 pipe_from_fork
 pipe_to_fork
+########
+$|=1;
+if ($pid = fork()) {
+    print "forked first kid\n";
+    print "waitpid() returned ok\n" if waitpid($pid,0) == $pid;
+}
+else {
+    print "first child\n";
+    exit(0);
+}
+if ($pid = fork()) {
+    print "forked second kid\n";
+    print "wait() returned ok\n" if wait() == $pid;
+}
+else {
+    print "second child\n";
+    exit(0);
+}
+EXPECT
+forked first kid
+first child
+waitpid() returned ok
+forked second kid
+second child
+wait() returned ok
index 4c27445..fc0ba77 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..6\n";
index 8d9bca1..cf2cafd 100755 (executable)
@@ -10,7 +10,7 @@
 #       break correctly as well.
 
 chdir 't' if -d 't';
-unshift @INC, "../lib";
+@INC = '../lib';
 $ENV{PERL5LIB} = "../lib";
 
 # turn warnings into fatal errors
index d4b0e87..211dc91 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, "../lib" if -d "../lib";
+    @INC = '../lib';
     eval {my @n = getgrgid 0};
     if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
        print "1..0 # Skip: $1\n";
@@ -70,7 +70,8 @@ my %seen;
 setgrent();
 while (<GR>) {
     chomp;
-    my @s = split /:/;
+    # LIMIT -1 so that groups with no users don't fall off
+    my @s = split /:/, $_, -1;
     my ($name_s,$passwd_s,$gid_s,$members_s) = @s;
     if (@s) {
        push @{ $seen{$name_s} }, $.;
@@ -139,7 +140,7 @@ print "ok ", $tst++;
 print "\t# (not necessarily serious: run t/op/grent.t by itself)" if $not;
 print "\n";
 
-# Test both the scalar and array contexts.
+# Test both the scalar and list contexts.
 
 my @gr1;
 
index bb10b75..431910b 100755 (executable)
--- a/t/op/gv.t
+++ b/t/op/gv.t
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }   
 
 use warnings;
index 9182273..8466a71 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use strict;
index 6ac0866..7d675a4 100755 (executable)
@@ -2,10 +2,10 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
-print "1..6\n";
+print "1..7\n";
 
 # compile time evaluation
 
@@ -28,3 +28,9 @@ print $x == -7 ? "ok 5\n" : "# expected -7, got $x\nnot ok 5\n";
     $y = (3/-10)*-10;
     print $x+$y == 3 && abs($x) < 10 ? "ok 6\n" : "not ok 6\n";
 }
+
+# check bad strings still get converted
+
+@x = ( 6, 8, 10);
+print "not " if $x["1foo"] != 8;
+print "ok 7\n";
index def5a9e..b50878e 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..6\n";
+print "1..10\n";
 
 @x = (1, 2, 3);
 if (join(':',@x) eq '1:2:3') {print "ok 1\n";} else {print "not ok 1\n";}
@@ -20,3 +20,27 @@ if ($f eq 'a,b,e') {print "ok 5\n";} else {print "not ok 5\n";}
 $f = 'a';
 $f = join $f, 'b', 'e', 'k';
 if ($f eq 'baeak') {print "ok 6\n";} else {print "# '$f'\nnot ok 6\n";}
+
+# 7,8 check for multiple read of tied objects
+{ package X;
+  sub TIESCALAR { my $x = 7; bless \$x };
+  sub FETCH { my $y = shift; $$y += 5 };
+  tie my $t, 'X';
+  my $r = join ':', $t, 99, $t, 99;
+  print "# expected '12:99:17:99' got '$r'\nnot " if $r ne '12:99:17:99';
+  print "ok 7\n";
+  $r = join '', $t, 99, $t, 99;
+  print "# expected '22992799' got '$r'\nnot " if $r ne '22992799';
+  print "ok 8\n";
+};
+
+# 9,10 and for multiple read of undef
+{ my $s = 5;
+  local ($^W, $SIG{__WARN__}) = ( 1, sub { $s+=4 } );
+  my $r = join ':', 'a', undef, $s, 'b', undef, $s, 'c';
+  print "# expected 'a::9:b::13:c' got '$r'\nnot " if $r ne 'a::9:b::13:c';
+  print "ok 9\n";
+  my $r = join '', 'a', undef, $s, 'b', undef, $s, 'c';
+  print "# expected 'a17b21c' got '$r'\nnot " if $r ne 'a17b21c';
+  print "ok 10\n";
+};
index f3f205e..181c842 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3; 
 
@@ -309,7 +309,7 @@ getpriority $$, $$          # getpriority
 time                           # time
 localtime $^T                  # localtime
 gmtime $^T                     # gmtime
-sleep 1                                # sleep
+'???'                          # sleep: can randomly fail
 '???'                          # alarm
 '???'                          # shmget
 '???'                          # shmctl
index 97c920c..feee8cc 100644 (file)
@@ -4,7 +4,7 @@
 
 BEGIN {
        chdir 't' if -d 't';
-       unshift @INC, '../lib';
+       @INC = '../lib';
        # Don't bother if there are no quad offsets.
        require Config; import Config;
        if ($Config{lseeksize} < 8) {
index f15201f..d57271a 100755 (executable)
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..7\n";
index 7739276..e2acb1f 100755 (executable)
@@ -3,7 +3,7 @@
 BEGIN {
     $| = 1;
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $SIG{__WARN__} = sub { die "Dying on warning: ", @_ };
 }
 
@@ -195,10 +195,10 @@ else {
        ok 29, ($Is_MSWin32 ? (`cmd /x /c set foo 2>NUL` eq "")
                                : (`echo \$foo` eq "\n") );
 
-       $ENV{NoNeSuCh} = "foo";
+       $ENV{__NoNeSuCh} = "foo";
        $0 = "bar";
-       ok 30, ($Is_MSWin32 ? (`cmd /x /c set NoNeSuCh` eq "NoNeSuCh=foo\n")
-                                               : (`echo \$NoNeSuCh` eq "foo\n") );
+       ok 30, ($Is_MSWin32 ? (`cmd /x /c set __NoNeSuCh` eq "__NoNeSuCh=foo\n")
+                           : (`echo \$__NoNeSuCh` eq "foo\n") );
 }
 
 {
index 6e25310..be4df75 100755 (executable)
@@ -6,7 +6,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 print "1..53\n";
index 00abc99..f442494 100755 (executable)
@@ -4,7 +4,7 @@
 # separate executable and can't simply use eval.
 
 chdir 't' if -d 't';
-unshift @INC, "../lib";
+@INC = '../lib';
 $ENV{PERL5LIB} = "../lib";
 
 $|=1;
@@ -346,7 +346,7 @@ print "you die joe!\n" unless "@x" eq 'x y z';
 /(?{"{"})/     # Check it outside of eval too
 EXPECT
 Sequence (?{...}) not terminated or not {}-balanced at - line 1, within pattern
-/(?{"{"})/: Sequence (?{...}) not terminated or not {}-balanced at - line 1.
+Sequence (?{...}) not terminated or not {}-balanced before HERE mark in regex m/(?{ << HERE "{"})/ at - line 1.
 ########
 /(?{"{"}})/    # Check it outside of eval too
 EXPECT
@@ -371,8 +371,8 @@ argv <e>
 # fdopen from a system descriptor to a system descriptor used to close
 # the former.
 open STDERR, '>&=STDOUT' or die $!;
-select STDOUT; $| = 1; print fileno STDOUT;
-select STDERR; $| = 1; print fileno STDERR;
+select STDOUT; $| = 1; print fileno STDOUT or die $!;
+select STDERR; $| = 1; print fileno STDERR or die $!;
 EXPECT
 1
 2
index cf8e55d..c5a090c 100755 (executable)
@@ -4,7 +4,7 @@ print "1..9\n";
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use File::Path;
index 1777e88..601e1d6 100755 (executable)
--- a/t/op/my.t
+++ b/t/op/my.t
@@ -2,7 +2,7 @@
 
 # $RCSfile: my.t,v $
 
-print "1..30\n";
+print "1..31\n";
 
 sub foo {
     my($a, $b) = @_;
@@ -92,3 +92,10 @@ print +(@x ? "not " : ""), "ok 29\n";
 { @x = my %y }
 print +(@x ? "not " : ""), "ok 30\n";
 
+# Found in HTML::FormatPS
+my %fonts = qw(nok 31);
+for my $full (keys %fonts) {
+    $full =~ s/^n//;
+    # Supposed to be copy-on-write via force_normal after a THINKFIRST check.
+    print "$full $fonts{nok}\n";
+}
index 79f3f28..4a1d502 100644 (file)
@@ -3,7 +3,7 @@
 package Foo;
 
 BEGIN {
-    unshift @INC, "../lib";
+    @INC = '../lib';
 }
 
 use Test;
index fd36e2e..411a0b4 100755 (executable)
@@ -6,7 +6,7 @@
 BEGIN
  {
   chdir 't' if -d 't';
-  unshift @INC, "../lib";
+  @INC = '../lib';
   require Config;
   import Config;
   if ($Config{'use5005threads'})
index 3a487d8..896f875 100755 (executable)
@@ -57,11 +57,23 @@ print length eq 5                      ? "ok" : "not ok", " 37\n";
 print $_ eq "\0"."_"."7"."_"."7"       ? "ok" : "not ok", " 38\n";
 chop, chop, chop, chop;
 print $_ eq "\0"                       ? "ok" : "not ok", " 39\n";
-print "\077_" eq "?_"                  ? "ok" : "not ok", " 40\n";
+if (ord("\t") != 9) {
+    # question mark is 111 in 1047, 037, && POSIX-BC
+    print "\157_" eq "?_"                  ? "ok" : "not ok", " 40\n";
+}
+else {
+    print "\077_" eq "?_"                  ? "ok" : "not ok", " 40\n";
+}
 
 $_ = "\x_7_7";
 print length eq 5                      ? "ok" : "not ok", " 41\n";
 print $_ eq "\0"."_"."7"."_"."7"       ? "ok" : "not ok", " 42\n";
 chop, chop, chop, chop;
 print $_ eq "\0"                       ? "ok" : "not ok", " 43\n";
-print "\x2F_" eq "/_"                  ? "ok" : "not ok", " 44\n";
+if (ord("\t") != 9) {
+    # / is 97 in 1047, 037, && POSIX-BC
+    print "\x61_" eq "/_"                  ? "ok" : "not ok", " 44\n";
+}
+else {
+    print "\x2F_" eq "/_"                  ? "ok" : "not ok", " 44\n";
+}
index 5c215c6..67bd547 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
 }
 
index 81591fc..f009086 100755 (executable)
@@ -4,11 +4,11 @@
 # the format supported by op/regexp.t.  If you want to add a test
 # that does fit that format, add it to op/re_tests, not here.
 
-print "1..215\n";
+print "1..223\n";
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, "../lib" if -d "../lib";
+    @INC = '../lib';
 }
 eval 'use Config';          #  Defaults assumed if this fails
 
@@ -266,12 +266,12 @@ print "ok 68\n";
 
 undef $@;
 eval "'aaa' =~ /a{1,$reg_infty}/";
-print "not " if $@ !~ m%^\Q/a{1,$reg_infty}/: Quantifier in {,} bigger than%;
+print "not " if $@ !~ m%^\QQuantifier in {,} bigger than%;
 print "ok 69\n";
 
 eval "'aaa' =~ /a{1,$reg_infty_p}/";
 print "not "
-       if $@ !~ m%^\Q/a{1,$reg_infty_p}/: Quantifier in {,} bigger than%;
+       if $@ !~ m%^\QQuantifier in {,} bigger than%;
 print "ok 70\n";
 undef $@;
 
@@ -279,7 +279,7 @@ undef $@;
 
 $context = 'x' x 256;
 eval qq("${context}y" =~ /(?<=$context)y/);
-print "not " if $@ !~ m%^\Q/(?<=\Ex+/: lookbehind longer than 255 not%;
+print "not " if $@ !~ m%^\QLookbehind longer than 255 not%;
 print "ok 71\n";
 
 # removed test
@@ -588,8 +588,12 @@ sub make_must_warn {
 my $for_future = make_must_warn('reserved for future extensions');
 
 &$for_future('q(a:[b]:) =~ /[x[:foo:]]/');
-&$for_future('q(a=[b]=) =~ /[x[=foo=]]/');
-&$for_future('q(a.[b].) =~ /[x[.foo.]]/');
+
+#&$for_future('q(a=[b]=) =~ /[x[=foo=]]/');
+print "ok $test\n"; $test++; # now a fatal croak
+
+#&$for_future('q(a.[b].) =~ /[x[.foo.]]/');
+print "ok $test\n"; $test++; # now a fatal croak
 
 # test if failure of patterns returns empty list
 $_ = 'aaa';
@@ -689,6 +693,30 @@ print "not "
 print "ok $test\n";
 $test++;
 
+eval { $+[0] = 13; };
+print "not " 
+   if $@ !~ /^Modification of a read-only value attempted/;
+print "ok $test\n";
+$test++;
+
+eval { $-[0] = 13; };
+print "not " 
+   if $@ !~ /^Modification of a read-only value attempted/;
+print "ok $test\n";
+$test++;
+
+eval { @+ = (7, 6, 5); };
+print "not " 
+   if $@ !~ /^Modification of a read-only value attempted/;
+print "ok $test\n";
+$test++;
+
+eval { @- = qw(foo bar); };
+print "not " 
+   if $@ !~ /^Modification of a read-only value attempted/;
+print "ok $test\n";
+$test++;
+
 /.(a)(ba*)?/;
 print "#$#-..$#+\nnot " if $#+ != 2 or $#- != 1;
 print "ok $test\n";
@@ -1021,3 +1049,38 @@ $test++;
 'a1b' =~ ('xyz' =~ /t/) and $` eq 'a' or print "not ";
 print "ok $test\n";
 $test++;
+
+$w = 0;
+{
+    local $SIG{__WARN__} = sub { $w = 1 };
+    local $^W = 1;
+       $w = 1 if ("1\n" x 102) =~ /^\s*\n/m;
+}
+print $w ? "not " : "", "ok $test\n";
+$test++;
+
+my %space = ( spc   => " ",
+             tab   => "\t",
+             cr    => "\r",
+             lf    => "\n",
+             ff    => "\f",
+# The vertical tabulator seems miraculously be 12 both in ASCII and EBCDIC.
+             vt    => chr(11),
+             false => "space" );
+
+my @space0 = sort grep { $space{$_} =~ /\s/ }          keys %space;
+my @space1 = sort grep { $space{$_} =~ /[[:space:]]/ } keys %space;
+my @space2 = sort grep { $space{$_} =~ /[[:blank:]]/ } keys %space;
+
+print "not " unless "@space0" eq "cr ff lf spc tab";
+print "ok $test\n";
+$test++;
+
+print "not " unless "@space1" eq "cr ff lf spc tab vt";
+print "ok $test\n";
+$test++;
+
+print "not " unless "@space2" eq "spc tab";
+print "ok $test\n";
+$test++;
index 0f67eb4..4cccbfe 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, "../lib" if -d "../lib";
+    @INC = '../lib';
     eval {my @n = getpwuid 0};
     if ($@ && $@ =~ /(The \w+ function is unimplemented)/) {
        print "1..0 # Skip: $1\n";
@@ -71,7 +71,8 @@ my %seen;
 setpwent();
 while (<PW>) {
     chomp;
-    my @s = split /:/;
+    # LIMIT -1 so that users with empty shells don't fall off
+    my @s = split /:/, $_, -1;
     my ($name_s, $passwd_s, $uid_s, $gid_s, $gcos_s, $home_s, $shell_s) = @s;
     next if /^\+/; # ignore NIS includes
     if (@s) {
@@ -136,7 +137,7 @@ print "ok ", $tst++;
 print "\t# (not necessarily serious: run t/op/pwent.t by itself)" if $not;
 print "\n";
 
-# Test both the scalar and array contexts.
+# Test both the scalar and list contexts.
 
 my @pw1;
 
index ec247f8..ea62ed8 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
 }
 
index 97019bb..83186ae 100755 (executable)
@@ -17,7 +17,7 @@
 
 BEGIN {
     chdir "t" if -d "t";
-    unshift @INC, "../lib" if -d "../lib";
+    @INC = '../lib';
 }
 
 use strict;
index 3848325..c2753e5 100644 (file)
@@ -45,9 +45,9 @@ a[b-d]e       ace     y       $&      ace
 a[b-d] aac     y       $&      ac
 a[-b]  a-      y       $&      a-
 a[b-]  a-      y       $&      a-
-a[b-a] -       c       -       /a[b-a]/: invalid [] range "b-a" in regexp
-a[]b   -       c       -       /a[]b/: unmatched [] in regexp
-a[     -       c       -       /a[/: unmatched [] in regexp
+a[b-a] -       c       -       Invalid [] range "b-a" before HERE mark in regex m/a[b-a << HERE ]/
+a[]b   -       c       -       Unmatched [ before HERE mark in regex m/a[ << HERE ]b/ at (eval 96) line 1, <TESTS> line 49.
+a[     -       c       -       Unmatched [ before HERE mark in regex m/a[ << HERE / at (eval 97) line 1, <TESTS> line 50.
 a]     a]      y       $&      a]
 a[]]b  a]b     y       $&      a]b
 a[^bc]d        aed     y       $&      aed
@@ -95,21 +95,21 @@ a[\S]b      a-b     y       -       -
 ab|cd  abc     y       $&      ab
 ab|cd  abcd    y       $&      ab
 ()ef   def     y       $&-$1   ef-
-*a     -       c       -       /*a/: ?+*{} follows nothing in regexp
-(*)b   -       c       -       /(*)b/: ?+*{} follows nothing in regexp
+*a     -       c       -       Quantifier follows nothing before HERE mark in regex m/* << HERE a/ at (eval 192) line 1, <TESTS> line 98.
+(*)b   -       c       -       Quantifier follows nothing before HERE mark in regex m/(* << HERE )b/ at (eval 193) line 1, <TESTS> line 99.
 $b     b       n       -       -
 a\     -       c       -       Search pattern not terminated
 a\(b   a(b     y       $&-$1   a(b-
 a\(*b  ab      y       $&      ab
 a\(*b  a((b    y       $&      a((b
 a\\b   a\b     y       $&      a\b
-abc)   -       c       -       /abc)/: unmatched () in regexp
-(abc   -       c       -       /(abc/: unmatched () in regexp
+abc)   -       c       -       Unmatched ) before HERE mark in regex m/abc) << HERE / at (eval 205) line 1, <TESTS> line 106.
+(abc   -       c       -       Unmatched ( before HERE mark in regex m/( << HERE abc/ at (eval 206) line 1, <TESTS> line 107.
 ((a))  abc     y       $&-$1-$2        a-a-a
 (a)b(c)        abc     y       $&-$1-$2        abc-a-c
 a+b+c  aabbabc y       $&      abc
 a{1,}b{1,}c    aabbabc y       $&      abc
-a**    -       c       -       /a**/: nested *?+ in regexp
+a**    -       c       -       Nested quantifiers before HERE mark in regex m/a** << HERE / at (eval 215) line 1, <TESTS> line 112.
 a.+?c  abcabc  y       $&      abc
 (a+|b)*        ab      y       $&-$1   ab-b
 (a+|b){0,}     ab      y       $&-$1   ab-b
@@ -117,7 +117,7 @@ a.+?c       abcabc  y       $&      abc
 (a+|b){1,}     ab      y       $&-$1   ab-b
 (a+|b)?        ab      y       $&-$1   a-a
 (a+|b){0,1}    ab      y       $&-$1   a-a
-)(     -       c       -       /)(/: unmatched () in regexp
+)(     -       c       -       Unmatched ) before HERE mark in regex m/) << HERE (/ at (eval 230) line 1, <TESTS> line 120.
 [^ab]* cde     y       $&      cde
 abc            n       -       -
 a*             y       $&      
@@ -164,11 +164,11 @@ a(bc)d    abcd    y       $1-\$1-\\$1     bc-$1-\bc
 a[-]?c ac      y       $&      ac
 (abc)\1        abcabc  y       $1      abc
 ([a-c]*)\1     abcabc  y       $1      abc
-\1     -       c       -       /\1/: reference to nonexistent group
-\2     -       c       -       /\2/: reference to nonexistent group
+\1     -       c       -       Reference to nonexistent group
+\2     -       c       -       Reference to nonexistent group
 (a)|\1 a       y       -       -
 (a)|\1 x       n       -       -
-(a)|\2 -       c       -       /(a)|\2/: reference to nonexistent group
+(a)|\2 -       c       -       Reference to nonexistent group
 (([a-c])b*?\2)*        ababbbcbc       y       $&-$1-$2        ababb-bb-b
 (([a-c])b*?\2){3}      ababbbcbc       y       $&-$1-$2        ababbbcbc-cbc-c
 ((\3|b)\2(a)x)+        aaxabxbaxbbx    n       -       -
@@ -218,9 +218,9 @@ a[-]?c      ac      y       $&      ac
 'a[b-d]'i      AAC     y       $&      AC
 'a[-b]'i       A-      y       $&      A-
 'a[b-]'i       A-      y       $&      A-
-'a[b-a]'i      -       c       -       /a[b-a]/: invalid [] range "b-a" in regexp
-'a[]b'i        -       c       -       /a[]b/: unmatched [] in regexp
-'a['i  -       c       -       /a[/: unmatched [] in regexp
+'a[b-a]'i      -       c       -       Invalid [] range "b-a" before HERE mark in regex m/a[b-a << HERE ]/
+'a[]b'i        -       c       -       Unmatched [ before HERE mark in regex m/a[ << HERE ]b/ at (eval 431) line 1, <TESTS> line 222.
+'a['i  -       c       -       Unmatched [ before HERE mark in regex m/a[ << HERE / at (eval 432) line 1, <TESTS> line 223.
 'a]'i  A]      y       $&      A]
 'a[]]b'i       A]B     y       $&      A]B
 'a[^bc]d'i     AED     y       $&      AED
@@ -232,21 +232,21 @@ a[-]?c    ac      y       $&      ac
 'ab|cd'i       ABC     y       $&      AB
 'ab|cd'i       ABCD    y       $&      AB
 '()ef'i        DEF     y       $&-$1   EF-
-'*a'i  -       c       -       /*a/: ?+*{} follows nothing in regexp
-'(*)b'i        -       c       -       /(*)b/: ?+*{} follows nothing in regexp
+'*a'i  -       c       -       Quantifier follows nothing before HERE mark in regex m/* << HERE a/ at (eval 455) line 1, <TESTS> line 235.
+'(*)b'i        -       c       -       Quantifier follows nothing before HERE mark in regex m/(* << HERE )b/ at (eval 456) line 1, <TESTS> line 236.
 '$b'i  B       n       -       -
 'a\'i  -       c       -       Search pattern not terminated
 'a\(b'i        A(B     y       $&-$1   A(B-
 'a\(*b'i       AB      y       $&      AB
 'a\(*b'i       A((B    y       $&      A((B
 'a\\b'i        A\B     y       $&      A\B
-'abc)'i        -       c       -       /abc)/: unmatched () in regexp
-'(abc'i        -       c       -       /(abc/: unmatched () in regexp
+'abc)'i        -       c       -       Unmatched ) before HERE mark in regex m/abc) << HERE / at (eval 468) line 1, <TESTS> line 243.
+'(abc'i        -       c       -       Unmatched ( before HERE mark in regex m/( << HERE abc/ at (eval 469) line 1, <TESTS> line 244.
 '((a))'i       ABC     y       $&-$1-$2        A-A-A
 '(a)b(c)'i     ABC     y       $&-$1-$2        ABC-A-C
 'a+b+c'i       AABBABC y       $&      ABC
 'a{1,}b{1,}c'i AABBABC y       $&      ABC
-'a**'i -       c       -       /a**/: nested *?+ in regexp
+'a**'i -       c       -       Nested quantifiers before HERE mark in regex m/a** << HERE / at (eval 478) line 1, <TESTS> line 249.
 'a.+?c'i       ABCABC  y       $&      ABC
 'a.*?c'i       ABCABC  y       $&      ABC
 'a.{0,5}?c'i   ABCABC  y       $&      ABC
@@ -257,7 +257,7 @@ a[-]?c      ac      y       $&      ac
 '(a+|b)?'i     AB      y       $&-$1   A-A
 '(a+|b){0,1}'i AB      y       $&-$1   A-A
 '(a+|b){0,1}?'i        AB      y       $&-$1   -
-')('i  -       c       -       /)(/: unmatched () in regexp
+')('i  -       c       -       Unmatched ) before HERE mark in regex m/) << HERE (/ at (eval 499) line 1, <TESTS> line 260.
 '[^ab]*'i      CDE     y       $&      CDE
 'abc'i         n       -       -
 'a*'i          y       $&      
@@ -318,7 +318,7 @@ a(?:b|c|d){2}(.)    acdbcdbe        y       $1      b
 a(?:b|c|d){4,5}(.)     acdbcdbe        y       $1      b
 a(?:b|c|d){4,5}?(.)    acdbcdbe        y       $1      d
 ((foo)|(bar))* foobar  y       $1-$2-$3        bar-foo-bar
-:(?:   -       c       -       /(?/: Sequence (? incomplete
+:(?:   -       c       -       Sequence (? incomplete
 a(?:b|c|d){6,7}(.)     acdbcdbe        y       $1      e
 a(?:b|c|d){6,7}?(.)    acdbcdbe        y       $1      e
 a(?:b|c|d){5,6}(.)     acdbcdbe        y       $1      e
@@ -346,7 +346,7 @@ a(?:b|(c|e){1,2}?|d)+?(.)   ace     y       $1$2    ce
 (?<!c)b        cb      n       -       -
 (?<!c)b        b       y       -       -
 (?<!c)b        b       y       $&      b
-(?<%)b -       c       -       /(?<%)b/: Sequence (?%...) not recognized
+(?<%)b -       c       -       Sequence (?<%...) not recognized before HERE mark in regex m/(?<% << HERE )b/
 (?:..)*a       aba     y       $&      aba
 (?:..)*?a      aba     y       $&      a
 ^(?:b|a(?=(.)))*\1     abc     y       $&      ab
@@ -397,10 +397,10 @@ a(?:b|(c|e){1,2}?|d)+?(.) ace     y       $1$2    ce
 '(ab)\d\1'i    ab4Ab   y       $1      ab
 foo\w*\d{4}baz foobar1234baz   y       $&      foobar1234baz
 a(?{})b        cabd    y       $&      ab
-a(?{)b -       c       -       /a(?{)b/: Sequence (?{...}) not terminated or not {}-balanced
-a(?{{})b       -       c       -       /a(?{{})b/: Sequence (?{...}) not terminated or not {}-balanced
-a(?{}})b       -       c       -       /a(?{}})b/: Sequence (?{...}) not terminated or not {}-balanced
-a(?{"{"})b     -       c       -       /a(?{"{"})b/: Sequence (?{...}) not terminated or not {}-balanced
+a(?{)b -       c       -       Sequence (?{...}) not terminated or not {}-balanced before HERE mark in regex m/a(?{ << HERE )b/ at (eval 780) line 1, <TESTS> line 400.
+a(?{{})b       -       c       -       Sequence (?{...}) not terminated or not {}-balanced before HERE mark in regex m/a(?{ << HERE {})b/ at (eval 781) line 1, <TESTS> line 401.
+a(?{}})b       -       c       -       
+a(?{"{"})b     -       c       -       Sequence (?{...}) not terminated or not {}-balanced before HERE mark in regex m/a(?{ << HERE "{"})b/ at (eval 783) line 1, <TESTS> line 403.
 a(?{"\{"})b    cabd    y       $&      ab
 a(?{"{"}})b    -       c       -       Unmatched right curly bracket
 a(?{$bl="\{"}).b       caxbd   y       $bl     {
@@ -441,8 +441,8 @@ x(~~)*(?:(?:F)?)?   x~~     y       -       -
 ^(\(+)?blah(?(1)(\)))$ blah    y       ($2)    ()
 ^(\(+)?blah(?(1)(\)))$ blah)   n       -       -
 ^(\(+)?blah(?(1)(\)))$ (blah   n       -       -
-(?(1?)a|b)     a       c       -       /(?(1?)a|b)/: Switch (?(number? not recognized
-(?(1)a|b|c)    a       c       -       /(?(1)a|b|c)/: Switch (?(condition)... contains too many branches
+(?(1?)a|b)     a       c       -       Switch condition not recognized before HERE mark in regex m/(?(1? << HERE )a|b)/ at (eval 868) line 1, <TESTS> line 444.
+(?(1)a|b|c)    a       c       -       Switch (?(condition)... contains too many branches
 (?(?{0})a|b)   a       n       -       -
 (?(?{0})b|a)   a       y       $&      a
 (?(?{1})b|a)   a       n       -       -
@@ -473,10 +473,10 @@ $(?<=^(a))        a       y       $1      a
 ([[:]+)        a:[b]:  y       $1      :[
 ([[=]+)        a=[b]=  y       $1      =[
 ([[.]+)        a.[b].  y       $1      .[
-[a[:xyz:       -       c       -       /[a[:xyz:/: unmatched [] in regexp
-[a[:xyz:]      -       c       -       Character class [:xyz:] unknown
+[a[:xyz:       -       c       -       Unmatched [ before HERE mark in regex m/[ << HERE a[:xyz:/ at (eval 950) line 1, <TESTS> line 476.
+[a[:xyz:]      -       c       -       POSIX class [:xyz:] unknown before HERE mark in regex m/[a[:xyz:] << HERE /
 [a[:]b[:c]     abc     y       $&      abc
-([a[:xyz:]b]+) pbaq    c       -       Character class [:xyz:] unknown
+([a[:xyz:]b]+) pbaq    c       -       POSIX class [:xyz:] unknown before HERE mark in regex m/([a[:xyz:] << HERE b]+)/
 [a[:]b[:c]     abc     y       $&      abc
 ([[:alpha:]]+) ABcd01Xy__--  ${nulnul}${ffff}  y       $1      ABcd
 ([[:alnum:]]+) ABcd01Xy__--  ${nulnul}${ffff}  y       $1      ABcd01Xy
@@ -503,13 +503,13 @@ $(?<=^(a))        a       y       $1      a
 ([[:^word:]]+) ABcd01Xy__--  ${nulnul}${ffff}  y       $1      --  ${nulnul}${ffff}
 ([[:^upper:]]+)        ABcd01Xy__--  ${nulnul}${ffff}  y       $1      cd01
 ([[:^xdigit:]]+)       ABcd01Xy__--  ${nulnul}${ffff}  y       $1      Xy__--  ${nulnul}${ffff}
-[[:foo:]]      -       c       -       Character class [:foo:] unknown
-[[:^foo:]]     -       c       -       Character class [:^foo:] unknown
+[[:foo:]]      -       c       -       POSIX class [:foo:] unknown before HERE mark in regex m/[[:foo:] << HERE ]/
+[[:^foo:]]     -       c       -       POSIX class [:^foo:] unknown before HERE mark in regex m/[[:^foo:] << HERE ]/
 ((?>a+)b)      aaab    y       $1      aaab
 (?>(a+))b      aaab    y       $1      aaa
 ((?>[^()]+)|\([^()]*\))+       ((abc(ade)ufh()()x      y       $&      abc(ade)ufh()()x
-(?<=x+)y       -       c       -       /(?<=x+)y/: variable length lookbehind not implemented
-a{37,17}       -       c       -       /a{37,17}/: Can't do {n,m} with n > m
+(?<=x+)y       -       c       -       Variable length lookbehind not implemented
+a{37,17}       -       c       -       Can't do {n,m} with n > m
 \Z     a\nb\n  y       $-[0]   3
 \z     a\nb\n  y       $-[0]   4
 $      a\nb\n  y       $-[0]   3
index d101c2f..00199b0 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 eval 'opendir(NOSUCH, "no/such/directory");';
@@ -20,7 +20,11 @@ if (opendir(OP, "op")) { print "ok 1\n"; } else { print "not ok 1\n"; }
 @D = grep(/^[^\.].*\.t$/i, readdir(OP));
 closedir(OP);
 
-if (@D > 20 && @D < 100) { print "ok 2\n"; } else { print "not ok 2\n"; }
+##
+## This range will have to adjust as the number of tests expands,
+## as it's counting the number of .t files in src/t
+##
+if (@D > 90 && @D < 110) { print "ok 2\n"; } else { print "not ok 2\n"; }
 
 @R = sort @D;
 @G = sort <op/*.t>;
index 4ffe136..23ae576 100755 (executable)
@@ -33,7 +33,7 @@ $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 $iters = shift || 1;           # Poor man performance suite, 10000 is OK.
diff --git a/t/op/regmesg.t b/t/op/regmesg.t
new file mode 100644 (file)
index 0000000..f209239
--- /dev/null
@@ -0,0 +1,172 @@
+#!./perl -w
+
+BEGIN {
+       chdir 't' if -d 't';
+       @INC = '../lib';
+}
+
+my $debug = 1;
+
+##
+## If the markers used are changed (search for "MARKER1" in regcomp.c),
+## update only these two variables, and leave the {#} in the @death/@warning
+## arrays below. The {#} is a meta-marker -- it marks where the marker should
+## go.
+
+my $marker1 = "HERE";
+my $marker2 = " << HERE ";
+
+##
+## Key-value pairs of code/error of code that should have fatal errors.
+##
+
+eval 'use Config';         # assume defaults if fail
+our %Config;
+my $inf_m1 = ($Config{reg_infty} || 32767) - 1;
+my $inf_p1 = $inf_m1 + 2;
+my @death =
+(
+ '/[[=foo=]]/' => 'POSIX syntax [= =] is reserved for future extensions before {#} mark in regex m/[[=foo=]{#}]/',
+
+ '/(?<= .*)/' =>  'Variable length lookbehind not implemented before {#} mark in regex m/(?<= .*){#}/',
+
+ '/(?<= x{1000})/' => 'Lookbehind longer than 255 not implemented before {#} mark in regex m/(?<= x{1000}){#}/',
+
+ '/(?@)/' => 'Sequence (?@...) not implemented before {#} mark in regex m/(?@{#})/',
+
+ '/(?{ 1/' => 'Sequence (?{...}) not terminated or not {}-balanced before {#} mark in regex m/(?{{#} 1/',
+
+ '/(?(1x))/' => 'Switch condition not recognized before {#} mark in regex m/(?(1x{#}))/',
+
+ '/(?(1)x|y|z)/' => 'Switch (?(condition)... contains too many branches before {#} mark in regex m/(?(1)x|y|{#}z)/',
+
+ '/(?(x)y|x)/' => 'Unknown switch condition (?(x) before {#} mark in regex m/(?({#}x)y|x)/',
+
+ '/(?/' => 'Sequence (? incomplete before {#} mark in regex m/(?{#}/',
+
+ '/(?;x/' => 'Sequence (?;...) not recognized before {#} mark in regex m/(?;{#}x/',
+ '/(?<;x/' => 'Sequence (?<;...) not recognized before {#} mark in regex m/(?<;{#}x/',
+
+ '/((x)/' => 'Unmatched ( before {#} mark in regex m/({#}(x)/',
+
+ "/x{$inf_p1}/" => "Quantifier in {,} bigger than $inf_m1 before {#} mark in regex m/x{{#}$inf_p1}/",
+
+ '/x{3,1}/' => 'Can\'t do {n,m} with n > m before {#} mark in regex m/x{3,1}{#}/',
+
+ '/x**/' => 'Nested quantifiers before {#} mark in regex m/x**{#}/',
+
+ '/x[/' => 'Unmatched [ before {#} mark in regex m/x[{#}/',
+
+ '/*/', => 'Quantifier follows nothing before {#} mark in regex m/*{#}/',
+
+ '/\p{x/' => 'Missing right brace on \p{} before {#} mark in regex m/\p{{#}x/',
+
+ 'use utf8; /[\p{x]/' => 'Missing right brace on \p{} before {#} mark in regex m/[\p{{#}x]/',
+
+ '/(x)\2/' => 'Reference to nonexistent group before {#} mark in regex m/(x)\2{#}/',
+
+ 'my $m = chr(92); $m =~ $m', => 'Trailing \ in regex m/\/',
+
+ '/\x{1/' => 'Missing right brace on \x{} before {#} mark in regex m/\x{{#}1/',
+
+ 'use utf8; /[\x{X]/' => 'Missing right brace on \x{} before {#} mark in regex m/[\x{{#}X]/',
+
+ '/\x{x}/' => 'Can\'t use \x{} without \'use utf8\' declaration before {#} mark in regex m/\x{x}{#}/',
+
+ '/[[:barf:]]/' => 'POSIX class [:barf:] unknown before {#} mark in regex m/[[:barf:]{#}]/',
+
+ '/[[=barf=]]/' => 'POSIX syntax [= =] is reserved for future extensions before {#} mark in regex m/[[=barf=]{#}]/',
+
+ '/[[.barf.]]/' => 'POSIX syntax [. .] is reserved for future extensions before {#} mark in regex m/[[.barf.]{#}]/',
+  
+ '/[z-a]/' => 'Invalid [] range "z-a" before {#} mark in regex m/[z-a{#}]/',
+);
+
+##
+## Key-value pairs of code/error of code that should have non-fatal warnings.
+##
+@warning = (
+    "m/(?p{ 'a' })/" => "(?p{}) is deprecated - use (??{}) before {#} mark in regex m/(?p{#}{ 'a' })/",
+
+    'm/\b*/' => '\b* matches null string many times before {#} mark in regex m/\b*{#}/',
+
+    'm/[:blank:]/' => 'POSIX syntax [: :] belongs inside character classes before {#} mark in regex m/[:blank:]{#}/',
+
+    "m'[\\y]'"     => 'Unrecognized escape \y in character class passed through before {#} mark in regex m/[\y{#}]/',
+
+    'm/[a-\d]/' => 'False [] range "a-\d" before {#} mark in regex m/[a-\d{#}]/',
+    'm/[\w-x]/' => 'False [] range "\w-" before {#} mark in regex m/[\w-{#}x]/',
+    "m'\\y'"     => 'Unrecognized escape \y passed through before {#} mark in regex m/\y{#}/',
+);
+
+my $total = (@death + @warning)/2;
+
+print "1..$total\n";
+
+my $count = 0;
+
+while (@death)
+{
+    $count++;
+    my $regex = shift @death;
+    my $result = shift @death;
+
+    $_ = "x";
+    eval $regex;
+    if (not $@) {
+       print "# oops, $regex didn't die\nnot ok $count\n";
+       next;
+    }
+    chomp $@;
+    $result =~ s/{\#}/$marker1/;
+    $result =~ s/{\#}/$marker2/;
+    if ($@ !~ /^\Q$result/) {
+       print "# For $regex, expected:\n#  $result\n# Got:\n#  $@\n#\nnot ";
+    }
+    print "ok $count\n";
+}
+
+
+our $warning;
+$SIG{__WARN__} = sub { $warning = shift };
+
+while (@warning)
+{
+    $count++;
+    my $regex = shift @warning;
+    my $result = shift @warning;
+
+    undef $warning;
+    $_ = "x";
+    eval $regex;
+
+    if ($@)
+    {
+       print "# oops, $regex died with:\n#\t$@#\nnot ok $count\n";
+       next;
+    }
+
+    if (not $warning)
+    {
+       print "# oops, $regex didn't generate a warning\nnot ok $count\n";
+       next;
+    }
+    $result =~ s/{\#}/$marker1/;
+    $result =~ s/{\#}/$marker2/;
+    if ($warning !~ /^\Q$result/)
+    {
+       print <<"EOM";
+# For $regex, expected:
+#   $result
+# Got:
+#   $warning
+#
+not ok $count
+EOM
+       next;
+    }
+    print "ok $count\n";
+}
+
+
+
index 3865e52..3140f02 100755 (executable)
@@ -7,7 +7,7 @@
 ##
 
 chdir 't' if -d 't';
-unshift @INC, "../lib";
+@INC = '../lib';
 $Is_VMS = $^O eq 'VMS';
 $Is_MSWin32 = $^O eq 'MSWin32';
 $ENV{PERL5LIB} = "../lib" unless $Is_VMS;
@@ -176,11 +176,13 @@ print "bar reached\n";
 EXPECT
 Can't "goto" out of a pseudo block at - line 2.
 ########
+%seen = ();
 sub sortfn {
   (split(/./, 'x'x10000))[0];
   my (@y) = ( 4, 6, 5);
   @y = sort { $a <=> $b } @y;
-  print "sortfn ".join(', ', @y)."\n";
+  my $t = "sortfn ".join(', ', @y)."\n";
+  print $t if ($seen{$t}++ == 0);
   return $_[0] <=> $_[1];
 }
 @x = ( 3, 2, 1 );
@@ -188,8 +190,6 @@ sub sortfn {
 print "---- ".join(', ', @x)."\n";
 EXPECT
 sortfn 4, 5, 6
-sortfn 4, 5, 6
-sortfn 4, 5, 6
 ---- 1, 2, 3
 ########
 @a = (3, 2, 1);
index 8161701..9095871 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 use warnings;
 print "1..57\n";
index 78f51f5..45df76a 100755 (executable)
@@ -1,8 +1,6 @@
 #!./perl
 
-# $RCSfile: split.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:26 $
-
-print "1..27\n";
+print "1..28\n";
 
 $FS = ':';
 
@@ -118,3 +116,9 @@ print "ok 26\n";
 $_ = join ':', split /^/, "ab\ncd\nef\n";
 print "not " if $_ ne "ab\n:cd\n:ef\n";
 print "ok 27\n";
+
+# see if @a = @b = split(...) optimization works
+@list1 = @list2 = split ('p',"a p b c p");
+print "not " if @list1 != @list2 or "@list1" ne "@list2"
+             or @list1 != 2 or "@list1" ne "a   b c ";
+print "ok 28\n";
index c484355..2f6cd27 100755 (executable)
@@ -8,7 +8,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }   
 use warnings;
 
@@ -56,8 +56,17 @@ for ($i = 1; @tests; $i++) {
     }
     elsif ($y eq ">$result<")  # Some C libraries always give
     {                          # three-digit exponent
-       print("ok $i >$result< $x # three-digit exponent accepted\n");
+               print("ok $i # >$result< $x three-digit exponent accepted\n");
     }
+       elsif ($result =~ /[-+]\d{3}$/ &&
+                  # Suppress tests with modulo of exponent >= 100 on platforms
+                  # which can't handle such magnitudes (or where we can't tell).
+                  ((!eval {require POSIX}) || # Costly: only do this if we must!
+                       (length(&POSIX::DBL_MAX) - rindex(&POSIX::DBL_MAX, '+')) == 3))
+       {
+               print("ok $i # >$template< >$data< >$result<",
+                         " Suppressed: exponent out of range?\n") 
+       }
     else {
        $y = ($x eq $y ? "" : " => $y");
        print("not ok $i >$template< >$data< >$result< $x$y",
@@ -76,6 +85,20 @@ for ($i = 1; @tests; $i++) {
 # number of elements.  Even so, subterfuge is sometimes required: see
 # tests for %n and %p.
 #
+# The following tests are not currently run, for the reasons stated:
+
+=pod
+
+=begin problematic
+
+>%.0f<      >-0.1<        >-0<  >C library bug: no minus on VMS, HP-UX<
+>%.0f<      >1.5<         >2<   >Standard vague: no rounding rules<
+>%.0f<      >2.5<         >2<   >Standard vague: no rounding rules<
+
+=end problematic
+
+=cut
+
 # template    data          result
 __END__
 >%6. 6s<    >''<          >%6. 6s INVALID< >(See use of $w in code above)<
@@ -176,6 +199,7 @@ __END__
 >%+e<       >-1234.875<   >-1.234875e+03<
 >%#e<       >-1234.875<   >-1.234875e+03<
 >%.0e<      >1234.875<    >1e+03<
+>%#.0e<     >1234.875<    >1.e+03<
 >%.*e<      >[0, 1234.875]< >1e+03<
 >%.1e<      >1234.875<    >1.2e+03<
 >%-12.4e<   >1234.875<    >1.2349e+03  <
@@ -205,13 +229,15 @@ __END__
 >%.0f<      >0<           >0<
 >%.0f<      >2**38<       >274877906944<   >Should have exact int'l rep'n<
 >%.0f<      >0.1<         >0<
->%.0f<      >-0.1<        >-0<
->%.0f<      >0.6<         >1<
->%.0f<      >-0.6<        >-1<
+>%.0f<      >0.6<         >1<              >Known to fail with sfio<
+>%.0f<      >-0.6<        >-1<             >Known to fail with sfio<
+>%.0f<      >1<           >1<
+>%#.0f<     >1<           >1.<
 >%g<        >12345.6789<  >12345.7<
 >%+g<       >12345.6789<  >+12345.7<
 >%#g<       >12345.6789<  >12345.7<
 >%.0g<      >12345.6789<  >1e+04<
+>%#.0g<     >12345.6789<  >1.e+04<
 >%.2g<      >12345.6789<  >1.2e+04<
 >%.*g<      >[2, 12345.6789]< >1.2e+04<
 >%.9g<      >12345.6789<  >12345.6789<
index 353b3b3..1317ba8 100755 (executable)
@@ -4,7 +4,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 use Config;
@@ -32,7 +32,7 @@ if (open(FOO, ">Op.stat.tmp")) {
   else {
     print "# res=$res, nlink=$nlink.\nnot ok 1\n";
   }
-  if ($Is_MSWin32 or $Is_Cygwin || ($mtime && $mtime == $ctime)) {
+  if ($Is_MSWin32 or $Is_Cygwin or $Is_Dos || ($mtime && $mtime == $ctime)) {
     print "ok 2\n";
   }
   else {
index 9757f4c..7dd7a1c 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
 }
 
index e2e7c0e..7189572 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     require Config; import Config;
 }
 
index f2a0c6c..4d3bbce 100755 (executable)
@@ -1,12 +1,12 @@
 #!./perl
 
-print "1..135\n";
+print "1..136\n";
 
 #P = start of string  Q = start of substr  R = end of substr  S = end of string
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 use warnings ;
 
@@ -297,3 +297,10 @@ ok 125, $a eq 'xxxxefgh';
     ok 134, length($z) == 5;
     ok 135, $z eq "21\x{263a}10";
 }
+
+# replacement should work on magical values
+require Tie::Scalar;
+my %data;
+tie $data{'a'}, 'Tie::StdScalar';  # makes $data{'a'} magical
+$data{a} = "firstlast";
+ok 136, substr($data{'a'}, 0, 5, "") eq "first" && $data{'a'} eq "last";
index 44f50ae..7cc4447 100755 (executable)
@@ -9,7 +9,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 use strict;
index 9543420..afcc4a1 100755 (executable)
@@ -6,13 +6,14 @@
 # Currently it only tests the untie warning 
 
 chdir 't' if -d 't';
-unshift @INC, "../lib";
+@INC = '../lib';
 $ENV{PERL5LIB} = "../lib";
 
 $|=1;
 
 # catch warnings into fatal errors
 $SIG{__WARN__} = sub { die "WARNING: @_" } ;
+$SIG{__DIE__}  = sub { die @_ };
 
 undef $/;
 @prgs = split "\n########\n", <DATA>;
@@ -25,7 +26,7 @@ for (@prgs){
     $results = $@ ;
     $results =~ s/\n+$//;
     $expected =~ s/\n+$//;
-    if ( $status or $results and $results !~ /^WARNING: $expected/){
+    if ( $status or $results and $results !~ /^(WARNING: )?$expected/){
        print STDERR "STATUS: $status\n";
        print STDERR "PROG: $prog\n";
        print STDERR "EXPECTED:\n$expected\n";
@@ -44,6 +45,21 @@ untie %h;
 EXPECT
 ########
 
+# standard behaviour, without any extra references
+use Tie::Hash ;
+{package Tie::HashUntie;
+ use base 'Tie::StdHash';
+ sub UNTIE
+  {
+   warn "Untied\n";
+  }
+}
+tie %h, Tie::HashUntie;
+untie %h;
+EXPECT
+Untied
+########
+
 # standard behaviour, with 1 extra reference
 use Tie::Hash ;
 $a = tie %h, Tie::StdHash;
@@ -158,6 +174,7 @@ sub Self::DESTROY { $b = $_[0] + 0; }
 }
 die unless $a == $b;
 EXPECT
+Self-ties are not supported 
 ########
 # Interaction of tie and vec
 
index 25fda3f..8e78b2f 100755 (executable)
@@ -3,7 +3,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 my %seen;
index 6ae3faa..b04bdb7 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 my @expect;
@@ -77,7 +77,7 @@ package main;
 
 use Symbol;
 
-print "1..29\n";
+print "1..33\n";
 
 my $fh = gensym;
 
@@ -149,3 +149,19 @@ ok($data eq "qwerty");
 @expect = (CLOSE => $ob);
 $r = close $fh;
 ok($r == 5);
+
+# Does aliasing work with tied FHs?
+*ALIAS = *$fh;
+@expect = (PRINT => $ob,"some","text");
+$r = print ALIAS @expect[2,3];
+ok($r == 1);
+
+{
+    use warnings;
+    # Special case of aliasing STDERR, which used
+    # to dump core when warnings were enabled
+    *STDERR = *$fh;
+    @expect = (PRINT => $ob,"some","text");
+    $r = print STDERR @expect[2,3];
+    ok($r == 1);
+}
index ea665c7..a7b041e 100755 (executable)
--- a/t/op/tr.t
+++ b/t/op/tr.t
@@ -2,10 +2,10 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, "../lib";
+    @INC = '../lib';
 }
 
-print "1..27\n";
+print "1..29\n";
 
 $_ = "abcdefghijklmnopqrstuvwxyz";
 
@@ -59,107 +59,125 @@ print "ok 6\n";
 print "not " if $x ne 256.65.258 or length $x != 3;
 print "ok 7\n";
 $x =~ tr/A/B/;
-print "not " if $x ne 256.66.258 or length $x != 3;
+if (ord("\t") == 9) { # ASCII
+    print "not " if $x ne 256.66.258 or length $x != 3;
+}
+else {
+    print "not " if $x ne 256.65.258 or length $x != 3;
+}
 print "ok 8\n";
+# EBCDIC variants of the above tests
+($x = 256.193.258) =~ tr/a/b/;
+print "not " if $x ne 256.193.258 or length $x != 3;
+print "ok 9\n";
+$x =~ tr/A/B/;
+if (ord("\t") == 9) { # ASCII
+    print "not " if $x ne 256.193.258 or length $x != 3;
+}
+else {
+    print "not " if $x ne 256.194.258 or length $x != 3;
+}
+print "ok 10\n";
 
 {
-use utf8;
-
-# 9 - changing UTF8 characters in a UTF8 string, same length.
+if (ord("\t") == 9) { # ASCII
+    use utf8;
+}
+# 11 - changing UTF8 characters in a UTF8 string, same length.
 $l = chr(300); $r = chr(400);
 $x = 200.300.400;
 $x =~ tr/\x{12c}/\x{190}/;
 printf "not (%vd) ", $x if $x ne 200.400.400 or length $x != 3;
-print "ok 9\n";
+print "ok 11\n";
 
-# 10 - changing UTF8 characters in UTF8 string, more bytes.
+# 12 - changing UTF8 characters in UTF8 string, more bytes.
 $x = 200.300.400;
 $x =~ tr/\x{12c}/\x{be8}/;
 printf "not (%vd) ", $x if $x ne 200.3048.400 or length $x != 3;
-print "ok 10\n";
+print "ok 12\n";
 
-# 11 - introducing UTF8 characters to non-UTF8 string.
+# 13 - introducing UTF8 characters to non-UTF8 string.
 $x = 100.125.60;
 $x =~ tr/\x{64}/\x{190}/;
 printf "not (%vd) ", $x if $x ne 400.125.60 or length $x != 3;
-print "ok 11\n";
+print "ok 13\n";
 
-# 12 - removing UTF8 characters from UTF8 string
+# 14 - removing UTF8 characters from UTF8 string
 $x = 400.125.60;
 $x =~ tr/\x{190}/\x{64}/;
 printf "not (%vd) ", $x if $x ne 100.125.60 or length $x != 3;
-print "ok 12\n";
+print "ok 14\n";
 
-# 13 - counting UTF8 chars in UTF8 string
+# 15 - counting UTF8 chars in UTF8 string
 $x = 400.125.60.400;
 $y = $x =~ tr/\x{190}/\x{190}/;
 print "not " if $y != 2;
-print "ok 13\n";
+print "ok 15\n";
 
-# 14 - counting non-UTF8 chars in UTF8 string
+# 16 - counting non-UTF8 chars in UTF8 string
 $x = 60.400.125.60.400;
 $y = $x =~ tr/\x{3c}/\x{3c}/;
 print "not " if $y != 2;
-print "ok 14\n";
+print "ok 16\n";
 
-# 15 - counting UTF8 chars in non-UTF8 string
+# 17 - counting UTF8 chars in non-UTF8 string
 $x = 200.125.60;
 $y = $x =~ tr/\x{190}/\x{190}/;
 print "not " if $y != 0;
-print "ok 15\n";
+print "ok 17\n";
 }
 
-# 16: test brokenness with tr/a-z-9//;
+# 18: test brokenness with tr/a-z-9//;
 $_ = "abcdefghijklmnopqrstuvwxyz";
 eval "tr/a-z-9/ /";
 print (($@ =~ /^Ambiguous range in transliteration operator/) 
-       ? '' : 'not ', "ok 16\n");
+       ? '' : 'not ', "ok 18\n");
 
-# 17-19: Make sure leading and trailing hyphens still work
+# 19-21: Make sure leading and trailing hyphens still work
 $_ = "car-rot9";
 tr/-a-m/./;
-print (($_ eq '..r.rot9') ? '' : 'not ', "ok 17\n");
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 19\n");
 
 $_ = "car-rot9";
 tr/a-m-/./;
-print (($_ eq '..r.rot9') ? '' : 'not ', "ok 18\n");
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 20\n");
 
 $_ = "car-rot9";
 tr/-a-m-/./;
-print (($_ eq '..r.rot9') ? '' : 'not ', "ok 19\n");
+print (($_ eq '..r.rot9') ? '' : 'not ', "ok 21\n");
 
 $_ = "abcdefghijklmnop";
 tr/ae-hn/./;
-print (($_ eq '.bcd....ijklm.op') ? '' : 'not ', "ok 20\n");
+print (($_ eq '.bcd....ijklm.op') ? '' : 'not ', "ok 22\n");
 
 $_ = "abcdefghijklmnop";
 tr/a-cf-kn-p/./;
-print (($_ eq '...de......lm...') ? '' : 'not ', "ok 21\n");
+print (($_ eq '...de......lm...') ? '' : 'not ', "ok 23\n");
 
 $_ = "abcdefghijklmnop";
 tr/a-ceg-ikm-o/./;
-print (($_ eq '...d.f...j.l...p') ? '' : 'not ', "ok 22\n");
+print (($_ eq '...d.f...j.l...p') ? '' : 'not ', "ok 24\n");
 
-# 23: Test reversed range check
+# 25: Test reversed range check
 # 20000705 MJD
 eval "tr/m-d/ /";
 print (($@ =~ /^Invalid \[\] range "m-d" in transliteration operator/) 
-       ? '' : 'not ', "ok 23\n");
+       ? '' : 'not ', "ok 25\n");
 
-# 24: test cannot update if read-only
+# 26: test cannot update if read-only
 eval '$1 =~ tr/x/y/';
 print (($@ =~ /^Modification of a read-only value attempted/) ? '' : 'not ',
-       "ok 24\n");
+       "ok 26\n");
 
-# 25: test can count read-only
+# 27: test can count read-only
 'abcdef' =~ /(bcd)/;
-print (( eval '$1 =~ tr/abcd//' == 3) ? '' : 'not ', "ok 25\n");
+print (( eval '$1 =~ tr/abcd//' == 3) ? '' : 'not ', "ok 27\n");
 
-# 26: test lhs OK if not updating
-print ((eval '"123" =~ tr/12//' == 2) ? '' : 'not ', "ok 26\n");
+# 28: test lhs OK if not updating
+print ((eval '"123" =~ tr/12//' == 2) ? '' : 'not ', "ok 28\n");
 
-# 27: test lhs bad if updating
+# 29: test lhs bad if updating
 eval '"123" =~ tr/1/1/';
 print (($@ =~ m|^Can't modify constant item in transliteration \(tr///\)|)
-       ? '' : 'not ', "ok 27\n");
+       ? '' : 'not ', "ok 29\n");
 
index 8944ee3..f6e36a5 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 print "1..27\n";
index a0a74ec..e6db8e6 100755 (executable)
@@ -5,7 +5,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
     $| = 1;
 }
 
index b8efb80..7fe0974 100755 (executable)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..18\n";
+print "1..30\n";
 
 print vec($foo,0,1) == 0 ? "ok 1\n" : "not ok 1\n";
 print length($foo) == 0 ? "ok 2\n" : "not ok 2\n";
@@ -31,3 +31,50 @@ $baz = $foo | $bar;
 print $foo eq "1" && $foo == 1 ? "ok 16\n" : "not ok 16\n";
 print $bar eq "2" && $bar == 2 ? "ok 17\n" : "not ok 17\n";
 print "$foo $bar $baz" eq "1 2 3" ? "ok 18\n" : "not ok 18\n";
+
+# error cases
+
+$x = eval { vec $foo, 0, 3 };
+print "not " if defined $x or $@ !~ /^Illegal number of bits in vec/;
+print "ok 19\n";
+$x = eval { vec $foo, 0, 0 };
+print "not " if defined $x or $@ !~ /^Illegal number of bits in vec/;
+print "ok 20\n";
+$x = eval { vec $foo, 0, -13 };
+print "not " if defined $x or $@ !~ /^Illegal number of bits in vec/;
+print "ok 21\n";
+$x = eval { vec($foo, -1, 4) = 2 };
+print "not " if defined $x or $@ !~ /^Assigning to negative offset in vec/;
+print "ok 22\n";
+print "not " if vec('abcd', 7, 8);
+print "ok 23\n";
+
+# UTF8
+# N.B. currently curiously coded to circumvent bugs elswhere in UTF8 handling
+
+$foo = "\x{100}" . "\xff\xfe";
+$x = substr $foo, 1;
+print "not " if vec($x, 0, 8) != 255;
+print "ok 24\n";
+eval { vec($foo, 1, 8) };
+print "not " if $@;
+print "ok 25\n";
+eval { vec($foo, 1, 8) = 13 };
+print "not " if $@;
+print "ok 26\n";
+print "not " if $foo ne "\xc4\x0d\xc3\xbf\xc3\xbe";
+print "ok 27\n";
+$foo = "\x{100}" . "\xff\xfe";
+$x = substr $foo, 1;
+vec($x, 2, 4) = 7;
+print "not " if $x ne "\xff\xf7";
+print "ok 28\n";
+
+# mixed magic
+
+$foo = "\x61\x62\x63\x64\x65\x66";
+print "not " if vec(substr($foo, 2, 2), 0, 16) != 25444;
+print "ok 29\n";
+vec(substr($foo, 1,3), 5, 4) = 3;
+print "not " if $foo ne "\x61\x62\x63\x34\x65\x66";
+print "ok 30\n";
index 5346f39..08beced 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, "../lib";
+    @INC = '../lib';
 }
 
 print "1..23\n";
@@ -14,13 +14,24 @@ require v5.5.640;
 print "ok $test\n";  ++$test;
 
 # printing characters should work
-print v111;
-print v107.32;
-print "$test\n"; ++$test;
-
-# hash keys too
-$h{v111.107} = "ok";
-print "$h{ok} $test\n"; ++$test;
+if (ord("\t") == 9) { # ASCII
+    print v111;
+    print v107.32;
+    print "$test\n"; ++$test;
+
+    # hash keys too
+    $h{v111.107} = "ok";
+    print "$h{ok} $test\n"; ++$test;
+}
+else { # EBCDIC
+    print v150;
+    print v146.64;
+    print "$test\n"; ++$test;
+
+    # hash keys too
+    $h{v150.146} = "ok";
+    print "$h{ok} $test\n"; ++$test;
+}
 
 # poetry optimization should also
 sub v77 { "ok" }
@@ -28,7 +39,12 @@ $x = v77;
 print "$x $test\n"; ++$test;
 
 # but not when dots are involved
-$x = v77.78.79;
+if (ord("\t") == 9) { # ASCII
+    $x = v77.78.79;
+}
+else {
+    $x = v212.213.214;
+}
 print "not " unless $x eq "MNO";
 print "ok $test\n";  ++$test;
 
@@ -42,10 +58,20 @@ require 5.5.640;
 print "ok $test\n";  ++$test;
 
 # hash keys too
-$h{111.107.32} = "ok";
+if (ord("\t") == 9) { # ASCII
+    $h{111.107.32} = "ok";
+}
+else {
+    $h{150.146.64} = "ok";
+}
 print "$h{ok } $test\n"; ++$test;
 
-$x = 77.78.79;
+if (ord("\t") == 9) { # ASCII
+    $x = 77.78.79;
+}
+else {
+    $x = 212.213.214;
+}
 print "not " unless $x eq "MNO";
 print "ok $test\n";  ++$test;
 
@@ -53,19 +79,34 @@ print "not " unless 1.20.300.4000 eq "\x{1}\x{14}\x{12c}\x{fa0}";
 print "ok $test\n";  ++$test;
 
 # test sprintf("%vd"...) etc
-print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+if (ord("\t") == 9) { # ASCII
+    print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+}
+else {
+    print "not " unless sprintf("%vd", "Perl") eq '215.133.153.147';
+}
 print "ok $test\n";  ++$test;
 
 print "not " unless sprintf("%vd", v1.22.333.4444) eq '1.22.333.4444';
 print "ok $test\n";  ++$test;
 
-print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+if (ord("\t") == 9) { # ASCII
+    print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+}
+else {
+    print "not " unless sprintf("%vx", "Perl") eq 'd7.85.99.93';
+}
 print "ok $test\n";  ++$test;
 
 print "not " unless sprintf("%vX", 1.22.333.4444) eq '1.16.14D.115C';
 print "ok $test\n";  ++$test;
 
-print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+if (ord("\t") == 9) { # ASCII
+    print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+}
+else {
+    print "not " unless sprintf("%*v#o", ":", "Perl") eq '0327:0205:0231:0223';
+}
 print "ok $test\n";  ++$test;
 
 print "not " unless sprintf("%*vb", "##", v1.22.333.4444)
@@ -79,20 +120,35 @@ print "ok $test\n";  ++$test;
 
 {
     use bytes;
-    print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+    if (ord("\t") == 9) { # ASCII
+        print "not " unless sprintf("%vd", "Perl") eq '80.101.114.108';
+    }
+    else {
+        print "not " unless sprintf("%vd", "Perl") eq '215.133.153.147';
+    }
     print "ok $test\n";  ++$test;
 
     print "not " unless
         sprintf("%vd", 1.22.333.4444) eq '1.22.197.141.225.133.156';
     print "ok $test\n";  ++$test;
 
-    print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+    if (ord("\t") == 9) { # ASCII
+        print "not " unless sprintf("%vx", "Perl") eq '50.65.72.6c';
+    }
+    else {
+        print "not " unless sprintf("%vx", "Perl") eq 'd7.85.99.93';
+    }
     print "ok $test\n";  ++$test;
 
     print "not " unless sprintf("%vX", v1.22.333.4444) eq '1.16.C5.8D.E1.85.9C';
     print "ok $test\n";  ++$test;
 
-    print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+    if (ord("\t") == 9) { # ASCII
+        print "not " unless sprintf("%*v#o", ":", "Perl") eq '0120:0145:0162:0154';
+    }
+    else {
+        print "not " unless sprintf("%*v#o", ":", "Perl") eq '0327:0205:0231:0223';
+    }
     print "ok $test\n";  ++$test;
 
     print "not " unless sprintf("%*vb", "##", v1.22.333.4444)
index d348a9d..59e395e 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
diff --git a/t/pod/find.t b/t/pod/find.t
new file mode 100644 (file)
index 0000000..f5d4c52
--- /dev/null
@@ -0,0 +1,108 @@
+# Testing of Pod::Find
+# Author: Marek Rouchal <marek@saftsack.fs.uni-bayreuth.de>
+
+$| = 1;
+
+use Test;
+
+BEGIN { plan tests => 4 }
+
+use Pod::Find qw(pod_find pod_where);
+use File::Spec;
+
+# load successful
+ok(1);
+
+require Cwd;
+my $THISDIR = Cwd::cwd();
+my $VERBOSE = 0;
+my $lib_dir = File::Spec->catdir($THISDIR,'lib');
+if ($^O eq 'VMS') {
+    $lib_dir = VMS::Filespec::unixify(File::Spec->catdir($THISDIR,'-','lib','pod'));
+    $Qlib_dir = $lib_dir;
+    $Qlib_dir =~ s#\/#::#g;
+}
+print "### searching $lib_dir\n";
+my %pods = pod_find("$lib_dir");
+my $result = join("\n### ", sort values %pods);
+print "### found $result\n";
+my $compare = join(',', qw(
+    Pod::Checker
+    Pod::Find
+    Pod::InputObjects
+    Pod::ParseUtils
+    Pod::Parser
+    Pod::PlainText
+    Pod::Select
+    Pod::Usage
+));
+if ($^O eq 'VMS') {
+    $compare = lc($compare);
+    $result = join(',', sort grep(/pod::/, values %pods));
+    my $undollared = $Qlib_dir;
+    $undollared =~ s/\$/\\\$/g;
+    $undollared =~ s/\-/\\\-/g;
+    $result =~ s/$undollared/pod::/g;
+    my $count = 0;
+    my @result = split(/,/,$result);
+    my @compare = split(/,/,$compare);
+    foreach(@compare) {
+        $count += grep {/$_/} @result;
+    }
+    ok($count/($#result+1)-1,$#compare);
+}
+else {
+    ok($result,$compare);
+}
+
+# File::Find is located in this place since eons
+# and on all platforms, hopefully
+
+print "### searching for File::Find\n";
+$result = pod_where({ -inc => 1, -verbose => $VERBOSE }, 'File::Find')
+  || 'undef - pod not found!';
+print "### found $result\n";
+
+require Config;
+if ($^O eq 'VMS') { # privlib is perl_root:[lib] OK but not under mms
+    $compare = "lib.File]Find.pm";
+    $result =~ s/perl_root:\[\-?\.?//i;
+    $result =~ s/\[\-?\.?//i; # needed under `mms test`
+    ok($result,$compare);
+}
+else {
+    $compare = File::Spec->catfile($Config::Config{privlib},"File","Find.pm");
+    ok(_canon($result),_canon($compare));
+}
+
+# Search for a documentation pod rather than a module
+print "### searching for perlfunc.pod\n";
+$result = pod_where({ -inc => 1, -verbose => $VERBOSE }, 'perlfunc')
+  || 'undef - perlfunc.pod not found!';
+print "### found $result\n";
+
+if ($^O eq 'VMS') { # privlib is perl_root:[lib] unfortunately
+    $compare = "/lib/pod/perlfunc.pod";
+    $result = VMS::Filespec::unixify($result);
+    $result =~ s/perl_root\///i;
+    $result =~ s/^\.\.//;  # needed under `mms test`
+    ok($result,$compare);
+}
+else {
+    $compare = File::Spec->catfile($Config::Config{privlib},"perlfunc.pod");
+    ok(_canon($result),_canon($compare));
+}
+
+# make the path as generic as possible
+sub _canon
+{
+  my ($path) = @_;
+  $path = File::Spec->canonpath($path);
+  my @comp = File::Spec->splitpath($path);
+  my @dir = File::Spec->splitdir($comp[1]);
+  $comp[1] = File::Spec->catdir(@dir);
+  $path = File::Spec->catpath(@dir);
+  $path = uc($path) if File::Spec->case_tolerant;
+  $path;
+}
+
index b8a6ec5..44af44f 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index fc7b4b2..78608d0 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 6d0b7e3..4e73b78 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 0e31a09..4f171c4 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index e367d6d..02e2c9e 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 37e8d53..0fe410a 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 9c09801..c8e9b22 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 6a5405b..8559f1f 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index 3081ef4..28bd1d0 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index bceeeef..cf2c31b 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index ec632c2..8db7d43 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testpchk.pl";
    import TestPodChecker;
 }
@@ -59,7 +59,7 @@ The above blank line contains tabs and spaces only
 
 =over 4
 
-=item oops
+=item aaps
 
 =head2 end without begin
 
@@ -75,6 +75,20 @@ The above blank line contains tabs and spaces only
 
 =end
 
+second one results in end w/o begin
+
+=head2 begin w/o formatter
+
+=begin
+
+=end
+
+=head2 for w/o formatter
+
+=for
+
+something...
+
 =head2 Nested sequences of the same type
 
 C<code I<italic C<code again!>>>
@@ -84,6 +98,9 @@ C<code I<italic C<code again!>>>
 E<alea iacta est>
 E<C<auml>>
 E<abcI<bla>>
+E<0x100>
+E<07777>
+E<300>
 
 =head2 Unresolved internal links
 
@@ -96,12 +113,15 @@ L</OoPs>
 L<abc
 def>
 L<>
+L<   aha>
+L<oho   >
 L<"Warnings"> this one is ok
+L</unescaped> ok too, this POD has an X of the same name
 
 =head2 Warnings
 
 L<passwd(5)>
-L<   some text|page/"section"   >
+L<some text with / in it|perlvar/$|> should give warnings as hell
 
 =over 4
 
@@ -109,17 +129,70 @@ L<   some text|page/"section"   >
 
 =back 200
 
+the 200 is evil
+
 =begin html
 
 What?
 
 =end xml
 
+X<unescaped>see these unescaped < and > in the text?
+
+=head2 Misc
+
+Z<ddd> should be empty
+
+X<> should not be empty
+
+=over four
+
+This paragrapgh is misplaced - it ought to be an item.
+
+=item four should be numeric!
+
+=item
+
+=item blah
+
+=item previous is all empty!!!
+
+=back
+
+All empty over/back:
+
+=over 4
+
+=back
+
+item w/o name
+
+=cut
+
+=pod bla
+
+bla is evil
+
+=cut blub
+
+blub is evil
+
+=head2 reoccurence
+
 =over 4
 
+=item Misc
+
+we already have a head Misc
+
 =back
 
-see these unescaped < and > in the text?
+=head2 some heading
+
+=head2 another one
+
+previous section is empty!
 
 =cut
 
+
index b8e5e86..015f898 100644 (file)
@@ -1,33 +1,48 @@
-*** ERROR: Unknown command 'unknown1' at line 25 in file pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'Q' at line 29 in file pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'A' at line 30 in file pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'Y' at line 31 in file pod/poderrs.t
-*** ERROR: Unknown interior-sequence 'V' at line 31 in file pod/poderrs.t
-*** ERROR: unterminated B<...> at line 35 in file pod/poderrs.t
-*** ERROR: unterminated I<...> at line 34 in file pod/poderrs.t
-*** ERROR: unterminated C<...> at line 37 in file pod/poderrs.t
-*** WARNING: line containing nothing but whitespace in paragraph at line 45 in file pod/poderrs.t
-*** ERROR: =item without previous =over at line 52 in file pod/poderrs.t
-*** ERROR: =back without previous =over at line 56 in file pod/poderrs.t
-*** ERROR: =over on line 60 without closing =back (at head2) at line 64 in file pod/poderrs.t
-*** ERROR: =end without =begin at line 66 in file pod/poderrs.t
-*** ERROR: Nested =begin's (first at line 70:html) at line 72 in file pod/poderrs.t
-*** ERROR: =end without =begin at line 76 in file pod/poderrs.t
-*** ERROR: nested commands C<...C<...>...> at line 80 in file pod/poderrs.t
-*** ERROR: garbled entity E<alea iacta est> at line 84 in file pod/poderrs.t
-*** ERROR: garbled entity E<C<auml>> at line 85 in file pod/poderrs.t
-*** ERROR: garbled entity E<abcI<bla>> at line 86 in file pod/poderrs.t
-*** WARNING: collapsing newlines to blanks at line 96 in file pod/poderrs.t
-*** ERROR: malformed link L<> : empty link at line 98 in file pod/poderrs.t
-*** WARNING: ignoring leading whitespace in link at line 104 in file pod/poderrs.t
-*** WARNING: ignoring trailing whitespace in link at line 104 in file pod/poderrs.t
-*** ERROR: Spurious character(s) after =back at line 110 in file pod/poderrs.t
-*** WARNING: No items in =over (at line 118) / =back list at line 120 in file pod/poderrs.t
-*** WARNING: 2 unescaped <> in paragraph at line 122 in file pod/poderrs.t
-*** ERROR: unresolved internal link 'begin or begin' at line 90 in file pod/poderrs.t
-*** ERROR: unresolved internal link 'end with begin' at line 91 in file pod/poderrs.t
-*** ERROR: unresolved internal link 'OoPs' at line 92 in file pod/poderrs.t
-*** ERROR: unresolved internal link 'abc def' at line 96 in file pod/poderrs.t
-*** ERROR: unresolved internal link 'passwd(5)' at line 103 in file pod/poderrs.t
-*** WARNING: multiple occurence of link target 'oops' at line - in file pod/poderrs.t
-pod/poderrs.t has 25 pod syntax errors.
+*** ERROR: Unknown command 'unknown1' at line 25 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Q' at line 29 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'A' at line 30 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'Y' at line 31 in file t/pod/poderrs.t
+*** ERROR: Unknown interior-sequence 'V' at line 31 in file t/pod/poderrs.t
+*** ERROR: unterminated B<...> at line 35 in file t/pod/poderrs.t
+*** ERROR: unterminated I<...> at line 34 in file t/pod/poderrs.t
+*** ERROR: unterminated C<...> at line 37 in file t/pod/poderrs.t
+*** WARNING: line containing nothing but whitespace in paragraph at line 45 in file t/pod/poderrs.t
+*** ERROR: =item without previous =over at line 52 in file t/pod/poderrs.t
+*** ERROR: =back without previous =over at line 56 in file t/pod/poderrs.t
+*** ERROR: =over on line 60 without closing =back (at head2) at line 64 in file t/pod/poderrs.t
+*** ERROR: =end without =begin at line 66 in file t/pod/poderrs.t
+*** ERROR: Nested =begin's (first at line 70:html) at line 72 in file t/pod/poderrs.t
+*** ERROR: =end without =begin at line 76 in file t/pod/poderrs.t
+*** ERROR: No argument for =begin at line 82 in file t/pod/poderrs.t
+*** ERROR: =for without formatter specification at line 88 in file t/pod/poderrs.t
+*** ERROR: nested commands C<...C<...>...> at line 94 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<alea iacta est> at line 98 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<C<auml>> at line 99 in file t/pod/poderrs.t
+*** ERROR: garbled entity E<abcI<bla>> at line 100 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<0x100> at line 101 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<07777> at line 102 in file t/pod/poderrs.t
+*** ERROR: Entity number out of range E<300> at line 103 in file t/pod/poderrs.t
+*** WARNING: collapsing newlines to blanks at line 113 in file t/pod/poderrs.t
+*** ERROR: malformed link L<> : empty link at line 115 in file t/pod/poderrs.t
+*** WARNING: ignoring leading whitespace in link at line 116 in file t/pod/poderrs.t
+*** WARNING: ignoring trailing whitespace in link at line 117 in file t/pod/poderrs.t
+*** WARNING: (section) in 'passwd(5)' deprecated at line 123 in file t/pod/poderrs.t
+*** WARNING: node '$|' contains non-escaped | or / at line 124 in file t/pod/poderrs.t
+*** WARNING: alternative text '$|' contains non-escaped | or / at line 124 in file t/pod/poderrs.t
+*** ERROR: Spurious character(s) after =back at line 130 in file t/pod/poderrs.t
+*** ERROR: Nonempty Z<> at line 144 in file t/pod/poderrs.t
+*** ERROR: Empty X<> at line 146 in file t/pod/poderrs.t
+*** WARNING: No numeric argument for =over at line 148 in file t/pod/poderrs.t
+*** WARNING: preceding non-item paragraph(s) at line 152 in file t/pod/poderrs.t
+*** WARNING: No argument for =item at line 154 in file t/pod/poderrs.t
+*** WARNING: previous =item has no contents at line 156 in file t/pod/poderrs.t
+*** WARNING: No items in =over (at line 164) / =back list at line 166 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =pod at line 172 in file t/pod/poderrs.t
+*** ERROR: Spurious text after =cut at line 176 in file t/pod/poderrs.t
+*** WARNING: empty section in previous paragraph at line 192 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'begin or begin' at line 107 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'end with begin' at line 108 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'OoPs' at line 109 in file t/pod/poderrs.t
+*** ERROR: unresolved internal link 'abc def' at line 113 in file t/pod/poderrs.t
+*** WARNING: multiple occurence of link target 'Misc' at line - in file t/pod/poderrs.t
+t/pod/poderrs.t has 33 pod syntax errors.
index 30eb30c..0004548 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
index b8af57e..ecd99ec 100755 (executable)
@@ -1,7 +1,7 @@
-#!./perl
 BEGIN {
-   chdir 't' if -d 't';
-   unshift @INC, './pod', '../lib';
+   use File::Basename;
+   my $THISDIR = dirname $0;
+   unshift @INC, $THISDIR;
    require "testp2pt.pl";
    import TestPodIncPlainText;
 }
@@ -40,4 +40,7 @@ So things like C<<$self->method()>> and C<<$self->{FIELDNAME}>> wont end
 up doing what you might expect since the first > will still terminate
 the first < seen.
 
+Lets make sure these work for empty ones too, like C<<  >> and C<< >> >>
+(just to be obnoxious)
+
 =cut
index a07f4cf..a8c715a 100644 (file)
@@ -20,3 +20,6 @@
     up doing what you might expect since the first > will still terminate
     the first < seen.
 
+    Lets make sure these work for empty ones too, like and `>>' (just to be
+    obnoxious)
+
index 2ff8aa4..8cfdbb9 100644 (file)
@@ -42,8 +42,11 @@ BEGIN {
 sub catfile(@) { File::Spec->catfile(@_); }
 
 my $INSTDIR = abs_path(dirname $0);
-$INSTDIR = VMS::Filespec::unixpath($INSTDIR) if $^O eq 'VMS';
-$INSTDIR =~ s#/$## if $^O eq 'VMS';
+if ($^O eq 'VMS') { # clean up directory spec
+    $INSTDIR = VMS::Filespec::unixpath($INSTDIR);
+    $INSTDIR =~ s#/$##;
+    $INSTDIR =~ s#/000000/#/#;
+}
 $INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 'pod');
 $INSTDIR = (dirname $INSTDIR) if (basename($INSTDIR) eq 't');
 my @PODINCDIRS = ( catfile($INSTDIR, 'lib', 'Pod'),
@@ -51,6 +54,7 @@ my @PODINCDIRS = ( catfile($INSTDIR, 'lib', 'Pod'),
                    catfile($INSTDIR, 'pod'),
                    catfile($INSTDIR, 't', 'pod')
                  );
+print "PODINCDIRS = ",join(', ',@PODINCDIRS),"\n";
 
 ## Find the path to the file to =include
 sub findinclude {
@@ -106,7 +110,7 @@ sub begin_input {
 sub podinc2plaintext( $ $ ) {
     my ($infile, $outfile) = @_;
     local $_;
-    my $text_parser = $MYPKG->new;
+    my $text_parser = $MYPKG->new(quotes => "`'");
     $text_parser->parse_from_file($infile, $outfile);
 }
 
index dde64ce..450b4d0 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib' if -d '../lib';
+    @INC = '../lib';
 }
 
 use warnings;
index 15cd6b5..14014f6 100755 (executable)
@@ -1,8 +1,8 @@
 #!./perl
 
 BEGIN {
-    chdir '..' if -d '../pod';
-    unshift @INC, './lib' if -d './lib';
+    chdir '..' if -d '../pod' && -d '../t';
+    @INC = 'lib';
 }
 
 
index 414ceff..c8a0df8 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     unshift @INC, '.';
     require Config; import Config;
     if (!$Config{d_setlocale} || $Config{ccflags} =~ /\bD?NO_LOCALE\b/) {
@@ -664,6 +664,7 @@ foreach $Locale (@Locale) {
        print "# testing 116 failed for locale '$Locale' for characters @f\n"
             if @f;
     }
+
 }
 
 # Recount the errors.
@@ -709,26 +710,30 @@ EOW
     }
 }
 
-# Tell which locales ere okay.
+# Tell which locales were okay.
 
 if ($didwarn) {
     my @s;
     
     foreach my $l (@Locale) {
        my $p = 0;
-       foreach my $t (102..102) {
+       foreach my $t (102..116) {
            $p++ if $Problem{$t}{$l};
        }
        push @s, $l if $p == 0;
     }
     
-    my $s = join(" ", @s);
-    $s =~ s/(.{50,60}) /$1\n#\t/g;
-
-    warn
-       "# The following locales\n#\n",
-        "#\t", $s, "\n#\n",
-       "# tested okay.\n#\n",
+    if (@s) {
+        my $s = join(" ", @s);
+        $s =~ s/(.{50,60}) /$1\n#\t/g;
+
+        warn
+           "# The following locales\n#\n",
+            "#\t", $s, "\n#\n",
+           "# tested okay.\n#\n",
+    } else {
+        warn "# None of your locales was fully okay.\n";
+    }
 }
 
 # eof
index 78ca147..c7105dc 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 package Oscalar;
@@ -919,14 +919,69 @@ test $bar->[3], 13;               # 206
 my $aaa;
 { my $bbbb = 0; $aaa = bless \$bbbb, B }
 
-test !$aaa, 1;
+test !$aaa, 1;                 # 207
 
 unless ($aaa) {
-  test 'ok', 'ok';
+  test 'ok', 'ok';             # 208
 } else {
-  test 'is not', 'ok';
+  test 'is not', 'ok';         # 208
 }
 
+# check that overload isn't done twice by join
+{ my $c = 0;
+  package Join;
+  use overload '""' => sub { $c++ };
+  my $x = join '', bless([]), 'pq', bless([]);
+  main::test $x, '0pq1';               # 209
+};
+
+# Test module-specific warning
+{
+    # check the Odd number of arguments for overload::constant warning
+    my $a = "" ;
+    local $SIG{__WARN__} = sub {$a = $_[0]} ;
+    $x = eval ' overload::constant "integer" ; ' ;
+    test($a eq "") ; # 210
+    use warnings 'overload' ;
+    $x = eval ' overload::constant "integer" ; ' ;
+    test($a =~ /^Odd number of arguments for overload::constant at/) ; # 211
+}
+
+{
+    # check the `$_[0]' is not an overloadable type warning
+    my $a = "" ;
+    local $SIG{__WARN__} = sub {$a = $_[0]} ;
+    $x = eval ' overload::constant "fred" => sub {} ; ' ;
+    test($a eq "") ; # 212
+    use warnings 'overload' ;
+    $x = eval ' overload::constant "fred" => sub {} ; ' ;
+    test($a =~ /^`fred' is not an overloadable type at/); # 213
+}
+
+{
+    # check the `$_[1]' is not a code reference warning
+    my $a = "" ;
+    local $SIG{__WARN__} = sub {$a = $_[0]} ;
+    $x = eval ' overload::constant "integer" => 1; ' ;
+    test($a eq "") ; # 214
+    use warnings 'overload' ;
+    $x = eval ' overload::constant "integer" => 1; ' ;
+    test($a =~ /^`1' is not a code reference at/); # 215
+}
+
+# make sure that we don't inifinitely recurse
+{
+  my $c = 0;
+  package Recurse;
+  use overload '""'    => sub { shift },
+               '0+'    => sub { shift },
+               'bool'  => sub { shift },
+               fallback => 1;
+  my $x = bless([]);
+  main::test("$x" =~ /Recurse=ARRAY/);         # 216
+  main::test($x);                               # 217
+  main::test($x+0 =~ /Recurse=ARRAY/);         # 218
+};
 
 # Last test is:
-sub last {208}
+sub last {218}
index 167b360..5b245d0 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $ENV{PERL5LIB} = '../lib';
 }
 
index e96c329..3ab8766 100755 (executable)
@@ -2,7 +2,7 @@ print "1..46\n";
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
 }
 
 sub a : lvalue { my $a = 34; bless \$a }  # Return a temporary
index fe84f5e..7e48e20 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $ENV{PERL5LIB} = '../lib';
 }
 
@@ -114,6 +114,30 @@ EXPECT
 3
 ########
 
+# override a built-in function, call after definition
+use subs qw( open ) ;
+sub open { print $_[0] + $_[1], "\n" }
+open 1,2 ;
+EXPECT
+3
+########
+
+# override a built-in function, call with ()
+use subs qw( open ) ;
+open (1,2) ;
+sub open { print $_[0] + $_[1], "\n" }
+EXPECT
+3
+########
+
+# override a built-in function, call with () after definition
+use subs qw( open ) ;
+sub open { print $_[0] + $_[1], "\n" }
+open (1,2) ;
+EXPECT
+3
+########
+
 --FILE-- abc
 Fred 1,2 ;
 1;
index d1546fe..c3538c0 100755 (executable)
@@ -2,7 +2,7 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $ENV{PERL5LIB} = '../lib';
     if ( ord("\t") != 9 ) { # skip on ebcdic platforms
         print "1..0 # Skip utf8 tests on ebcdic platform.\n";
@@ -10,7 +10,7 @@ BEGIN {
     }
 }
 
-print "1..66\n";
+print "1..99\n";
 
 my $test = 1;
 
@@ -20,6 +20,12 @@ sub ok {
     print "ok $test\n";
 }
 
+sub nok {
+    my ($got,$expect) = @_;
+    print "# expected not [$expect], got [$got]\nnot " if $got eq $expect;
+    print "ok $test\n";
+}
+
 sub ok_bytes {
     use bytes;
     my ($got,$expect) = @_;
@@ -27,6 +33,12 @@ sub ok_bytes {
     print "ok $test\n";
 }
 
+sub nok_bytes {
+    use bytes;
+    my ($got,$expect) = @_;
+    print "# expected not [$expect], got [$got]\nnot " if $got eq $expect;
+    print "ok $test\n";
+}
 
 {
     use utf8;
@@ -295,3 +307,221 @@ sub ok_bytes {
     ok_bytes chr(0xe2), pack("C*", 0xc3, 0xa2);
     $test++;                # 66
 }
+
+{
+    use utf8;
+    my @a = map ord, split(//, join("", map chr, (1234, 123, 2345)));
+    ok "@a", "1234 123 2345";
+    $test++;                # 67
+}
+
+{
+    use utf8;
+    my $x = chr(123);
+    my @a = map ord, split(/$x/, join("", map chr, (1234, 123, 2345)));
+    ok "@a", "1234 2345";
+    $test++;                # 68
+}
+
+{
+    # bug id 20001009.001
+
+    my($a,$b);
+    { use bytes; $a = "\xc3\xa4"; }  
+    { use utf8;  $b = "\xe4"; }
+    { use bytes; ok_bytes $a, $b; $test++; } # 69
+    { use utf8;  nok      $a, $b; $test++; } # 70
+}
+
+{
+    # bug id 20001008.001
+
+    my @x = ("stra\337e 138","stra\337e 138");
+    for (@x) {
+       s/(\d+)\s*([\w\-]+)/$1 . uc $2/e;
+       my($latin) = /^(.+)(?:\s+\d)/;
+       print $latin eq "stra\337e" ? "ok $test\n" :
+           "#latin[$latin]\nnot ok $test\n";
+       $test++;
+       $latin =~ s/stra\337e/straße/; # \303\237 after the 2nd a
+       use utf8;
+       $latin =~ s!(s)tr(?:aß|s+e)!$1tr.!; # \303\237 after the a
+    }
+}
+
+{
+    # bug id 20000819.004 
+
+    $_ = $dx = "\x{10f2}";
+    s/($dx)/$dx$1/;
+    {
+       use bytes;
+       print "not " unless $_ eq "$dx$dx";
+       print "ok $test\n";
+       $test++;
+    }
+
+    $_ = $dx = "\x{10f2}";
+    s/($dx)/$1$dx/;
+    {
+       use bytes;
+       print "not " unless $_ eq "$dx$dx";
+       print "ok $test\n";
+       $test++;
+    }
+
+    $dx = "\x{10f2}";
+    $_  = "\x{10f2}\x{10f2}";
+    s/($dx)($dx)/$1$2/;
+    {
+       use bytes;
+       print "not " unless $_ eq "$dx$dx";
+       print "ok $test\n";
+       $test++;
+    }
+}
+
+{
+    # bug id 20000323.056
+
+    use utf8;
+
+    print "not " unless "\x{41}" eq +v65;
+    print "ok $test\n";
+    $test++;
+
+    print "not " unless "\x41" eq +v65;
+    print "ok $test\n";
+    $test++;
+
+    print "not " unless "\x{c8}" eq +v200;
+    print "ok $test\n";
+    $test++;
+
+    print "not " unless "\xc8" eq +v200;
+    print "ok $test\n";
+    $test++;
+
+    print "not " unless "\x{221b}" eq v8731;
+    print "ok $test\n";
+    $test++;
+}
+
+{
+    # bug id 20000427.003 
+
+    use utf8;
+    use warnings;
+    use strict;
+
+    my $sushi = "\x{b36c}\x{5a8c}\x{ff5b}\x{5079}\x{505b}";
+
+    my @charlist = split //, $sushi;
+    my $r = '';
+    foreach my $ch (@charlist) {
+       $r = $r . " " . sprintf "U+%04X", ord($ch);
+    }
+
+    print "not " unless $r eq " U+B36C U+5A8C U+FF5B U+5079 U+505B";
+    print "ok $test\n";
+    $test++;
+}
+
+{
+    # bug id 20000901.092
+    # test that undef left and right of utf8 results in a valid string
+
+    my $a;
+    $a .= "\x{1ff}";
+    print "not " unless $a eq "\x{1ff}";
+    print "ok $test\n";
+    $test++;
+}
+
+{
+    # bug id 20000426.003
+
+    use utf8;
+
+    my $s = "\x20\x40\x{80}\x{100}\x{80}\x40\x20";
+
+    my ($a, $b, $c) = split(/\x40/, $s);
+    print "not "
+       unless $a eq "\x20" && $b eq "\x{80}\x{100}\x{80}" && $c eq $a;
+    print "ok $test\n";
+    $test++;
+
+    my ($a, $b) = split(/\x{100}/, $s);
+    print "not " unless $a eq "\x20\x40\x{80}" && $b eq "\x{80}\x40\x20";
+    print "ok $test\n";
+    $test++;
+
+    my ($a, $b) = split(/\x{80}\x{100}\x{80}/, $s);
+    print "not " unless $a eq "\x20\x40" && $b eq "\x40\x20";
+    print "ok $test\n";
+    $test++;
+
+    my ($a, $b) = split(/\x40\x{80}/, $s);
+    print "not " unless $a eq "\x20" && $b eq "\x{100}\x{80}\x40\x20";
+    print "ok $test\n";
+    $test++;
+
+    my ($a, $b, $c) = split(/[\x40\x{80}]+/, $s);
+    print "not " unless $a eq "\x20" && $b eq "\x{100}" && $c eq "\x20";
+    print "ok $test\n";
+    $test++;
+}
+
+{
+    # bug id 20000730.004
+
+    use utf8;
+
+    my $smiley = "\x{263a}";
+
+    for my $s ("\x{263a}",                     #  1
+              $smiley,                        #  2
+               
+              "" . $smiley,                   #  3
+              "" . "\x{263a}",                #  4
+
+              $smiley    . "",                #  5
+              "\x{263a}" . "",                #  6
+              ) {
+       my $length_chars = length($s);
+       my $length_bytes;
+       { use bytes; $length_bytes = length($s) }
+       my @regex_chars = $s =~ m/(.)/g;
+       my $regex_chars = @regex_chars;
+       my @split_chars = split //, $s;
+       my $split_chars = @split_chars;
+       print "not "
+           unless "$length_chars/$regex_chars/$split_chars/$length_bytes" eq
+                  "1/1/1/3";
+       print "ok $test\n";
+       $test++;
+    }
+
+    for my $s ("\x{263a}" . "\x{263a}",        #  7
+              $smiley    . $smiley,           #  8
+
+              "\x{263a}\x{263a}",             #  9
+              "$smiley$smiley",               # 10
+              
+              "\x{263a}" x 2,                 # 11
+              $smiley    x 2,                 # 12
+              ) {
+       my $length_chars = length($s);
+       my $length_bytes;
+       { use bytes; $length_bytes = length($s) }
+       my @regex_chars = $s =~ m/(.)/g;
+       my $regex_chars = @regex_chars;
+       my @split_chars = split //, $s;
+       my $split_chars = @split_chars;
+       print "not "
+           unless "$length_chars/$regex_chars/$split_chars/$length_bytes" eq
+                  "2/2/2/6";
+       print "ok $test\n";
+       $test++;
+    }
+}
index 382a845..a25fa2c 100644 (file)
@@ -276,3 +276,37 @@ $a =+ 1 ;
 print STDERR "The End.\n" ;
 EXPECT
 Reversed += operator at - line 8.
+########
+
+use warnings 'void' ;
+
+time ;
+
+{
+    use warnings FATAL => qw(void) ;
+    length "abc" ;
+}
+
+join "", 1,2,3 ;
+
+print "done\n" ;
+EXPECT
+Useless use of time in void context at - line 4.
+Useless use of length in void context at - line 8.
+########
+
+use warnings ;
+
+time ;
+
+{
+    use warnings FATAL => qw(void) ;
+    length "abc" ;
+}
+
+join "", 1,2,3 ;
+
+print "done\n" ;
+EXPECT
+Useless use of time in void context at - line 4.
+Useless use of length in void context at - line 8.
index 96f319e..f5579b2 100755 (executable)
@@ -332,7 +332,17 @@ print $@ ;
 EXPECT
 Usage: warnings::warn([category,] 'message') at - line 4
 unknown warnings category 'fred' at - line 6
-       eval {...} called at - line 6
+########
+
+# check warnings::warnif
+use warnings ;
+eval { warnings::warnif() } ;
+print $@ ;
+eval { warnings::warnif("fred", "joe") } ;
+print $@ ;
+EXPECT
+Usage: warnings::warnif([category,] 'message') at - line 4
+unknown warnings category 'fred' at - line 6
 ########
 
 --FILE-- abc.pm
@@ -373,6 +383,7 @@ eval { abc::check() ; } ;
 print "[[$@]]\n";
 EXPECT
 hello at - line 3
+       eval {...} called at - line 3
 [[]]
 ########
 
@@ -388,6 +399,7 @@ eval { abc::check() ; } ;
 print "[[$@]]\n";
 EXPECT
 [[hello at - line 3
+       eval {...} called at - line 3
 ]]
 ########
 -W
@@ -431,7 +443,37 @@ use warnings 'syntax' ;
 use abc ;
 abc::check() ;
 EXPECT
-package 'abc' not registered for warnings at - line 3
+package 'abc' not registered for warnings at abc.pm line 4
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+  warnings::warn("fred") ;
+}
+1;
+--FILE-- 
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+package 'abc' not registered for warnings at abc.pm line 4
+########
+
+--FILE-- abc.pm
+package abc ;
+no warnings ;
+sub check {
+  warnings::warnif("fred") ;
+}
+1;
+--FILE-- 
+use warnings 'syntax' ;
+use abc ;
+abc::check() ;
+EXPECT
+package 'abc' not registered for warnings at abc.pm line 4
 ########
 
 --FILE-- abc.pm
@@ -617,6 +659,7 @@ eval { abc::check() ; } ;
 print "[[$@]]\n";
 EXPECT
 hello at - line 3
+       eval {...} called at - line 3
 [[]]
 ########
 
@@ -632,6 +675,7 @@ eval { abc::check() ; } ;
 print "[[$@]]\n";
 EXPECT
 [[hello at - line 3
+       eval {...} called at - line 3
 ]]
 ########
 -W
@@ -723,6 +767,10 @@ sub check {
   print "ok1\n" if !warnings::enabled() ;
   print "ok2\n" if !warnings::enabled("io") ;
   print "ok3\n" if !warnings::enabled("all") ;
+  warnings::warnif("my message 1") ;
+  warnings::warnif('abc', "my message 2") ;
+  warnings::warnif('io', "my message 3") ;
+  warnings::warnif('all', "my message 4") ;
 }
 1;
 --FILE-- 
@@ -867,6 +915,10 @@ sub check {
   print "ok1\n" if !warnings::enabled() ;
   print "ok2\n" if !warnings::enabled("io") ;
   print "ok3\n" if !warnings::enabled("all") ;
+  warnings::warnif("my message 1") ;
+  warnings::warnif('abc', "my message 2") ;
+  warnings::warnif('io', "my message 3") ;
+  warnings::warnif('all', "my message 4") ;
 }
 1;
 --FILE-- 
@@ -901,3 +953,210 @@ EXPECT
 ok1
 ok2
 ok3
+########
+
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+no warnings ;
+use warnings::register ;
+sub check { 
+  print "ok1\n" if  warnings::enabled() ;
+  print "ok2\n" if !warnings::enabled("io") ;
+  print "ok3\n" if !warnings::enabled("all") ;
+  print "ok4\n" if  warnings::enabled("abc") ;
+  warnings::warn("my message 1") ;
+  warnings::warnif("my message 2") ;
+  warnings::warnif('abc', "my message 3") ;
+  warnings::warnif('io', "my message 4") ;
+  warnings::warnif('all', "my message 5") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE-- 
+use abc ;
+use warnings 'abc';
+abc::in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+my message 1 at - line 3
+my message 2 at - line 3
+my message 3 at - line 3
+########
+
+--FILE-- def.pm
+package def ;
+no warnings ;
+use warnings::register ;
+sub check { 
+  print "ok1\n" if  warnings::enabled() ;
+  print "ok2\n" if !warnings::enabled("io") ;
+  print "ok3\n" if !warnings::enabled("all") ;
+  print "ok4\n" if  warnings::enabled("def") ;
+  warnings::warn("my message 1") ;
+  warnings::warnif("my message 2") ;
+  warnings::warnif('def', "my message 3") ;
+  warnings::warnif('io', "my message 4") ;
+  warnings::warnif('all', "my message 5") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+use def ;
+use warnings 'def';
+sub in1 { def::in1() ; }
+1;
+--FILE-- 
+use abc ;
+no warnings;
+abc::in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+my message 1 at abc.pm line 5
+       abc::in1() called at - line 3
+my message 2 at abc.pm line 5
+       abc::in1() called at - line 3
+my message 3 at abc.pm line 5
+       abc::in1() called at - line 3
+########
+
+--FILE-- def.pm
+$| = 1;
+package def ;
+no warnings ;
+use warnings::register ;
+require Exporter;
+@ISA = qw( Exporter ) ;
+@EXPORT = qw( in1 ) ;
+sub check { 
+  print "ok1\n" if  warnings::enabled() ;
+  print "ok2\n" if !warnings::enabled("io") ;
+  print "ok3\n" if !warnings::enabled("all") ;
+  print "ok4\n" if  warnings::enabled("abc") ;
+  print "ok5\n" if !warnings::enabled("def") ;
+  warnings::warn("my message 1") ;
+  warnings::warnif("my message 2") ;
+  warnings::warnif('abc', "my message 3") ;
+  warnings::warnif('def', "my message 4") ;
+  warnings::warnif('io', "my message 5") ;
+  warnings::warnif('all', "my message 6") ;
+}
+sub in2 { no warnings ; check() }
+sub in1 { no warnings ; in2() }
+1;
+--FILE-- abc.pm
+package abc ;
+use warnings::register ;
+use def ;
+#@ISA = qw(def) ;
+1;
+--FILE-- 
+use abc ;
+no warnings;
+use warnings 'abc';
+abc::in1() ;
+EXPECT
+ok2
+ok3
+ok4
+ok5
+my message 1 at - line 4
+my message 3 at - line 4
+########
+
+--FILE-- def.pm
+package def ;
+no warnings ;
+use warnings::register ;
+
+sub new
+{
+    my $class = shift ;
+    bless [], $class ;
+}
+
+sub check 
+{ 
+  my $self = shift ;
+  print "ok1\n" if !warnings::enabled() ;
+  print "ok2\n" if !warnings::enabled("io") ;
+  print "ok3\n" if !warnings::enabled("all") ;
+  print "ok4\n" if  warnings::enabled("abc") ;
+  print "ok5\n" if !warnings::enabled("def") ;
+  print "ok6\n" if  warnings::enabled($self) ;
+
+  warnings::warn("my message 1") ;
+  warnings::warn($self, "my message 2") ;
+
+  warnings::warnif("my message 3") ;
+  warnings::warnif('abc', "my message 4") ;
+  warnings::warnif('def', "my message 5") ;
+  warnings::warnif('io', "my message 6") ;
+  warnings::warnif('all', "my message 7") ;
+  warnings::warnif($self, "my message 8") ;
+}
+sub in2 
+{
+  no warnings ; 
+  my $self = shift ;
+  $self->check() ;
+}
+sub in1 
+{ 
+  no warnings ;
+  my $self = shift ;
+  $self->in2();
+}
+1;
+--FILE-- abc.pm
+$| = 1;
+package abc ;
+use warnings::register ;
+use def ;
+@ISA = qw(def) ;
+sub new
+{
+    my $class = shift ;
+    bless [], $class ;
+}
+
+1;
+--FILE-- 
+use abc ;
+no warnings;
+use warnings 'abc';
+$a = new abc ;
+$a->in1() ;
+print "**\n";
+$b = new def ;
+$b->in1() ;
+EXPECT
+ok1
+ok2
+ok3
+ok4
+ok5
+ok6
+my message 1 at - line 5
+my message 2 at - line 5
+my message 4 at - line 5
+my message 8 at - line 5
+**
+ok1
+ok2
+ok3
+ok4
+ok5
+my message 1 at - line 8
+my message 2 at - line 8
+my message 4 at - line 8
index 813f149..2a357e2 100644 (file)
   warn(warn_nl, "open");               [Perl_do_open9]
     open(F, "true\ncd")
 
-  Close on unopened file %s            [Perl_do_close] <<TODO
+  close() on unopened filehandle %s    [Perl_do_close]
     $a = "fred";close("$a")
 
-  tell() on unopened file              [Perl_do_tell]
+  tell() on closed filehandle          [Perl_do_tell]
     $a = "fred";$a = tell($a)
 
-  seek() on unopened file              [Perl_do_seek]
+  seek() on closed filehandle          [Perl_do_seek]
     $a = "fred";$a = seek($a,1,1)
 
-  sysseek() on unopened file           [Perl_do_sysseek]
+  sysseek() on closed filehandle       [Perl_do_sysseek]
     $a = "fred";$a = seek($a,1,1)
 
   warn(warn_uninit);                   [Perl_do_print]
     print $a ;
 
-  Stat on unopened file <%s>           [Perl_my_stat]
+  -x on closed filehandle %s           [Perl_my_stat]
     close STDIN ; -x STDIN ;
 
   warn(warn_nl, "stat");               [Perl_my_stat]
@@ -96,7 +96,7 @@ close "fred" ;
 no warnings 'unopened' ;
 close "joe" ;
 EXPECT
-Close on unopened file fred at - line 3.
+close() on unopened filehandle fred at - line 3.
 ########
 # doio.c [Perl_do_tell Perl_do_seek Perl_do_sysseek Perl_my_stat]
 use warnings 'io' ;
@@ -105,17 +105,35 @@ tell(STDIN);
 $a = seek(STDIN,1,1);
 $a = sysseek(STDIN,1,1);
 -x STDIN ;
+stat(STDIN) ;
+$a = "fred";
+tell($a);
+seek($a,1,1);
+sysseek($a,1,1);
+-x $a; # ok
+stat($a); # ok
 no warnings 'io' ;
 close STDIN ;
 tell(STDIN);
 $a = seek(STDIN,1,1);
 $a = sysseek(STDIN,1,1);
 -x STDIN ;
+stat(STDIN) ;
+$a = "fred";
+tell($a);
+seek($a,1,1);
+sysseek($a,1,1);
+-x $a;
+stat($a);
 EXPECT
-tell() on unopened file at - line 4.
-seek() on unopened file at - line 5.
-sysseek() on unopened file at - line 6.
-Stat on unopened file STDIN at - line 7.
+tell() on closed filehandle STDIN at - line 4.
+seek() on closed filehandle STDIN at - line 5.
+sysseek() on closed filehandle STDIN at - line 6.
+-x on closed filehandle STDIN at - line 7.
+stat() on closed filehandle STDIN at - line 8.
+tell() on unopened filehandle at - line 10.
+seek() on unopened filehandle at - line 11.
+sysseek() on unopened filehandle at - line 12.
 ########
 # doio.c [Perl_do_print]
 use warnings 'uninitialized' ;
index fe874ef..4268205 100644 (file)
@@ -1,6 +1,6 @@
   pp_hot.c     
 
-  Filehandle %s never opened                   [pp_print]
+  print() on unopened filehandle abc           [pp_print]
     $f = $a = "abc" ; print $f $a
 
   Filehandle %s opened only for input          [pp_print]
@@ -33,6 +33,9 @@
   readline() on closed filehandle %s           [Perl_do_readline]
     close STDIN ; $a = <STDIN>;
 
+  readline() on closed filehandle %s           [Perl_do_readline]
+    readline(NONESUCH);
+
   glob failed (child exited with status %d%s)  [Perl_do_readline] <<TODO
 
   Deep recursion on subroutine \"%s\"          [Perl_sub_crush_depth]
@@ -52,7 +55,7 @@ print $f $a;
 no warnings 'unopened' ;
 print $f $a;
 EXPECT
-Filehandle abc never opened at - line 4.
+print() on unopened filehandle abc at - line 4.
 ########
 # pp_hot.c [pp_print]
 use warnings 'io' ;
index ad5982a..2843c70 100644 (file)
@@ -16,7 +16,7 @@
 
   page overflow                                        [pp_leavewrite]
 
-  Filehandle %s never opened                   [pp_prtf]
+  printf() on unopened filehandle abc          [pp_prtf]
     $a = "abc"; printf $a "fred"
 
   Filehandle %s opened only for input          [pp_prtf]
     getpeername STDIN;
 
   flock() on closed socket %s                  [pp_flock]
+  flock() on closed socket                     [pp_flock]
     close STDIN;
     flock STDIN, 8;
+    flock $a, 8;
+
+  lstat() on filehandle %s                     [pp_stat]
+    lstat(STDIN);
 
   warn(warn_nl, "stat");                       [pp_stat]
 
-  Test on unopened file <%s>
-       close STDIN ; -T STDIN ;
+  -T on closed filehandle %s
+  stat() on closed filehandle %s
+       close STDIN ; -T STDIN ; stat(STDIN) ;
 
   warn(warn_nl, "open");                       [pp_fttext]
     -T "abc\ndef" ;
@@ -152,7 +158,7 @@ printf $a "fred";
 no warnings 'unopened' ;
 printf $a "fred";
 EXPECT
-Filehandle abc never opened at - line 4.
+printf() on unopened filehandle abc at - line 4.
 ########
 # pp_sys.c [pp_prtf]
 use warnings 'closed' ;
@@ -205,19 +211,25 @@ EOM
     exit ;
   } 
 }
-use warnings 'closed' ;
+use warnings qw(unopened closed);
 close STDIN;
 flock STDIN, 8;
 opendir STDIN, ".";
 flock STDIN, 8;
-no warnings 'closed' ;
+flock FOO, 8;
+flock $a, 8;
+no warnings qw(unopened closed);
 flock STDIN, 8;
 opendir STDIN, ".";
 flock STDIN, 8;
+flock FOO, 8;
+flock $a, 8;
 EXPECT
 flock() on closed filehandle STDIN at - line 14.
 flock() on closed filehandle STDIN at - line 16.
        (Are you trying to call flock() on dirhandle STDIN?)
+flock() on unopened filehandle FOO at - line 17.
+flock() on unopened filehandle at - line 18.
 ########
 # pp_sys.c [pp_prtf pp_send pp_bind pp_connect pp_listen pp_accept pp_shutdown pp_ssockopt ppp_getpeername]
 use warnings 'io' ;
@@ -324,14 +336,41 @@ stat "abc\ndef";
 EXPECT
 Unsuccessful stat on filename containing newline at - line 3.
 ########
+# pp_sys.c [pp_stat]
+use Config; 
+BEGIN { 
+  if ($^O eq 'd_lstat') {
+    print <<EOM ;
+SKIPPED
+# lstat not present
+EOM
+    exit ;
+  } 
+}
+use warnings 'io' ;
+lstat(STDIN) ;
+no warnings 'io' ;
+lstat(STDIN) ;
+EXPECT
+lstat() on filehandle STDIN at - line 13.
+########
 # pp_sys.c [pp_fttext]
-use warnings 'unopened' ;
+use warnings qw(unopened closed) ;
 close STDIN ; 
 -T STDIN ;
-no warnings 'unopened' ;
+stat(STDIN) ;
+-T HOCUS;
+stat(POCUS);
+no warnings qw(unopened closed) ;
 -T STDIN ;
+stat(STDIN);
+-T HOCUS;
+stat(POCUS);
 EXPECT
-Test on unopened file STDIN at - line 4.
+-T on closed filehandle STDIN at - line 4.
+stat() on closed filehandle STDIN at - line 5.
+-T on unopened filehandle HOCUS at - line 6.
+stat() on unopened filehandle POCUS at - line 7.
 ########
 # pp_sys.c [pp_fttext]
 use warnings 'newline' ;
@@ -343,6 +382,13 @@ Unsuccessful open on filename containing newline at - line 3.
 ########
 # pp_sys.c [pp_sysread]
 use warnings 'io' ;
+if ($^O eq 'dos') {
+    print <<EOM ;
+SKIPPED
+# skipped on dos
+EOM
+    exit ;
+}
 my $file = "./xcv" ;
 open(F, ">$file") ; 
 my $a = sysread(F, $a,10) ;
@@ -351,4 +397,4 @@ my $a = sysread(F, $a,10) ;
 close F ;
 unlink $file ;
 EXPECT
-Filehandle F opened only for output at - line 5.
+Filehandle F opened only for output at - line 12.
index ef87b7f..59076d5 100644 (file)
@@ -29,7 +29,7 @@ $a =~ /(?=a)*/ ;
 no warnings 'regexp' ;
 $a =~ /(?=a)*/ ;
 EXPECT
-(?=a)* matches null string many times at - line 4.
+(?=a)* matches null string many times before HERE mark in regex m/(?=a)* << HERE / at - line 4.
 ########
 # regcomp.c [S_study_chunk]
 use warnings 'regexp' ;
@@ -38,7 +38,7 @@ $_ = "" ;
 no warnings 'regexp' ;
 /(?=a)?/;
 EXPECT
-Strange *+?{} on zero-length expression at - line 4.
+Quantifier unexpected on zero-length expression before HERE mark in regex m/(?=a)? << HERE / at - line 4.
 ########
 # regcomp.c [S_regatom]
 $x = '\m' ;
@@ -47,7 +47,7 @@ $a =~ /a$x/ ;
 no warnings 'regexp' ;
 $a =~ /a$x/ ;
 EXPECT
-/a\m/: Unrecognized escape \m passed through at - line 4.
+Unrecognized escape \m passed through before HERE mark in regex m/a\m << HERE / at - line 4.
 ########
 # regcomp.c [S_regpposixcc S_checkposixcc]
 BEGIN { $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3 }
@@ -61,9 +61,9 @@ no warnings 'regexp' ;
 /[:zog:]/;
 /[[:zog:]]/;
 EXPECT
-Character class syntax [: :] belongs inside character classes at - line 5.
-Character class syntax [: :] belongs inside character classes at - line 6.
-Character class [:zog:] unknown at - line 7.
+POSIX syntax [: :] belongs inside character classes before HERE mark in regex m/[:alpha:] << HERE / at - line 5.
+POSIX syntax [: :] belongs inside character classes before HERE mark in regex m/[:zog:] << HERE / at - line 6.
+POSIX class [:zog:] unknown before HERE mark in regex m/[[:zog:] << HERE ]/
 ########
 # regcomp.c [S_checkposixcc]
 BEGIN { $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3 }
@@ -73,8 +73,8 @@ $_ = "" ;
 no warnings 'regexp' ;
 /[.zog.]/;
 EXPECT
-Character class syntax [. .] belongs inside character classes at - line 5.
-Character class syntax [. .] is reserved for future extensions at - line 5.
+POSIX syntax [. .] belongs inside character classes before HERE mark in regex m/[.zog.] << HERE / at - line 5.
+POSIX syntax [. .] is reserved for future extensions before HERE mark in regex m/[.zog.] << HERE /
 ########
 # regcomp.c [S_checkposixcc]
 BEGIN { $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3 }
@@ -84,7 +84,7 @@ $_ = "" ;
 no warnings 'regexp' ;
 /[[.zog.]]/;
 EXPECT
-Character class syntax [. .] is reserved for future extensions at - line 5.
+POSIX syntax [. .] is reserved for future extensions before HERE mark in regex m/[[.zog.] << HERE ]/
 ########
 # regcomp.c [S_regclass]
 $_ = "";
@@ -109,14 +109,14 @@ no warnings 'regexp' ;
 /[[:alpha:]-[:digit:]]/;
 /[[:digit:]-[:alpha:]]/;
 EXPECT
-/[a-\d]/: false [] range "a-\d" in regexp at - line 5.
-/[\d-b]/: false [] range "\d-" in regexp at - line 6.
-/[\s-\d]/: false [] range "\s-" in regexp at - line 7.
-/[\d-\s]/: false [] range "\d-" in regexp at - line 8.
-/[a-[:digit:]]/: false [] range "a-[:digit:]" in regexp at - line 9.
-/[[:digit:]-b]/: false [] range "[:digit:]-" in regexp at - line 10.
-/[[:alpha:]-[:digit:]]/: false [] range "[:alpha:]-" in regexp at - line 11.
-/[[:digit:]-[:alpha:]]/: false [] range "[:digit:]-" in regexp at - line 12.
+False [] range "a-\d" before HERE mark in regex m/[a-\d << HERE ]/ at - line 5.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE b]/ at - line 6.
+False [] range "\s-" before HERE mark in regex m/[\s- << HERE \d]/ at - line 7.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE \s]/ at - line 8.
+False [] range "a-[:digit:]" before HERE mark in regex m/[a-[:digit:] << HERE ]/ at - line 9.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE b]/ at - line 10.
+False [] range "[:alpha:]-" before HERE mark in regex m/[[:alpha:]- << HERE [:digit:]]/ at - line 11.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE [:alpha:]]/ at - line 12.
 ########
 # regcomp.c [S_regclassutf8]
 BEGIN {
@@ -148,14 +148,14 @@ no warnings 'regexp' ;
 /[[:alpha:]-[:digit:]]/;
 /[[:digit:]-[:alpha:]]/;
 EXPECT
-/[a-\d]/: false [] range "a-\d" in regexp at - line 12.
-/[\d-b]/: false [] range "\d-" in regexp at - line 13.
-/[\s-\d]/: false [] range "\s-" in regexp at - line 14.
-/[\d-\s]/: false [] range "\d-" in regexp at - line 15.
-/[a-[:digit:]]/: false [] range "a-[:digit:]" in regexp at - line 16.
-/[[:digit:]-b]/: false [] range "[:digit:]-" in regexp at - line 17.
-/[[:alpha:]-[:digit:]]/: false [] range "[:alpha:]-" in regexp at - line 18.
-/[[:digit:]-[:alpha:]]/: false [] range "[:digit:]-" in regexp at - line 19.
+False [] range "a-\d" before HERE mark in regex m/[a-\d << HERE ]/ at - line 12.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE b]/ at - line 13.
+False [] range "\s-" before HERE mark in regex m/[\s- << HERE \d]/ at - line 14.
+False [] range "\d-" before HERE mark in regex m/[\d- << HERE \s]/ at - line 15.
+False [] range "a-[:digit:]" before HERE mark in regex m/[a-[:digit:] << HERE ]/ at - line 16.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE b]/ at - line 17.
+False [] range "[:alpha:]-" before HERE mark in regex m/[[:alpha:]- << HERE [:digit:]]/ at - line 18.
+False [] range "[:digit:]-" before HERE mark in regex m/[[:digit:]- << HERE [:alpha:]]/ at - line 19.
 ########
 # regcomp.c [S_regclass S_regclassutf8]
 use warnings 'regexp' ;
@@ -163,4 +163,5 @@ $a =~ /[a\zb]/ ;
 no warnings 'regexp' ;
 $a =~ /[a\zb]/ ;
 EXPECT
-/[a\zb]/: Unrecognized escape \z in character class passed through at - line 3.
+Unrecognized escape \z in character class passed through before HERE mark in regex m/[a\z << HERE b]/ at - line 3.
+
index a551740..3674497 100644 (file)
@@ -2,9 +2,10 @@
 
 BEGIN {
     chdir 't' if -d 't';
-    unshift @INC, '../lib';
+    @INC = '../lib';
     $ENV{PERL5LIB} = '../lib';
     require Config; import Config;
+    $ENV{PERL_DESTRUCT_LEVEL} = 0 unless $ENV{PERL_DESTRUCT_LEVEL} > 3;
 }
 
 $| = 1;
index f7ab18c..9740dba 100644 (file)
--- a/thread.h
+++ b/thread.h
 #define INIT_THREADS           cthread_init()
 #define YIELD                  cthread_yield()
 #define ALLOC_THREAD_KEY       NOOP
+#define FREE_THREAD_KEY                NOOP
 #define SET_THREAD_SELF(thr)   (thr->self = cthread_self())
 
 #endif /* I_MACH_CTHREADS */
 #  define ALLOC_THREAD_KEY \
     STMT_START {                                               \
        if (pthread_key_create(&PL_thr_key, 0)) {               \
-           fprintf(stderr, "panic: pthread_key_create");       \
+           PerlIO_printf(PerlIO_stderr(), "panic: pthread_key_create");        \
            exit(1);                                            \
        }                                                       \
     } STMT_END
 #endif
 
+#ifndef FREE_THREAD_KEY
+#  define FREE_THREAD_KEY \
+    STMT_START {                                               \
+       pthread_key_delete(PL_thr_key);                         \
+    } STMT_END
+#endif
+
 #ifndef THREAD_RET_TYPE
 #  define THREAD_RET_TYPE      void *
 #  define THREAD_RET_CAST(p)   ((void *)(p))
diff --git a/toke.c b/toke.c
index 777719f..b3c6674 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -209,10 +209,8 @@ S_no_op(pTHX_ char *what, char *s)
 
     if (!s)
        s = oldbp;
-    else {
-       assert(s >= oldbp);
+    else
        PL_bufptr = s;
-    }
     yywarn(Perl_form(aTHX_ "%s found where operator expected", what));
     if (is_first)
        Perl_warn(aTHX_ "\t(Missing semicolon on previous line?)\n");
@@ -223,8 +221,10 @@ S_no_op(pTHX_ char *what, char *s)
            Perl_warn(aTHX_ "\t(Do you need to predeclare %.*s?)\n",
                t - PL_oldoldbufptr, PL_oldoldbufptr);
     }
-    else
+    else {
+       assert(s >= oldbp);
        Perl_warn(aTHX_ "\t(Missing operator before %.*s?)\n", s - oldbp, oldbp);
+    }
     PL_bufptr = oldbp;
 }
 
@@ -357,7 +357,6 @@ Perl_lex_start(pTHX_ SV *line)
            SAVEVPTR(PL_nextval[toke]);
        }
        SAVEI32(PL_nexttoke);
-       PL_nexttoke = 0;
     }
     SAVECOPLINE(PL_curcop);
     SAVEPPTR(PL_bufptr);
@@ -391,6 +390,7 @@ Perl_lex_start(pTHX_ SV *line)
     PL_lex_stuff = Nullsv;
     PL_lex_repl = Nullsv;
     PL_lex_inpat = 0;
+    PL_nexttoke = 0;
     PL_lex_inwhat = 0;
     PL_sublex_info.sub_inwhat = 0;
     PL_linestr = line;
@@ -812,7 +812,7 @@ Perl_str_to_version(pTHX_ SV *sv)
        I32 skip;
        UV n;
        if (utf)
-           n = utf8_to_uv((U8*)start, &skip);
+           n = utf8_to_uv_chk((U8*)start, &skip, 0);
        else {
            n = *(U8*)start;
            skip = 1;
@@ -1219,7 +1219,7 @@ S_scan_const(pTHX_ char *start)
                 if (min > max) {
                    Perl_croak(aTHX_
                               "Invalid [] range \"%c-%c\" in transliteration operator",
-                              min, max);
+                              (char)min, (char)max);
                 }
 
 #ifndef ASCIIish
@@ -1305,9 +1305,11 @@ S_scan_const(pTHX_ char *start)
                *d++ = *s++;
        }
 
-       /* check for embedded arrays (@foo, @:foo, @'foo, @{foo}, @$foo) */
+       /* check for embedded arrays
+          (@foo, @:foo, @'foo, @{foo}, @$foo, @+, @-)
+          */
        else if (*s == '@' && s[1]
-                && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$", s[1])))
+                && (isALNUM_lazy_if(s+1,UTF) || strchr(":'{$+-", s[1])))
            break;
 
        /* check for embedded scalars.  only stop if we're sure it's a
@@ -1323,7 +1325,7 @@ S_scan_const(pTHX_ char *start)
        /* (now in tr/// code again) */
 
        if (*s & 0x80 && thisutf) {
-          (void)utf8_to_uv((U8*)s, &len);
+          (void)utf8_to_uv_chk((U8*)s, &len, 0);
           if (len == 1) {
               /* illegal UTF8, make it valid */
               char *old_pvx = SvPVX(sv);
@@ -1489,7 +1491,10 @@ S_scan_const(pTHX_ char *start)
                        char *ostart = SvPVX(sv);
                        SvCUR_set(sv, d - ostart);
                        SvPOK_on(sv);
+                       *d = '\0';
                        sv_utf8_upgrade(sv);
+                       /* this just broke our allocation above... */
+                       SvGROW(sv, send - start);
                        d = SvPVX(sv) + SvCUR(sv);
                        has_utf = TRUE;
                    }
@@ -3980,11 +3985,11 @@ Perl_yylex(pTHX)
                /* Mark this internal pseudo-handle as clean */
                IoFLAGS(GvIOp(gv)) |= IOf_UNTAINT;
                if (PL_preprocess)
-                   IoTYPE(GvIOp(gv)) = '|';
+                   IoTYPE(GvIOp(gv)) = IoTYPE_PIPE;
                else if ((PerlIO*)PL_rsfp == PerlIO_stdin())
-                   IoTYPE(GvIOp(gv)) = '-';
+                   IoTYPE(GvIOp(gv)) = IoTYPE_STD;
                else
-                   IoTYPE(GvIOp(gv)) = '<';
+                   IoTYPE(GvIOp(gv)) = IoTYPE_RDONLY;
 #if defined(WIN32) && !defined(PERL_TEXTMODE_SCRIPTS)
                /* if the script was opened in binmode, we need to revert
                 * it to text mode for compatibility; but only iff it has CRs
@@ -3993,7 +3998,7 @@ Perl_yylex(pTHX)
                    && PL_bufend[-1] == '\n' && PL_bufend[-2] == '\r')
                {
                    Off_t loc = 0;
-                   if (IoTYPE(GvIOp(gv)) == '<') {
+                   if (IoTYPE(GvIOp(gv)) == IoTYPE_RDONLY) {
                        loc = PerlIO_tell(PL_rsfp);
                        (void)PerlIO_seek(PL_rsfp, 0L, 0);
                    }
@@ -5092,12 +5097,12 @@ Perl_keyword(pTHX_ register char *d, I32 len)
            if (strEQ(d,"cos"))                 return -KEY_cos;
            break;
        case 4:
-           if (strEQ(d,"chop"))                return KEY_chop;
+           if (strEQ(d,"chop"))                return -KEY_chop;
            break;
        case 5:
            if (strEQ(d,"close"))               return -KEY_close;
            if (strEQ(d,"chdir"))               return -KEY_chdir;
-           if (strEQ(d,"chomp"))               return KEY_chomp;
+           if (strEQ(d,"chomp"))               return -KEY_chomp;
            if (strEQ(d,"chmod"))               return -KEY_chmod;
            if (strEQ(d,"chown"))               return -KEY_chown;
            if (strEQ(d,"crypt"))               return -KEY_crypt;
@@ -5742,13 +5747,12 @@ S_new_constant(pTHX_ char *s, STRLEN len, const char *key, SV *sv, SV *pv,
     SAVETMPS;
     
     PUSHMARK(SP) ;
-    EXTEND(sp, 4);
+    EXTEND(sp, 3);
     if (pv)
        PUSHs(pv);
     PUSHs(sv);
     if (pv)
        PUSHs(typesv);
-    PUSHs(cv);
     PUTBACK;
     call_sv(cv, G_SCALAR | ( PL_in_eval ? 0 : G_EVAL));
     
@@ -7355,7 +7359,7 @@ Perl_yyerror(pTHX_ char *s)
        qerror(msg);
     if (PL_error_count >= 10) {
        if (PL_in_eval && SvCUR(ERRSV))
-           Perl_croak(aTHX_ "%_%s has too many errors.\n",
+           Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
                       ERRSV, CopFILE(PL_curcop));
        else
            Perl_croak(aTHX_ "%s has too many errors.\n",
index 5cd5cd5..96d3264 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
  */
 /*#define HAS_GETPGID          / **/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-/*#define HAS_GETPGRP          / **/
-/*#define USE_BSD_GETPGRP      / **/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
  */
 /*#define HAS_SETPGID  / **/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-/*#define HAS_SETPGRP          / **/
-/*#define USE_BSD_SETPGRP      / **/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
  *     This symbol, if defined, indicates to the C program that it should
  *     include <math.h>.
  */
-/*#define I_MATH               / **/
+#define I_MATH         /**/
 
 /* I_MEMORY:
  *     This symbol, if defined, indicates to the C program that it should
  *     This macro surrounds its token with double quotes.
  */
 #if 42 == 1
-#  define CAT2(a,b)    a/**/b
-#  define STRINGIFY(a) "a"
+#define CAT2(a,b)      a/**/b
+#define STRINGIFY(a)   "a"
                /* If you can get stringification with catify, tell me how! */
 #endif
 #if 42 == 42
-#  define PeRl_CaTiFy(a, b)    a ## b  
-#  define PeRl_StGiFy(a)       #a
+#define PeRl_CaTiFy(a, b)      a ## b  
+#define PeRl_StGiFy(a) #a
 /* the additional level of indirection enables these macros to be
  * used as arguments to other macros.  See K&R 2nd ed., page 231. */
-#  define CAT2(a,b)    PeRl_CaTiFy(a,b)
-#  define StGiFy(a)    PeRl_StGiFy(a)
-#  define STRINGIFY(a) PeRl_StGiFy(a)
+#define CAT2(a,b)      PeRl_CaTiFy(a,b)
+#define StGiFy(a)      PeRl_StGiFy(a)
+#define STRINGIFY(a)   PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
 #   include "Bletch: How does this C preprocessor catenate tokens?"
  */
 /*#define HAS_SETPROTOENT              / **/
 
+/* HAS_SETPROCTITLE:
+ *     This symbol, if defined, indicates that the setproctitle routine is
+ *     available to set process title.
+ */
+/*#define HAS_SETPROCTITLE             / **/
+
 /* HAS_SETPWENT:
  *     This symbol, if defined, indicates that the setpwent routine is
  *     available for initializing sequential access of the passwd database.
 /*#define      HAS_MSG_PROXY   / **/
 /*#define      HAS_SCM_RIGHTS  / **/
 
+/* HAS_SOCKS5_INIT:
+ *     This symbol, if defined, indicates that the socks5_init routine is
+ *     available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT              / **/
+
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
  */
 /*#define   I_INTTYPES                / **/
 
+/* I_LIBUTIL:
+ *     This symbol, if defined, indicates that <libutil.h> exists and
+ *     should be included.
+ */
+/*#define      I_LIBUTIL               / **/
+
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <mach/cthreads.h>.
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'g') for output.
  */
+/* PERL_PRIeldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'f') for input.
+ */
 /*#define PERL_PRIfldbl        "llf"   / **/
 /*#define PERL_PRIgldbl        "llg"   / **/
+/*#define PERL_PRIeldbl        "lle"   / **/
+/*#define PERL_SCNfldbl        "llf"   / **/
 
 /* Off_t:
  *     This symbol holds the type used to declare offsets in the kernel.
  */
 /* UVxf:
  *     This symbol defines the format string used for printing a Perl UV
- *     as an unsigned hexadecimal integer.
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
  */
 #define        IVdf            "ld"            /**/
 #define        UVuf            "lu"            /**/
 #define        UVof            "lo"            /**/
 #define        UVxf            "lx"            /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
 #define PERL_XS_APIVERSION "5.005"
 #define PERL_PM_APIVERSION "5.005"
 
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+/*#define HAS_GETPGRP          / **/
+/*#define USE_BSD_GETPGRP      / **/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+/*#define HAS_SETPGRP          / **/
+/*#define USE_BSD_SETPGRP      / **/
+
 #endif
index d986b0d..faf618a 100755 (executable)
@@ -16,10 +16,11 @@ clocktype='clock_t'
 cpp_stuff='42'
 crosscompile='undef'
 d_Gconvert='sprintf((b),"%.*g",(n),(x))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_SCNfldbl='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
 d_PRId64='undef'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
@@ -223,6 +224,7 @@ d_setpgid='undef'
 d_setpgrp2='undef'
 d_setpgrp='undef'
 d_setprior='undef'
+d_setproctitle='undef'
 d_setpwent='undef'
 d_setregid='undef'
 d_setresgid='undef'
@@ -245,6 +247,7 @@ d_sigaction='undef'
 d_sigsetjmp='undef'
 d_socket='undef'
 d_sockpair='undef'
+d_socks5_init='undef'
 d_sqrtl='undef'
 d_statblks='undef'
 d_statfs_f_flags='undef'
@@ -342,11 +345,12 @@ i_gdbm='undef'
 i_grp='undef'
 i_iconv='undef'
 i_inttypes='undef'
+i_libutil='undef'
 i_limits='undef'
 i_locale='undef'
 i_machcthr='undef'
 i_malloc='undef'
-i_math='undef'
+i_math='define'
 i_memory='undef'
 i_mntent='undef'
 i_ndbm='undef'
@@ -427,6 +431,9 @@ netdb_host_type='const char *'
 netdb_name_type='const char *'
 netdb_net_type='unsigned long'
 nroff='nroff'
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
 nvsize='8'
 nvtype='double'
 o_nonblock='O_NONBLOCK'
@@ -447,10 +454,10 @@ randbits='48'
 randfunc='drand48'
 randseedtype='int'
 rd_nodata='-1'
-sPRIEldbl='"llE"'
-sPRIFldbl='"llF"'
-sPRIGldbl='"llG"'
-sPRIX64='"LX"'
+sPRIEUldbl='"llE"'
+sPRIFUldbl='"llF"'
+sPRIGUldbl='"llG"'
+sPRIXU64='"LX"'
 sPRId64='"Ld"'
 sPRIeldbl='"lle"'
 sPRIfldbl='"llf"'
@@ -473,6 +480,7 @@ sig_num_init='0'
 signal_t=int
 sizetype=int
 sizesize=1
+sSCNfldbl='"llf"'
 ssizetype=int
 stdchar=char
 stdio_base='((fp)->_IO_read_base)'
@@ -521,6 +529,7 @@ uvsize='4'
 uvtype='unsigned long'
 uvuformat='"lu"'
 uvxformat='"lx"'
+versiononly='undef'
 voidflags=1
 xs_apiversion='5.005'
 d_getfsstat='undef'
index 6c555a1..0899b1a 100644 (file)
@@ -266,8 +266,8 @@ XS(XS_UNIVERSAL_VERSION)
                    /* they said C<use Foo v1.2.3> and $Foo::VERSION
                     * doesn't look like a float: do string compare */
                    if (sv_cmp(req,sv) == 1) {
-                       Perl_croak(aTHX_ "%s v%vd required--"
-                                  "this is only v%vd",
+                       Perl_croak(aTHX_ "%s v%"VDf" required--"
+                                  "this is only v%"VDf,
                                   HvNAME(pkg), req, sv);
                    }
                    goto finish;
index 7b8ef16..5815a19 100644 (file)
--- a/unixish.h
+++ b/unixish.h
 #define BIT_BUCKET "/dev/null"
 
 #define dXSUB_SYS
+
+#define USE_ENVIRON_ARRAY
+
diff --git a/utf8.c b/utf8.c
index e86c49f..a713ea1 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -116,13 +116,7 @@ Perl_is_utf8_char(pTHX_ U8 *s)
     if (!(u & 0x40))
        return 0;
 
-    if      (!(u & 0x20))      { len = 2; }
-    else if (!(u & 0x10))      { len = 3; }
-    else if (!(u & 0x08))      { len = 4; }
-    else if (!(u & 0x04))      { len = 5; }
-    else if (!(u & 0x02))      { len = 6; }
-    else if (!(u & 0x01))      { len = 7; }
-    else                       { len = 13; } /* whoa! */
+    len = UTF8SKIP(s);
 
     slen = len - 1;
     s++;
@@ -135,7 +129,7 @@ Perl_is_utf8_char(pTHX_ U8 *s)
 }
 
 /*
-=for apidoc Am|bool_utf8_string|U8 *s|STRLEN len
+=for apidoc Am|is_utf8_string|U8 *s|STRLEN len
 
 Returns true if first C<len> bytes of the given string form valid a UTF8
 string, false otherwise.
@@ -143,7 +137,7 @@ string, false otherwise.
 =cut
 */
 
-bool 
+bool
 Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len)
 {
     U8* x=s;
@@ -158,8 +152,25 @@ Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len)
     return 1;
 }
 
+/*
+=for apidoc Am|U8* s|utf8_to_uv_chk|I32 *retlen|I32 checking
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, the behaviour
+is dependent on the value of C<checking>: if this is true, it is
+assumed that the caller will raise a warning, and this function will
+set C<retlen> to C<-1> and return. If C<checking> is not true, an optional UTF8
+warning is produced.
+
+=cut
+*/
+
 UV
-Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
+Perl_utf8_to_uv_chk(pTHX_ U8* s, I32* retlen, bool checking)
 {
     UV uv = *s;
     int len;
@@ -170,7 +181,12 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
     }
     if (!(uv & 0x40)) {
         dTHR;
-       if (ckWARN_d(WARN_UTF8))     
+       if (checking && retlen) {
+           *retlen = -1;
+           return 0;
+       }
+
+       if (ckWARN_d(WARN_UTF8))
            Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
        if (retlen)
            *retlen = 1;
@@ -192,7 +208,12 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
     while (len--) {
        if ((*s & 0xc0) != 0x80) {
             dTHR;
-           if (ckWARN_d(WARN_UTF8))     
+           if (checking && retlen) {
+               *retlen = -1;
+               return 0;
+            }
+
+           if (ckWARN_d(WARN_UTF8))
                Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
            if (retlen)
                *retlen -= len + 1;
@@ -204,7 +225,28 @@ Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
     return uv;
 }
 
-/* utf8_distance(a,b) is intended to be a - b in pointer arithmetic */
+/*
+=for apidoc Am|U8* s|utf8_to_uv|I32 *retlen
+
+Returns the character value of the first character in the string C<s>
+which is assumed to be in UTF8 encoding; C<retlen> will be set to the
+length, in bytes, of that character, and the pointer C<s> will be
+advanced to the end of the character.
+
+If C<s> does not point to a well-formed UTF8 character, an optional UTF8
+warning is produced.
+
+=cut
+*/
+
+UV
+Perl_utf8_to_uv(pTHX_ U8* s, I32* retlen)
+{
+ return Perl_utf8_to_uv_chk(aTHX_ s, retlen, 0);
+}
+
+/* utf8_distance(a,b) returns the number of UTF8 characters between
+   the pointers a and b                                                        */
 
 I32
 Perl_utf8_distance(pTHX_ U8 *a, U8 *b)
@@ -247,40 +289,48 @@ Perl_utf8_hop(pTHX_ U8 *s, I32 off)
 }
 
 /*
-=for apidoc Am|U8 *|utf8_to_bytes|U8 *s|STRLEN len
+=for apidoc Am|U8 *|utf8_to_bytes|U8 *s|STRLEN *len
 
-Converts a string C<s> of length C<len> from UTF8 into ASCII encoding.
-Unlike C<bytes_to_utf8>, this over-writes the original string.
-Returns zero on failure after converting as much as possible.
+Converts a string C<s> of length C<len> from UTF8 into byte encoding.
+Unlike C<bytes_to_utf8>, this over-writes the original string, and
+updates len to contain the new length.
+Returns zero on failure, setting C<len> to -1.
 
 =cut
 */
 
 U8 *
-Perl_utf8_to_bytes(pTHX_ U8* s, STRLEN len)
+Perl_utf8_to_bytes(pTHX_ U8* s, STRLEN *len)
 {
     dTHR;
     U8 *send;
     U8 *d;
     U8 *save;
 
-    send = s + len;
+    send = s + *len;
     d = save = s;
+
+    /* ensure valid UTF8 and chars < 256 before updating string */
+    while (s < send) {
+       U8 c = *s++;
+        if (c >= 0x80 &&
+           ( (s >= send) || ((*s++ & 0xc0) != 0x80) || ((c & 0xfe) != 0xc2))) {
+           *len = -1;
+           return 0;
+       }
+    }
+    s = save;
     while (s < send) {
         if (*s < 0x80)
             *d++ = *s++;
         else {
             I32 ulen;
-            UV uv = utf8_to_uv(s, &ulen);
-            if (uv > 255) {
-                *d = '\0';
-                return 0;
-            }
+            *d++ = (U8)utf8_to_uv(s, &ulen);
             s += ulen;
-            *d++ = (U8)uv;
         }
     }
     *d = '\0';
+    *len = d - save;
     return save;
 }
 
@@ -638,7 +688,10 @@ Perl_is_utf8_alnum(pTHX_ U8 *p)
     if (!is_utf8_char(p))
        return FALSE;
     if (!PL_utf8_alnum)
-       PL_utf8_alnum = swash_init("utf8", "IsAlnum", &PL_sv_undef, 0, 0);
+       /* NOTE: "IsWord", not "IsAlnum", since Alnum is a true
+        * descendant of isalnum(3), in other words, it doesn't
+        * contain the '_'. --jhi */
+       PL_utf8_alnum = swash_init("utf8", "IsWord", &PL_sv_undef, 0, 0);
     return swash_fetch(PL_utf8_alnum, p);
 /*    return *p == '_' || is_utf8_alpha(p) || is_utf8_digit(p); */
 #ifdef SURPRISINGLY_SLOWER  /* probably because alpha is usually true */
@@ -800,7 +853,7 @@ Perl_to_utf8_upper(pTHX_ U8 *p)
     if (!PL_utf8_toupper)
        PL_utf8_toupper = swash_init("utf8", "ToUpper", &PL_sv_undef, 4, 0);
     uv = swash_fetch(PL_utf8_toupper, p);
-    return uv ? uv : utf8_to_uv(p,0);
+    return uv ? uv : utf8_to_uv_chk(p,0,0);
 }
 
 UV
@@ -811,7 +864,7 @@ Perl_to_utf8_title(pTHX_ U8 *p)
     if (!PL_utf8_totitle)
        PL_utf8_totitle = swash_init("utf8", "ToTitle", &PL_sv_undef, 4, 0);
     uv = swash_fetch(PL_utf8_totitle, p);
-    return uv ? uv : utf8_to_uv(p,0);
+    return uv ? uv : utf8_to_uv_chk(p,0,0);
 }
 
 UV
@@ -822,7 +875,7 @@ Perl_to_utf8_lower(pTHX_ U8 *p)
     if (!PL_utf8_tolower)
        PL_utf8_tolower = swash_init("utf8", "ToLower", &PL_sv_undef, 4, 0);
     uv = swash_fetch(PL_utf8_tolower, p);
-    return uv ? uv : utf8_to_uv(p,0);
+    return uv ? uv : utf8_to_uv_chk(p,0,0);
 }
 
 /* a "swash" is a swatch hash */
@@ -832,7 +885,7 @@ Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none)
 {
     SV* retval;
     char tmpbuf[256];
-    dSP;    
+    dSP;
 
     if (!gv_stashpv(pkg, 0)) { /* demand load utf8 */
        ENTER;
@@ -856,7 +909,7 @@ Perl_swash_init(pTHX_ char* pkg, char* name, SV *listsv, I32 minbits, I32 none)
     if (PL_curcop == &PL_compiling)    /* XXX ought to be handled by lex_start */
        strncpy(tmpbuf, PL_tokenbuf, sizeof tmpbuf);
     if (call_method("SWASHNEW", G_SCALAR))
-       retval = newSVsv(*PL_stack_sp--);    
+       retval = newSVsv(*PL_stack_sp--);
     else
        retval = &PL_sv_undef;
     LEAVE;
@@ -912,11 +965,11 @@ Perl_swash_fetch(pTHX_ SV *sv, U8 *ptr)
            PUSHMARK(SP);
            EXTEND(SP,3);
            PUSHs((SV*)sv);
-           PUSHs(sv_2mortal(newSViv(utf8_to_uv(ptr, 0) & ~(needents - 1))));
+           PUSHs(sv_2mortal(newSViv(utf8_to_uv_chk(ptr, 0, 0) & ~(needents - 1))));
            PUSHs(sv_2mortal(newSViv(needents)));
            PUTBACK;
            if (call_method("SWASHGET", G_SCALAR))
-               retval = newSVsv(*PL_stack_sp--);    
+               retval = newSVsv(*PL_stack_sp--);
            else
                retval = &PL_sv_undef;
            POPSTACK;
diff --git a/utf8.h b/utf8.h
index c37a995..7407335 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -35,17 +35,40 @@ END_EXTERN_C
 
 #define UTF8SKIP(s) PL_utf8skip[*(U8*)s]
 
+#ifdef HAS_QUAD
+#define UTF8LEN(uv) ( (uv) < 0x80           ? 1 : \
+                     (uv) < 0x800          ? 2 : \
+                     (uv) < 0x10000        ? 3 : \
+                     (uv) < 0x200000       ? 4 : \
+                     (uv) < 0x4000000      ? 5 : \
+                     (uv) < 0x80000000     ? 6 : \
+                      (uv) < 0x1000000000LL ? 7 : 13 ) 
+#else
+/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
+#define UTF8LEN(uv) ( (uv) < 0x80           ? 1 : \
+                     (uv) < 0x800          ? 2 : \
+                     (uv) < 0x10000        ? 3 : \
+                     (uv) < 0x200000       ? 4 : \
+                     (uv) < 0x4000000      ? 5 : \
+                     (uv) < 0x80000000     ? 6 : 7 )
+#endif
+
 /*
  * Note: we try to be careful never to call the isXXX_utf8() functions
  * unless we're pretty sure we've seen the beginning of a UTF-8 character
  * (that is, the two high bits are set).  Otherwise we risk loading in the
  * heavy-duty SWASHINIT and SWASHGET routines unnecessarily.
  */
-#define isIDFIRST_lazy_if(p,c) ((!c || (*((U8*)p) < 0xc0)) \
+#ifdef EBCDIC
+#define isIDFIRST_lazy_if(p,c) isIDFIRST(*(p))
+#define isALNUM_lazy_if(p,c)   isALNUM(*(p))
+#else
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
                                ? isIDFIRST(*(p)) \
                                : isIDFIRST_utf8((U8*)p))
-#define isALNUM_lazy_if(p,c)   ((!c || (*((U8*)p) < 0xc0)) \
+#define isALNUM_lazy_if(p,c)   ((IN_BYTE || (!c || (*((U8*)p) < 0xc0))) \
                                ? isALNUM(*(p)) \
                                : isALNUM_utf8((U8*)p))
+#endif
 #define isIDFIRST_lazy(p)      isIDFIRST_lazy_if(p,1)
 #define isALNUM_lazy(p)                isALNUM_lazy_if(p,1)
diff --git a/util.c b/util.c
index 897360c..6c949c7 100644 (file)
--- a/util.c
+++ b/util.c
@@ -659,6 +659,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
                         (!done && (lang || PerlEnv_getenv("LC_CTYPE")))
                                    ? "" : Nullch)))
            setlocale_failure = TRUE;
+       else
+           curctype = savepv(curctype);
 #endif /* USE_LOCALE_CTYPE */
 #ifdef USE_LOCALE_COLLATE
        if (! (curcoll =
@@ -666,6 +668,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
                         (!done && (lang || PerlEnv_getenv("LC_COLLATE")))
                                   ? "" : Nullch)))
            setlocale_failure = TRUE;
+       else
+           curcoll = savepv(curcoll);
 #endif /* USE_LOCALE_COLLATE */
 #ifdef USE_LOCALE_NUMERIC
        if (! (curnum =
@@ -673,6 +677,8 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
                         (!done && (lang || PerlEnv_getenv("LC_NUMERIC")))
                                  ? "" : Nullch)))
            setlocale_failure = TRUE;
+       else
+           curnum = savepv(curnum);
 #endif /* USE_LOCALE_NUMERIC */
     }
 
@@ -689,14 +695,20 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 #ifdef USE_LOCALE_CTYPE
        if (! (curctype = setlocale(LC_CTYPE, "")))
            setlocale_failure = TRUE;
+       else
+           curctype = savepv(curctype);
 #endif /* USE_LOCALE_CTYPE */
 #ifdef USE_LOCALE_COLLATE
        if (! (curcoll = setlocale(LC_COLLATE, "")))
            setlocale_failure = TRUE;
+       else
+           curcoll = savepv(curcoll);
 #endif /* USE_LOCALE_COLLATE */
 #ifdef USE_LOCALE_NUMERIC
        if (! (curnum = setlocale(LC_NUMERIC, "")))
            setlocale_failure = TRUE;
+       else
+           curnum = savepv(curnum);
 #endif /* USE_LOCALE_NUMERIC */
     }
 
@@ -808,15 +820,16 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 #endif /* ! LC_ALL */
 
 #ifdef USE_LOCALE_CTYPE
-       curctype = setlocale(LC_CTYPE, Nullch);
+       curctype = savepv(setlocale(LC_CTYPE, Nullch));
 #endif /* USE_LOCALE_CTYPE */
 #ifdef USE_LOCALE_COLLATE
-       curcoll = setlocale(LC_COLLATE, Nullch);
+       curcoll = savepv(setlocale(LC_COLLATE, Nullch));
 #endif /* USE_LOCALE_COLLATE */
 #ifdef USE_LOCALE_NUMERIC
-       curnum = setlocale(LC_NUMERIC, Nullch);
+       curnum = savepv(setlocale(LC_NUMERIC, Nullch));
 #endif /* USE_LOCALE_NUMERIC */
     }
+    else {
 
 #ifdef USE_LOCALE_CTYPE
     new_ctype(curctype);
@@ -829,9 +842,22 @@ Perl_init_i18nl10n(pTHX_ int printwarn)
 #ifdef USE_LOCALE_NUMERIC
     new_numeric(curnum);
 #endif /* USE_LOCALE_NUMERIC */
+    }
 
 #endif /* USE_LOCALE */
 
+#ifdef USE_LOCALE_CTYPE
+    if (curctype != NULL)
+       Safefree(curctype);
+#endif /* USE_LOCALE_CTYPE */
+#ifdef USE_LOCALE_COLLATE
+    if (curcoll != NULL)
+       Safefree(curcoll);
+#endif /* USE_LOCALE_COLLATE */
+#ifdef USE_LOCALE_NUMERIC
+    if (curnum != NULL)
+       Safefree(curnum);
+#endif /* USE_LOCALE_NUMERIC */
     return ok;
 }
 
@@ -1896,14 +1922,20 @@ Perl_vwarner(pTHX_ U32  err, const char* pat, va_list* args)
            PerlIO *serr = Perl_error_log;
            PerlIO_write(serr, message, msglen);
 #ifdef LEAKTEST
-           DEBUG_L(xstat());
+           DEBUG_L(*message == '!' 
+               ? (xstat(message[1]=='!'
+                        ? (message[2]=='!' ? 2 : 1)
+                        : 0)
+                  , 0)
+               : 0);
 #endif
            (void)PerlIO_flush(serr);
        }
     }
 }
 
-#ifndef VMS  /* VMS' my_setenv() is in VMS.c */
+#ifdef USE_ENVIRON_ARRAY
+       /* VMS' and EPOC's my_setenv() is in vms.c and epoc.c */
 #if !defined(WIN32) && !defined(__CYGWIN__)
 void
 Perl_my_setenv(pTHX_ char *nam, char *val)
@@ -2070,7 +2102,7 @@ Perl_setenv_getix(pTHX_ char *nam)
     return i;
 }
 
-#endif /* !VMS */
+#endif /* !VMS && !EPOC*/
 
 #ifdef UNLINK_ALL_VERSIONS
 I32
@@ -2676,6 +2708,7 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
 
     if (!pid)
        return -1;
+#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
     if (pid > 0) {
        sprintf(spid, "%"IVdf, (IV)pid);
        svp = hv_fetch(PL_pidstatus,spid,strlen(spid),FALSE);
@@ -2698,6 +2731,7 @@ Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
            return pid;
        }
     }
+#endif
 #ifdef HAS_WAITPID
 #  ifdef HAS_WAITPID_RUNTIME
     if (!HAS_WAITPID_RUNTIME)
@@ -3555,6 +3589,8 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t)
     PL_dirty = 0;
     PL_localizing = 0;
     Zero(&PL_hv_fetch_ent_mh, 1, HE);
+    PL_efloatbuf = (char*)NULL;
+    PL_efloatsize = 0;
 #else
     Zero(thr, 1, struct perl_thread);
 #endif
@@ -3573,7 +3609,7 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t)
 
     JMPENV_BOOTSTRAP;
 
-    PL_in_eval = EVAL_NULL;    /* ~(EVAL_INEVAL|EVAL_WARNONLY|EVAL_KEEPERR) */
+    PL_in_eval = EVAL_NULL;    /* ~(EVAL_INEVAL|EVAL_WARNONLY|EVAL_KEEPERR|EVAL_INREQUIRE) */
     PL_restartop = 0;
 
     PL_statname = NEWSV(66,0);
@@ -3868,41 +3904,69 @@ Perl_my_fflush_all(pTHX)
 NV
 Perl_my_atof(pTHX_ const char* s)
 {
+    NV x = 0.0;
 #ifdef USE_LOCALE_NUMERIC
     if ((PL_hints & HINT_LOCALE) && PL_numeric_local) {
-       NV x, y;
+       NV y;
 
-       x = Perl_atof(s);
+       Perl_atof2(s, x);
        SET_NUMERIC_STANDARD();
-       y = Perl_atof(s);
+       Perl_atof2(s, y);
        SET_NUMERIC_LOCAL();
        if ((y < 0.0 && y < x) || (y > 0.0 && y > x))
            return y;
-       return x;
     }
     else
-       return Perl_atof(s);
+       Perl_atof2(s, x);
 #else
-    return Perl_atof(s);
+    Perl_atof2(s, x);
 #endif
+    return x;
 }
 
 void
-Perl_report_closed_fh(pTHX_ GV *gv, IO *io, const char *func, const char *obj)
-{
-    SV *sv;
-    char *name;
-
-    assert(gv);
-
-    sv = sv_newmortal();
-    gv_efullname4(sv, gv, Nullch, FALSE);
-    name = SvPVX(sv);
+Perl_report_evil_fh(pTHX_ GV *gv, IO *io, I32 op)
+{
+    char *vile;
+    I32   warn_type;
+    char *func =
+       op == OP_READLINE   ? "readline"  :     /* "<HANDLE>" not nice */
+       op == OP_LEAVEWRITE ? "write" :         /* "write exit" not nice */
+       PL_op_desc[op];
+    char *pars = OP_IS_FILETEST(op) ? "" : "()";
+    char *type = OP_IS_SOCKET(op) || (io && IoTYPE(io) == IoTYPE_SOCKET) ?
+                     "socket" : "filehandle";
+    char *name = NULL;
+
+    if (io && IoTYPE(io) == IoTYPE_CLOSED) {
+       vile = "closed";
+       warn_type = WARN_CLOSED;
+    }
+    else {
+       vile = "unopened";
+       warn_type = WARN_UNOPENED;
+    }
 
-    Perl_warner(aTHX_ WARN_CLOSED, "%s() on closed %s %s", func, obj, name);
+    if (gv && isGV(gv)) {
+       SV *sv = sv_newmortal();
+       gv_efullname4(sv, gv, Nullch, FALSE);
+       name = SvPVX(sv);
+    }
 
-    if (io && IoDIRP(io))
-       Perl_warner(aTHX_ WARN_CLOSED,
-                   "\t(Are you trying to call %s() on dirhandle %s?)\n",
-                   func, name);
+    if (name && *name) {
+       Perl_warner(aTHX_ warn_type,
+                   "%s%s on %s %s %s", func, pars, vile, type, name);
+       if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
+           Perl_warner(aTHX_ warn_type,
+                       "\t(Are you trying to call %s%s on dirhandle %s?)\n",
+                       func, pars, name);
+    }
+    else {
+       Perl_warner(aTHX_ warn_type,
+                   "%s%s on %s %s", func, pars, vile, type);
+       if (io && IoDIRP(io) && !(IoFLAGS(io) & IOf_FAKE_DIRP))
+           Perl_warner(aTHX_ warn_type,
+                       "\t(Are you trying to call %s%s on dirhandle?)\n",
+                       func, pars);
+    }
 }
diff --git a/util.h b/util.h
index cb9f4c9..bcf6b58 100644 (file)
--- a/util.h
+++ b/util.h
         || ((f)[0] && (f)[1] == ':')           /* drive name */        \
         || ((f)[0] == '\\' && (f)[1] == '\\')) /* UNC path */
 #  else                /* !WIN32 */
-#    ifdef DOSISH
+#    if defined( DOSISH) || defined(EPOC)
 #      define PERL_FILE_IS_ABSOLUTE(f) \
        (*(f) == '/'                                                    \
         || ((f)[0] && (f)[1] == ':'))          /* drive name */
-#    else      /* !DOSISH */
+#    else      /* NEITHER DOSISH NOR EPOCISH */
 #      ifdef MACOS_TRADITIONAL
 #        define PERL_FILE_IS_ABSOLUTE(f)       (strchr(f, ':'))
 #      else /* !MACOS_TRADITIONAL */
index 944cbe8..95d286e 100644 (file)
@@ -44,3 +44,6 @@ realclean:
 clobber:       realclean
 
 distclean:     clobber
+
+veryclean:     distclean
+       -rm -f *~ *.org
index 2885c6f..44b9ac8 100644 (file)
@@ -260,6 +260,68 @@ are using to run h2xs will have no effect.
        # Same but treat SV* etc as "opaque" types
        h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
 
+=head2 Extension based on F<.h> and F<.c> files
+
+Suppose that you have some C files implementing some functionality,
+and the corresponding header files.  How to create an extension which
+makes this functionality accessable in Perl?  The example below
+assumes that the header files are F<interface_simple.h> and
+I<interface_hairy.h>, and you want the perl module be named as
+C<Ext::Ension>.  If you need some preprocessor directives and/or
+linking with external libraries, see the flags C<-F>, C<-L> and C<-l>
+in L<"OPTIONS">.
+
+=over
+
+=item Find the directory name
+
+Start with a dummy run of h2xs:
+
+  h2xs -Afn Ext::Ension
+
+The only purpose of this step is to create the needed directories, and
+let you know the names of these directories.  From the output you can
+see that the directory for the extension is F<Ext/Ension>.
+
+=item Copy C files
+
+Copy your header files and C files to this directory F<Ext/Ension>.
+
+=item Create the extension
+
+Run h2xs, overwriting older autogenerated files:
+
+  h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
+
+h2xs looks for header files I<after> changing to the extension
+directory, so it will find your header files OK.
+
+=item Archive and test
+
+As usual, run
+
+  cd Ext/Ension
+  perl Makefile.PL
+  make dist
+  make
+  make test
+
+=item Hints
+
+It is important to do C<make dist> as early as possible.  This way you
+can easily merge(1) your changes to autogenerated files if you decide
+to edit your C<.h> files and rerun h2xs.
+
+Do not forget to edit the documentation in the generated F<.pm> file.
+
+Consider the autogenerated files as skeletons only, you may invent
+better interfaces than what h2xs could guess.
+
+Consider this section as a guideline only, some other options of h2xs
+may better suit your needs.
+
+=back
+
 =head1 ENVIRONMENT
 
 No environment variables are used.
@@ -905,6 +967,7 @@ my $exp_doc = <<EOD;
 #None by default.
 #
 EOD
+
 if (@const_names and not $opt_P) {
   $exp_doc .= <<EOD;
 #=head2 Exportable constants
@@ -913,21 +976,31 @@ if (@const_names and not $opt_P) {
 #
 EOD
 }
+
 if (defined $fdecls and @$fdecls and not $opt_P) {
   $exp_doc .= <<EOD;
 #=head2 Exportable functions
 #
 EOD
+
 #  $exp_doc .= <<EOD if $opt_p;
 #When accessing these functions from Perl, prefix C<$opt_p> should be removed.
 #
-EOD
+#EOD
   $exp_doc .= <<EOD;
 #  @{[join "\n  ", @known_fnames{@fnames}]}
 #
 EOD
 }
 
+my $meth_doc = '';
+
+if ($opt_x && $opt_a) {
+  my($name, $struct);
+  $meth_doc .= accessor_docs($name, $struct)
+    while ($name, $struct) = each %structs;
+}
+
 my $pod = <<"END" unless $opt_P;
 ## Below is stub documentation for your module. You better edit it!
 #
@@ -947,7 +1020,7 @@ my $pod = <<"END" unless $opt_P;
 #unedited.
 #
 #Blah blah blah.
-$exp_doc$revhist
+$exp_doc$meth_doc$revhist
 #=head1 AUTHOR
 #
 #$author, $email
@@ -1406,6 +1479,72 @@ EOF
   }
 }
 
+sub accessor_docs {
+  my($name, $struct) = @_;
+  return unless defined $struct && $name !~ /\s|_ANON/;
+  $name = normalize_type($name);
+  my $ptrname = $name . 'Ptr';
+  my @items = @$struct;
+  my @list;
+  while (@items) {
+    my $item = shift @items;
+    if ($item->[0] =~ /_ANON/) {
+      if (defined $item->[2]) {
+       push @items, map [
+         @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
+       ], @{ $structs{$item->[0]} };
+      } else {
+       push @items, @{ $structs{$item->[0]} };
+      }
+    } else {
+      push @list, $item->[2];
+    }
+  }
+  my $methods = (join '(...)>, C<', @list) . '(...)';
+
+  my $pod = <<"EOF";
+#
+#=head2 Object and class methods for C<$name>/C<$ptrname>
+#
+#The principal Perl representation of a C object of type C<$name> is an
+#object of class C<$ptrname> which is a reference to an integer
+#representation of a C pointer.  To create such an object, one may use
+#a combination
+#
+#  my \$buffer = $name->new();
+#  my \$obj = \$buffer->_to_ptr();
+#
+#This exersizes the following two methods, and an additional class
+#C<$name>, the internal representation of which is a reference to a
+#packed string with the C structure.  Keep in mind that \$buffer should
+#better survive longer than \$obj.
+#
+#=over
+#
+#=item C<\$object_of_type_$name-E<gt>_to_ptr()>
+#
+#Converts an object of type C<$name> to an object of type C<$ptrname>.
+#
+#=item C<$name-E<gt>new()>
+#
+#Creates an empty object of type C<$name>.  The corresponding packed
+#string is zeroed out.
+#
+#=item C<$methods>
+#
+#return the current value of the corresponding element if called
+#without additional arguments.  Set the element to the supplied value
+#(and return the new value) if called with an additional argument.
+#
+#Applicable to objects of type C<$ptrname>.
+#
+#=back
+#
+EOF
+  $pod =~ s/^\#//gm;
+  return $pod;
+}
+
 # Should be called before any actual call to normalize_type().
 sub get_typemap {
   # We do not want to read ./typemap by obvios reasons.
@@ -1561,10 +1700,26 @@ WriteMakefile(
 END
 if (!$opt_X) { # print C stuff, unless XS is disabled
   $opt_F = '' unless defined $opt_F;
+  my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
+  my $Ihelp = ($I ? '-I. ' : '');
+  my $Icomment = ($I ? '' : <<EOC);
+       # Insert -I. if you add *.h files later:
+EOC
+
   print PL <<END;
     'LIBS'             => ['$extralibs'], # e.g., '-lm'
     'DEFINE'           => '$opt_F', # e.g., '-DHAVE_SOMETHING'
-    'INC'              => '', # e.g., '-I/usr/include/other'
+$Icomment    'INC'             => '$I', # e.g., '$Ihelp-I/usr/include/other'
+END
+
+  my $C = grep $_ ne "$modfname.c", (glob '*.c'), (glob '*.cc'), (glob '*.C');
+  my $Cpre = ($C ? '' : '# ');
+  my $Ccomment = ($C ? '' : <<EOC);
+       # Un-comment this if you add C files to link with later:
+EOC
+
+  print PL <<END;
+$Ccomment    $Cpre\'OBJECT'            => '\$(O_FILES)', # link all the C files too
 END
 }
 print PL ");\n";
diff --git a/utils/perlbc.PL b/utils/perlbc.PL
deleted file mode 100644 (file)
index 51d074b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/local/bin/perl
-
-use Config;
-use File::Basename qw(&basename &dirname);
-use Cwd;
-
-# List explicitly here the variables you want Configure to
-# generate.  Metaconfig only looks for shell variables, so you
-# have to mention them as if they were shell variables, not
-# %Config entries.  Thus you write
-#  $startperl
-# to ensure Configure will look for $Config{startperl}.
-# Wanted:  $archlibexp
-
-# This forces PL files to create target in same directory as PL file.
-# This is so that make depend always knows where to find PL derivatives.
-$origdir = cwd;
-chdir dirname($0);
-$file = basename($0, '.PL');
-$file .= '.com' if $^O eq 'VMS';
-
-open OUT,">$file" or die "Can't create $file: $!";
-
-print "Extracting $file (with variable substitutions)\n";
-
-# In this section, perl variables will be expanded during extraction.
-# You can use $Config{...} to use Configure variables.
-
-print OUT <<"!GROK!THIS!";
-$Config{startperl}
-    eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
-    if \$running_under_some_shell;
-!GROK!THIS!
-
-# In the following, perl variables are not expanded during extraction.
-
-print OUT <<'!NO!SUBS!';
-
-use strict;
-use warning;
-no warning qw(once);
-
-use Config;
-
-require ByteLoader;
-
-foreach my $infile (@ARGV)
-{
-    if ($infile =~ /\.p[ml]$/)
-    {
-       my $outfile = $infile . "c";
-
-       open(OUT,"> $outfile") || die "Can't open $outfile: $!";
-
-       if ($infile =~ /\.pl$/)
-       {
-           print OUT "$Config{startperl}\n";
-           print OUT "    eval 'exec $Config{perlpath} -S \$0 \${1+\"\$@\"}'\n";
-           print OUT "    if \$running_under_some_shell;\n\n";
-       }
-
-       print OUT "use ByteLoader $ByteLoader::VERSION;\n";
-
-       close(OUT);
-
-       print "$^X -MO=Bytecode $infile >> $outfile\n";
-
-       system("$^X -MO=Bytecode $infile >> $outfile");
-    }
-    else
-    {
-       warn "Don't know how to byte compile $infile";
-    }
-}
-!NO!SUBS!
-
-close OUT or die "Can't close $file: $!";
-chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
-exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
-chdir $origdir;
index d9389ce..6c92254 100644 (file)
@@ -91,7 +91,7 @@ BEGIN {
     $::HaveUtil = ($@ eq "");
 };
 
-my $Version = "1.31";
+my $Version = "1.32";
 
 # Changed in 1.06 to skip Mail::Send and Mail::Util if not available.
 # Changed in 1.07 to see more sendmail execs, and added pipe output.
@@ -127,6 +127,7 @@ my $Version = "1.31";
 # Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000
 # Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000
 # Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000
+# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000
 
 # TODO: - Allow the user to re-name the file on mail failure, and
 #       make sure failure (transmission-wise) of Mail::Send is
@@ -134,7 +135,7 @@ my $Version = "1.31";
 #       - Test -b option
 
 my( $file, $usefile, $cc, $address, $perlbug, $testaddress, $filename,
-    $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity, 
+    $subject, $from, $verbose, $ed, $outfile, $Is_MacOS, $category, $severity,
     $fh, $me, $Is_MSWin32, $Is_VMS, $msg, $body, $andcc, %REP, $ok);
 
 my $perl_version = $^V ? sprintf("v%vd", $^V) : $];
@@ -173,9 +174,9 @@ sub ask_for_alternatives { # (category|severity)
            'default' => 'low',
            'ok'      => 'none',
            'opts'    => [qw(critical high medium low wishlist none)], # zero
-       },      
+       },
     );
-    die "Invalid alternative($name) requested\n" unless grep(/^$name$/, keys %alts); 
+    die "Invalid alternative($name) requested\n" unless grep(/^$name$/, keys %alts);
     my $alt = "";
     if ($ok) {
        $alt = $alts{$name}{'ok'};
@@ -222,7 +223,7 @@ sub Init {
     # -------- Configuration ---------
 
     # perlbug address
-    $perlbug = 'perlbug@perl.com';
+    $perlbug = 'perlbug@perl.org';
 
     # Test address
     $testaddress = 'perlbug-test@perl.com';
@@ -905,12 +906,8 @@ EOF
 }
 
 sub filename {
-    my $dir = $Is_VMS ? 'sys$scratch:'
-       : ($Is_MSWin32 && $ENV{'TEMP'}) ? $ENV{'TEMP'}
-        : $Is_MacOS ? $ENV{'TMPDIR'}
-       : '/tmp';
+    my $dir = File::Spec->tmpdir();
     $filename = "bugrep0$$";
-#    $dir .= "\\" if $Is_MSWin32 and $dir !~ m|[\\/]$|;
     $filename++ while -e File::Spec->catfile($dir, $filename);
     $filename = File::Spec->catfile($dir, $filename);
 }
@@ -963,7 +960,7 @@ will be needed.  Simply run it, and follow the prompts.
 
 If you are unable to run B<perlbug> (most likely because you don't have
 a working setup to send mail that perlbug recognizes), you may have to
-compose your own report, and email it to B<perlbug@perl.com>.  You might
+compose your own report, and email it to B<perlbug@perl.org>.  You might
 find the B<-d> option useful to get summary information in that case.
 
 In any case, when reporting a bug, please make sure you have run through
@@ -1041,7 +1038,7 @@ definitely be fixed.  Use the C<diff> program to generate your patches
 (C<diff> is being maintained by the GNU folks as part of the B<diffutils>
 package, so you should be able to get it from any of the GNU software
 repositories).  If you do submit a patch, the cool-dude counter at
-perlbug@perl.com will register you as a savior of the world.  Your
+perlbug@perl.org will register you as a savior of the world.  Your
 patch may be returned with requests for changes, or requests for more
 detailed explanations about your fix.
 
@@ -1061,7 +1058,7 @@ B<perlbug> will, amongst other things, ensure your report includes
 crucial information about your version of perl.  If C<perlbug> is unable
 to mail your report after you have typed it in, you may have to compose
 the message yourself, add the output produced by C<perlbug -d> and email
-it to B<perlbug@perl.com>.  If, for some reason, you cannot run
+it to B<perlbug@perl.org>.  If, for some reason, you cannot run
 C<perlbug> at all on your system, be sure to include the entire output
 produced by running C<perl -V> (note the uppercase V).
 
@@ -1088,7 +1085,7 @@ version of perl comes out and your bug is still present.
 
 =item B<-a>
 
-Address to send the report to.  Defaults to `perlbug@perl.com'.
+Address to send the report to.  Defaults to `perlbug@perl.org'.
 
 =item B<-b>
 
index f0636f6..0c4b726 100644 (file)
@@ -31,836 +31,444 @@ print OUT <<"!GROK!THIS!";
 $Config{startperl}
     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
     if \$running_under_some_shell;
+--\$running_under_some_shell;
 !GROK!THIS!
  
 # In the following, perl variables are not expanded during extraction.
  
 print OUT <<'!NO!SUBS!';
 
-use Config;
+# Version 2.0, Simon Cozens, Thu Mar 30 17:52:45 JST 2000 
+# Version 2.01, Tom Christiansen, Thu Mar 30 08:25:14 MST 2000
+# Version 2.02, Simon Cozens, Sun Apr 16 01:53:36 JST 2000
+
 use strict;
-use FileHandle;
-use File::Basename qw(&basename &dirname);
-use Cwd;
+use warnings;
+use v5.6.0;
 
-use Getopt::Long;
+use Config;
+use Fcntl qw(:DEFAULT :flock);
+use File::Temp qw(tempfile);
+use Cwd;
+our $VERSION = 2.02;
+$| = 1;
 
-$Getopt::Long::bundling_override = 1;
-$Getopt::Long::passthrough = 0;
-$Getopt::Long::ignore_case = 0;
+use subs qw{
+    cc_harness check_read check_write checkopts_byte choose_backend
+    compile_byte compile_cstyle compile_module generate_code
+    grab_stash parse_argv sanity_check vprint yclept spawnit
+};
+sub opt(*); # imal quoting
 
-my $pathsep = ($Config{'osname'} eq 'MSWin32')? "\\" : "/"; # MAJOR HACK. SHOULD
-                                                            # BE IN Config.pm
+our ($Options, $BinPerl, $Backend);
+our ($Input => $Output);
 
-my $options = {};
-my $_fh;
-unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
+# eval { main(); 1 } or die;
 
 main();
 
-sub main
-{
-
-    GetOptions
-            (
-            $options,   "L:s",
-                        "I:s",
-                        "C:s",
-                        "o:s",
-                        "e:s",
-                        "regex:s",
-                        "verbose:s",
-                        "log:s",
-                        "argv:s",
-                        "b",
-                        "opt",
-                        "gen",
-                        "sav",
-                        "run",
-                        "prog",
-                        "mod"
-            );
-
-
-    my $key;
-
-    local($") = "|";
-
-    _usage() if (!_checkopts());
-    push(@ARGV, _maketempfile()) if ($options->{'e'});
-
-    _usage() if (!@ARGV);
-                
-    my $file;
-    foreach $file (@ARGV)
-    {
-        _print("
---------------------------------------------------------------------------------
-Compiling $file:
---------------------------------------------------------------------------------
-", 36 );
-        _doit($file);
-    }
+sub main { 
+    parse_argv();
+    check_write($Output);
+    choose_backend();
+    generate_code();
+    die "XXX: Not reached?";
+    exit(0);
 }
-        
-sub _doit
-{
-    my ($file) = @_;
-
-    my ($program_ext, $module_ext) = _getRegexps();
-    my ($obj, $objfile, $so, $type, $backend, $gentype);
-
-    $backend = $options->{'b'} ? 'Bytecode' : $options->{'opt'} ? 'CC' : 'C';
 
-    $gentype = $options->{'b'} ? 'Bytecode' : 'C';
+#######################################################################
 
-    if  (
-            (($file =~ m"@$program_ext") && ($file !~ m"@$module_ext"))
-            || (defined($options->{'prog'}) || defined($options->{'run'}))
-        )
-    {
-        $type = 'program';
-
-        if ($options->{'b'})
-        {
-            $obj = $objfile = $options->{'o'} ? $options->{'o'} : "${file}c";
-        }
-        else
-        {
-            $objfile = $options->{'C'} ? $options->{'C'} : "$file.c";
-            $obj = $options->{'o'} ? $options->{'o'}
-                                   : _getExecutable( $file,$program_ext);
-        }
-
-        return() if (!$obj);
-
-    }
-    elsif (($file =~ m"@$module_ext") || ($options->{'mod'}))
-    {
-        $type = 'module';
-
-        if ($options->{'b'})
-        {
-            $obj = $objfile = $options->{'o'} ? $options->{'o'} : "${file}c";
-        }
-        else
-        {
-            die "Shared objects are not supported on Win32 yet!!!!\n"
-                                          if ($Config{'osname'} eq 'MSWin32');
-
-            $objfile = $options->{'C'} ? $options->{'C'} : "$file.c";
-            $obj = $options->{'o'} ? $options->{'o'}
-                                   : _getExecutable($file, $module_ext);
-            $so = "$obj.$Config{so}";
-        }
-
-        return() if (!$obj);
+sub choose_backend {
+    # Choose the backend.
+    $Backend = 'C';
+    if (opt(B)) {
+        checkopts_byte();
+        $Backend = 'Bytecode';
     }
-    else
-    {
-        _error("noextension", $file, $program_ext, $module_ext);
-        return();
+    if (opt(S) && opt(c)) {
+        # die "$0: Do you want me to compile this or not?\n";
+        delete $Options->{S};
     }
-
-    if ($type eq 'program')
-    {
-        _print("Making $gentype($objfile) for $file!\n", 36 );
-
-        my $errcode = _createCode($backend, $objfile, $file);
-        (_print( "ERROR: In generating code for $file!\n", -1), return()) 
-                                                                if ($errcode);
-
-        _print("Compiling C($obj) for $file!\n", 36 ) if (!$options->{'gen'} &&
-                                                          !$options->{'b'});
-        $errcode = _compileCode($file, $objfile, $obj) 
-                                            if (!$options->{'gen'} &&
-                                                !$options->{'b'});
-
-        if ($errcode)
-               {
-                       _print( "ERROR: In compiling code for $objfile !\n", -1);
-                       my $ofile = File::Basename::basename($objfile);
-                       $ofile =~ s"\.c$"\.o"s;
-                       
-                       _removeCode("$ofile"); 
-                       return()
-               }
-    
-        _runCode($objfile) if ($options->{'run'} && $options->{'b'});
-        _runCode($obj) if ($options->{'run'} && !$options->{'b'});
-
-        _removeCode($objfile) if (($options->{'b'} &&
-                                   ($options->{'e'} && !$options->{'o'})) ||
-                                  (!$options->{'b'} &&
-                                   (!$options->{'sav'} || 
-                                    ($options->{'e'} && !$options->{'C'}))));
-
-        _removeCode($file) if ($options->{'e'}); 
-
-        _removeCode($obj) if (!$options->{'b'} &&
-                              (($options->{'e'} &&
-                               !$options->{'sav'} && !$options->{'o'}) ||
-                              ($options->{'run'} && !$options->{'sav'})));
-    }
-    else
-    {
-        _print( "Making $gentype($objfile) for $file!\n", 36 );
-        my $errcode = _createCode($backend, $objfile, $file, $obj);
-        (_print( "ERROR: In generating code for $file!\n", -1), return()) 
-                                                                if ($errcode);
-    
-        _print( "Compiling C($so) for $file!\n", 36 ) if (!$options->{'gen'} &&
-                                                          !$options->{'b'});
-
-        $errcode = 
-            _compileCode($file, $objfile, $obj, $so ) if (!$options->{'gen'} &&
-                                                          !$options->{'b'});
-
-        (_print( "ERROR: In compiling code for $objfile!\n", -1), return()) 
-                                                                if ($errcode);
-    }
-}
-
-sub _getExecutable
-{
-    my ($sourceprog, $ext) = @_;
-    my ($obj);
-
-    if (defined($options->{'regex'}))
-    {
-        eval("(\$obj = \$sourceprog) =~ $options->{'regex'}");
-        return(0) if (_error('badeval', $@));
-        return(0) if (_error('equal', $obj, $sourceprog));
-    }
-    elsif (defined ($options->{'ext'}))
-    {
-        ($obj = $sourceprog) =~ s"@$ext"$options->{ext}"g;        
-        return(0) if (_error('equal', $obj, $sourceprog));
-    }
-    elsif (defined ($options->{'run'}))
-    {
-           $obj = "perlc$$";
-    }
-    else
-    {
-        ($obj = $sourceprog) =~ s"@$ext""g;
-        return(0) if (_error('equal', $obj, $sourceprog));
-    }
-    return($obj);
+    $Backend = 'CC' if opt(O);
 }
 
-sub _createCode
-{
-    my ( $backend, $generated_file, $file, $final_output ) = @_;
-    my $return;
-    my $output_switch = "o";
-    my $max_line_len = '';
-
-    local($") = " -I";
 
-    if ($^O eq 'MSWin32' && $backend =~ /^CC?$/ && $Config{cc} =~ /^cl/i) {
-       $max_line_len = '-l2000,';
-    }
-
-    if ($backend eq "Bytecode")
-    {
-        require ByteLoader;
-
-       open(GENFILE, "> $generated_file") || die "Can't open $generated_file: $!";
-       binmode GENFILE;
-        print GENFILE "#!$^X\n" if @_ == 3;
-        print GENFILE "use ByteLoader $ByteLoader::VERSION;\n";
-       close(GENFILE);
+sub generate_code { 
 
-       $output_switch ="a";
-    }
+    vprint 0, "Compiling $Input";
 
-    if (@_ == 3)                                   # compiling a program   
-    {
-        chmod $generated_file, 0777 & ~umask if $backend eq "Bytecode";
-       my $null=File::Spec->devnull;
-        _print( "$^X -I@INC -MB::Stash -c  $file\n", 36);
-        my @stash=`$^X -I@INC -MB::Stash -c  $file 2>$null`;
-       my $stash=$stash[-1];
-        chomp $stash;
-
-        _print( "$^X -I@INC -MO=$backend,$max_line_len$stash $file\n", 36);
-        $return =  _run("$^X -I@INC -MO=$backend,$max_line_len$stash,-$output_switch$generated_file $file", 9);
-        $return;
-    }
-    else                                           # compiling a shared object
-    {            
-        _print( 
-            "$^X -I@INC -MO=$backend,$max_line_len-m$final_output $file\n", 36);
-        $return = 
-        _run("$^X -I@INC -MO=$backend,$max_line_len-m$final_output,-$output_switch$generated_file $file  ", 9);
-        $return;
-    }
-}
+    $BinPerl  = yclept();  # Calling convention for perl.
 
-sub _compileCode
-{
-    my ($sourceprog, $generated_cfile, $output_executable, $shared_object) = @_;
-    my @return;
-
-    if (@_ == 3)                            # just compiling a program 
-    {
-        $return[0] = 
-        _ccharness('static', $sourceprog, "-o", $output_executable,
-                  $generated_cfile);  
-        $return[0];
-    }
-    else
-    {
-        my $object_file = $generated_cfile;
-        $object_file =~ s"\.c$"$Config{_o}";   
-
-        $return[0] = _ccharness('compile', $sourceprog, "-c", $generated_cfile);
-        $return[1] = _ccharness
-                            (
-                                'dynamic', 
-                                $sourceprog, "-o", 
-                                $shared_object, $object_file 
-                            );
-        return(1) if (grep ($_, @return));
-        return(0);
+    if (opt(shared)) {
+        compile_module();
+    } else {
+        if ($Backend eq 'Bytecode') {
+            compile_byte();
+        } else {
+            compile_cstyle();
+        }
     }
-}
 
-sub _runCode
-{
-    my ($executable) = @_;
-    _print("$executable $options->{'argv'}\n", 36);
-    _run("$executable $options->{'argv'}", -1 );
 }
 
-sub _removeCode
-{
-    my ($file) = @_;
-    unlink($file) if (-e $file);
-}
-
-sub _ccharness
-{
-    my $type = shift;
-    my (@args) = @_;
-    local($") = " ";
-
-    my $sourceprog = shift(@args);
-    my ($libdir, $incdir);
-
-    my $L = '-L';
-    $L = '-libpath:' if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i;
-
-    if (-d "$Config{installarchlib}/CORE")
-    {
-        $libdir = "$L$Config{installarchlib}/CORE";
-        $incdir = "-I$Config{installarchlib}/CORE";
-    }
-    else
-    {
-        $libdir = "$L.. $L."; 
-        $incdir = "-I.. -I.";
+# usage: vprint [level] msg args
+sub vprint {
+    my $level;
+    if (@_ == 1) {
+        $level = 1;
+    } elsif ($_[0] =~ /^\d$/) {
+        $level = shift;
+    } else {
+        # well, they forgot to use a number; means >0
+        $level = 0;
+    } 
+    my $msg = "@_";
+    $msg .= "\n" unless substr($msg, -1) eq "\n";
+    print "$0: $msg" if opt(v) > $level;
+} 
+
+sub parse_argv {
+
+    use Getopt::Long; 
+    Getopt::Long::Configure("bundling");
+    Getopt::Long::Configure("no_ignore_case");
+
+    # no difference in exists and defined for %ENV; also, a "0"
+    # argument or a "" would not help cc, so skip
+    unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
+
+    $Options = {};
+    Getopt::Long::GetOptions( $Options,
+        'L:s',          # lib directory
+        'I:s',          # include directories (FOR C, NOT FOR PERL)
+        'o:s',          # Output executable
+        'v+',           # Verbosity level
+        'e:s',          # One-liner
+        'B',            # Byte compiler backend
+        'O',            # Optimised C backend
+        'c',            # Compile only
+        'h',            # Help me
+        'S',            # Dump C files
+        's:s',          # Dirty hack to enable -shared/-static
+        'shared',       # Create a shared library (--shared for compat.)
+    );
+        
+    # This is an attempt to make perlcc's arg. handling look like cc.
+    if ( opt('s') ) {  # must quote: looks like s)foo)bar)!
+        if (opt('s') eq 'hared') {
+            $Options->{shared}++; 
+        } elsif (opt('s') eq 'tatic') {
+            $Options->{static}++; 
+        } else {
+            warn "$0: Unknown option -s", opt('s');
+        }
     }
 
-    $libdir .= " $L$options->{L}" if (defined($options->{L}));
-    $incdir .= " -I$options->{L}" if (defined($options->{L}));
-
-    my $linkargs = '';
-    my $dynaloader = '';
-    my $optimize = '';
-    my $flags = '';
+    $Options->{v} += 0;
 
-    if (!grep(/^-[cS]$/, @args))
-    {
-       my $lperl = $^O eq 'os2' ? '-llibperl' 
-          : $^O eq 'MSWin32' ? "$Config{archlibexp}\\CORE\\$Config{libperl}"
-          : '-lperl';
-       ($lperl = $Config{libperl}) =~ s/lib(.*)\Q$Config{_a}\E/-l$1/
-           if($^O eq 'cygwin');
+    helpme() if opt(h); # And exit
 
-       $optimize = $Config{'optimize'} =~ /-O\d/ ? '' : $Config{'optimize'};
+    $Output = opt(o) || 'a.out';
 
-       $flags = $type eq 'dynamic' ? $Config{lddlflags} : $Config{ldflags};
-       $linkargs = "$flags $libdir $lperl @Config{libs}";
-       $linkargs = "/link $linkargs" if $^O eq 'MSWin32' && $Config{cc} =~ /^cl/i;
+    if (opt(e)) {
+        warn "$0: using -e 'code' as input file, ignoring @ARGV\n" if @ARGV;
+        # We don't use a temporary file here; why bother?
+        # XXX: this is not bullet proof -- spaces or quotes in name!
+        $Input = "-e '".opt(e)."'"; # Quotes eaten by shell
+    } else {
+        $Input = shift @ARGV;  # XXX: more files?
+        die "$0: No input file specified\n" unless $Input;
+        # DWIM modules. This is bad but necessary.
+        $Options->{shared}++ if $Input =~ /\.pm\z/;
+        warn "$0: using $Input as input file, ignoring @ARGV\n" if @ARGV;
+        check_read($Input);
+        check_perl($Input);
+        sanity_check();
     }
 
-    my $libs = _getSharedObjects($sourceprog);
-    @$libs = grep { !(/DynaLoader\.a$/ && ($dynaloader = $_)) } @$libs
-       if($^O eq 'cygwin');
-
-    my $args = "@args";
-    if ($^O eq 'MSWin32' && $Config{cc} =~ /^bcc/i) {
-        # BC++ cmd line syntax does not allow space between -[oexz...] and arg
-        $args =~ s/(^|\s+)-([oe])\s+/$1-$2/g;
-    }
+}
 
-    my $ccflags = $Config{ccflags};
-    $ccflags .= ' -DUSEIMPORTLIB' if $^O eq 'cygwin';
-    my $cccmd = "$Config{cc} $ccflags $optimize $incdir "
-               ."$args $dynaloader $linkargs @$libs";
+sub opt(*) {
+    my $opt = shift;
+    return exists($Options->{$opt}) && ($Options->{$opt} || 0);
+} 
 
-    _print ("$cccmd\n", 36);
-    _run("$cccmd", 18 );
+sub compile_module { 
+    die "$0: Compiling to shared libraries is currently disabled\n";
 }
 
-sub _getSharedObjects
-{
-    my ($sourceprog) = @_;
-    my ($tmpfile, $incfile);
-    my (@sharedobjects, @libraries);
-    local($") = " -I";
+sub compile_byte {
+    require ByteLoader;
+    my $stash = grab_stash();
+    my $command = "$BinPerl -MO=Bytecode,$stash $Input";
+    # The -a option means we'd have to close the file and lose the
+    # lock, which would create the tiniest of races. Instead, append
+    # the output ourselves. 
+    vprint 1, "Writing on $Output";
 
-    my ($tmpprog);
-    ($tmpprog = $sourceprog) =~ s"(.*)[\\/](.*)"$2";
+    my $openflags = O_WRONLY | O_CREAT;
+    $openflags |= O_BINARY if eval { O_BINARY; 1 };
+    $openflags |= O_EXLOCK if eval { O_EXLOCK; 1 };
 
-    my $tempdir= File::Spec->tmpdir;
+    # these dies are not "$0: .... \n" because they "can't happen"
 
-    $tmpfile = "$tempdir/$tmpprog.tst";
-    $incfile = "$tempdir/$tmpprog.val";
+    sysopen(OUT, $Output, $openflags)
+        or die "can't write to $Output: $!";
 
-    my $fd = new FileHandle("> $tmpfile") || die "Couldn't open $tmpfile!\n";
-    my $fd2 = 
-        new FileHandle("$sourceprog") || die "Couldn't open $sourceprog!\n";
+    # this is blocking; hold on; why are we doing this??
+    # flock OUT, LOCK_EX or die "can't lock $Output: $!"
+    #    unless eval { O_EXLOCK; 1 };
 
-    print $fd <<"EOF";
-        use FileHandle;
-        my \$fh3  = new FileHandle("> $incfile") 
-                                        || die "Couldn't open $incfile\\n";
+    truncate(OUT, 0)
+        or die "couldn't trunc $Output: $!";
 
-        my \$key;
-        foreach \$key (keys(\%INC)) { print \$fh3 "\$key:\$INC{\$key}\\n"; }
-        close(\$fh3);
-        exit();
+    print OUT <<EOF;
+#!$^X
+use ByteLoader $ByteLoader::VERSION;
 EOF
 
-    print $fd (   <$fd2>    );
-    close($fd);
-
-    _print("$^X -I@INC $tmpfile\n", 36);
-    _run("$^X -I@INC $tmpfile", 9 );
-
-    $fd = new FileHandle ("$incfile"); 
-    my @lines = <$fd>;    
-
-    unlink($tmpfile);
-    unlink($incfile);
+    # Now the compile:
+    vprint 1, "Compiling...";
+    vprint 3, "Calling $command";
 
-    my $line;
-    my $autolib;
+    my ($output_r, $error_r) = spawnit($command);
 
-    my @return;
-
-    foreach $line (@lines) 
-    {
-        chomp($line);
-
-        my ($modname, $modpath) = split(':', $line);
-        my ($dir, $file) = ($modpath=~ m"(.*)[\\/]($modname)");
-
-        if ($autolib = _lookforAuto($dir, $file)) { push(@return, $autolib); }
+    if (@$error_r && $? != 0) {
+       die "$0: $Input did not compile, which can't happen:\n@$error_r\n";
+    } else {
+       my @error = grep { !/^$Input syntax OK$/o } @$error_r;
+       warn "$0: Unexpected compiler output:\n@error" if @error;
     }
-    return(\@return);
-}
-
-sub _maketempfile
-{
-    my $return;
+       
+    # Write it and leave.
+    print OUT @$output_r               or die "can't write $Output: $!";
+    close OUT                          or die "can't close $Output: $!";
 
-#    if ($Config{'osname'} eq 'MSWin32') 
-#            { $return = "C:\\TEMP\\comp$$.p"; }
-#    else
-#            { $return = "/tmp/comp$$.p"; }
-
-    $return = "comp$$.p"; 
-
-    my $fd = new FileHandle( "> $return") || die "Couldn't open $return!\n";
-    print $fd $options->{'e'};
-    close($fd);
-
-    return($return);
+    # wait, how could it be anything but what you see next?
+    chmod 0777 & ~umask, $Output    or die "can't chmod $Output: $!";
+    exit 0;
 }
-    
-    
-sub _lookforAuto
-{
-    my ($dir, $file) = @_;    
 
-    my ($relabs, $relshared);
-    my ($prefix);
-    my $return;
-    my $sharedextension = $^O =~ /MSWin32|cygwin|os2/i
-                         ? $Config{_a} : ".$Config{so}";
-    ($prefix = $file) =~ s"(.*)\.pm"$1";
-
-    my ($tmp, $modname) = ($prefix =~ m"(?:(.*)[\\/]){0,1}(.*)"s);
-
-    $relshared = "$pathsep$prefix$pathsep$modname$sharedextension";
-    $relabs    = "$pathsep$prefix$pathsep$modname$Config{_a}";
-                                               # HACK . WHY DOES _a HAVE A '.'
-                                               # AND so HAVE NONE??
-
-    my @searchpaths =   map("$_${pathsep}auto", @INC);
+sub compile_cstyle {
+    my $stash = grab_stash();
     
-    my $path;
-    foreach $path (@searchpaths)
-    {
-        if (-e ($return = "$path$relshared")) { return($return); } 
-        if (-e ($return = "$path$relabs"))    { return($return); }
+    # What are we going to call our output C file?
+    my ($cfile,$cfh);
+    my $lose = 0;
+    if (opt(S) || opt(c)) {
+        # We need to keep it.
+        if (opt(e)) {
+            $cfile = "a.out.c";
+        } else {
+            $cfile = $Input;
+            # File off extension if present
+            # hold on: plx is executable; also, careful of ordering!
+            $cfile =~ s/\.(?:p(?:lx|l|h)|m)\z//i;
+            $cfile .= ".c";
+            $cfile = $Output if opt(c) && $Output =~ /\.c\z/i;
+        }
+        check_write($cfile);
+    } else {
+        # Don't need to keep it, be safe with a tempfile.
+        $lose = 1;
+        ($cfh, $cfile) = tempfile("pccXXXXX", SUFFIX => ".c"); 
+        close $cfh; # See comment just below
     }
-   return(undef);
-}
-
-sub _getRegexps    # make the appropriate regexps for making executables, 
-{                  # shared libs
-
-    my ($program_ext, $module_ext) = ([],[]); 
+    vprint 1, "Writing C on $cfile";
 
+    my $max_line_len = '';
+    if ($^O eq 'MSWin32' && $Config{cc} =~ /^cl/i) {
+        $max_line_len = '-l2000,';
+    }
 
-    @$program_ext = ($ENV{PERL_SCRIPT_EXT})? split(':', $ENV{PERL_SCRIPT_EXT}) :
-                                            ('.p$', '.pl$', '.bat$');
+    # This has to do the write itself, so we can't keep a lock. Life
+    # sucks.
+    my $command = "$BinPerl -MO=$Backend,$max_line_len$stash,-o$cfile $Input";
+    vprint 1, "Compiling...";
+    vprint 1, "Calling $command";
 
+       my ($output_r, $error_r) = spawnit($command);
+       my @output = @$output_r;
+       my @error = @$error_r;
 
-    @$module_ext  = ($ENV{PERL_MODULE_EXT})? split(':', $ENV{PERL_MODULE_EXT}) :
-                                            ('.pm$');
+    if (@error && $? != 0) {
+        die "$0: $Input did not compile, which can't happen:\n@error\n";
+    }
 
-    _mungeRegexp( $program_ext );
-    _mungeRegexp( $module_ext  );    
+    cc_harness($cfile,$stash) unless opt(c);
 
-    return($program_ext, $module_ext);
+    if ($lose) {
+        vprint 2, "unlinking $cfile";
+        unlink $cfile or die "can't unlink $cfile: $!" if $lose;
+    }
+       exit(0);
 }
 
-sub _mungeRegexp
-{
-    my ($regexp) = @_;
-
-    grep(s:(^|[^\\])\.:$1\x00\\.:g, @$regexp);
-    grep(s:(^|[^\x00])\\\.:$1\.:g,  @$regexp);
-    grep(s:\x00::g,                 @$regexp);
+sub cc_harness {
+       my ($cfile,$stash)=@_;
+       use ExtUtils::Embed ();
+       my $command = ExtUtils::Embed::ccopts." -o $Output $cfile ";
+       $command .= join " -I", split /\s+/, opt(I);
+       $command .= join " -L", split /\s+/, opt(L);
+       my @mods = split /-?u /, $stash;
+       $command .= ExtUtils::Embed::ldopts("-std", \@mods);
+       vprint 3, "running cc $command";
+       system("cc $command");
 }
 
-sub _error
-{
-    my ($type, @args) = @_;
-
-    if ($type eq 'equal')
-    {
-            
-        if ($args[0] eq $args[1])
-        {
-            _print ("ERROR: The object file '$args[0]' does not generate a legitimate executable file! Skipping!\n", -1);
-            return(1);
+# Where Perl is, and which include path to give it.
+sub yclept {
+    my $command = "$^X ";
+
+    # DWIM the -I to be Perl, not C, include directories.
+    if (opt(I) && $Backend eq "Bytecode") {
+        for (split /\s+/, opt(I)) {
+            if (-d $_) {
+                push @INC, $_;
+            } else {
+                warn "$0: Include directory $_ not found, skipping\n";
+            }
         }
     }
-    elsif ($type eq 'badeval')
-    {
-        if ($args[0])
-        {
-            _print ("ERROR: $args[0]\n", -1);
-            return(1);
-        }
-    }
-    elsif ($type eq 'noextension')
-    {
-        my $progext = join(',', @{$args[1]});
-        my $modext  = join(',', @{$args[2]});
-
-        $progext =~ s"\\""g;
-        $modext  =~ s"\\""g;
-
-        $progext =~ s"\$""g;
-        $modext  =~ s"\$""g;
-
-        _print 
-        (
-"
-ERROR: '$args[0]' does not have a proper extension! Proper extensions are:
-
-    PROGRAM:       $progext 
-    SHARED OBJECT: $modext
-
-Use the '-prog' flag to force your files to be interpreted as programs.
-Use the '-mod' flag to force your files to be interpreted as modules.
-", -1
-        );
-        return(1);
-    }
-
-    return(0);
+            
+    $command .= "-I$_ " for @INC;
+    return $command;
 }
 
-sub _checkopts
+# Use B::Stash to find additional modules and stuff.
 {
-    my @errors;
-    local($") = "\n";
+    my $_stash;
+    sub grab_stash {
 
-    if ($options->{'log'})
-    {
-        $_fh = new FileHandle(">> $options->{'log'}") || push(@errors, "ERROR: Couldn't open $options->{'log'}\n");
-    }
+        warn "already called get_stash once" if $_stash;
 
-    if ($options->{'b'} && $options->{'c'})
-    {
-        push(@errors,
-"ERROR: The '-b' and '-c' options are incompatible. The '-c' option specifies
-       a name for the intermediate C code but '-b' generates byte code
-       directly.\n");
-    }
-    if ($options->{'b'} && ($options->{'sav'} || $options->{'gen'}))
-    {
-        push(@errors,
-"ERROR: The '-sav' and '-gen' options are incompatible with the '-b' option.
-       They ask for intermediate C code to be saved by '-b' generates byte
-       code directly.\n");
-    }
+        my $command = "$BinPerl -MB::Stash -c $Input";
+        # Filename here is perfectly sanitised.
+        vprint 3, "Calling $command\n";
 
-    if (($options->{'c'}) && (@ARGV > 1) && ($options->{'sav'} ))
-    {
-        push(@errors, 
-"ERROR: The '-sav' and '-C' options are incompatible when you have more than 
-       one input file! ('-C' explicitly names resulting C code, '-sav' saves it,
-       and hence, with more than one file, the c code will be overwritten for 
-       each file that you compile)\n");
-    }
-    if (($options->{'o'}) && (@ARGV > 1))
-    {
-        push(@errors, 
-"ERROR: The '-o' option is incompatible when you have more than one input 
-       file! (-o explicitly names the resulting file, hence, with more than 
-       one file the names clash)\n");
-    }
+               my ($stash_r, $error_r) = spawnit($command);
+               my @stash = @$stash_r;
+               my @error = @$error_r;
 
-    if ($options->{'e'} && ($options->{'sav'} || $options->{'gen'}) &&
-                                                            !$options->{'C'})
-    {
-        push(@errors, 
-"ERROR: You need to specify where you are going to save the resulting 
-       C code when using '-sav' and '-e'. Use '-C'.\n");
-    }
+       if (@error && $? != 0) {
+            die "$0: $Input did not compile:\n@error\n";
+        }
 
-    if (($options->{'regex'} || $options->{'run'} || $options->{'o'}) 
-                                                    && $options->{'gen'})
-    {
-        push(@errors, 
-"ERROR: The options '-regex', '-run', and '-o' are incompatible with '-gen'. 
-       '-gen' says to stop at C generation, and the other three modify the 
-       compilation and/or running process!\n");
+        $stash[0] =~ s/,-u\<none\>//;
+        vprint 2, "Stash: ", join " ", split /,?-u/, $stash[0];
+        chomp $stash[0];
+        return $_stash = $stash[0];
     }
 
-    if ($options->{'run'} && $options->{'mod'})
-    {
-        push(@errors, 
-"ERROR: Can't run modules that you are compiling! '-run' and '-mod' are 
-       incompatible!\n"); 
-    }
+}
 
-    if ($options->{'e'} && @ARGV)
-    {
-        push (@errors, 
-"ERROR: The option '-e' needs to be all by itself without any other 
-       file arguments!\n");
-    }
-    if ($options->{'e'} && !($options->{'o'} || $options->{'run'}))
-    {
-        $options->{'run'} = 1;
-    }
+# Check the consistency of options if -B is selected.
+# To wit, (-B|-O) ==> no -shared, no -S, no -c
+sub checkopts_byte {
 
-    if (!defined($options->{'verbose'})) 
-    { 
-        $options->{'verbose'} = ($options->{'log'})? 64 : 7; 
-    }
+    die "$0: Please choose one of either -B and -O.\n" if opt(O);
 
-    my $verbose_error;
+    if (opt(shared)) {
+        warn "$0: Will not create a shared library for bytecode\n";
+        delete $Options->{shared};
+    }
 
-    if ($options->{'verbose'} =~ m"[^tagfcd]" && 
-            !( $options->{'verbose'} eq '0' || 
-                ($options->{'verbose'} < 64 && $options->{'verbose'} > 0)))
-    {
-        $verbose_error = 1;
-        push(@errors, 
-"ERROR: Illegal verbosity level.  Needs to have either the letters 
-       't','a','g','f','c', or 'd' in it or be between 0 and 63, inclusive.\n");
+    for my $o ( qw[c S] ) { 
+        if (opt($o)) { 
+            warn "$0: Compiling to bytecode is a one-pass process--",
+                  "-$o ignored\n";
+            delete $Options->{$o};
+        }
     }
 
-    $options->{'verbose'} = ($options->{'verbose'} =~ m"[tagfcd]")? 
-                            ($options->{'verbose'} =~ m"d") * 32 +     
-                            ($options->{'verbose'} =~ m"c") * 16 +     
-                            ($options->{'verbose'} =~ m"f") * 8     +     
-                            ($options->{'verbose'} =~ m"t") * 4     +     
-                            ($options->{'verbose'} =~ m"a") * 2     +     
-                            ($options->{'verbose'} =~ m"g") * 1     
-                                                    : $options->{'verbose'};
-
-    if     (!$verbose_error && (    $options->{'log'} && 
-                                !(
-                                    ($options->{'verbose'} & 8)   || 
-                                    ($options->{'verbose'} & 16)  || 
-                                    ($options->{'verbose'} & 32 ) 
-                                )
-                            )
-        )
-    {
-        push(@errors, 
-"ERROR: The verbosity level '$options->{'verbose'}' does not output anything 
-       to a logfile, and you specified '-log'!\n");
-    } # }
-
-    if     (!$verbose_error && (    !$options->{'log'} && 
-                                (
-                                    ($options->{'verbose'} & 8)   || 
-                                    ($options->{'verbose'} & 16)  || 
-                                    ($options->{'verbose'} & 32)  || 
-                                    ($options->{'verbose'} & 64)
-                                )
-                            )
-        )
-    {
-        push(@errors, 
-"ERROR: The verbosity level '$options->{'verbose'}' requires that you also 
-       specify a logfile via '-log'\n");
-    } # }
-
-
-    (_print( "\n". join("\n", @errors), -1), return(0)) if (@errors);
-    return(1);
 }
 
-sub _print
-{
-    my ($text, $flag ) = @_;
-    
-    my $logflag = int($flag/8) * 8;
-    my $regflag = $flag % 8;
-
-    if ($flag == -1 || ($flag & $options->{'verbose'}))
-    {
-        my $dolog = ((($logflag & $options->{'verbose'}) || $flag == -1) 
-                                                        && $options->{'log'}); 
-
-        my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
-        
-        if ($doreg) { print( STDERR $text ); }
-        if ($dolog) { print $_fh $text; }
+# Check the input and output files make sense, are read/writeable.
+sub sanity_check {
+    if ($Input eq $Output) {
+        if ($Input eq 'a.out') {
+            warn "$0: Compiling a.out is probably not what you want to do.\n";
+            # You fully deserve what you get now.
+        } else {
+            warn "$0: Will not write output on top of input file, ",
+                "compiling to a.out instead\n";
+            $Output = "a.out";
+        }
     }
 }
 
-sub _run
-{
-    my ($command, $flag) = @_;
-
-    my $logflag = ($flag != -1)? int($flag/8) * 8 : 0;
-    my $regflag = $flag % 8;
-
-    if ($flag == -1 || ($flag & $options->{'verbose'}))
-    {
-        my $dolog = ($logflag & $options->{'verbose'} && $options->{'log'});
-        my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
-
-        if ($doreg && !$dolog) 
-        {
-           print _interruptrun("$command");
-       }
-        elsif ($doreg && $dolog) 
-        { 
-           my $text = _interruptrun($command); 
-           print $_fh $text; 
-           print STDERR $text;
-       }
-        else 
-        { 
-           my $text = _interruptrun($command);
-           print $_fh $text; 
-       }
-    }
-    else 
-    {
-       _interruptrun($command);
+sub check_read { 
+    my $file = shift;
+    unless (-r $file) {
+        die "$0: Input file $file is a directory, not a file\n" if -d _;
+        unless (-e _) {
+            die "$0: Input file $file was not found\n";
+        } else {
+            die "$0: Cannot read input file $file: $!\n";
+        }
     }
-    return($?);
+    unless (-f _) {
+        # XXX: die?  don't try this on /dev/tty
+        warn "$0: WARNING: input $file is not a plain file\n";
+    } 
 }
 
-sub _interruptrun
-{
-    my ($command) = @_;
-    my $pid = open (FD, "$command  |");
-
-    local($SIG{HUP}) = sub { 
-#      kill 9, $pid + 1;  
-#      HACK... 2>&1 doesn't propogate
-#      kill, comment out for quick and dirty
-#      process killing of child.
-
-       kill 9, $pid;  
-       exit(); 
-    };
-    local($SIG{INT}) = sub { 
-#      kill 9, $pid + 1;  
-#      HACK... 2>&1 doesn't propogate
-#      kill, comment out for quick and dirty
-#      process killing of child.
-       kill 9, $pid; 
-       exit(); 
-    }; 
-
-    my $needalarm = 
-            ($ENV{'PERLCC_TIMEOUT'} && 
-                    $Config{'osname'} ne 'MSWin32' && $command =~ m"^perlc");
-    my $text;
-
-    eval
-    {
-        local($SIG{ALRM}) = sub { die "INFINITE LOOP"; };
-        alarm($ENV{'PERLCC_TIMEOUT'}) if ($needalarm);
-        $text = join('', <FD>); 
-        alarm(0) if ($needalarm);
-    };
-
-    if ($@) 
-    { 
-        eval { kill 'HUP', $pid; };
-        _print("SYSTEM TIMEOUT (infinite loop?)\n", 36); 
+sub check_write {
+    my $file = shift;
+    if (-d $file) {
+        die "$0: Cannot write on $file, is a directory\n";
+    }
+    if (-e _) {
+        die "$0: Cannot write on $file: $!\n" unless -w _;
+    } 
+    unless (-w cwd()) { 
+        die "$0: Cannot write in this directory: $!\n" 
     }
-        
-    close(FD);
-    return($text);
 }
 
-sub _usage
-{
-    _print
-    ( 
-    <<"EOF"
-
-Usage: $0 <file_list> 
-
-WARNING: The whole compiler suite ('perlcc' included) is considered VERY
-experimental.  Use for production purposes is strongly discouraged.
-
-    Flags with arguments
-        -L       < extra library dirs for installation (form of 'dir1:dir2') >
-        -I       < extra include dirs for installation (form of 'dir1:dir2') >
-        -C       < explicit name of resulting C code > 
-        -o       < explicit name of resulting executable >
-        -e       < to compile 'one liners'. Need executable name (-o) or '-run'>
-        -regex   < rename regex, -regex 's/\.p/\.exe/' compiles a.p to a.exe >
-        -verbose < verbose level < 1-63, or following letters 'gatfcd' >
-        -argv    < arguments for the executables to be run via '-run' or '-e' > 
-
-    Boolean flags
-        -b       ( to generate byte code )
-        -opt     ( to generated optimised C code. May not work in some cases. )
-        -gen     ( to just generate the C code. Implies '-sav' )
-        -sav     ( to save intermediate C code, (and executables with '-run'))
-        -run     ( to run the compiled program on the fly, as were interpreted.)
-        -prog    ( to indicate that the files on command line are programs )
-        -mod     ( to indicate that the files on command line are modules  )
-
-EOF
-, -1
+sub check_perl {
+    my $file = shift;
+    unless (-T $file) {
+        warn "$0: Binary `$file' sure doesn't smell like perl source!\n";
+        print "Checking file type... ";
+        system("file", $file);  
+        die "Please try a perlier file!\n";
+    } 
+
+    open(my $handle, "<", $file)    or die "XXX: can't open $file: $!";
+    local $_ = <$handle>;
+    if (/^#!/ && !/perl/) {
+        die "$0: $file is a ", /^#!\s*(\S+)/, " script, not perl\n";
+    } 
+
+} 
+
+# File spawning and error collecting
+sub spawnit {
+       my ($command) = shift;
+       my (@error,@output);
+       my $errname;
+       (undef, $errname) = tempfile("pccXXXXX");
+       { 
+       open (S_OUT, "$command 2>$errname |")
+               or die "$0: Couldn't spawn the compiler.\n";
+       @output = <S_OUT>;
+       }
+       open (S_ERROR, $errname) or die "$0: Couldn't read the error file.\n";
+       @error = <S_ERROR>;
+       close S_ERROR;
+       close S_OUT;
+       unlink $errname or die "$0: Can't unlink error file $errname";
+       return (\@output, \@error);
+}
 
-    );
-    exit(255);
+sub helpme {
+       print "perlcc compiler frontend, version $VERSION\n\n";
+       { no warnings;
+       exec "pod2usage $0";
+       exec "perldoc $0";
+       exec "pod2text $0";
+       }
 }
 
 
@@ -868,247 +476,83 @@ __END__
 
 =head1 NAME
 
-perlcc - frontend for perl compiler
+perlcc - generate executables from Perl programs
 
 =head1 SYNOPSIS
 
-    %prompt  perlcc a.p        # compiles into executable 'a'
-
-    %prompt  perlcc A.pm       # compile into 'A.so'
-
-    %prompt  perlcc a.p -o execute  # compiles 'a.p' into 'execute'.
+    $ perlcc hello              # Compiles into executable 'a.out'
+    $ perlcc -o hello hello.pl  # Compiles into executable 'hello'
 
-    %prompt  perlcc a.p -o execute -run # compiles 'a.p' into execute, runs on
-                                        # the fly
+    $ perlcc -O file            # Compiles using the optimised C backend
+    $ perlcc -B file            # Compiles using the bytecode backend
 
-    %prompt  perlcc a.p -o execute -run -argv 'arg1 arg2 arg3' 
-                                        # compiles into execute, runs with 
-                                        # arg1 arg2 arg3 as @ARGV
-
-    %prompt perlcc a.p b.p c.p -regex 's/\.p/\.exe'
-                                        # compiles into 'a.exe','b.exe','c.exe'.
-
-    %prompt perlcc a.p -log compilelog  # compiles into 'a', saves compilation
-                                        # info into compilelog, as well
-                                        # as mirroring to screen
-
-    %prompt perlcc a.p -log compilelog -verbose cdf 
-                                        # compiles into 'a', saves compilation
-                                        # info into compilelog, being silent
-                                        # on screen.
-
-    %prompt perlcc a.p -C a.c -gen      # generates C code (into a.c) and 
-                                        # stops without compile.
-
-    %prompt perlcc a.p -L ../lib a.c 
-                                        # Compiles with the perl libraries 
-                                        # inside ../lib included.
+    $ perlcc -c file            # Creates a C file, 'file.c'
+    $ perlcc -S -o hello file   # Creates a C file, 'file.c',
+                                # then compiles it to executable 'hello'
+    $ perlcc -c out.c file      # Creates a C file, 'out.c' from 'file'
 
+    $ perlcc -e 'print q//'     # Compiles a one-liner into 'a.out'
+    $ perlcc -c -e 'print q//'  # Creates a C file 'a.out.c'
+    
 =head1 DESCRIPTION
 
-'perlcc' is the frontend into the perl compiler. Typing 'perlcc a.p'
-compiles the code inside a.p into a standalone executable, and 
-perlcc A.pm will compile into a shared object, A.so, suitable for inclusion 
-into a perl program via "use A".
+F<perlcc> creates standalone executables from Perl programs, using the
+code generators provided by the L<B> module. At present, you may
+either create executable Perl bytecode, using the C<-B> option, or 
+generate and compile C files using the standard and 'optimised' C
+backends.
 
-There are quite a few flags to perlcc which help with such issues as compiling 
-programs in bulk, testing compiled programs for compatibility with the 
-interpreter, and controlling.
+The code generated in this way is not guaranteed to work. The whole
+codegen suite (C<perlcc> included) should be considered B<very>
+experimental. Use for production purposes is strongly discouraged.
 
-=head1 OPTIONS 
+=head1 OPTIONS
 
 =over 4
 
-=item -L < library_directories >
-
-Adds directories in B<library_directories> to the compilation command.
-
-=item -I  < include_directories > 
-
-Adds directories inside B<include_directories> to the compilation command.
-
-=item -C   < c_code_name > 
-
-Explicitly gives the name B<c_code_name> to the generated file containing
-the C code which is to be compiled. Can only be used if compiling one file
-on the command line.
-
-=item -o   < executable_name >
-
-Explicitly gives the name B<executable_name> to the executable which is to be
-compiled. Can only be used if compiling one file on the command line.
+=item -LI<library directories>
 
-=item -e   < perl_line_to_execute>
+Adds the given directories to the library search path when C code is
+passed to your C compiler.
 
-Compiles 'one liners', in the same way that B<perl -e> runs text strings at 
-the command line. Default is to have the 'one liner' be compiled, and run all
-in one go (see B<-run>); giving the B<-o> flag saves the resultant executable, 
-rather than throwing it away. Use '-argv' to pass arguments to the executable
-created.
+=item -II<include directories>
 
-=item -b
+Adds the given directories to the include file search path when C code is
+passed to your C compiler; when using the Perl bytecode option, adds the
+given directories to Perl's include path.
 
-Generates bytecode instead of C code.
+=item -o I<output file name>
 
-=item -opt
+Specifies the file name for the final compiled executable.
 
-Uses the optimized C backend (C<B::CC>)rather than the simple C backend
-(C<B::C>).  Beware that the optimized C backend creates very large
-switch structures and structure initializations.  Many C compilers
-find it a challenge to compile the resulting output in finite amounts
-of time.  Many Perl features such as C<goto LABEL> are also not
-supported by the optimized C backend.  The simple C backend should
-work in more instances, but can only offer modest speed increases.
+=item -c I<C file name>
 
-=item -regex   <rename_regex>
+Create C code only; do not compile to a standalone binary.
 
-Gives a rule B<rename_regex> - which is a legal perl regular expression - to 
-create executable file names.
+=item -e I<perl code>
 
-=item -verbose <verbose_level>
+Compile a one-liner, much the same as C<perl -e '...'>
 
-Show exactly what steps perlcc is taking to compile your code. You can
-change the verbosity level B<verbose_level> much in the same way that
-the C<-D> switch changes perl's debugging level, by giving either a
-number which is the sum of bits you want or a list of letters
-representing what you wish to see. Here are the verbosity levels so
-far :
+=item -S
 
-    Bit 1(g):      Code Generation Errors to STDERR
-    Bit 2(a):      Compilation Errors to STDERR
-    Bit 4(t):      Descriptive text to STDERR 
-    Bit 8(f):      Code Generation Errors to file (B<-log> flag needed)
-    Bit 16(c):     Compilation Errors to file (B<-log> flag needed)
-    Bit 32(d):     Descriptive text to file (B<-log> flag needed) 
+Do not delete generated C code after compilation.
 
-If the B<-log> tag is given, the default verbose level is 63 (ie: mirroring 
-all of perlcc's output to both the screen and to a log file). If no B<-log>
-tag is given, then the default verbose level is 7 (ie: outputting all of 
-perlcc's output to STDERR).
+=item -B
 
-NOTE: Because of buffering concerns, you CANNOT shadow the output of '-run' to
-both a file, and to the screen! Suggestions are welcome on how to overcome this
-difficulty, but for now it simply does not work properly, and hence will only go
-to the screen.
+Use the Perl bytecode code generator.
 
-=item -log <logname>
+=item -O
 
-Opens, for append, a logfile to save some or all of the text for a given 
-compile command. No rewrite version is available, so this needs to be done 
-manually.
+Use the 'optimised' C code generator. This is more experimental than
+everything else put together, and the code created is not guaranteed to
+compile in finite time and memory, or indeed, at all.
 
-=item -argv <arguments>
+=item -v
 
-In combination with C<-run> or C<-e>, tells perlcc to run the resulting 
-executable with the string B<arguments> as @ARGV.
-
-=item -sav
-
-Tells perl to save the intermediate C code. Usually, this C code is the name
-of the perl code, plus '.c'; 'perlcode.p' gets generated in 'perlcode.p.c',
-for example. If used with the C<-e> operator, you need to tell perlcc where to 
-save resulting executables.
-
-=item -gen
-
-Tells perlcc to only create the intermediate C code, and not compile the 
-results. Does an implicit B<-sav>, saving the C code rather than deleting it.
-
-=item -run
-
-Immediately run the perl code that has been generated. NOTE: IF YOU GIVE THE 
-B<-run> FLAG TO B<perlcc>, THEN THE REST OF @ARGV WILL BE INTERPRETED AS 
-ARGUMENTS TO THE PROGRAM THAT YOU ARE COMPILING.
-
-=item -prog
-
-Indicate that the programs at the command line are programs, and should be
-compiled as such. B<perlcc> will automatically determine files to be 
-programs if they have B<.p>, B<.pl>, B<.bat> extensions.
-
-=item -mod
-
-Indicate that the programs at the command line are modules, and should be
-compiled as such. B<perlcc> will automatically determine files to be 
-modules if they have the extension B<.pm>.
+Increase verbosity of output; can be repeated for more verbose output.
 
 =back
 
-=head1 ENVIRONMENT
-
-Most of the work of B<perlcc> is done at the command line. However, you can 
-change the heuristic which determines what is a module and what is a program.
-As indicated above, B<perlcc> assumes that the extensions:
-
-.p$, .pl$, and .bat$
-
-indicate a perl program, and:
-
-.pm$
-
-indicate a library, for the purposes of creating executables. And furthermore,
-by default, these extensions will be replaced (and dropped) in the process of 
-creating an executable. 
-
-To change the extensions which are programs, and which are modules, set the
-environmental variables:
-
-PERL_SCRIPT_EXT
-PERL_MODULE_EXT
-
-These two environmental variables take colon-separated, legal perl regular 
-expressions, and are used by perlcc to decide which objects are which. 
-For example:
-
-setenv PERL_SCRIPT_EXT  '.prl$:.perl$'
-prompt%   perlcc sample.perl
-
-will compile the script 'sample.perl' into the executable 'sample', and
-
-setenv PERL_MODULE_EXT  '.perlmod$:.perlmodule$'
-
-prompt%   perlcc sample.perlmod
-
-will  compile the module 'sample.perlmod' into the shared object 
-'sample.so'
-
-NOTE: the '.' in the regular expressions for PERL_SCRIPT_EXT and PERL_MODULE_EXT
-is a literal '.', and not a wild-card. To get a true wild-card, you need to 
-backslash the '.'; as in:
-
-setenv PERL_SCRIPT_EXT '\.\.\.\.\.'
-
-which would have the effect of compiling ANYTHING (except what is in 
-PERL_MODULE_EXT) into an executable with 5 less characters in its name.
-
-The PERLCC_OPTS environment variable can be set to the default flags
-that must be used by the compiler.
-
-The PERLCC_TIMEOUT environment variable can be set to the number of
-seconds to wait for the backends before giving up.  This is sometimes
-necessary to avoid some compilers taking forever to compile the
-generated output.  May not work on Windows and similar platforms.
-
-=head1 FILES
-
-'perlcc' uses a temporary file when you use the B<-e> option to evaluate 
-text and compile it. This temporary file is 'perlc$$.p'. The temporary C code is
-perlc$$.p.c, and the temporary executable is perlc$$.
-
-When you use '-run' and don't save your executable, the temporary executable is
-perlc$$
-
-=head1 BUGS
-
-The whole compiler suite (C<perlcc> included) should be considered very
-experimental.  Use for production purposes is strongly discouraged.
-
-perlcc currently cannot compile shared objects on Win32. This should be fixed
-in future.
-
-Bugs in the various compiler backends still exist, and are perhaps too
-numerous to list here.
-
 =cut
 
 !NO!SUBS!
index 5d136b3..e1dd783 100644 (file)
@@ -203,7 +203,7 @@ if (-f "Makefile.PL") {
     eval q{ use lib qw(. lib); 1; } or die;
 
     # don't add if superuser
-    if ($< && $>) {   # don't be looking too hard now!
+    if ($< && $> && -f "blib") {   # don't be looking too hard now!
        eval q{ use blib; 1 };
        warn $@ if $@ && $opt_v;
     }
@@ -409,7 +409,7 @@ sub page {
     }
     else {
        foreach my $pager (@pagers) {
-           last if system("$pager $tmp") == 0;
+           last if system("$pager \"$tmp\"") == 0;
        }
     }
 }
@@ -439,9 +439,9 @@ foreach (@pages) {
        next;
     }
     print STDERR "Searching for $_\n" if $opt_v;
-    # We must look both in @INC for library modules and in PATH
+    # We must look both in @INC for library modules and in $bindir
     # for executables, like h2xs or perldoc itself.
-    my @searchdirs = @INC;
+    my @searchdirs = ($bindir, @INC);
     if ($opt_F) {
        next unless -r;
        push @found, $_ if $opt_m or containspod($_);
index 2bf0114..c34be75 100644 (file)
@@ -22,6 +22,7 @@
 #### Start of system configuration section. ####
 
 ~DECC~
+~DECCXX~
 ~GNUC~
 ~ARCH-TYPE~ = 1
 ~THREAD~
@@ -131,7 +132,11 @@ DBGSPECFLAGS = /Show=All
        @ If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS DECC$Library_Include
 .endif
 
+.ifdef DECCXX
+XTRACCFLAGS = /Include=[]/Standard=ANSI/Prefix=All/Obj=$(OBJVAL)
+.else
 XTRACCFLAGS = /Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=$(OBJVAL)
+.endif
 XTRADEF =
 POSIX = POSIX
 .endif
@@ -218,6 +223,7 @@ NOOP = continue
 # are built using these macros should depend on $(MINIPERL_EXE)
 MINIPERL_EXE = Sys$Disk:[]miniperl$(E)
 MINIPERL = MCR $(MINIPERL_EXE) "-I[.lib]"
+MINIPERLQ = MCR $(MINIPERL_EXE) ""-I[.lib]""
 XSUBPP = $(MINIPERL) "-I[.ext.re]" [.lib.extutils]xsubpp -noprototypes
 # Macro to invoke a preexisting copy of Perl.  This is used to regenerate
 # some header files when rebuilding Perl, but premade versions are provided
@@ -299,7 +305,11 @@ ac8 = $(ARCHCORE)perlapi.h $(ARCHCORE)perlio.h $(ARCHCORE)perlsdio.h
 ac9 = $(ARCHCORE)perlvars.h $(ARCHCORE)perly.h $(ARCHCORE)pp.h
 ac10 = $(ARCHCORE)pp_proto.h $(ARCHCORE)proto.h $(ARCHCORE)regcomp.h
 ac11 = $(ARCHCORE)regexp.h $(ARCHCORE)regnodes.h $(ARCHCORE)scope.h
+.ifdef SOCKARCH
 ac12 = $(ARCHCORE)sv.h $(ARCHCORE)thrdvar.h $(SOCKARCH)
+.else
+ac12 = $(ARCHCORE)sv.h $(ARCHCORE)thrdvar.h
+.endif 
 ac13 = $(ARCHCORE)thread.h $(ARCHCORE)utf8.h $(ARCHCORE)util.h
 ac14 = $(ARCHCORE)vmsish.h $(ARCHCORE)warnings.h $(ARCHCORE)xsub.h
 acopt = $(ARCHCORE)perlshr_attr.opt $(ARCHCORE)$(DBG)perlshr_bld.opt
@@ -327,17 +337,19 @@ CRTLOPTS =,$(CRTL)/Options
 .endif
 
 # Modules which must be installed before we can build extensions
-LIBPREREQ = $(ARCHDIR)Config.pm [.lib]DynaLoader.pm [.lib]XSLoader.pm [.lib]lib.pm [.lib]vmsish.pm [.lib.VMS]Filespec.pm [.lib.ExtUtils]XSSymSet.pm
+LIBPREREQ = $(ARCHDIR)Config.pm [.lib.VMS]Filespec.pm [.lib]DynaLoader.pm [.lib]XSLoader.pm [.lib]lib.pm [.lib]vmsish.pm [.lib.ExtUtils]XSSymSet.pm $(ARCHDIR)vmspipe.com [.lib]re.pm
 
 utils1 = [.lib.pod]perldoc.com [.lib.ExtUtils]Miniperl.pm [.utils]c2ph.com [.utils]h2ph.com [.utils]h2xs.com [.lib]perlbug.com [.lib]perlcc.com [.utils]dprofpp.com
 utils2 = [.lib]splain.com [.utils]pl2pm.com
 
 .ifdef NOX2P
 all : base extras archcorefiles preplibrary perlpods
-       @ $(NOOP)
+       @ write sys$output " "
+       @ write sys$output " Everything is up to date. '$(MMS)$(MMSQUALIFIERS) test' to run test suite."
 .else
 all : base extras x2p archcorefiles preplibrary perlpods
-       @ $(NOOP)
+       @ write sys$output " "
+       @ write sys$output " Everything is up to date. '$(MMS)$(MMSQUALIFIERS) test' to run test suite."
 .endif
 base : miniperl perl
        @ $(NOOP)
@@ -382,7 +394,13 @@ perlpods : $(pod)
 archcorefiles : $(ac) $(acth) $(ARCHAUTO)time.stamp
        @ $(NOOP)
 
-miniperl : $(DBG)miniperl$(E)
+[.lib]re.pm  : [.ext.re]re.pm
+       copy/log $(MMS$SOURCE) $(MMS$TARGET)
+
+vmspipe.com : [.vms]vmspipe.com
+       copy/log $(MMS$SOURCE) $(MMS$TARGET)
+
+miniperl : $(DBG)miniperl$(E)  vmspipe.com
        @ Continue
 $(MINIPERL_EXE) :  miniperlmain$(O), $(DBG)libperl$(OLB) $(CRTL)
        Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MMS$TARGET) miniperlmain$(O), $(DBG)libperl$(OLB)/Library/Include=globals $(CRTLOPTS)
@@ -449,6 +467,9 @@ $(ARCHDIR)config.pm : [.lib]config.pm
 [.lib]config.pm : config.h $(MINIPERL_EXE)
        $(MINIPERL) ConfigPM.
 
+$(ARCHDIR)vmspipe.com : vmspipe.com
+        Copy $(MMS$SOURCE) $(MMS$TARGET)
+
 [.ext.dynaloader]dl_vms.c : [.ext.dynaloader]dl_vms.xs $(ARCHDIR)Config.pm [.lib.ExtUtils]XSSymSet.pm $(MINIPERL_EXE)
        $(XSUBPP) $(MMS$SOURCE) >$(MMS$TARGET)
 
@@ -474,7 +495,7 @@ $(ARCHDIR)config.pm : [.lib]config.pm
        @ Rename/Log xsloader.pm [.ext.dynaloader]
 
 dynext : $(LIBPREREQ) $(DBG)perlshr$(E)
-       @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)"
+       @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)"
 
 [.lib]vmsish.pm : [.vms.ext]vmsish.pm
        Copy/Log/NoConfirm $(MMS$SOURCE) $(MMS$TARGET)
@@ -879,8 +900,12 @@ perly$(O) : perly.c, perly.h, $(h)
 [.t.lib]vmsish.t : [.vms.ext]vmsish.t
        Copy/Log/NoConfirm $(MMS$SOURCE) $(MMS$TARGET)
 
+check : test
+       @ Continue
+
 test : all [.t.lib]vmsfspec.t [.t.lib]vmsish.t
        - @[.VMS]Test.Com "$(E)" "$(__DEBUG__)"
+       @ $(MINIPERL) -e "print ""Ran tests"";" > [.t]rantests.
 
 # install ought not need a source, but it doesn't work if one's not
 # there. Go figure...
@@ -1162,6 +1187,25 @@ $(CRTL) : $(MAKEFILE)
        @ @[.vms]genopt "$(CRTL)/Write" "|" "$(LIBS1)|$(FULLLIBS2)|$(SOCKLIB)"
 
 
+ok : $(utils)
+       $(MINIPERL) lib/perlbug.com -ok -s "(UNINSTALLED)"
+
+okfile : $(utils)
+       $(MINIPERL) lib/perlbug.com -ok -s "(UNINSTALLED)" "-F" perl.ok
+
+nok : $(utils)
+       @ write sys$output " "
+       @ write sys$output " Please type the command:"
+       @ write sys$output " "
+       @ write sys$output "$(MINIPERLQ) lib/perlbug.com -nok -s ""(UNINSTALLED)"""
+
+nokfile : $(utils)
+       @ write sys$output " "
+       @ write sys$output " Please type the command:"
+       @ write sys$output " "
+       @ write sys$output "$(MINIPERLQ) lib/perlbug.com -nok -s ""(UNINSTALLED)"" ""-F"" perl.nok"
+
+
 cleanlis :
        - If F$Search("*.Lis").nes."" Then Delete/NoConfirm/Log *.Lis;*
        - If F$Search("*.CPP").nes."" Then Delete/NoConfirm/Log *.CPP;*
@@ -1204,7 +1248,7 @@ tidy : cleanlis
        - If F$Search("[.lib.pod]*.com;-1").nes."" Then Purge/NoConfirm/Log [.lib.pod]*.com
 
 clean : tidy
-       - @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" clean
+       - @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" clean
        - If F$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*/Exclude=PerlShr_*.Opt
        - If F$Search("[...]*$(O);*") .nes."" Then Delete/NoConfirm/Log [...]*$(O);*
        - If F$Search(F$Parse("Sys$Disk:[]","$(SOCKH)")).nes."" Then Delete/NoConfirm/Log $(SOCKH);*
@@ -1229,14 +1273,14 @@ clean : tidy
        - If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log [.pod]*.com;*
 
 realclean : clean
-       - @build_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" realclean
+       - @make_ext "$(dynamic_ext)" "$(MINIPERL_EXE)" "$(MMS)" realclean
        - If F$Search("*$(OLB)").nes."" Then Delete/NoConfirm/Log *$(OLB);*
        - If F$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*
        - If F$Search("Config.H").nes."" Then Delete/NoConfirm/Log Config.H;*
        - If F$Search("Config.SH").nes."" Then Delete/NoConfirm/Log Config.SH;*
        - $(MINIPERL) -e "use File::Path; rmtree(\@ARGV,1,0);" config
        - If F$Search("Descrip.MMS").nes."" Then Delete/NoConfirm/Log Descrip.MMS;*
-       - If F$Search("Build_Ext.Com").nes."" Then Delete/NoConfirm/Log Build_Ext.Com;*
+       - If F$Search("make_ext.Com").nes."" Then Delete/NoConfirm/Log make_ext.Com;*
        - $(MINIPERL) -e "use File::Path; rmtree(['lib/auto','lib/VMS','lib/$(ARCH)'],1,0);"
        - If F$Search("*.TS").nes."" Then Delete/NoConfirm/Log *.TS;*
        - If F$Search("[.Lib]DynaLoader.pm").nes."" Then Delete/NoConfirm/Log [.Lib]DynaLoader.pm;*
@@ -1256,6 +1300,7 @@ realclean : clean
        - If F$Search("[.t.lib]vms*.t").nes."" Then Delete/NoConfirm/Log [.t.lib]vms*.t;*
        - If F$Search("[...]*$(E)").nes."" Then Delete/NoConfirm/Log [...]*$(E);*
        - If F$Search("[.vms]Perl_Setup.Com").nes."" Then Delete/NoConfirm/Log [.vms]Perl_Setup.Com;*
+       - If F$Search("[.t]rantests.").nes."" Then Delete/NoConfirm/Log [.t]rantests.;*
 
 cleansrc : clean
 !GROK!THIS!
index 7989cee..99adb94 100644 (file)
@@ -215,7 +215,7 @@ C<tie> described above.
 If called in a scalar context, C<getsym> returns the value of the symbol whose
 name is given as the argument to the call, or C<undef> if no such symbol
 exists.  Symbols in the local symbol table are always used in preference to
-symbols in the global symbol table.  If called in an array context, C<getsym>
+symbols in the global symbol table.  If called in a list context, C<getsym>
 returns a two-element list, whose first element is the value of the symbol, and
 whose second element is the string 'GLOBAL' or 'LOCAL', indicating the table
 from which the symbol's value was read.
index a109f7b..68bb6e8 100644 (file)
@@ -328,6 +328,7 @@ if ($ENV{PERLSHR_USE_GSMATCH}) {
     # number in the top four bits and use the bottom four for build options
     # that'll cause incompatibilities
     ($ver, $sub) = $] =~ /\.(\d\d\d)(\d\d)/;
+    $ver += 0; $sub += 0;
     $gsmatch = ($sub >= 50) ? "equal" : "lequal"; # Force an equal match for
                                                  # dev, but be more forgiving
                                                  # for releases
diff --git a/vms/subconfigure.com b/vms/subconfigure.com
deleted file mode 100644 (file)
index ebb59e5..0000000
+++ /dev/null
@@ -1,4450 +0,0 @@
-$! SUBCONFIGURE.COM
-$!  - build a config.sh for VMS Perl.
-$!  - use built config.sh to take config_h.SH -> config.h
-$!  - also take vms/descrip_mms.template -> descrip.mms (VMS Makefile)
-$!
-$! Note for folks from other platforms changing things in here:
-$!   Fancy changes (based on compiler capabilities or VMS version or
-$!   whatever) are tricky, so go ahead and punt on those.
-$!
-$!   Simple changes, though (say, always setting something to 1, or undef,
-$!   or something like that) are straightforward. Adding a new item for the
-$!   ultimately created config.sh requires adding two lines to this file.
-$!
-$!   First, a line in the format:
-$!     $ foo = "bar"
-$!   after the line tagged ##ADD NEW CONSTANTS HERE##. Replace foo with the
-$!   variable name as it appears in config.sh.
-$!
-$!   Second, add a line in the format:
-$!     $ WC "foo='" + foo + "'"
-$!   after the line tagged ##WRITE NEW CONSTANTS HERE##. Careful of the
-$!   quoting, as it can be tricky. 
-$! 
-$! This .COM file expects to be called by configure.com, and thus expects
-$! a few symbols in the environment. Notably:
-$!
-$!  One of: Using_Dec_C, Using_Gnu_C set to "YES"
-$!  Dec_C_Version set to the Dec C version (defaults to 0 if not specified)
-$!  Has_Socketshr set to "T" if using socketshr
-$!  Has_Dec_C_Sockets set to "T" if using Dec C sockets
-$!  Use_Threads set to "T" if they're using threads
-$!  C_Compiler_Invoke is the command needed to invoke the C compiler
-$!
-$! We'll be playing with Sys$Output; don't clutter it
-$ Set NoVerify
-$!
-$! Set Dec_C_Version to something
-$ WRITE_RESULT := "WRITE SYS$OUTPUT ""%CONFIG-I-RESULT "" + "
-$ echo = "Write Sys$Output "
-$ Dec_C_Version := "''Dec_C_Version'"
-$ Dec_C_Version = Dec_C_Version + 0
-$ Vms_Ver := "''f$extract(1,3, f$getsyi(""version""))'"
-$ perl_extensions := "''extensions'"
-$ IF F$LENGTH(Mcc) .EQ. 0 THEN Mcc := "cc"
-$ MCC = f$edit(mcc, "UPCASE")
-$ C_Compiler_Replace := "CC=CC=''Mcc'''CC_flags'"
-$ IF Using_Dec_C
-$ THEN
-$   Checkcc := "''Mcc'/prefix=all"
-$ ELSE
-$   Checkcc := "''Mcc'"
-$ ENDIF
-$ cc_flags = cc_flags + extra_flags
-$ IF be_case_sensitive
-$ THEN
-$   d_vms_be_case_sensitive = "define"
-$ ELSE
-$   d_vms_be_case_sensitive = "undef"
-$ ENDIF
-$ IF use_multiplicity
-$ THEN
-$   perl_usemultiplicity = "define"
-$ ELSE
-$   perl_usemultiplicity = "undef"
-$ ENDIF
-$! Some constant defaults.
-$ hwname = f$getsyi("HW_NAME")
-$ myname = myhostname
-$ IF myname .EQS. "" THEN myname = F$TRNLNM("SYS$NODE")
-$!
-$! ##ADD NEW CONSTANTS HERE##
-$ perl_i_prot="undef"
-$ perl_d_getespwnam="undef"
-$ perl_d_getprpwnam="undef"
-$ perl_d_isnan= "define"
-$ perl_sizesize = "4"
-$ perl_shmattype = ""
-$ perl_mmaptype = ""
-$ perl_gidformat = "lu"
-$ perl_gidsize = "4"
-$ perl_gidsign = "1"
-$ perl_groupstype = "Gid_t"
-$ perl_stdio_stream_array = ""
-$ perl_uidformat = "lu"
-$ perl_uidsize = "4"
-$ perl_uidsign = "1"
-$ perl_d_getcwd = "undef"
-$ perl_d_nv_preserves_uv = "define"
-$ perl_d_fs_data_s = "undef"
-$ perl_d_getmnt = "undef"
-$ perl_d_sqrtl = "define"
-$ perl_d_statfs_f_flags = "undef"
-$ perl_d_statfs_s = "undef"
-$ perl_d_ustat = "undef"
-$ perl_i_ieeefp = "undef"
-$ perl_i_sunmath = "undef"
-$ perl_i_sysstatfs = "undef"
-$ perl_i_sysvfs = "undef"
-$ perl_i_ustat = "undef"
-$ perl_d_llseek="undef"
-$ perl_d_iconv="undef"
-$ perl_d_madvise="undef"
-$ perl_selectminbits="32"
-$ perl_d_vendorarch="undef"
-$ perl_vendorarchexp=""
-$ perl_d_msync="undef"
-$ perl_d_mprotect="undef"
-$ perl_d_munmap="undef"
-$ perl_crosscompile="undef"
-$ perl_multiarch="undef"
-$ perl_d_mmap="undef"
-$ perl_i_sysmman="undef"
-$ perl_d_telldirproto="define"
-$ perl_i_sysmount="undef"
-$ perl_d_bincompat="undef"
-$ perl_d_getspnam="undef
-$ perl_d_fstatfs="undef"
-$ perl_d_getfsstat="undef"
-$ perl_i_machcthreads="undef"
-$ perl_i_pthread="define"
-$ perl_d_fstatvfs="undef"
-$ perl_usesocks="undef"
-$ perl_d_vendorlib="undef"
-$ perl_vendorlibexp=""
-$ perl_vendorlib_stem=""
-$ perl_d_statfsflags="undef"
-$ perl_i_sysstatvfs="undef"
-$ perl_i_mntent="undef"
-$ perl_d_getmntent="undef"
-$ perl_d_hasmntopt="undef"
-$ perl_package="''package'"
-$ perl_baserev = "''baserev'"
-$ cc_defines=""
-$ perl_installusrbinperl="undef"
-$ perl_CONFIG="true"
-$ perl_d_fseeko="undef"
-$ perl_d_ftello="undef"
-$ perl_d_qgcvt="undef"
-$ perl_d_readv="undef"
-$ perl_d_writev="undef"
-$ perl_i_machcthr="undef"
-$ perl_i_netdb="undef"
-$ perl_d_gnulibc="undef"
-$ perl_ccdlflags=""
-$ perl_cccdlflags=""
-$ perl_mab=""
-$ perl_drand01 = "drand48()"
-$ perl_randseedtype = "long int"
-$ perl_seedfunc = "srand48"
-$ perl_d_msg_ctrunc = "undef"
-$ perl_d_msg_dontroute = "undef"
-$ perl_d_msg_oob = "undef"
-$ perl_d_msg_peek = "undef"
-$ perl_d_msg_proxy = "undef"
-$ perl_d_scm_rights = "undef"
-$ perl_d_sendmsg = "undef"
-$ perl_d_recvmsg = "undef"
-$ perl_d_msghdr_s = "undef"
-$ perl_d_cmsghdr_s = "undef"
-$ IF (use64bitint)
-$ THEN
-$   perl_use64bitint = "define"
-$   perl_uselargefiles = "define"
-$   perl_uselongdouble = "define"
-$   perl_usemorebits = "define"
-$ ELSE
-$   perl_use64bitint = "undef"
-$   perl_uselargefiles = "undef"
-$   perl_uselongdouble = "undef"
-$   perl_usemorebits = "undef"
-$ ENDIF
-$ IF (use64bitall)
-$ THEN
-$   perl_use64bitall = "define"
-$ ELSE
-$   perl_use64bitall = "undef"
-$ ENDIF
-$ perl_d_drand48proto = "define"
-$ perl_d_lseekproto = "define"
-$ perl_libpth="/sys$share /sys$library"
-$ perl_ld="Link"
-$ perl_lddlflags="/Share"
-$ perl_ranlib=""
-$ perl_ar=""
-$ perl_full_ar=""
-$ perl_eunicefix=":"
-$ perl_hint="none"
-$ perl_i_arpainet="undef"
-$ perl_d_grpasswd="undef"
-$ perl_d_setgrent="undef"
-$ perl_d_getgrent="define"
-$ perl_d_endgrent="define"
-$ perl_d_pwpasswd="define"
-$ perl_d_setpwent="define"
-$ perl_d_getpwent="define"
-$ perl_d_endpwent="define"
-$ perl_d_phostname="undef"
-$ perl_d_accessx="undef"
-$ perl_d_eaccess="undef"
-$ perl_ebcdic="undef"
-$ perl_hintfile=""
-$ perl_shrplib="define"
-$ perl_usemymalloc=mymalloc
-$ perl_usevfork="true"
-$ perl_useposix="false"
-$ perl_spitshell="write sys$output "
-$ perl_dlsrc="dl_vms.c"
-$ perl_man1ext="rno"
-$ perl_man3ext="rno"
-$ perl_prefix="perl_root"
-$ perl_binexp="''perl_prefix':[000000]"
-$ perl_builddir="''perl_prefix':[000000]"
-$ perl_installbin="''perl_prefix':[000000]"
-$ perl_installscript="''perl_prefix':[utils]"
-$ perl_installman1dir="''perl_prefix':[man.man1]"
-$ perl_installman3dir="''perl_prefix':[man.man3]"
-$ perl_installprivlib="''perl_prefix':[lib]"
-$ perl_installsitelib="''perl_prefix':[lib.site_perl]"
-$ perl_path_sep="|"
-$ perl_cc=Mcc
-$ perl_d_sockpair="undef"
-$ perl_i_neterrno="define"
-$ perl_ldflags="/NoTrace/NoMap"
-$ perl_d_lchown="undef"
-$ perl_d_mknod="undef"
-$ perl_d_union_semun="undef"
-$ perl_d_semctl_semun="undef"
-$ perl_d_semctl_semid_ds="undef"
-$ IF (sharedperl .AND. F$GETSYI("HW_MODEL") .GE. 1024)
-$ THEN
-$ perl_obj_ext=".abj"
-$ perl_so="axe"
-$ perl_dlext="axe"
-$ perl_exe_ext=".axe"
-$ perl_lib_ext=".alb"
-$ ELSE
-$ perl_obj_ext=".obj"
-$ perl_so="exe"
-$ perl_dlext="exe"
-$ perl_exe_ext=".exe"
-$ perl_lib_ext=".olb"
-$ENDIF
-$ perl_dlobj="dl_vms''perl_obj_ext'"
-$ perl_osname="VMS"
-$ perl_d_archlib="define"
-$ perl_d_bincompat3="undef"
-$ perl_cppstdin="''Perl_CC'/noobj/preprocess=sys$output sys$input"
-$ perl_cppminus=" "
-$ perl_cpprun="''Perl_CC'/noobj/preprocess=sys$output sys$input"
-$ perl_cpplast=" "
-$ perl_aphostname=""
-$ perl_d_castneg="define"
-$ perl_castflags="0"
-$ perl_d_chsize="undef"
-$ perl_d_const="define"
-$ perl_d_crypt="define"
-$ perl_byteorder="1234"
-$ perl_full_csh=" "
-$ perl_d_csh="undef"
-$ perl_d_dup2="define"
-$ perl_d_fchmod="undef"
-$ perl_d_fchown="undef"
-$ perl_d_fcntl="undef"
-$ perl_d_fgetpos="define"
-$ perl_d_flexfnam="define"
-$ perl_d_flock="undef"
-$ perl_d_fsetpos="define"
-$ perl_d_getgrps="undef"
-$ perl_d_setgrps="undef"
-$ perl_d_getprior="undef"
-$ perl_d_killpg="undef"
-$ perl_d_link="undef"
-$ perl_d_lstat="undef"
-$ perl_d_lockf="undef"
-$ perl_d_memcmp="define"
-$ perl_d_memcpy="define"
-$ perl_d_memmove="define"
-$ perl_d_memset="define"
-$ perl_d_mkdir="define"
-$ perl_d_msg="undef"
-$ perl_d_open3="define"
-$ perl_d_poll="undef"
-$ perl_d_readdir="define"
-$ perl_d_seekdir="define"
-$ perl_d_telldir="define"
-$ perl_d_rewinddir="define"
-$ perl_d_rename="define"
-$ perl_d_rmdir="define"
-$ perl_d_sem="undef"
-$ perl_d_setegid="undef"
-$ perl_d_seteuid="undef"
-$ perl_d_setprior="undef"
-$ perl_d_setregid="undef"
-$ perl_d_setresgid="undef"
-$ perl_d_setreuid="undef"
-$ perl_d_setresuid="undef"
-$ perl_d_setrgid="undef"
-$ perl_d_setruid="undef"
-$ perl_d_setsid="undef"
-$ perl_d_shm="undef"
-$ perl_d_shmatprototype="undef"
-$ perl_d_statblks="undef"
-$ perl_stdio_ptr="((*fp)->_ptr)"
-$ perl_stdio_cnt="((*fp)->_cnt)"
-$ perl_stdio_base="((*fp)->_base)"
-$ perl_stdio_bufsiz="((*fp)->_cnt + (*fp)->_ptr - (*fp)->_base)"
-$ perl_d_strctcpy="define"
-$ perl_d_strerror="define"
-$ perl_d_syserrlst="undef"
-$ perl_d_strerrm="strerror((e),vaxc$errno)"
-$ perl_d_symlink="undef"
-$ perl_d_syscall="undef"
-$ perl_d_system="define"
-$ perl_timetype="time_t"
-$ perl_d_vfork="define"
-$ perl_signal_t="void"
-$ perl_d_volatile="define"
-$ perl_d_vprintf="define"
-$ perl_d_charvspr="undef"
-$ perl_d_waitpid="define"
-$ perl_i_dirent="undef"
-$ perl_d_dirnamlen="define"
-$ perl_direntrytype="struct dirent"
-$ perl_i_fcntl="undef"
-$ perl_i_grp="undef"
-$ perl_i_limits="define"
-$ perl_i_memory="undef"
-$ perl_i_ndbm="undef"
-$ perl_i_stdarg="define"
-$ perl_i_pwd="undef"
-$ perl_d_pwquota="undef"
-$ perl_d_pwage="undef"
-$ perl_d_pwchange="undef"
-$ perl_d_pwclass="undef"
-$ perl_d_pwexpire="undef"
-$ perl_d_pwcomment="define"
-$ perl_i_stddef="define"
-$ perl_i_stdlib="define"
-$ perl_i_string="define"
-$ perl_i_sysdir="undef"
-$ perl_i_sysfile="undef"
-$ perl_i_sysioctl="undef"
-$ perl_i_sysndir="undef"
-$ perl_i_sysresrc="undef"
-$ perl_i_sysselct="undef"
-$ perl_i_dbm="undef"
-$ perl_i_rpcsvcdbm="undef"
-$ perl_i_sfio="undef"
-$ perl_i_sysstat="define"
-$ perl_i_systimes="undef"
-$ perl_i_systypes="define"
-$ perl_i_sysun="undef"
-$ perl_i_syswait="undef"
-$ perl_i_termio="undef"
-$ perl_i_sgtty="undef"
-$ perl_i_termios="undef"
-$ perl_i_time="define"
-$ perl_i_systime="undef"
-$ perl_i_systimek="undef"
-$! perl_i_unistd="undef"
-$ perl_i_utime="undef"
-$ perl_i_varargs="undef"
-$ perl_i_vfork="undef"
-$ perl_prototype="define"
-$ perl_randbits="31"
-$ perl_stdchar="char"
-$ perl_d_unlink_all_versions="undef"
-$ perl_full_sed="_NLA0:"
-$ perl_bin="/''perl_prefix'/000000"
-$ perl_binexp="''perl_prefix':[000000]"
-$ perl_d_alarm="define"
-$ perl_d_casti32="define"
-$ perl_d_chown="define"
-$ perl_d_chroot="undef"
-$ perl_d_cuserid="define"
-$ perl_d_dbl_dig="define"
-$ perl_d_ldbl_dig="define"
-$ perl_d_difftime="define"
-$ perl_d_fork="undef"
-$ perl_d_getlogin="define"
-$ perl_d_getppid="undef"
-$ perl_d_nice="define"
-$ perl_d_pause="define"
-$ perl_d_pipe="define"
-$ perl_d_readlink="undef"
-$ perl_d_setlinebuf="undef"
-$ perl_d_strchr="define"
-$ perl_d_strtod="define"
-$ perl_d_strtol="define"
-$ perl_d_strtoul="define"
-$ perl_d_tcgetpgrp="undef"
-$ perl_d_tcsetpgrp="undef"
-$ perl_d_times="define"
-$ perl_d_tzname="undef"
-$ perl_d_umask="define"
-$ perl_fpostype="fpos_t"
-$ perl_i_dlfcn="undef"
-$ perl_i_float="define"
-$ perl_i_math="define"
-$ perl_lseektype="int"
-$ perl_i_values="undef"
-$ perl_malloctype="void *"
-$ perl_freetype="void"
-$ perl_d_perl_otherlibdirs="undef"
-$ perl_otherlibdirs=""
-$ IF mymalloc
-$ THEN
-$ perl_d_mymalloc="define"
-$ ELSE
-$ perl_d_mymalloc="undef"
-$ ENDIF
-$ perl_sh="MCR"
-$ perl_modetype="unsigned int"
-$ perl_ssizetype="int"
-$ perl_o_nonblock=" "
-$ perl_eagain=" "
-$ perl_rd_nodata=" "
-$ perl_d_eofnblk="undef"
-$ perl_d_oldarchlib="define"
-$ perl_privlibexp="''perl_prefix':[lib]"
-$ perl_privlib="''perl_prefix':[lib]"
-$ perl_sitelibexp="''perl_prefix':[lib.site_perl]"
-$ perl_sitelib="''perl_prefix':[lib.site_perl]"
-$ perl_sitelib_stem="''perl_prefix':[lib.site_perl]"
-$ perl_sizetype="size_t"
-$ perl_i_sysparam="undef"
-$ perl_d_void_closedir="define"
-$ perl_d_dlerror="undef"
-$ perl_d_dlsymun="undef"
-$ perl_d_suidsafe="undef"
-$ perl_d_dosuid="undef"
-$ perl_d_inetaton="undef"
-$ perl_d_isascii="define"
-$ perl_d_mkfifo="undef"
-$ perl_d_safebcpy="undef"
-$ perl_d_safemcpy="define"
-$ perl_d_sanemcmp="define"
-$ perl_d_setpgrp="undef"
-$ perl_d_bsdsetpgrp="undef"
-$ perl_d_bsdpgrp="undef"
-$ perl_d_setpgid="undef"
-$ perl_d_setpgrp2="undef"
-$ perl_d_Gconvert="my_gconvert(x,n,t,b)"
-$ perl_d_getpgid="undef"
-$ perl_d_getpgrp="undef"
-$ perl_d_bsdgetpgrp="undef"
-$ perl_d_getpgrp2="undef"
-$ perl_d_sfio="undef"
-$ perl_usedl="define"
-$ perl_startperl="""$ perl 'f$env(\""procedure\"")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8'  !\n$ exit++ + ++$status != 0 and $exit = $status = undef;"""
-$ perl_db_hashtype=" "
-$ perl_db_prefixtype=" "
-$ perl_useperlio="undef"
-$ perl_defvoidused="15"
-$ perl_voidflags="15"
-$ perl_d_eunice="undef"
-$ perl_d_pwgecos="define"
-$ IF ((Use_Threads) .AND. (VMS_VER .LES. "6.2"))
-$ THEN
-$ perl_libs="SYS$SHARE:CMA$LIB_SHR.EXE/SHARE SYS$SHARE:CMA$RTL.EXE/SHARE SYS$SHARE:CMA$OPEN_LIB_SHR.exe/SHARE SYS$SHARE:CMA$OPEN_RTL.exe/SHARE"
-$ ELSE
-$ perl_libs=" "
-$ ENDIF
-$ IF Using_Dec_C
-$ THEN
-$   perl_libc="(DECCRTL)"
-$ ELSE
-$   perl_libc=" "
-$ ENDIF
-$ perl_pager="most"
-$!
-$! Are we 64 bit?
-$!
-$ IF (use64bitint)
-$ THEN
-$   perl_d_PRIfldbl = "define"
-$   perl_d_PRIgldbl = "define"
-$   perl_d_PRId64 = "define"
-$   perl_d_PRIu64 = "define"
-$   perl_d_PRIo64 = "define"
-$   perl_d_PRIx64 = "define"
-$   perl_sPRIfldbl = """Lf"""
-$   perl_sPRIgldbl = """Lg"""
-$   perl_sPRId64 = """Ld"""
-$   perl_sPRIu64 = """Lu"""
-$   perl_sPRIo64 = """Lo"""
-$   perl_sPRIx64 = """Lx"""
-$   perl_d_quad = "define"
-$   perl_quadtype = "long long"
-$   perl_uquadtype = "unsigned long long"
-$   perl_quadkind  = "QUAD_IS_LONG_LONG"
-$   perl_d_frexpl = "define"
-$   perl_d_isnanl = "define"
-$   perl_d_modfl = "define"
-$ ELSE
-$   perl_d_PRIfldbl = "undef"
-$   perl_d_PRIgldbl = "undef"
-$   perl_d_PRId64 = "undef"
-$   perl_d_PRIu64 = "undef"
-$   perl_d_PRIo64 = "undef"
-$   perl_d_PRIx64 = "undef"
-$   perl_sPRIfldbl = ""
-$   perl_sPRIgldbl = ""
-$   perl_sPRId64 = ""
-$   perl_sPRIu64 = ""
-$   perl_sPRIo64 = ""
-$   perl_sPRIx64 = ""
-$   perl_d_quad = "undef"
-$   perl_quadtype = "long"
-$   perl_uquadtype = "unsigned long"
-$   perl_quadkind  = "QUAD_IS_LONG"
-$   perl_d_frexpl = "undef"
-$   perl_d_isnanl = "undef"
-$   perl_d_modfl = "undef"
-$ ENDIF
-$!
-$! Now some that we build up
-$!
-$ IF Use_Threads
-$ THEN
-$   if use_5005_threads
-$   THEN
-$     arch = "''arch'-thread"
-$     archname = "''archname'-thread"
-$     perl_d_old_pthread_create_joinable = "undef"
-$     perl_old_pthread_create_joinable = " "
-$     perl_use5005threads = "define"
-$     perl_useithreads = "undef"
-$   ELSE
-$     arch = "''arch'-ithread"
-$     archname = "''archname'-ithread"
-$     perl_d_old_pthread_create_joinable = "undef"
-$     perl_old_pthread_create_joinable = " "
-$     perl_use5005threads = "undef"
-$     perl_useithreads = "define"
-$   ENDIF
-$ ELSE
-$   perl_d_old_pthread_create_joinable = "undef"
-$   perl_old_pthread_create_joinable = " "
-$   perl_use5005threads = "undef"
-$   perl_useithreads = "undef"
-$ ENDIF
-$!
-$! Some that we need to invoke the compiler for
-$ OS := "open/write SOURCECHAN []temp.c"
-$ WS := "write SOURCECHAN"
-$ CS := "close SOURCECHAN"
-$ DS := "delete/nolog []temp.*;*"
-$ Needs_Opt := N
-$ IF using_gnu_c
-$ THEN
-$   open/write OPTCHAN []temp.opt
-$   write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library"
-$   write OPTCHAN "Sys$Share:VAXCRTL/Share"
-$   Close OPTCHAN
-$   Needs_Opt := Y
-$ ENDIF
-$!
-$! Check for __STDC__
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "#ifdef __STDC__
-$ WS "printf(""42\n"");
-$ WS "#else
-$ WS "printf(""1\n"");
-$ WS "#endif
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp.c
-$   If Needs_Opt
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$   DEFINE SYS$ERROR TEMPOUT
-$   DEFINE SYS$OUTPUT TEMPOUT
-$   mcr []temp
-$   CLOSE TEMPOUT
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   OPEN/READ TEMPOUT [-.uu]tempout.lis
-$   READ TEMPOUT line
-$   CLOSE TEMPOUT
-$   DELETE/NOLOG [-.uu]tempout.lis;
-$ perl_cpp_stuff=line
-$ WRITE_RESULT "cpp_stuff is ''perl_cpp_stuff'"
-$!
-$! Check for double size
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "int foo;
-$ WS "foo = sizeof(double);
-$ WS "printf(""%d\n"", foo);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp.c
-$   If Needs_Opt
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   DEFINE SYS$ERROR TEMPOUT
-$   DEFINE SYS$OUTPUT TEMPOUT
-$   mcr []temp
-$   CLOSE TEMPOUT
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   OPEN/READ TEMPOUT [-.uu]tempout.lis
-$   READ TEMPOUT line
-$   CLOSE TEMPOUT
-$ DELETE/NOLOG [-.uu]tempout.lis;
-$ 
-$ perl_doublesize=line
-$ WRITE_RESULT "doublesize is ''perl_doublesize'"
-$!
-$! Check for long double size
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "printf(""%d\n"", sizeof(long double));
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_longdblsize="0"
-$     perl_d_longdbl="undef"
-$   ELSE
-$     ON ERROR THEN CONTINUE
-$     ON WARNING THEN CONTINUE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     teststatus = f$extract(9,1,$status)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     IF (teststatus.nes."1")
-$     THEN
-$       perl_longdblsize="0"
-$       perl_d_longdbl="undef"
-$     ELSE
-$       OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$       DEFINE SYS$ERROR TEMPOUT
-$       DEFINE SYS$OUTPUT TEMPOUT
-$       mcr []temp
-$       CLOSE TEMPOUT
-$       DEASSIGN SYS$OUTPUT
-$       DEASSIGN SYS$ERROR
-$       OPEN/READ TEMPOUT [-.uu]tempout.lis
-$       READ TEMPOUT line
-$       CLOSE TEMPOUT
-$       DELETE/NOLOG [-.uu]tempout.lis;
-$       perl_longdblsize=line
-$       perl_d_longdbl="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "longdblsize is ''perl_longdblsize'"
-$ WRITE_RESULT "d_longdbl is ''perl_d_longdbl'"
-$!
-$! Check for long long existance and size
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "printf(""%d\n"", sizeof(long long));
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   IF Needs_Opt
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   ELSE
-$     link temp.obj
-$   ENDIF
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_longlongsize="0"
-$     perl_d_longlong="undef"
-$   ELSE
-$     OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$     DEFINE SYS$ERROR TEMPOUT
-$     DEFINE SYS$OUTPUT TEMPOUT
-$     mcr []temp
-$     CLOSE TEMPOUT
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     OPEN/READ TEMPOUT [-.uu]tempout.lis
-$     READ TEMPOUT line
-$     CLOSE TEMPOUT
-$     DELETE/NOLOG [-.uu]tempout.lis;
-$     perl_longlongsize=line
-$     perl_d_longlong="define"
-$   ENDIF
-$ WRITE_RESULT "longlongsize is ''perl_longlongsize'"
-$ WRITE_RESULT "d_longlong is ''perl_d_longlong'"
-$!
-$! Check the prototype for getgid
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "gid_t foo;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, gid_t failed. Must be unsigned int
-$     perl_gidtype = "unsigned int"
-$   ELSE
-$     perl_gidtype = "gid_t"
-$   ENDIF
-$ WRITE_RESULT "Gid_t is ''perl_gidtype'"
-$!
-$! Check to see if we've got dev_t
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "dev_t foo;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, dev_t failed. Must be unsigned int
-$     perl_devtype = "unsigned int"
-$   ELSE
-$     perl_devtype = "dev_t"
-$   ENDIF
-$ WRITE_RESULT "Dev_t is ''perl_devtype'"
-$!
-$! Check to see if we've got unistd.h (which we ought to, but you never know)
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, failed. Must not have it
-$     perl_i_unistd = "undef"
-$   ELSE
-$     perl_i_unistd = "define"
-$   ENDIF
-$ WRITE_RESULT "i_unistd is ''perl_i_unistd'"
-$!
-$! Check to see if we've got shadow.h (probably not, but...)
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <shadow.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, failed. Must not have it
-$     perl_i_shadow = "undef"
-$   ELSE
-$     perl_i_shadow = "define"
-$   ENDIF
-$ WRITE_RESULT "i_shadow is ''perl_i_shadow'"
-$!
-$! Check to see if we've got socks.h (probably not, but...)
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <socks.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, failed. Must not have it
-$     perl_i_socks = "undef"
-$   ELSE
-$     perl_i_socks = "define"
-$   ENDIF
-$ WRITE_RESULT "i_socks is ''perl_i_socks'"
-$!
-$! Check the prototype for select
-$!
-$ IF Has_Dec_C_Sockets .OR. Has_Socketshr
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#include <unistd.h>
-$ IF Has_Socketshr
-$ THEN
-$   WS "#include <socketshr.h>"
-$ ELSE
-$   WS "#include <time.h>
-$   WS "#include <socket.h>
-$ ENDIF
-$ WS "int main()
-$ WS "{"
-$ WS "fd_set *foo;
-$ WS "int bar;
-$ WS "foo = NULL;
-$ WS "bar = select(2, foo, foo, foo, NULL);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, fd_set failed. Must be an int
-$     perl_selecttype = "int *"
-$   ELSE
-$     perl_selecttype="fd_set *"
-$   ENDIF
-$ ELSE
-$   ! No sockets, so stick in an int *
-$   perl_selecttype = "int *"
-$ ENDIF
-$ WRITE_RESULT "selectype is ''perl_selecttype'"
-$!
-$! Check to see if fd_set exists
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#include <unistd.h>
-$ IF Has_Socketshr
-$ THEN
-$   WS "#include <socketshr.h>"
-$ ENDIF
-$ IF Has_Dec_C_Sockets
-$ THEN
-$   WS "#include <time.h>
-$   WS "#include <socket.h>
-$ ENDIF
-$ WS "int main()
-$ WS "{"
-$ WS "fd_set *foo;
-$ WS "int bar;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ on error then continue
-$ on warning then continue
-$ 'Checkcc' temp.c
-$ teststatus = f$extract(9,1,$status)
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ if (teststatus.nes."1")
-$ THEN
-$!  Okay, fd_set failed. Must not exist
-$   perl_d_fd_set = "undef"
-$ ELSE
-$   perl_d_fd_set="define"
-$ ENDIF
-$ WRITE_RESULT "d_fd_set is ''perl_d_fd_set'"
-$!
-$! Check for inttypes.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <inttypes.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_inttypes="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_inttypes="undef"
-$     ELSE
-$       perl_i_inttypes="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_inttypes is ''perl_i_inttypes'"
-$!
-$! Check for h_errno
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <netdb.h>
-$ WS "int main()
-$ WS "{"
-$ WS "h_errno = 3;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_herrno="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_herrno="undef"
-$     ELSE
-$       perl_d_herrno="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_herrno is ''perl_d_herrno'"
-$!
-$! Check to see if int64_t exists
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''perl_i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "int64_t bar;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ on error then continue
-$ on warning then continue
-$ 'Checkcc' temp.c
-$ teststatus = f$extract(9,1,$status)
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ if (teststatus.nes."1")
-$ THEN
-$!  Okay, int64_t failed. Must not exist
-$   perl_d_int64_t = "undef"
-$ ELSE
-$   perl_d_int64_t="define"
-$ ENDIF
-$ WRITE_RESULT "d_int64_t is ''perl_d_int64_t'"
-$!
-$! Check to see if off64_t exists
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''perl_i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "off64_t bar;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ on error then continue
-$ on warning then continue
-$ 'Checkcc' temp.c
-$ teststatus = f$extract(9,1,$status)
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ if (teststatus.nes."1")
-$ THEN
-$!  Okay, off64_t failed. Must not exist
-$   perl_d_off64_t = "undef"
-$ ELSE
-$   perl_d_off64_t="define"
-$ ENDIF
-$ WRITE_RESULT "d_off64_t is ''perl_d_off64_t'"
-$!
-$! Check to see if fpos64_t exists
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#''perl_i_inttypes IIH
-$ WS "#ifdef IIH
-$ WS "#include <inttypes.h>
-$ WS "#endif
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "fpos64_t bar;
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ on error then continue
-$ on warning then continue
-$ 'Checkcc' temp.c
-$ teststatus = f$extract(9,1,$status)
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ if (teststatus.nes."1")
-$ THEN
-$!  Okay, fpos64_t failed. Must not exist
-$   perl_d_fpos64_t = "undef"
-$ ELSE
-$   perl_d_fpos64_t="define"
-$ ENDIF
-$ WRITE_RESULT "d_fpos64_t is ''perl_d_fpos64_t'"
-$!
-$! Check to see if gethostname exists
-$!
-$ IF (Has_Dec_C_Sockets .OR. Has_Socketshr)
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <types.h>
-$ WS "#include <unistd.h>
-$ IF Has_Socketshr
-$ THEN
-$   WS "#include <socketshr.h>"
-$ ELSE
-$   WS "#include <time.h>
-$   WS "#include <socket.h>
-$ ENDIF
-$ WS "int main()
-$ WS "{"
-$ WS "char name[100];
-$ WS "int bar, baz;
-$ WS "bar = 100;
-$ WS "baz = gethostname(name, bar);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$!   Okay, compile failed. Must not have it
-$     perl_d_gethname = "undef"
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_gethname="undef"
-$     ELSE
-$       perl_d_gethname="define"
-$     ENDIF
-$   ENDIF
-$ ELSE
-$   ! No sockets, so no gethname
-$   perl_d_gethname = "undef"
-$ ENDIF
-$ WRITE_RESULT "d_gethname is ''perl_d_gethname'"
-$!
-$! Check for sys/file.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/file.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_sysfile="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_sysfile="undef"
-$     ELSE
-$       perl_i_sysfile="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_sysfile is ''perl_i_sysfile'"
-$!
-$! Check for sys/utsname.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/utsname.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_sysutsname="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_sysutsname="undef"
-$     ELSE
-$       perl_i_sysutsname="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_sysutsname is ''perl_i_sysutsname'"
-$!
-$! Check for syslog.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <syslog.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_syslog="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_syslog="undef"
-$     ELSE
-$       perl_i_syslog="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_syslog is ''perl_i_syslog'"
-$!
-$! Check for poll.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <poll.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_poll="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     ELSE
-$       link temp.obj
-$     ENDIF
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_poll="undef"
-$     ELSE
-$       perl_i_poll="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_poll is ''perl_i_poll'"
-$!
-$! Check for sys/uio.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/uio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_sysuio="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     IF Needs_Opt
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_sysuio="undef"
-$     ELSE
-$       perl_i_sysuio="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_sysuio is ''perl_i_sysuio'"
-$!
-$! Check for sys/mode.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/mode.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_sysmode="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_sysmode="undef"
-$     ELSE
-$       perl_i_sysmode="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_sysmode is ''perl_i_sysmode'"
-$!
-$! Check for sys/access.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/access.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_sysaccess="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_sysaccess="undef"
-$     ELSE
-$       perl_i_sysaccess="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_sysaccess is ''perl_i_sysaccess'"
-$!
-$! Check for sys/security.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <sys/security.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_syssecrt="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_syssecrt="undef"
-$     ELSE
-$       perl_i_syssecrt="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_syssecrt is ''perl_i_syssecrt'"
-$!
-$! Check for fcntl.h
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <fcntl.h>
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_fcntl="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_i_fcntl="undef"
-$     ELSE
-$       perl_i_fcntl="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "i_fcntl is ''perl_i_fcntl'"
-$!
-$! Check for fcntl
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "#include <fcntl.h>
-$ WS "int main()
-$ WS "{"
-$ WS "fcntl(1,2,3);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_fcntl="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_fcntl="undef"
-$     ELSE
-$       perl_d_fcntl="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_fcntl is ''perl_d_fcntl'"
-$!
-$! Check for memchr
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "char * place;
-$ WS "place = memchr(""foo"", 47, 3)
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_memchr="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_memchr="undef"
-$     ELSE
-$       perl_d_memchr="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_memchr is ''perl_d_memchr'"
-$!
-$! Check for strtoull
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "unsigned __int64 result;
-$ WS "result = strtoull(""123123"", NULL, 10);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_strtoull="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_strtoull="undef"
-$     ELSE
-$       perl_d_strtoull="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_strtoull is ''perl_d_strtoull'"
-$!
-$! Check for strtouq
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "unsigned __int64 result;
-$ WS "result = strtouq(""123123"", NULL, 10);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_strtouq="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_strtouq="undef"
-$     ELSE
-$       perl_d_strtouq="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_strtouq is ''perl_d_strtouq'"
-$!
-$! Check for strtoll
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "__int64 result;
-$ WS "result = strtoll(""123123"", NULL, 10);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_strtoll="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_strtoll="undef"
-$     ELSE
-$       perl_d_strtoll="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_strtoll is ''perl_d_strtoll'"
-$!
-$! Check for strtold
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "long double result;
-$ WS "result = strtold(""123123"", NULL, 10);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_strtold="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_strtold="undef"
-$     ELSE
-$       perl_d_strtold="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_strtold is ''perl_d_strtold'"
-$!
-$! Check for atoll
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS " __int64 result;
-$ WS "result = atoll(""123123"");
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_atoll="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_atoll="undef"
-$     ELSE
-$       perl_d_atoll="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_atoll is ''perl_d_atoll'"
-$!
-$! Check for atoll
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <string.h>
-$ WS "int main()
-$ WS "{"
-$ WS "long double
-$ WS "result = atolf(""123123"");
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_atolf="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_atolf="undef"
-$     ELSE
-$       perl_d_atolf="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_atolf is ''perl_d_atolf'"
-$!
-$! Check for access
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <unistd.h>
-$ WS "int main()
-$ WS "{"
-$ WS "access("foo", F_OK);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_access="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_access="undef"
-$     ELSE
-$       perl_d_access="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_access is ''perl_d_access'"
-$!
-$! Check for bzero
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <strings.h>
-$ WS "int main()
-$ WS "{"
-$ WS "char foo[10];
-$ WS "bzero(foo, 10);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_bzero="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_bzero="undef"
-$     ELSE
-$       perl_d_bzero="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_bzero is ''perl_d_bzero'"
-$!
-$! Check for bcopy
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <strings.h>
-$ WS "int main()
-$ WS "{"
-$ WS "char foo[10], bar[10];
-$ WS "bcopy(""foo"", bar, 3);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_bcopy="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$     THEN
-$       perl_d_bcopy="undef"
-$     ELSE
-$       perl_d_bcopy="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_bcopy is ''perl_d_bcopy'"
-$!
-$! Check for mkstemp
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "mkstemp(""foo"");
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_mkstemp="undef"
-$   ELSE
-$     perl_d_mkstemp="define"
-$   ENDIF
-$ WRITE_RESULT "d_mkstemp is ''perl_d_mkstemp'"
-$!
-$! Check for mkstemps
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "mkstemps(""foo"", 1);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_mkstemps="undef"
-$   ELSE
-$     perl_d_mkstemps="define"
-$   ENDIF
-$ WRITE_RESULT "d_mkstemps is ''perl_d_mkstemps'"
-$!
-$! Check for iconv
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "#include <iconv.h>
-$ WS "int main()
-$ WS "{"
-$ WS "  iconv_t cd = (iconv_t)0;"
-$ WS "  char *inbuf, *outbuf;"
-$ WS "  size_t inleft, outleft;"
-$ WS "  iconv(cd, &inbuf, &inleft, &outbuf, &outleft);"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_iconv="undef"
-$     perl_i_iconv="undef"
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$   ELSE
-$     If (Needs_Opt.eqs."Yes")
-$     THEN
-$       link temp.obj,temp.opt/opt
-$     else
-$       link temp.obj
-$     endif
-$     savedstatus = $status
-$     teststatus = f$extract(9,1,savedstatus)
-$     DEASSIGN SYS$OUTPUT
-$     DEASSIGN SYS$ERROR
-$     if (teststatus.nes."1")
-$  THEN
-$       perl_d_iconv="undef"
-$       perl_i_iconv="undef"
-$     ELSE
-$       perl_d_iconv="define"
-$       perl_i_iconv="define"
-$     ENDIF
-$   ENDIF
-$ WRITE_RESULT "d_iconv is ''perl_d_iconv'"
-$ WRITE_RESULT "i_iconv is ''perl_i_iconv'"
-$!
-$! Check for mkdtemp
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "mkdtemp(""foo"");
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   savedstatus = $status
-$   teststatus = f$extract(9,1,savedstatus)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_mkdtemp="undef"
-$   ELSE
-$     perl_d_mkdtemp="define"
-$   ENDIF
-$ WRITE_RESULT "d_mkdtemp is ''perl_d_mkdtemp'"
-$!
-$! Check for setvbuf
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "FILE *foo;
-$ WS "char Buffer[99];
-$ WS "foo = fopen(""foo"", ""r"");
-$ WS "setvbuf(foo, Buffer, 0, 0);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_setvbuf="undef"
-$   ELSE
-$     perl_d_setvbuf="define"
-$   ENDIF
-$ WRITE_RESULT "d_setvbuf is ''perl_d_setvbuf'"
-$!
-$! Check for setenv
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "setenv(""FOO"", ""BAR"", 0);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp,temp/opt
-$   else
-$     link temp
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_setenv="undef"
-$   ELSE
-$     perl_d_setenv="define"
-$   ENDIF
-$ WRITE_RESULT "d_setenv is ''perl_d_setenv'"
-$!
-$! Check for <netinet/in.h>
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "#include <netinet/in.h>"
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_niin="undef"
-$   ELSE
-$     perl_i_niin="define"
-$   ENDIF
-$ ELSE
-$   perl_i_niin="undef"
-$ ENDIF
-$ WRITE_RESULT "i_niin is ''perl_i_niin'"
-$!
-$! Check for <netinet/tcp.h>
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "#include <netinet/tcp.h>"
-$ WS "int main()
-$ WS "{"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_i_netinettcp="undef"
-$   ELSE
-$     perl_i_netinettcp="define"
-$   ENDIF
-$ ELSE
-$   perl_i_netinettcp="undef"
-$ ENDIF
-$ WRITE_RESULT "i_netinettcp is ''perl_i_netinettcp'"
-$!
-$! Check for endhostent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "endhostent();
-$ WS "exit(0);
-
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_endhent="undef"
-$   ELSE
-$     perl_d_endhent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_endhent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_endhent is ''perl_d_endhent'"
-$!
-$! Check for endnetent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "endnetent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_endnent="undef"
-$   ELSE
-$     perl_d_endnent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_endnent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_endnent is ''perl_d_endnent'"
-$!
-$! Check for endprotoent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "endprotoent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_endpent="undef"
-$   ELSE
-$     perl_d_endpent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_endpent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_endpent is ''perl_d_endpent'"
-$!
-$! Check for endservent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "endservent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_endsent="undef"
-$   ELSE
-$     perl_d_endsent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_endsent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_endsent is ''perl_d_endsent'"
-$!
-$! Check for sethostent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "sethostent(1);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_sethent="undef"
-$   ELSE
-$     perl_d_sethent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_sethent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_sethent is ''perl_d_sethent'"
-$!
-$! Check for setnetent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "setnetent(1);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_setnent="undef"
-$   ELSE
-$     perl_d_setnent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_setnent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_setnent is ''perl_d_setnent'"
-$!
-$! Check for setprotoent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "setprotoent(1);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_setpent="undef"
-$   ELSE
-$     perl_d_setpent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_setpent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_setpent is ''perl_d_setpent'"
-$!
-$! Check for setservent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "setservent(1);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_setsent="undef"
-$   ELSE
-$     perl_d_setsent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_setsent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_setsent is ''perl_d_setsent'"
-$!
-$! Check for gethostent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "gethostent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_gethent="undef"
-$   ELSE
-$     perl_d_gethent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_gethent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_gethent is ''perl_d_gethent'"
-$!
-$! Check for getnetent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "getnetent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_getnent="undef"
-$   ELSE
-$     perl_d_getnent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_getnent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_getnent is ''perl_d_getnent'"
-$!
-$! Check for getprotoent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "getprotoent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_getpent="undef"
-$   ELSE
-$     perl_d_getpent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_getpent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_getpent is ''perl_d_getpent'"
-$!
-$! Check for getservent
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ if ("''Has_Socketshr'".eqs."T")
-$ THEN
-$  WS "#include <socketshr.h>"
-$ else
-$  WS "#include <netdb.h>
-$ endif
-$ WS "int main()
-$ WS "{"
-$ WS "getservent();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_getsent="undef"
-$   ELSE
-$     perl_d_getsent="define"
-$   ENDIF
-$ ELSE
-$ perl_d_getsent="undef"
-$ ENDIF
-$ WRITE_RESULT "d_getsent is ''perl_d_getsent'"
-$!
-$! Check for socklen_t
-$!
-$ if ("''Has_Dec_C_Sockets'".eqs."T").or.("''Has_Socketshr'".eqs."T")
-$ THEN
-$   OS
-$   WS "#ifdef __DECC
-$   WS "#include <stdlib.h>
-$   WS "#endif
-$   WS "#include <stdio.h>
-$   IF ("''Has_Socketshr'".eqs."T")
-$   THEN
-$     WS "#include <socketshr.h>"
-$   ELSE
-$     WS "#include <netdb.h>
-$   ENDIF
-$   WS "int main()
-$   WS "{"
-$   WS "socklen_t x = 16;
-$   WS "exit(0);
-$   WS "}"
-$   CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_socklen_t="undef"
-$   ELSE
-$     perl_d_socklen_t="define"
-$   ENDIF
-$ ELSE
-$   perl_d_socklen_t="undef"
-$ ENDIF
-$ WRITE_RESULT "d_socklen_t is ''perl_d_socklen_t'"
-$!
-$! Check for pthread_yield
-$!
-$ if ("''use_threads'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <pthread.h>
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "pthread_yield();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_pthread_yield="undef"
-$   ELSE
-$     perl_d_pthread_yield="define"
-$   ENDIF
-$ ELSE
-$   perl_d_pthread_yield="undef"
-$ ENDIF
-$ WRITE_RESULT "d_pthread_yield is ''perl_d_pthread_yield'"
-$!
-$! Check for sched_yield
-$!
-$ if ("''use_threads'".eqs."T")
-$ THEN
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <pthread.h>
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "sched_yield();
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   on error then continue
-$   on warning then continue
-$   'Checkcc' temp.c
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_d_sched_yield="undef"
-$     perl_sched_yield = " "
-$   ELSE
-$     perl_d_sched_yield="define"
-$     perl_sched_yield = "sched_yield"
-$   ENDIF
-$ ELSE
-$   perl_d_sched_yield="undef"
-$   perl_sched_yield = " "
-$ ENDIF
-$ WRITE_RESULT "d_sched_yield is ''perl_d_sched_yield'"
-$ WRITE_RESULT "sched_yield is ''perl_sched_yield'"
-$!
-$! Check for generic pointer size
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "int foo;
-$ WS "foo = sizeof(char *);
-$ WS "printf(""%d\n"", foo);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ ON ERROR THEN CONTINUE
-$ ON WARNING THEN CONTINUE
-$ 'Checkcc' temp.c
-$ If (Needs_Opt.eqs."Yes")
-$ THEN
-$   link temp.obj,temp.opt/opt
-$ ELSE
-$   link temp.obj
-$ ENDIF
-$ OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ DEFINE SYS$ERROR TEMPOUT
-$ DEFINE SYS$OUTPUT TEMPOUT
-$ mcr []temp.exe
-$ CLOSE TEMPOUT
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ OPEN/READ TEMPOUT [-.uu]tempout.lis
-$ READ TEMPOUT line
-$ CLOSE TEMPOUT
-$ DELETE/NOLOG [-.uu]tempout.lis;
-$ 
-$ perl_ptrsize=line
-$ WRITE_RESULT "ptrsize is ''perl_ptrsize'"
-$!
-$! Check for size_t size
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "int foo;
-$ WS "foo = sizeof(size_t);
-$ WS "printf(""%d\n"", foo);
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp.c
-$   If Needs_Opt
-$   THEN
-$     link temp.obj,temp.opt/opt
-$   else
-$     link temp.obj
-$   endif
-$   OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   DEFINE SYS$ERROR TEMPOUT
-$   DEFINE SYS$OUTPUT TEMPOUT
-$   mcr []temp
-$   CLOSE TEMPOUT
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   OPEN/READ TEMPOUT [-.uu]tempout.lis
-$   READ TEMPOUT line
-$   CLOSE TEMPOUT
-$ DELETE/NOLOG [-.uu]tempout.lis;
-$ 
-$ perl_sizesize=line
-$ WRITE_RESULT "sizesize is ''perl_sizesize'"
-$!
-$! Check rand48 and its ilk
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "srand48(12L);"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$!
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp,temp.opt/opt
-$   else
-$     link temp
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_drand01="random()"
-$     perl_randseedtype = "unsigned"
-$     perl_seedfunc = "srandom"
-$   ENDIF
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "srandom(12);"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$! copy temp.c sys$output
-$!
-$   DEFINE SYS$ERROR _NLA0:
-$   DEFINE SYS$OUTPUT _NLA0:
-$   ON ERROR THEN CONTINUE
-$   ON WARNING THEN CONTINUE
-$   'Checkcc' temp
-$   If (Needs_Opt.eqs."Yes")
-$   THEN
-$     link temp,temp.opt/opt
-$   else
-$     link temp
-$   endif
-$   teststatus = f$extract(9,1,$status)
-$   DEASSIGN SYS$OUTPUT
-$   DEASSIGN SYS$ERROR
-$   if (teststatus.nes."1")
-$   THEN
-$     perl_drand01="(((float)rand())/((float)RAND_MAX))"
-$     perl_randseedtype = "unsigned"
-$     perl_seedfunc = "srand"
-$   ENDIF
-$ WRITE_RESULT "drand01 is ''perl_drand01'"
-$!
-$ set nover
-$! Done with compiler checks. Clean up.
-$ if f$search("temp.c").nes."" then DELETE/NOLOG temp.c;*
-$ if f$search("temp.obj").nes."" then DELETE/NOLOG temp.obj;*
-$ if f$search("temp.exe").nes."" then DELETE/NOLOG temp.exe;*
-$ if f$search("temp.opt").nes."" then DELETE/NOLOG Temp.opt;*
-$!
-$!
-$! Some that are compiler or VMS version sensitive
-$!
-$! Gnu C stuff
-$ IF "''Using_Gnu_C'".EQS."Yes"
-$ THEN
-$   perl_d_attribut="define"
-$   perl_vms_cc_type="gcc"
-$ ELSE
-$   perl_vms_cc_type="cc"
-$   perl_d_attribut="undef"
-$ ENDIF
-$
-$! Dec C >= 5.2 and VMS ver >= 7.0
-$ IF (Using_Dec_C).AND.(F$INTEGER(Dec_C_Version).GE.50200000).AND.(VMS_VER .GES. "7.0")
-$ THEN
-$ perl_d_bcmp="define"
-$ perl_d_gettimeod="define"
-$ perl_d_uname="define"
-$ perl_d_sigaction="define"
-$ perl_d_truncate="define"
-$ perl_d_wait4="define"
-$ perl_d_index="define"
-$ perl_pidtype="pid_t"
-$ perl_sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2 SPARE18 SPARE19 CHLD CONT STOP TSTP TTIN TTOU DEBUG SPARE27 SPARE28 SPARE29 SPARE30 SPARE31 SPARE32 RTMIN RTMAX"",0"
-$ psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
-$ psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",""SPARE18"",""SPARE19"",""CHLD"",""CONT"",""STOP"",""TSTP"","
-$ psnwc3="""TTIN"",""TTOU"",""DEBUG"",""SPARE27"",""SPARE28"",""SPARE29"",""SPARE30"",""SPARE31"",""SPARE32"",""RTMIN"",""RTMAX"",0"
-$perl_sig_name_with_commas = psnwc1 + psnwc2 + psnwc3
-$ perl_sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 64"","0"
-$ perl_sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,64,0"
-$ perl_sig_num_with_commas=perl_sig_num_init
-$ perl_uidtype="uid_t"
-$ perl_d_pathconf="define"
-$ perl_d_fpathconf="define"
-$ perl_d_sysconf="define"
-$ perl_d_sigsetjmp="define"
-$ ELSE
-$ perl_pidtype="unsigned int"
-$ perl_d_gettimeod="undef"
-$ perl_d_bcmp="undef"
-$ perl_d_uname="undef"
-$ perl_d_sigaction="undef"
-$ perl_d_truncate="undef"
-$ perl_d_wait4="undef"
-$ perl_d_index="undef"
-$ perl_sig_name="ZERO HUP INT QUIT ILL TRAP IOT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM ABRT USR1 USR2"",0"
-$ psnwc1="""ZERO"",""HUP"",""INT"",""QUIT"",""ILL"",""TRAP"",""IOT"",""EMT"",""FPE"",""KILL"",""BUS"",""SEGV"",""SYS"","
-$ psnwc2="""PIPE"",""ALRM"",""TERM"",""ABRT"",""USR1"",""USR2"",0"
-$ perl_sig_name_with_commas = psnwc1 + psnwc2
-$ perl_sig_num="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 6 16 17"",0"
-$ perl_sig_num_init="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,6,16,17,0"
-$ perl_sig_num_with_commas=perl_sig_num_init
-$ perl_uidtype="unsigned int"
-$ perl_d_pathconf="undef"
-$ perl_d_fpathconf="undef"
-$ perl_d_sysconf="undef"
-$ perl_d_sigsetjmp="undef"
-$ ENDIF
-$!
-$! Dec C alone
-$ IF ("''Using_Dec_C'".EQS."Yes")
-$ THEN
-$ perl_d_mbstowcs="define"
-$ perl_d_mbtowc="define"
-$ perl_d_stdiobase="define"
-$ perl_d_stdio_ptr_lval="define"
-$ perl_d_stdio_cnt_lval="define"
-$ perl_d_stdstdio="define"
-$ perl_d_wcstombs="define"
-$ perl_d_mblen="define"
-$ perl_d_mktime="define"
-$ perl_d_strcoll="define"
-$ perl_d_strxfrm="define"
-$ perl_d_wctomb="define"
-$ perl_i_locale="define"
-$ perl_d_locconv="define"
-$ perl_d_setlocale="define"
-$ perl_vms_cc_type="decc"
-$ ELSE
-$ perl_d_mbstowcs="undef"
-$ perl_d_mbtowc="undef"
-$ perl_d_stdiobase="undef"
-$ perl_d_stdio_ptr_lval="undef"
-$ perl_d_stdio_cnt_lval="undef"
-$ perl_d_stdstdio="undef"
-$ perl_d_wcstombs="undef"
-$ perl_d_mblen="undef"
-$ perl_d_mktime="undef"
-$ perl_d_strcoll="undef"
-$ perl_d_strxfrm="undef"
-$ perl_d_wctomb="undef"
-$ perl_i_locale="undef"
-$ perl_d_locconv="undef"
-$ perl_d_setlocale="undef"
-$ ENDIF
-$!
-$! Sockets?
-$ if ("''Has_Socketshr'".EQS."T").OR.("''Has_Dec_C_Sockets'".EQS."T")
-$ THEN
-$ perl_d_vms_do_sockets="define"
-$ perl_d_htonl="define"
-$ perl_d_socket="define"
-$ perl_d_select="define"
-$ perl_netdb_host_type="char *"
-$ perl_netdb_hlen_type="int"
-$ perl_netdb_name_type="char *"
-$ perl_netdb_net_type="long"
-$ perl_d_gethbyaddr="define"
-$ perl_d_gethbyname="define"
-$ perl_d_getnbyaddr="define"
-$ perl_d_getnbyname="define"
-$ perl_d_getpbynumber="define"
-$ perl_d_getpbyname="define"
-$ perl_d_getsbyport="define"
-$ perl_d_getsbyname="define"
-$ perl_d_gethostprotos="define"
-$ perl_d_getnetprotos="define"
-$ perl_d_getprotoprotos="define"
-$ perl_d_getservprotos="define"
-$ IF ("''Using_Dec_C'".EQS."Yes")
-$ THEN
-$ perl_socksizetype="unsigned int"
-$ ELSE
-$ perl_socksizetype="int *"
-$ ENDIF
-$ ELSE
-$ perl_d_vms_do_sockets="undef"
-$ perl_d_htonl="undef"
-$ perl_d_socket="undef"
-$ perl_d_select="undef"
-$ perl_netdb_host_type="char *"
-$ perl_netdb_hlen_type="int"
-$ perl_netdb_name_type="char *"
-$ perl_netdb_net_type="long"
-$ perl_d_gethbyaddr="undef"
-$ perl_d_gethbyname="undef"
-$ perl_d_getnbyaddr="undef"
-$ perl_d_getnbyname="undef"
-$ perl_d_getpbynumber="undef"
-$ perl_d_getpbyname="undef"
-$ perl_d_getsbyport="undef"
-$ perl_d_getsbyname="undef"
-$ perl_d_gethostprotos="undef"
-$ perl_d_getnetprotos="undef"
-$ perl_d_getprotoprotos="undef"
-$ perl_d_getservprotos="undef"
-$ perl_socksizetype="undef"
-$ ENDIF
-$! Threads
-$ IF use_threads
-$ THEN
-$   perl_usethreads="define"
-$   perl_d_pthreads_created_joinable="define"
-$   if (VMS_VER .GES. "7.0")
-$   THEN
-$     perl_d_oldpthreads="undef"
-$   ELSE
-$     perl_d_oldpthreads="define"
-$   ENDIF
-$ ELSE
-$   perl_d_oldpthreads="undef"
-$   perl_usethreads="undef"
-$   
-$   perl_d_pthreads_created_joinable="undef"
-$ ENDIF
-$! 
-$! new (5.005_62++) typedefs for primitives
-$! 
-$ perl_ivtype="long"
-$ perl_uvtype="unsigned long"
-$ perl_i8type="char"
-$ perl_u8type="unsigned char"
-$ perl_i16type="short"
-$ perl_u16type="unsigned short"
-$ perl_i32type="int"
-$ perl_u32type="unsigned int"
-$ perl_i64type="long long"
-$ perl_u64type="unsigned long long"
-$ perl_nvtype="double"
-$!
-$ GOTO beyond_type_size_check
-$!
-$type_size_check: 
-$!
-$! Check for type sizes 
-$!
-$ OS
-$ WS "#ifdef __DECC
-$ WS "#include <stdlib.h>
-$ WS "#endif
-$ WS "#include <stdio.h>
-$ WS "int main()
-$ WS "{"
-$ WS "printf(""%d\n"", sizeof(''type'));"
-$ WS "exit(0);
-$ WS "}"
-$ CS
-$ DEFINE SYS$ERROR _NLA0:
-$ DEFINE SYS$OUTPUT _NLA0:
-$ ON ERROR THEN CONTINUE
-$ ON WARNING THEN CONTINUE
-$ 'Checkcc' temp.c
-$ If (Needs_Opt.eqs."Yes")
-$ THEN
-$   link temp.obj,temp.opt/opt
-$ ELSE
-$   link temp.obj
-$ ENDIF
-$ OPEN/WRITE TEMPOUT [-.uu]tempout.lis
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ DEFINE SYS$ERROR TEMPOUT
-$ DEFINE SYS$OUTPUT TEMPOUT
-$ mcr []temp.exe
-$ CLOSE TEMPOUT
-$ DEASSIGN SYS$OUTPUT
-$ DEASSIGN SYS$ERROR
-$ OPEN/READ TEMPOUT [-.uu]tempout.lis
-$ READ TEMPOUT line
-$ CLOSE TEMPOUT
-$ DELETE/NOLOG [-.uu]tempout.lis;
-$ WRITE_RESULT "''size_name' is ''line'"
-$ DS
-$ RETURN
-$!
-$beyond_type_size_check:
-$!
-$ line = ""
-$ type = "''perl_ivtype'"
-$ size_name = "ivsize"
-$ gosub type_size_check
-$ perl_ivsize="''line'"
-$ IF type .eqs. "long"
-$ THEN perl_longsize = "''line'"
-$ ELSE
-$   type = "long"
-$   size_name = "longsize"
-$   gosub type_size_check
-$   perl_longsize="''line'"
-$ ENDIF
-$
-$ type = "''perl_uvtype'"
-$ size_name = "uvsize"
-$ gosub type_size_check
-$ perl_uvsize="''line'"
-$
-$ type = "''perl_i8type'"
-$ size_name = "i8size"
-$ gosub type_size_check
-$ perl_i8size="''line'"
-$
-$ type = "''perl_u8type'"
-$ size_name = "u8size"
-$ gosub type_size_check
-$ perl_u8size="''line'"
-$
-$ type = "''perl_i16type'"
-$ size_name = "i16size"
-$ gosub type_size_check
-$ perl_i16size="''line'"
-$ IF type .eqs. "short"
-$ THEN perl_shortsize="''line'"
-$ ELSE
-$   type = "''perl_i16type'"
-$   size_name = "shortsize"
-$   gosub type_size_check
-$   perl_shortsize="''line'"
-$ ENDIF
-$
-$ type = "''perl_u16type'"
-$ size_name = "u16size"
-$ gosub type_size_check
-$ perl_u16size="''line'"
-$
-$ type = "''perl_i32type'"
-$ size_name = "i32size"
-$ gosub type_size_check
-$ perl_i32size="''line'"
-$ IF type .eqs. "int"
-$ THEN perl_intsize="''perl_i32size'"
-$ ELSE
-$   type = "int"
-$   size_name = "intsize"
-$   gosub type_size_check
-$   perl_intsize="''line'"
-$ ENDIF
-$
-$ type = "''perl_u32type'"
-$ size_name = "u32size"
-$ gosub type_size_check
-$ perl_u32size="''line'"
-$
-$ If use64bitint
-$ Then
-$   type = "''perl_i64type'"
-$   size_name = "i64size"
-$   gosub type_size_check
-$   perl_i64size="''line'"
-$   perl_ivtype="''perl_i64type'"
-$
-$   type = "''perl_u64type'"
-$   size_name = "u64size"
-$   gosub type_size_check
-$   perl_u64size="''line'"
-$   perl_uvtype="''perl_u64type'"
-$   perl_nvtype="long double"
-$ Else
-$   perl_i64size="undef"
-$   perl_u64size="undef"
-$ EndIf
-$!
-$ perl_ivdformat="""ld"""
-$ perl_uvuformat="""lu"""
-$ perl_uvoformat="""lo"""
-$ perl_uvxformat="""lx"""
-$! 
-$! Finally the composite ones. All config
-$ perl_installarchlib="''perl_prefix':[lib.''archname'.''version']"
-$ perl_installsitearch="''perl_prefix':[lib.site_perl.''archname']"
-$ perl_myhostname="''myhostname'"
-$ perl_mydomain="''mydomain'"
-$ perl_perladmin="''perladmin'"
-$ perl_myuname:="''osname' ''myname' ''osvers' ''f$edit(hwname, "TRIM")'"
-$ perl_archlibexp="''perl_prefix':[lib.''archname'.''version']"
-$ perl_archlib="''perl_prefix':[lib.''archname'.''version']"
-$ perl_oldarchlibexp="''perl_prefix':[lib.''archname']"
-$ perl_oldarchlib="''perl_prefix':[lib.''archname']"
-$ perl_sitearchexp="''perl_prefix':[lib.site_perl.''archname']"
-$ perl_sitearch="''perl_prefix':[lib.site_perl.''archname']"
-$ IF Using_Dec_C
-$ THEN
-$ perl_ccflags="/Include=[]/Standard=Relaxed_ANSI/Prefix=All/Obj=''perl_obj_ext'/NoList''cc_flags'"
-$ ENDIF
-$ if use_vmsdebug_perl .eqs. "Y"
-$ then
-$     perl_optimize="/Debug/NoOpt"
-$     perl_dbgprefix = "DBG"
-$ else
-$     perl_optimize= ""
-$     perl_dbgprefix = ""
-$ endif
-$!
-$! Okay, we've got everything configured. Now go write out a config.sh.
-$ echo4 "Creating config.sh..."
-$ open/write CONFIG [-]config.sh
-$ WC := "write CONFIG"
-$!
-$ WC "# This file generated by Configure.COM on a VMS system."
-$ WC "# Time: " + cf_time
-$ WC ""
-$ WC "CONFIGDOTSH=true"
-$ WC "package='" + perl_package + "'"
-$ WC "config_args='" + config_args + "'"
-$ WC "d_nv_preserves_uv='" + perl_d_nv_preserves_uv + "'"
-$ WC "use5005threads='" + perl_use5005threads + "'"
-$ WC "useithreads='" + perl_useithreads + "'"
-$ WC "CONFIG='" + perl_config + "'"
-$ WC "cf_time='" + cf_time + "'"
-$ WC "cf_by='" + cf_by + "'"
-$ WC "cpp_stuff='" + perl_cpp_stuff + "'"
-$ WC "ccdlflags='" + perl_ccdlflags + "'"
-$ WC "cccdlflags='" + perl_cccdlflags + "'"
-$ WC "mab='" + perl_mab + "'"
-$ WC "libpth='" + perl_libpth + "'"
-$ WC "ld='" + perl_ld + "'"
-$ WC "lddlflags='" + perl_lddlflags + "'"
-$ WC "ranlib='" + perl_ranlib + "'"
-$ WC "ar='" + perl_ar + "'"
-$ WC "full_ar='" + perl_full_ar + "'"
-$ WC "eunicefix='" + perl_eunicefix + "'"
-$ WC "hint='" + perl_hint +"'"
-$ WC "hintfile='" + perl_hintfile + "'"
-$ WC "shrplib='" + perl_shrplib + "'"
-$ WC "usemymalloc='" + perl_usemymalloc + "'"
-$ WC "usevfork='" + perl_usevfork + "'"
-$ WC "useposix='false'"
-$ WC "spitshell='write sys$output '"
-$ WC "dlsrc='dl_vms.c'"
-$ WC "binexp='" + perl_binexp + "'"
-$ WC "man1ext='" + perl_man1ext + "'"
-$ WC "man3ext='" + perl_man3ext + "'"
-$ WC "archname='" + archname + "'"
-$ WC "osvers='" + osvers + "'"
-$ WC "prefix='" + perl_prefix + "'"
-$ WC "builddir='" + perl_builddir + "'"
-$ WC "installbin='" + perl_installbin + "'"
-$ WC "installscript='" + perl_installscript + "'"
-$ WC "installman1dir='" + perl_installman1dir + "'"
-$ WC "installman3dir='" + perl_installman3dir + "'"
-$ WC "installprivlib='" + perl_installprivlib + "'"
-$ WC "installarchlib='" + perl_installarchlib + "'"
-$ WC "installsitelib='" + perl_installsitelib + "'"
-$ WC "installsitearch='" + perl_installsitearch + "'"
-$ WC "path_sep='" + perl_path_sep + "'"
-$ WC "vms_cc_type='" + perl_vms_cc_type + "'"
-$ WC "d_attribut='" + perl_d_attribut + "'"
-$ WC "cc='" + perl_cc + "'"
-$ WC "ccflags='" + perl_ccflags + "'"
-$ WC "optimize='" + perl_optimize + "'"
-$ WC "dbgprefix='" + perl_dbgprefix + "'"
-$ WC "d_vms_do_sockets='" + perl_d_vms_do_sockets + "'"
-$ WC "d_socket='" + perl_d_socket + "'"
-$ WC "d_sockpair='" + perl_d_sockpair + "'"
-$ WC "d_gethent='" + perl_d_gethent + "'"
-$ WC "d_getsent='" + perl_d_getsent + "'"
-$ WC "d_socklen_t='" + perl_d_socklen_t + "'"
-$ WC "d_select='" + perl_d_select + "'"
-$ WC "i_niin='" + perl_i_niin + "'"
-$ WC "i_netinettcp='" + perl_i_netinettcp + "'"
-$ WC "i_neterrno='" + perl_i_neterrno + "'"
-$ WC "d_stdstdio='" + perl_d_stdstdio + "'"
-$ WC "d_stdio_ptr_lval='" + perl_d_stdio_ptr_lval + "'"
-$ WC "d_stdio_cnt_lval='" + perl_d_stdio_cnt_lval + "'"
-$ WC "d_stdiobase='" + perl_d_stdiobase + "'"
-$ WC "d_locconv='" + perl_d_locconv + "'"
-$ WC "d_setlocale='" + perl_d_setlocale + "'"
-$ WC "i_locale='" + perl_i_locale + "'"
-$ WC "d_mbstowcs='" + perl_d_mbstowcs + "'"
-$ WC "d_mbtowc='" + perl_d_mbtowc + "'"
-$ WC "d_wcstombs='" + perl_d_wcstombs + "'"
-$ WC "d_wctomb='" + perl_d_wctomb + "'"
-$ WC "d_mblen='" + perl_d_mblen + "'"
-$ WC "d_mktime='" + perl_d_mktime + "'"
-$ WC "d_strcoll='" + perl_d_strcoll + "'"
-$ WC "d_strxfrm='" + perl_d_strxfrm  + "'"
-$ WC "ldflags='" + perl_ldflags + "'"
-$ WC "dlobj='" + perl_dlobj + "'"
-$ WC "obj_ext='" + perl_obj_ext + "'"
-$ WC "so='" + perl_so + "'"
-$ WC "dlext='" + perl_dlext + "'"
-$ WC "exe_ext='" + perl_exe_ext + "'"
-$ WC "lib_ext='" + perl_lib_ext + "'"
-$ WC "myhostname='" + perl_myhostname + "'"
-$ WC "mydomain='" + perl_mydomain + "'"
-$ WC "perladmin='" + perl_perladmin + "'"
-$ WC "cf_email='" + cf_email + "'"
-$ WC "myuname='" + perl_myuname + "'"
-$ WC "alignbytes='" + alignbytes + "'"
-$ WC "osname='" + perl_osname + "'"
-$ WC "d_archlib='" + perl_d_archlib + "'"
-$ WC "archlibexp='" + perl_archlibexp + "'"
-$ WC "archlib='" + perl_archlib + "'"
-$ WC "archname='" + archname + "'"
-$ WC "d_bincompat3='" + perl_d_bincompat3 + "'"
-$ WC "cppstdin='" + perl_cppstdin + "'"
-$ WC "cppminus='" + perl_cppminus + "'"
-$ WC "cpprun='" + perl_cpprun + "'"
-$ WC "cpplast='" + perl_cpplast + "'"
-$ WC "d_bcmp='" + perl_d_bcmp + "'"
-$ WC "d_bcopy='" + perl_d_bcopy + "'"
-$ WC "d_bzero='" + perl_d_bzero + "'"
-$ WC "d_castneg='" + perl_d_castneg + "'"
-$ WC "castflags='" + perl_castflags + "'"
-$ WC "d_chsize='" + perl_d_chsize + "'"
-$ WC "d_const='" + perl_d_const + "'"
-$ WC "d_crypt='" + perl_d_crypt + "'"
-$ WC "byteorder='" + perl_byteorder + "'"
-$ WC "full_csh='" + perl_full_csh + "'"
-$ WC "d_csh='" + perl_d_csh + "'"
-$ WC "d_dup2='" + perl_d_dup2 + "'"
-$ WC "d_fchmod='" + perl_d_fchmod + "'"
-$ WC "d_fchown='" + perl_d_fchown + "'"
-$ WC "d_fcntl='" + perl_d_fcntl + "'"
-$ WC "d_fgetpos='" + perl_d_fgetpos + "'"
-$ WC "d_flexfnam='" + perl_d_flexfnam + "'"
-$ WC "d_flock='" + perl_d_flock + "'"
-$ WC "d_fsetpos='" + perl_d_fsetpos + "'"
-$ WC "d_gettimeod='" + perl_d_gettimeod + "'"
-$ WC "d_getgrps='" + perl_d_getgrps + "'"
-$ WC "d_setgrps='" + perl_d_setgrps + "'"
-$ WC "groupstype='" + perl_groupstype + "'"
-$ WC "d_uname='" + perl_d_uname + "'"
-$ WC "d_getprior='" + perl_d_getprior + "'"
-$ WC "d_killpg='" + perl_d_killpg + "'"
-$ WC "d_link='" + perl_d_link + "'"
-$ WC "d_lstat='" + perl_d_lstat + "'"
-$ WC "d_lockf='" + perl_d_lockf + "'"
-$ WC "d_memcmp='" + perl_d_memcmp + "'"
-$ WC "d_memcpy='" + perl_d_memcpy + "'"
-$ WC "d_memmove='" + perl_d_memmove + "'"
-$ WC "d_memset='" + perl_d_memset + "'"
-$ WC "d_mkdir='" + perl_d_mkdir + "'"
-$ WC "d_msg='" + perl_d_msg + "'"
-$ WC "d_open3='" + perl_d_open3 + "'"
-$ WC "d_poll='" + perl_d_poll + "'"
-$ WC "d_perl_otherlibdirs='" + perl_d_perl_otherlibdirs + "'"
-$ WC "otherlibdirs='" + perl_otherlibdirs + "'"
-$ WC "d_readdir='" + perl_d_readdir + "'"
-$ WC "d_seekdir='" + perl_d_seekdir + "'"
-$ WC "d_telldir='" + perl_d_telldir + "'"
-$ WC "d_rewinddir='" + perl_d_rewinddir + "'"
-$ WC "d_rename='" + perl_d_rename + "'"
-$ WC "d_rmdir='" + perl_d_rmdir + "'"
-$ WC "d_sem='" + perl_d_sem + "'"
-$ WC "d_setegid='" + perl_d_setegid + "'"
-$ WC "d_seteuid='" + perl_d_seteuid + "'"
-$ WC "d_setprior='" + perl_d_setprior + "'"
-$ WC "d_setregid='" + perl_d_setregid + "'"
-$ WC "d_setresgid='" + perl_d_setresgid + "'"
-$ WC "d_setreuid='" + perl_d_setreuid + "'"
-$ WC "d_setresuid='" + perl_d_setresuid + "'"
-$ WC "d_setrgid='" + perl_d_setrgid + "'"
-$ WC "d_setruid='" + perl_d_setruid + "'"
-$ WC "d_setsid='" + perl_d_setsid + "'"
-$ WC "d_shm='" + perl_d_shm + "'"
-$ WC "d_shmatprototype='" + perl_d_shmatprototype + "'"
-$ WC "shmattype='" + perl_shmattype + "'"
-$ WC "d_sigaction='" + perl_d_sigaction + "'"
-$ WC "d_statblks='" + perl_d_statblks + "'"
-$ WC "stdio_ptr='" + perl_stdio_ptr + "'"
-$ WC "stdio_cnt='" + perl_stdio_cnt + "'"
-$ WC "stdio_base='" + perl_stdio_base + "'"
-$ WC "stdio_bufsiz='" + perl_stdio_bufsiz + "'"
-$ WC "d_strctcpy='" + perl_d_strctcpy + "'"
-$ WC "d_strerror='" + perl_d_strerror + "'"
-$ WC "d_syserrlst='" + perl_d_syserrlst + "'"
-$ WC "d_strerrm='" + perl_d_strerrm + "'"
-$ WC "d_symlink='" + perl_d_symlink + "'"
-$ WC "d_syscall='" + perl_d_syscall + "'"
-$ WC "d_system='" + perl_d_system + "'"
-$ WC "timetype='" + perl_timetype + "'"
-$ WC "d_truncate='" + perl_d_truncate + "'"
-$ WC "d_vfork='" + perl_d_vfork + "'"
-$ WC "signal_t='" + perl_signal_t + "'"
-$ WC "d_volatile='" + perl_d_volatile + "'"
-$ WC "d_vprintf='" + perl_d_vprintf + "'"
-$ WC "d_charvspr='" + perl_d_charvspr + "'"
-$ WC "d_wait4='" + perl_d_wait4 + "'"
-$ WC "d_waitpid='" + perl_d_waitpid + "'"
-$ WC "i_dirent='" + perl_i_dirent + "'"
-$ WC "d_dirnamlen='" + perl_d_dirnamlen + "'"
-$ WC "direntrytype='" + perl_direntrytype + "'"
-$ WC "i_fcntl='" + perl_i_fcntl + "'"
-$ WC "i_grp='" + perl_i_grp + "'"
-$ WC "i_limits='" + perl_i_limits + "'"
-$ WC "i_memory='" + perl_i_memory + "'"
-$ WC "i_ndbm='" + perl_i_ndbm + "'"
-$ WC "i_stdarg='" + perl_i_stdarg + "'"
-$ WC "i_pwd='" + perl_i_pwd + "'"
-$ WC "d_pwquota='" + perl_d_pwquota + "'"
-$ WC "d_pwage='" + perl_d_pwage + "'"
-$ WC "d_pwchange='" + perl_d_pwchange + "'"
-$ WC "d_pwclass='" + perl_d_pwclass + "'"
-$ WC "d_pwexpire='" + perl_d_pwexpire + "'"
-$ WC "d_pwcomment='" + perl_d_pwcomment + "'"
-$ WC "i_stddef='" + perl_i_stddef + "'"
-$ WC "i_stdlib='" + perl_i_stdlib + "'"
-$ WC "i_string='" + perl_i_string + "'"
-$ WC "i_sysdir='" + perl_i_sysdir + "'"
-$ WC "i_sysfile='" + perl_i_sysfile + "'"
-$ WC "i_sysioctl='" + perl_i_sysioctl + "'"
-$ WC "i_sysndir='" + perl_i_sysndir + "'"
-$ WC "i_sysresrc='" + perl_i_sysresrc + "'"
-$ WC "i_sysselct='" + perl_i_sysselct + "'"
-$ WC "i_dbm='" + perl_i_dbm + "'"
-$ WC "i_rpcsvcdbm='" + perl_i_rpcsvcdbm + "'"
-$ WC "i_sfio='" + perl_i_sfio + "'"
-$ WC "i_sysstat='" + perl_i_sysstat + "'"
-$ WC "i_systimes='" + perl_i_systimes + "'"
-$ WC "i_systypes='" + perl_i_systypes + "'"
-$ WC "i_sysun='" + perl_i_sysun + "'"
-$ WC "i_syswait='" + perl_i_syswait + "'"
-$ WC "i_termio='" + perl_i_termio + "'"
-$ WC "i_sgtty='" + perl_i_sgtty + "'"
-$ WC "i_termios='" + perl_i_termios + "'"
-$ WC "i_time='" + perl_i_time + "'"
-$ WC "i_systime='" + perl_i_systime + "'"
-$ WC "i_systimek='" + perl_i_systimek + "'"
-$ WC "i_unistd='" + perl_i_unistd + "'"
-$ WC "i_utime='" + perl_i_utime + "'"
-$ WC "i_varargs='" + perl_i_varargs + "'"
-$ WC "i_vfork='" + perl_i_vfork + "'"
-$ WC "prototype='" + perl_prototype + "'"
-$ WC "randbits='" + perl_randbits +"'"
-$ WC "selecttype='" + perl_selecttype + "'"
-$ WC "selectminbits='" + perl_selectminbits + "'"
-$ WC "stdchar='" + perl_stdchar + "'"
-$ WC "d_unlink_all_versions='" + perl_d_unlink_all_versions + "'"
-$ WC "full_sed='" + perl_full_sed + "'"
-$ WC "bin='" + perl_bin + "'"
-$ WC "binexp='" + perl_binexp + "'"
-$ WC "d_alarm='" + perl_d_alarm + "'"
-$ WC "d_casti32='" + perl_d_casti32 + "'"
-$ WC "d_chown='" + perl_d_chown + "'"
-$ WC "d_chroot='" + perl_d_chroot + "'"
-$ WC "d_cuserid='" + perl_d_cuserid + "'"
-$ WC "d_dbl_dig='" + perl_d_dbl_dig + "'"
-$ WC "d_ldbl_dig='" + perl_d_ldbl_dig + "'"
-$ WC "d_difftime='" + perl_d_difftime + "'"
-$ WC "d_fork='" + perl_d_fork + "'"
-$ WC "d_getlogin='" + perl_d_getlogin + "'"
-$ WC "d_getppid='" + perl_d_getppid + "'"
-$ WC "d_htonl='" + perl_d_htonl + "'"
-$ WC "d_nice='" + perl_d_nice + "'"
-$ WC "d_pause='" + perl_d_pause + "'"
-$ WC "d_pipe='" + perl_d_pipe + "'"
-$ WC "d_readlink='" + perl_d_readlink + "'"
-$ WC "d_setlinebuf='" + perl_d_setlinebuf + "'"
-$ WC "d_strchr='" + perl_d_strchr + "'"
-$ WC "d_index='" + perl_d_index + "'"
-$ WC "d_strtod='" + perl_d_strtod + "'"
-$ WC "d_strtol='" + perl_d_strtol + "'"
-$ WC "d_strtoul='" + perl_d_strtoul + "'"
-$ WC "d_tcgetpgrp='" + perl_d_tcgetpgrp + "'"
-$ WC "d_tcsetpgrp='" + perl_d_tcsetpgrp + "'"
-$ WC "d_times='" + perl_d_times + "'"
-$ WC "d_tzname='" + perl_d_tzname + "'"
-$ WC "d_umask='" + perl_d_umask + "'"
-$ WC "fpostype='" + perl_fpostype + "'"
-$ WC "i_dlfcn='" + perl_i_dlfcn + "'"
-$ WC "i_float='" + perl_i_float + "'"
-$ WC "i_math='" + perl_i_math + "'"
-$ WC "intsize='" + perl_intsize + "'"
-$ WC "longsize='" + perl_longsize + "'"
-$ WC "shortsize='" + perl_shortsize + "'"
-$ WC "lseektype='" + perl_lseektype + "'"
-$ WC "lseeksize='4'"
-$ WC "i_values='" + perl_i_values + "'"
-$ WC "malloctype='" + perl_malloctype + "'"
-$ WC "freetype='" + perl_freetype + "'"
-$ WC "d_mymalloc='" + perl_d_mymalloc + "'"
-$ WC "sh='" + perl_sh + "'"
-$ WC "sig_name='" + perl_sig_name + "'"
-$ WC "sig_num='" + perl_sig_num + "'"
-$ tempsym = "sig_name_init='" + perl_sig_name_with_commas + "'"
-$ WC/symbol tempsym
-$ WC "modetype='" + perl_modetype + "'"
-$ WC "ssizetype='" + perl_ssizetype + "'"
-$ WC "o_nonblock='" + perl_o_nonblock + "'"
-$ WC "eagain='" + perl_eagain + "'"
-$ WC "rd_nodata='" + perl_rd_nodata + "'"
-$ WC "d_eofnblk='" + perl_d_eofnblk + "'"
-$ WC "d_oldarchlib='" + perl_d_oldarchlib + "'"
-$ WC "oldarchlibexp='" + perl_oldarchlibexp + "'"
-$ WC "oldarchlib='" + perl_oldarchlib + "'"
-$ WC "privlibexp='" + perl_privlibexp + "'"
-$ WC "privlib='" + perl_privlib + "'"
-$ WC "sitelibexp='" + perl_sitelibexp + "'"
-$ WC "sitelib='" + perl_sitelib + "'"
-$ WC "sitelib_stem='" + perl_sitelib_stem + "'"
-$ WC "sitearchexp='" + perl_sitearchexp + "'"
-$ WC "sitearch='" + perl_sitearch + "'"
-$ WC "sizetype='" + perl_sizetype + "'"
-$ WC "i_sysparam='" + perl_i_sysparam + "'"
-$ WC "d_void_closedir='" + perl_d_void_closedir + "'"
-$ WC "d_dlerror='" + perl_d_dlerror + "'"
-$ WC "d_dlsymun='" + perl_d_dlsymun + "'"
-$ WC "d_suidsafe='" + perl_d_suidsafe + "'"
-$ WC "d_dosuid='" + perl_d_dosuid + "'"
-$ WC "d_inetaton='" + perl_d_inetaton + "'"
-$ WC "d_int64_t='" + perl_d_int64_t + "'"
-$ WC "d_isascii='" + perl_d_isascii + "'"
-$ WC "d_mkfifo='" + perl_d_mkfifo + "'"
-$ WC "d_pathconf='" + perl_d_pathconf + "'"
-$ WC "d_fpathconf='" + perl_d_fpathconf + "'"
-$ WC "d_safebcpy='" + perl_d_safebcpy + "'"
-$ WC "d_safemcpy='" + perl_d_safemcpy + "'"
-$ WC "d_sanemcmp='" + perl_d_sanemcmp + "'"
-$ WC "d_setpgrp='" + perl_d_setpgrp + "'"
-$ WC "d_bsdsetpgrp='" + perl_d_bsdsetpgrp + "'"
-$ WC "d_bsdpgrp='" + perl_d_bsdpgrp + "'"
-$ WC "d_setpgid='" + perl_d_setpgid + "'"
-$ WC "d_setpgrp2='" + perl_d_setpgrp2 + "'"
-$ WC "d_sysconf='" + perl_d_sysconf + "'"
-$ WC "d_Gconvert='" + perl_d_Gconvert + "'"
-$ WC "d_getpgid='" + perl_d_getpgid + "'"
-$ WC "d_getpgrp='" + perl_d_getpgrp + "'"
-$ WC "d_bsdgetpgrp='" + perl_d_bsdgetpgrp + "'"
-$ WC "d_getpgrp2='" + perl_d_getpgrp2 + "'"
-$ WC "d_sfio='" + perl_d_sfio + "'"
-$ WC "d_sigsetjmp='" + perl_d_sigsetjmp + "'"
-$ WC "usedl='" + perl_usedl + "'"
-$ WC "startperl=" + perl_startperl ! This one's special--no enclosing single quotes
-$ WC "db_hashtype='" + perl_db_hashtype + "'"
-$ WC "db_prefixtype='" + perl_db_prefixtype + "'"
-$ WC "useperlio='" + perl_useperlio + "'"
-$ WC "defvoidused='" + perl_defvoidused + "'"
-$ WC "voidflags='" + perl_voidflags + "'"
-$ WC "d_eunice='" + perl_d_eunice + "'"
-$ WC "libs='" + perl_libs + "'"
-$ WC "libc='" + perl_libc + "'"
-$ WC "xs_apiversion='" + version + "'"
-$ WC "pm_apiversion='" + version + "'"
-$ WC "version='" + version + "'"
-$ WC "revision='" + revision + "'"
-$ WC "patchlevel='" + patchlevel + "'"
-$ WC "subversion='" + subversion + "'"
-$ WC "PERL_VERSION='" + patchlevel + "'"
-$ WC "PERL_SUBVERSION='" + subversion + "'"
-$ WC "pager='" + perl_pager + "'"
-$ WC "make='" + make + "'"
-$ WC "uidtype='" + perl_uidtype + "'"
-$ WC "uidformat='" + perl_uidformat + "'"
-$ WC "uidsize='" + perl_uidsize + "'"
-$ WC "uidsign='" + perl_uidsign + "'"
-$ WC "gidtype='" + perl_gidtype + "'"
-$ WC "gidformat='" + perl_gidformat + "'"
-$ WC "gidsize='" + perl_gidsize + "'"
-$ WC "gidsign='" + perl_gidsign + "'"
-$ WC "usethreads='" + perl_usethreads + "'"
-$ WC "d_pthread_yield='" + perl_d_pthread_yield + "'"
-$ WC "d_pthreads_created_joinable='" + perl_d_pthreads_created_joinable + "'"
-$ WC "d_gnulibc='" + perl_d_gnulibc + "'"
-$ WC "i_netdb='" + perl_i_netdb + "'"
-$ WC "pidtype='" + perl_pidtype + "'"
-$ WC "netdb_host_type='" + perl_netdb_host_type + "'"
-$ WC "netdb_hlen_type='" + perl_netdb_hlen_type + "'"
-$ WC "netdb_name_type='" + perl_netdb_name_type + "'"
-$ WC "netdb_net_type='" + perl_netdb_net_type + "'"
-$ WC "socksizetype='" + perl_socksizetype + "'"
-$ WC "baserev='" + perl_baserev + "'"
-$ WC "doublesize='" + perl_doublesize + "'"
-$ WC "ptrsize='" + perl_ptrsize + "'"
-$ WC "d_gethbyaddr='" + perl_d_gethbyaddr + "'"
-$ WC "d_gethbyname='" + perl_d_gethbyname + "'"
-$ WC "d_getnbyaddr='" + perl_d_getnbyaddr + "'"
-$ WC "d_getnbyname='" + perl_d_getnbyname + "'"
-$ WC "d_getpbynumber='" + perl_d_getpbynumber + "'"
-$ WC "d_getpbyname='" + perl_d_getpbyname + "'"
-$ WC "d_getsbyport='" + perl_d_getsbyport + "'"
-$ WC "d_getsbyname='" + perl_d_getsbyname + "'"
-$ WC "d_sethent='" + perl_d_sethent + "'"
-$ WC "d_oldpthreads='" + perl_d_oldpthreads + "'"
-$ WC "d_longdbl='" + perl_d_longdbl + "'"
-$ WC "longdblsize='" + perl_longdblsize + "'"
-$ WC "d_longlong='" + perl_d_longlong + "'"
-$ WC "longlongsize='" + perl_longlongsize + "'"
-$ WC "d_mkstemp='" + perl_d_mkstemp + "'"
-$ WC "d_mkstemps='" + perl_d_mkstemps + "'"
-$ WC "d_mkdtemp='" + perl_d_mkdtemp + "'"
-$ WC "d_setvbuf='" + perl_d_setvbuf + "'"
-$ WC "d_setenv='" + perl_d_setenv + "'"
-$ WC "d_endhent='" + perl_d_endhent + "'"
-$ WC "d_endnent='" + perl_d_endsent + "'"
-$ WC "d_endpent='" + perl_d_endpent + "'"
-$ WC "d_endsent='" + perl_d_endsent + "'"
-$ WC "d_gethent='" + perl_d_gethent + "'"
-$ WC "d_getnent='" + perl_d_getsent + "'"
-$ WC "d_getpent='" + perl_d_getpent + "'"
-$ WC "d_getsent='" + perl_d_getsent + "'"
-$ WC "d_sethent='" + perl_d_sethent + "'"
-$ WC "d_setnent='" + perl_d_setsent + "'"
-$ WC "d_setpent='" + perl_d_setpent + "'"
-$ WC "ebcdic='" + perl_ebcdic + "'"
-$ WC "d_setsent='" + perl_d_setsent + "'"
-$ WC "d_gethostprotos='" + perl_d_gethostprotos + "'"
-$ WC "d_getnetprotos='" + perl_d_getnetprotos + "'"
-$ WC "d_getprotoprotos='" + perl_d_getprotoprotos + "'"
-$ WC "d_getservprotos='" + perl_d_getservprotos + "'"
-$ WC "d_pwgecos='" + perl_d_pwgecos + "'"
-$ WC "d_sched_yield='" + perl_d_sched_yield + "'"
-$ WC "d_lchown='" + perl_d_lchown + "'"
-$ WC "d_union_semun='" + perl_d_union_semun + "'"
-$ WC "i_arpainet='" + perl_i_arpainet + "'"
-$ WC "d_grpasswd='" + perl_d_grpasswd + "'"
-$ WC "d_setgrent='" + perl_d_setgrent + "'"
-$ WC "d_getgrent='" + perl_d_getgrent + "'"
-$ WC "d_endgrent='" + perl_d_endgrent + "'"
-$ WC "d_pwpasswd='" + perl_d_pwpasswd + "'"
-$ WC "d_setpwent='" + perl_d_setpwent + "'"
-$ WC "d_getpwent='" + perl_d_getpwent + "'"
-$ WC "d_endpwent='" + perl_d_endpwent + "'"
-$ WC "d_semctl_semun='" + perl_d_semctl_semun + "'"
-$ WC "d_semctl_semid_ds='" + perl_d_semctl_semid_ds + "'"
-$ WC "extensions='" + perl_extensions + "'"
-$ WC "known_extensions='" + perl_known_extensions + "'"
-$ WC "static_ext='" + "'"
-$ WC "dynamic_ext='" + perl_extensions + "'"
-$ WC "d_mknod='" + perl_d_mknod + "'"
-$ WC "devtype='" + perl_devtype + "'"
-$ WC "d_gethname='" + perl_d_gethname + "'"
-$ WC "d_phostname='" + perl_d_phostname + "'"
-$ WC "aphostname='" + perl_aphostname + "'"
-$ WC "d_accessx='" + perl_d_accessx + "'"
-$ WC "d_eaccess='" + perl_d_eaccess + "'"
-$ WC "i_ieeefp='" + perl_i_ieeefp + "'"
-$ WC "i_sunmath='" + perl_i_sunmath + "'"
-$ WC "i_sysaccess='" + perl_i_sysaccess + "'"
-$ WC "i_syssecrt='" + perl_i_syssecrt + "'"
-$ WC "d_fd_set='" + perl_d_fd_set + "'"
-$ WC "d_access='" + perl_d_access + "'"
-$ WC "d_msg_ctrunc='" + perl_d_msg_ctrunc + "'"
-$ WC "d_msg_dontroute='" + perl_d_msg_dontroute + "'"
-$ WC "d_msg_oob='" + perl_d_msg_oob + "'"
-$ WC "d_msg_peek='" + perl_d_msg_peek + "'"
-$ WC "d_msg_proxy='" + perl_d_msg_proxy + "'"
-$ WC "d_scm_rights='" + perl_d_scm_rights + "'"
-$ WC "d_sendmsg='" + perl_d_sendmsg + "'"
-$ WC "d_recvmsg='" + perl_d_recvmsg + "'"
-$ WC "d_msghdr_s='" + perl_d_msghdr_s + "'"
-$ WC "d_cmsghdr_s='" + perl_d_cmsghdr_s + "'"
-$ WC "i_sysuio='" + perl_i_sysuio + "'"
-$ WC "d_fseeko='" + perl_d_fseeko + "'"
-$ WC "d_ftello='" + perl_d_ftello + "'"
-$ WC "d_qgcvt='" + perl_d_qgcvt + "'"
-$ WC "d_readv='" + perl_d_readv + "'"
-$ WC "d_writev='" + perl_d_writev + "'"
-$ WC "i_machcthr='" + perl_i_machcthr + "'"
-$ WC "usemultiplicity='" + perl_usemultiplicity + "'"
-$ WC "i_poll='" + perl_i_poll + "'"
-$ WC "i_inttypes='" + perl_i_inttypes + "'"
-$ WC "d_off64_t='" + perl_d_off64_t + "'"
-$ WC "d_fpos64_t='" + perl_d_fpos64_t + "'"
-$ WC "use64bitall='" + perl_use64bitall + "'"
-$ WC "use64bitint='" + perl_use64bitint + "'"
-$ WC "d_drand48proto='" + perl_d_drand48proto + "'"
-$ WC "d_lseekproto='" + perl_d_drand48proto + "'"
-$ WC "d_old_pthread_create_joinable='" + perl_d_old_pthread_create_joinable + "'"
-$ WC "old_pthread_create_joinable='" + perl_old_pthread_create_joinable + "'"
-$ WC "drand01='" + perl_drand01 + "'"
-$ WC "randseedtype='" + perl_randseedtype + "'"
-$ WC "seedfunc='" + perl_seedfunc + "'"
-$ WC "sig_num_init='" + perl_sig_num_with_commas + "'"
-$ WC "i_sysmount='" + perl_i_sysmount + "'"
-$ WC "d_fstatfs='" + perl_d_fstatfs + "'"
-$ WC "d_getfsstat='" + perl_d_getfsstat + "'"
-$ WC "d_memchr='" + perl_d_memchr + "'"
-$ WC "d_statfsflags='" + perl_d_statfsflags + "'"
-$ WC "fflushNULL='define'"
-$ WC "fflushall='undef'"
-$ WC "d_stdio_stream_array='undef'"
-$ WC "stdio_stream_array='" + perl_stdio_stream_array + "'"
-$ WC "i_sysstatvfs='" + perl_i_sysstatvfs + "'"
-$ WC "i_syslog='" + perl_i_syslog + "'"
-$ WC "i_sysmode='" + perl_i_sysmode + "'"
-$ WC "i_sysutsname='" + perl_i_sysutsname + "'"
-$ WC "i_machcthreads='" + perl_i_machcthreads + "'"
-$ WC "i_pthread='" + perl_i_pthread + "'"
-$ WC "d_fstatvfs='" + perl_d_fstatvfs + "'"
-$ WC "i_mntent='" + perl_i_mntent + "'"
-$ WC "d_getmntent='" + perl_d_getmntent + "'"
-$ WC "d_hasmntopt='" + perl_d_hasmntopt + "'"
-$ WC "d_telldirproto='" + perl_d_telldirproto + "'"
-$ WC "d_madvise='" + perl_d_madvise + "'"
-$ WC "d_msync='" + perl_d_msync + "'"
-$ WC "d_mprotect='" + perl_d_mprotect + "'"
-$ WC "d_munmap='" + perl_d_munmap + "'"
-$ WC "d_mmap='" + perl_d_mmap + "'"
-$ WC "mmaptype='" + perl_mmaptype + "'"
-$ WC "i_sysmman='" + perl_i_sysmman + "'"
-$ WC "installusrbinperl='" + perl_installusrbinperl + "'"
-$! WC "selectminbits='" + perl_selectminbits + "'"
-$ WC "crosscompile='" + perl_crosscompile + "'"
-$ WC "multiarch='" + perl_multiarch + "'"
-$ WC "sched_yield='" + perl_sched_yield + "'"
-$ WC "d_strtoull='" + perl_d_strtoull + "'"
-$ WC "d_strtouq='" + perl_d_strtouq + "'"
-$ WC "d_strtoll='" + perl_d_strtoll + "'"
-$ WC "d_strtold='" + perl_d_strtold + "'"
-$ WC "usesocks='" + perl_usesocks + "'"
-$ WC "d_vendorlib='" + perl_d_vendorlib + "'"
-$ WC "vendorlibexp='" + perl_vendorlibexp + "'"
-$ WC "vendorlib_stem='" + perl_vendorlib_stem + "'"
-$ WC "d_atolf='" + perl_d_atolf + "'"
-$ WC "d_atoll='" + perl_d_atoll + "'"
-$ WC "d_bincompat5005='" + perl_d_bincompat + "'"
-$ WC "d_getspnam='" + perl_d_getspnam + "'"
-$ WC "i_shadow='" + perl_i_shadow + "'"
-$ WC "i_socks='" + perl_i_socks + "'"
-$ WC "d_PRIfldbl='" + perl_d_PRIfldbl + "'"
-$ WC "d_PRIgldbl='" + perl_d_PRIgldbl + "'"
-$ WC "d_PRId64='" + perl_d_PRId64 + "'"
-$ WC "d_PRIu64='" + perl_d_PRIu64 + "'"
-$ WC "d_PRIo64='" + perl_d_PRIo64 + "'"
-$ WC "d_PRIx64='" + perl_d_PRIx64 + "'"
-$ WC "sPRIfldbl='" + perl_sPRIfldbl + "'"
-$ WC "sPRIgldbl='" + perl_sPRIgldbl + "'"
-$ WC "sPRId64='" + perl_sPRId64 + "'"
-$ WC "sPRIu64='" + perl_sPRIu64 + "'"
-$ WC "sPRIo64='" + perl_sPRIo64 + "'"
-$ WC "sPRIx64='" + perl_sPRIx64 + "'"
-$ WC "d_llseek='" + perl_d_llseek + "'"
-$ WC "d_iconv='" + perl_d_iconv +"'"
-$ WC "i_iconv='" + perl_i_iconv +"'"
-$ WC "inc_version_list='0'"
-$ WC "inc_version_list_init='0'"
-$ WC "uselargefiles='" + perl_uselargefiles + "'"
-$ WC "uselongdouble='" + perl_uselongdouble + "'"
-$ WC "usemorebits='" + perl_usemorebits + "'"
-$ WC "d_quad='" + perl_d_quad + "'"
-$ WC "quadtype='" + perl_quadtype + "'" 
-$ WC "uquadtype='" + perl_uquadtype + "'" 
-$ WC "quadkind='" + perl_quadkind + "'"
-$ WC "d_fs_data_s='" + perl_d_fs_data_s + "'" 
-$ WC "d_getcwd='" + perl_d_getcwd + "'"
-$ WC "d_getmnt='" + perl_d_getmnt + "'"
-$ WC "d_sqrtl='" + perl_d_sqrtl + "'"
-$ WC "d_statfs_f_flags='" + perl_d_statfs_f_flags + "'"
-$ WC "d_statfs_s='" + perl_d_statfs_s + "'"
-$ WC "d_ustat='" + perl_d_ustat + "'"
-$ WC "d_vendorarch='" + perl_d_vendorarch + "'"
-$ WC "vendorarchexp='" + perl_vendorarchexp + "'"
-$ WC "i_sysstatfs='" + perl_i_sysstatfs + "'"
-$ WC "i_sysvfs='" + perl_i_sysvfs + "'"
-$ WC "i_ustat='" + perl_i_ustat + "'"
-$ WC "ivtype='" + perl_ivtype + "'"
-$ WC "uvtype='" + perl_uvtype + "'"
-$ WC "i8type='" + perl_i8type + "'"
-$ WC "i16type='" + perl_i16type + "'"
-$ WC "u8type='" + perl_u8type + "'"
-$ WC "u16type='" + perl_u16type + "'"
-$ WC "i32type='" + perl_i32type + "'"
-$ WC "u32type='" + perl_u32type + "'"
-$ WC "i64type='" + perl_i64type + "'"
-$ WC "u64type='" + perl_u64type + "'"
-$ WC "nvtype='" + perl_nvtype + "'"
-$ WC "ivsize='" + perl_ivsize + "'"
-$ WC "uvsize='" + perl_uvsize + "'"
-$ WC "i8size='" + perl_i8size + "'"
-$ WC "u8size='" + perl_u8size + "'"
-$ WC "i16size='" + perl_i16size + "'"
-$ WC "u16size='" + perl_u16size + "'"
-$ WC "i32size='" + perl_i32size + "'"
-$ WC "u32size='" + perl_u32size + "'"
-$ WC "i64size='" + perl_i64size + "'"
-$ WC "u64size='" + perl_u64size + "'"
-$ WC "ivdformat='" + perl_ivdformat + "'"
-$ WC "uvuformat='" + perl_uvuformat + "'"
-$ WC "uvoformat='" + perl_uvoformat + "'"
-$ WC "uvxformat='" + perl_uvxformat + "'"
-$ WC "d_vms_case_sensitive_symbols='" + d_vms_be_case_sensitive + "'"
-$ WC "sizesize='" + perl_sizesize + "'"
-$ WC "d_frexpl='" + perl_d_frexpl + "'"
-$ WC "d_isnan='" + perl_d_isnan + "'"
-$ WC "d_isnanl='" + perl_d_isnanl + "'"
-$ WC "d_modfl='" + perl_d_modfl + "'"
-$ WC "d_getprpwnam='" + perl_d_getprpwnam + "'"
-$ WC "d_getespwnam='" + perl_d_getespwnam + "'"
-$ WC "i_prot='" + perl_i_prot + "'"
-$!
-$! ##WRITE NEW CONSTANTS HERE##
-$!
-$ Close CONFIG
-$
-$! Okay, we've gotten here. Build munchconfig and run it
-$ 'Perl_CC' munchconfig.c
-$ If (Needs_Opt.eqs."Yes")
-$ THEN
-$   open/write OPTCHAN []munchconfig.opt
-$   IF ("''using_gnu_c'".eqs."Yes")
-$   THEN
-$     write OPTCHAN "Gnu_CC:[000000]gcclib.olb/library"
-$   endif
-$   write OPTCHAN "Sys$Share:VAXCRTL/Share"
-$   Close OPTCHAN
-$   link munchconfig.obj,munchconfig.opt/opt
-$   delete munchconfig.opt;*
-$ else
-$   link munchconfig.obj
-$ endif
-$ echo ""
-$ echo "Doing variable substitutions on .SH files..."
-$ echo "Extracting config.h (with variable substitutions)"
-$ !
-$ ! we need an fdl file
-$ CREATE [-]CONFIG.FDL
-RECORD
-  FORMAT STREAM_LF
-$ CREATE /FDL=[-]CONFIG.FDL [-]CONFIG.LOCAL
-$ ! First spit out the header info with the local defines (to get
-$ ! around the 255 character command line limit)
-$ OPEN/APPEND CONFIG [-]config.local
-$ IF use_debugging_perl THEN WC "#define DEBUGGING"
-$ IF use_two_pot_malloc THEN WC "#define TWO_POT_OPTIMIZE"
-$ IF mymalloc THEN WC "#define EMBEDMYMALLOC"
-$ IF use_pack_malloc THEN WC "#define PACK_MALLOC"
-$ IF use_debugmalloc THEN WC "#define DEBUGGING_MSTATS"
-$ IF Using_Gnu_C THEN WC "#define GNUC_ATTRIBUTE_CHECK"
-$ IF (Has_Dec_C_Sockets)
-$ THEN
-$    WC "#define VMS_DO_SOCKETS"
-$    WC "#define DECCRTL_SOCKETS"
-$ ELSE
-$    IF Has_Socketshr THEN WC "#define VMS_DO_SOCKETS"
-$ ENDIF
-$! This is VMS-specific for now
-$ WC "#''perl_d_setenv' HAS_SETENV"
-$ IF d_secintgenv THEN WC "#define SECURE_INTERNAL_GETENV"
-$ if d_alwdeftype THEN WC "#define ALWAYS_DEFTYPES"
-$ IF (use64bitint)
-$ THEN
-$    WC "#define USE_64_BIT_INT"
-$    WC "#define USE_LONG_DOUBLE"
-$ ENDIF
-$ IF use64bitall THEN WC "#define USE_64_BIT_ALL"
-$ IF be_case_sensitive THEN WC "#define VMS_WE_ARE_CASE_SENSITIVE"
-$ if perl_d_herrno .eqs. "undef"
-$ THEN
-$    WC "#define NEED_AN_H_ERRNO"
-$ ENDIF
-$ WC "#define HAS_ENVGETENV"
-$ WC "#define PERL_EXTERNAL_GLOB"
-$ CLOSE CONFIG
-$!
-$! Now build the normal config.h
-$ define/user sys$output [-]config.main
-$ mcr []munchconfig [-]config.sh [-]config_h.sh
-$ ! Concatenate them together
-$ copy [-]config.local,[-]config.main [-]config.h
-$! Clean up
-$ DELETE/NOLOG [-]CONFIG.MAIN;*
-$ DELETE/NOLOG [-]CONFIG.LOCAL;*
-$ DELETE/NOLOG [-]CONFIG.FDL;*
-$!
-$ IF Using_Dec_C
-$ THEN
-$   DECC_REPLACE = "DECC=decc=1"
-$ ELSE
-$   DECC_REPLACE = "DECC=" 
-$ ENDIF
-$ IF Using_Gnu_C
-$ THEN
-$   GNUC_REPLACE = "GNUC=gnuc=1"
-$ ELSE
-$   GNUC_REPLACE = "GNUC=" 
-$ ENDIF
-$ IF Has_Dec_C_Sockets
-$ THEN
-$   SOCKET_REPLACE = "SOCKET=DECC_SOCKETS=1"
-$ ELSE
-$   IF Has_Socketshr
-$   THEN
-$     SOCKET_REPLACE = "SOCKET=SOCKETSHR_SOCKETS=1"
-$   ELSE
-$     SOCKET_REPLACE = "SOCKET="
-$   ENDIF
-$ ENDIF
-$ IF (Use_Threads)
-$ THEN
-$   IF (VMS_VER .LES. "6.2")
-$   THEN
-$     THREAD_REPLACE = "THREAD=OLDTHREADED=1"
-$   ELSE
-$     THREAD_REPLACE = "THREAD=THREADED=1"
-$   ENDIF
-$ ELSE
-$   THREAD_REPLACE = "THREAD="
-$ ENDIF
-$ IF mymalloc
-$ THEN
-$   MALLOC_REPLACE = "MALLOC=MALLOC=1"
-$ ELSE
-$   MALLOC_REPLACE = "MALLOC="
-$ ENDIF
-$ echo "Extracting ''defmakefile' (with variable substitutions)"
-$!set ver
-$ define/user sys$output 'UUmakefile 
-$ mcr []munchconfig [-]config.sh descrip_mms.template "''DECC_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" "''SOCKET_REPLACE'" "''THREAD_REPLACE'" -
-"''C_Compiler_Replace'" "''MALLOC_REPLACE'" "''Thread_Live_Dangerously'" "PV=''version'" "FLAGS=FLAGS=''extra_flags'"
-$ echo "Extracting Build_Ext.Com (without variable substitutions)"
-$ Create Sys$Disk:[-]Build_Ext.Com
-$ Deck/Dollar="$EndOfTpl$"
-$!++ Build_Ext.Com
-$!   NOTE: This file is extracted as part of the VMS configuration process.
-$!   Any changes made to it directly will be lost.  If you need to make any
-$!   changes, please edit the template in [.vms]SubConfigure.Com instead.
-$    def = F$Environment("Default")
-$    exts1 = F$Edit(p1,"Compress")
-$    p2 = F$Edit(p2,"Upcase,Compress,Trim")
-$    If F$Locate("MCR ",p2).eq.0 Then p2 = F$Extract(3,255,p2)
-$    miniperl = "$" + F$Search(F$Parse(p2,".Exe"))
-$    makeutil = p3
-$    if f$type('p3') .nes. "" then makeutil = 'p3'
-$    targ = F$Edit(p4,"Lowercase")
-$    i = 0
-$ next_ext:
-$    ext = F$Element(i," ",p1)
-$    If ext .eqs. " " Then Goto done
-$    Define/User Perl_Env_Tables CLISYM_LOCAL
-$    miniperl
-     ($extdir = $ENV{'ext'}) =~ s/::/./g;
-     $extdir =~ s#/#.#g;
-     if ($extdir =~ /^vms/i) { $extdir =~ s/vms/.vms.ext/i; }
-     else                    { $extdir = ".ext.$extdir";   }
-     ($ENV{'extdir'} = "[$extdir]");
-     ($ENV{'up'} = ('-') x ($extdir =~ tr/././));
-$    Set Default &extdir
-$    redesc = 0
-$    If F$Locate("clean",targ) .eqs. F$Length(targ)
-$    Then
-$      Write Sys$Output "Building ''ext' . . ."
-$      On Error Then Goto done
-$      If F$Search("Descrip.MMS") .eqs. ""
-$      Then
-$        redesc = 1
-$      Else
-$        If F$CvTime(F$File("Descrip.MMS","rdt")) .lts. -
-            F$CvTime(F$File("Makefile.PL","rdt")) Then redesc = 1
-$      EndIf
-$    Else
-$      Write Sys$Output "''targ'ing ''ext' . . ."
-$      On Error Then Continue
-$    EndIf
-$    If redesc Then -
-       miniperl "-I[''up'.lib]" Makefile.PL "INST_LIB=[''up'.lib]" "INST_ARCHLIB=[''up'.lib]"
-$    makeutil 'targ'
-$    i = i + 1
-$    Set Def &def
-$    Goto next_ext
-$ done:
-$    sts = $Status
-$    Set Def &def
-$    Exit sts
-$!-- Build_Ext.Com
-$EndOfTpl$
-$
-$! set nover
-$!
-$! Clean up after ourselves
-$ DELETE/NOLOG/NOCONFIRM munchconfig.exe;
-$ DELETE/NOLOG/NOCONFIRM munchconfig.obj;
index b8ede89..7b4ebce 100644 (file)
@@ -19,7 +19,7 @@ $           Write Sys$Error "Can't find test directory"
 $           Exit 44
 $       EndIf
 $   EndIf
-$   Set Message /Facility/Severity/Identification/Text
+$   Set Message /NoFacility/NoSeverity/NoIdentification/NoText
 $
 $   exe = ".Exe"
 $   If p1.nes."" Then exe = p1
@@ -110,7 +110,7 @@ $   Deck/Dollar=$$END-OF-TEST$$
 use Config;
 
 @compexcl=('cpp.t');
-@ioexcl=('argv.t','dup.t','fs.t','pipe.t','openpid.t');
+@ioexcl=('argv.t','dup.t','fs.t','pipe.t');
 @libexcl=('db-btree.t','db-hash.t','db-recno.t',
           'gdbm.t','io_dup.t', 'io_pipe.t', 'io_poll.t', 'io_sel.t',
           'io_sock.t', 'io_unix.t',
@@ -173,7 +173,7 @@ while ($test = shift) {
        } else {
            $switch = '';
        }
-       open(results,"\$ MCR Sys\$Disk:[]Perl. \"-I[-.lib]\" $switch $test |") || (print "can't run.\n");
+       open(results,"\$ MCR Sys\$Disk:[]Perl. \"-I[-.lib]\" $switch $test 2>&1|") || (print "can't run.\n");
     $ok = 0;
     $next = 0;
     $pending_not = 0;
index 40348e0..8fe4f5f 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -1,9 +1,12 @@
 /* vms.c
  *
  * VMS-specific routines for perl5
+ * Version: 5.7.0
  *
- * Last revised: 20-Aug-1999 by Charles Bailey  bailey@newman.upenn.edu
- * Version: 5.5.60
+ * August 2000 tweaks to vms_image_init, my_flush, my_fwrite, cando_by_name, 
+ *             and Perl_cando by Craig Berry
+ * 29-Aug-2000 Charles Lane's piping improvements rolled in
+ * 20-Aug-1999 revisions by Charles Bailey  bailey@newman.upenn.edu
  */
 
 #include <acedef.h>
@@ -14,6 +17,7 @@
 #include <clidef.h>
 #include <climsgdef.h>
 #include <descrip.h>
+#include <devdef.h>
 #include <dvidef.h>
 #include <fibdef.h>
 #include <float.h>
 #  define WARN_INTERNAL WARN_MISC
 #endif
 
+#if defined(__VMS_VER) && __VMS_VER >= 70000000 && __DECC_VER >= 50200000
+#  define RTL_USES_UTC 1
+#endif
+
+
 /* gcc's header files don't #define direct access macros
  * corresponding to VAXC's variant structs */
 #ifdef __GNUC__
@@ -111,6 +120,10 @@ static int no_translate_barewords;
 /* Temp for subprocess commands */
 static struct dsc$descriptor_s VMScmd = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,Nullch};
 
+#ifndef RTL_USES_UTC
+static int tz_updated = 1;
+#endif
+
 /*{{{int vmstrnenv(const char *lnm, char *eqv, unsigned long int idx, struct dsc$descriptor_s **tabvec, unsigned long int flags) */
 int
 Perl_vmstrnenv(pTHX_ const char *lnm, char *eqv, unsigned long int idx,
@@ -691,7 +704,9 @@ vmssetenv(char *lnm, char *eqv, struct dsc$descriptor_s **tabvec)
 void
 Perl_my_setenv(pTHX_ char *lnm,char *eqv)
 {
-  if (lnm && *lnm && strlen(lnm) == 7) {
+  if (lnm && *lnm) {
+    int len = strlen(lnm);
+    if  (len == 7) {
     char uplnm[8];
     int i;
     for (i = 0; lnm[i]; i++) uplnm[i] = _toupper(lnm[i]);
@@ -700,6 +715,17 @@ Perl_my_setenv(pTHX_ char *lnm,char *eqv)
       return;
     }
   }
+#ifndef RTL_USES_UTC
+    if (len == 6 || len == 2) {
+        char uplnm[7];
+        int i;
+        for (i = 0; lnm[i]; i++) uplnm[i] = _toupper(lnm[i]);
+        uplnm[len] = '\0';
+        if (!strcmp(uplnm,"UCX$TZ")) tz_updated = 1;
+        if (!strcmp(uplnm,"TZ")) tz_updated = 1;
+    }
+#endif
+  }
   (void) vmssetenv(lnm,eqv,NULL);
 }
 /*}}}*/
@@ -967,23 +993,40 @@ my_tmpfile(void)
 }
 /*}}}*/
 
+/* default piping mailbox size */
+#define PERL_BUFSIZ        512
+
 
 static void
 create_mbx(unsigned short int *chan, struct dsc$descriptor_s *namdsc)
 {
-  static unsigned long int mbxbufsiz;
-  long int syiitm = SYI$_MAXBUF, dviitm = DVI$_DEVNAM;
+  unsigned long int mbxbufsiz;
+  static unsigned long int syssize = 0;
+  unsigned long int dviitm = DVI$_DEVNAM;
   dTHX;
+  char csize[LNM$C_NAMLENGTH+1];
   
-  if (!mbxbufsiz) {
+  if (!syssize) {
+    unsigned long syiitm = SYI$_MAXBUF;
     /*
-     * Get the SYSGEN parameter MAXBUF, and the smaller of it and the
-     * preprocessor consant BUFSIZ from stdio.h as the size of the
-     * 'pipe' mailbox.
+     * Get the SYSGEN parameter MAXBUF
+     *
+     * If the logical 'PERL_MBX_SIZE' is defined
+     * use the value of the logical instead of PERL_BUFSIZ, but 
+     * keep the size between 128 and MAXBUF.
+     *
      */
-    _ckvmssts(lib$getsyi(&syiitm, &mbxbufsiz, 0, 0, 0, 0));
-    if (mbxbufsiz > BUFSIZ) mbxbufsiz = BUFSIZ; 
+    _ckvmssts(lib$getsyi(&syiitm, &syssize, 0, 0, 0, 0));
+  }
+
+  if (vmstrnenv("PERL_MBX_SIZE", csize, 0, fildev, 0)) {
+      mbxbufsiz = atoi(csize);
+  } else {
+      mbxbufsiz = PERL_BUFSIZ;
   }
+  if (mbxbufsiz < 128) mbxbufsiz = 128;
+  if (mbxbufsiz > syssize) mbxbufsiz = syssize;
+
   _ckvmssts(sys$crembx(0,chan,mbxbufsiz,mbxbufsiz,0,0,0));
 
   _ckvmssts(lib$getdvi(&dviitm, chan, NULL, NULL, namdsc, &namdsc->dsc$w_length));
@@ -991,15 +1034,78 @@ create_mbx(unsigned short int *chan, struct dsc$descriptor_s *namdsc)
 
 }  /* end of create_mbx() */
 
+
 /*{{{  my_popen and my_pclose*/
+
+typedef struct _iosb           IOSB;
+typedef struct _iosb*         pIOSB;
+typedef struct _pipe           Pipe;
+typedef struct _pipe*         pPipe;
+typedef struct pipe_details    Info;
+typedef struct pipe_details*  pInfo;
+typedef struct _srqp            RQE;
+typedef struct _srqp*          pRQE;
+typedef struct _tochildbuf      CBuf;
+typedef struct _tochildbuf*    pCBuf;
+
+struct _iosb {
+    unsigned short status;
+    unsigned short count;
+    unsigned long  dvispec;
+};
+
+#pragma member_alignment save
+#pragma nomember_alignment quadword
+struct _srqp {          /* VMS self-relative queue entry */
+    unsigned long qptr[2];
+};
+#pragma member_alignment restore
+static RQE  RQE_ZERO = {0,0};
+
+struct _tochildbuf {
+    RQE             q;
+    int             eof;
+    unsigned short  size;
+    char            *buf;
+};
+
+struct _pipe {
+    RQE            free;
+    RQE            wait;
+    int            fd_out;
+    unsigned short chan_in;
+    unsigned short chan_out;
+    char          *buf;
+    unsigned int   bufsize;
+    IOSB           iosb;
+    IOSB           iosb2;
+    int           *pipe_done;
+    int            retry;
+    int            type;
+    int            shut_on_empty;
+    int            need_wake;
+    pPipe         *home;
+    pInfo          info;
+    pCBuf          curr;
+    pCBuf          curr2;
+};
+
+
 struct pipe_details
 {
-    struct pipe_details *next;
+    pInfo           next;
     PerlIO *fp;  /* stdio file pointer to pipe mailbox */
     int pid;   /* PID of subprocess */
     int mode;  /* == 'r' if pipe open for reading */
     int done;  /* subprocess has completed */
-    unsigned long int completion;  /* termination status of subprocess */
+    int             closing;        /* my_pclose is closing this pipe */
+    unsigned long   completion;     /* termination status of subprocess */
+    pPipe           in;             /* pipe in to sub */
+    pPipe           out;            /* pipe out of sub */
+    pPipe           err;            /* pipe of sub's sys$error */
+    int             in_done;        /* true when in pipe finished */
+    int             out_done;
+    int             err_done;
 };
 
 struct exit_control_block
@@ -1011,45 +1117,23 @@ struct exit_control_block
     unsigned long int exit_status;
 }; 
 
-static struct pipe_details *open_pipes = NULL;
-static $DESCRIPTOR(nl_desc, "NL:");
-static int waitpid_asleep = 0;
+#define RETRY_DELAY     "0 ::0.20"
+#define MAX_RETRY              50
 
-/* Send an EOF to a mbx.  N.B.  We don't check that fp actually points
- * to a mbx; that's the caller's responsibility.
- */
-static unsigned long int
-pipe_eof(FILE *fp, int immediate)
-{
-  char devnam[NAM$C_MAXRSS+1], *cp;
-  unsigned long int chan, iosb[2], retsts, retsts2;
-  struct dsc$descriptor devdsc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, devnam};
-  dTHX;
+static int pipe_ef = 0;          /* first call to safe_popen inits these*/
+static unsigned long mypid;
+static unsigned long delaytime[2];
+
+static pInfo open_pipes = NULL;
+static $DESCRIPTOR(nl_desc, "NL:");
 
-  if (fgetname(fp,devnam,1)) {
-    /* It oughta be a mailbox, so fgetname should give just the device
-     * name, but just in case . . . */
-    if ((cp = strrchr(devnam,':')) != NULL) *(cp+1) = '\0';
-    devdsc.dsc$w_length = strlen(devnam);
-    _ckvmssts(sys$assign(&devdsc,&chan,0,0));
-    retsts = sys$qiow(0,chan,IO$_WRITEOF|(immediate?IO$M_NOW|IO$M_NORSWAIT:0),
-             iosb,0,0,0,0,0,0,0,0);
-    if (retsts & 1) retsts = iosb[0];
-    retsts2 = sys$dassgn(chan);  /* Be sure to deassign the channel */
-    if (retsts & 1) retsts = retsts2;
-    _ckvmssts(retsts);
-    return retsts;
-  }
-  else _ckvmssts(vaxc$errno);  /* Should never happen */
-  return (unsigned long int) vaxc$errno;
-}
 
 static unsigned long int
 pipe_exit_routine()
 {
-    struct pipe_details *info;
+    pInfo info;
     unsigned long int retsts = SS$_NORMAL, abort = SS$_TIMEOUT;
-    int sts, did_stuff;
+    int sts, did_stuff, need_eof;
     dTHX;
 
     /* 
@@ -1062,11 +1146,12 @@ pipe_exit_routine()
     while (info) {
       int need_eof;
       _ckvmssts(sys$setast(0));
-      need_eof = info->mode != 'r' && !info->done;
-      _ckvmssts(sys$setast(1));
-      if (need_eof) {
-        if (pipe_eof(info->fp, 1) & 1) did_stuff = 1;
+      if (info->in && !info->in->shut_on_empty) {
+        _ckvmssts(sys$qio(0,info->in->chan_in,IO$_WRITEOF,0,0,0,
+                          0, 0, 0, 0, 0, 0));
+        did_stuff = 1;
       }
+      _ckvmssts(sys$setast(1));
       info = info->next;
     }
     if (did_stuff) sleep(1);   /* wait for EOF to have an effect */
@@ -1091,7 +1176,6 @@ pipe_exit_routine()
       if (!info->done) {  /* We tried to be nice . . . */
         sts = sys$delprc(&info->pid,0);
         if (!(sts&1) && sts != SS$_NONEXPR) _ckvmssts(sts); 
-        info->done = 1; /* so my_pclose doesn't try to write EOF */
       }
       _ckvmssts(sys$setast(1));
       info = info->next;
@@ -1108,72 +1192,914 @@ static struct exit_control_block pipe_exitblock =
        {(struct exit_control_block *) 0,
         pipe_exit_routine, 0, &pipe_exitblock.exit_status, 0};
 
+static void pipe_mbxtofd_ast(pPipe p);
+static void pipe_tochild1_ast(pPipe p);
+static void pipe_tochild2_ast(pPipe p);
 
 static void
-popen_completion_ast(struct pipe_details *thispipe)
+popen_completion_ast(pInfo info)
 {
-  thispipe->done = TRUE;
-  if (waitpid_asleep) {
-    waitpid_asleep = 0;
-    sys$wake(0,0);
+  dTHX;
+  pInfo i = open_pipes;
+  int iss;
+
+  while (i) {
+    if (i == info) break;
+    i = i->next;
+  }
+  if (!i) return;       /* unlinked, probably freed too */
+
+  info->completion &= 0x0FFFFFFF; /* strip off "control" field */
+  info->done = TRUE;
+
+/*
+    Writing to subprocess ...
+            if my_pclose'd: EOF already sent, should shutdown chan_in part of pipe
+
+            chan_out may be waiting for "done" flag, or hung waiting
+            for i/o completion to child...cancel the i/o.  This will
+            put it into "snarf mode" (done but no EOF yet) that discards
+            input.
+
+    Output from subprocess (stdout, stderr) needs to be flushed and
+    shut down.   We try sending an EOF, but if the mbx is full the pipe
+    routine should still catch the "shut_on_empty" flag, telling it to
+    use immediate-style reads so that "mbx empty" -> EOF.
+
+
+*/
+  if (info->in && !info->in_done) {               /* only for mode=w */
+        if (info->in->shut_on_empty && info->in->need_wake) {
+            info->in->need_wake = FALSE;
+            _ckvmssts(sys$dclast(pipe_tochild2_ast,info->in,0));
+        } else {
+            _ckvmssts(sys$cancel(info->in->chan_out));
+        }
+  }
+
+  if (info->out && !info->out_done) {             /* were we also piping output? */
+      info->out->shut_on_empty = TRUE;
+      iss = sys$qio(0,info->out->chan_in,IO$_WRITEOF|IO$M_NORSWAIT, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+      if (iss == SS$_MBFULL) iss = SS$_NORMAL;
+      _ckvmssts(iss);
+  }
+
+  if (info->err && !info->err_done) {        /* we were piping stderr */
+        info->err->shut_on_empty = TRUE;
+        iss = sys$qio(0,info->err->chan_in,IO$_WRITEOF|IO$M_NORSWAIT, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+        if (iss == SS$_MBFULL) iss = SS$_NORMAL;
+        _ckvmssts(iss);
   }
+  _ckvmssts(sys$setef(pipe_ef));
+
 }
 
 static unsigned long int setup_cmddsc(char *cmd, int check_img);
 static void vms_execfree(pTHX);
 
+/*
+    we actually differ from vmstrnenv since we use this to
+    get the RMS IFI to check if SYS$OUTPUT and SYS$ERROR *really*
+    are pointing to the same thing
+*/
+
+static unsigned short
+popen_translate(char *logical, char *result)
+{
+    int iss;
+    $DESCRIPTOR(d_table,"LNM$PROCESS_TABLE");
+    $DESCRIPTOR(d_log,"");
+    struct _il3 {
+        unsigned short length;
+        unsigned short code;
+        char *         buffer_addr;
+        unsigned short *retlenaddr;
+    } itmlst[2];
+    unsigned short l, ifi;
+
+    d_log.dsc$a_pointer = logical;
+    d_log.dsc$w_length  = strlen(logical);
+
+    itmlst[0].code = LNM$_STRING;
+    itmlst[0].length = 255;
+    itmlst[0].buffer_addr = result;
+    itmlst[0].retlenaddr = &l;
+
+    itmlst[1].code = 0;
+    itmlst[1].length = 0;
+    itmlst[1].buffer_addr = 0;
+    itmlst[1].retlenaddr = 0;
+
+    iss = sys$trnlnm(0, &d_table, &d_log, 0, itmlst);
+    if (iss == SS$_NOLOGNAM) {
+        iss = SS$_NORMAL;
+        l = 0;
+    }
+    if (!(iss&1)) lib$signal(iss);
+    result[l] = '\0';
+/*
+    logicals for PPFs have a 4 byte prefix  ESC+NUL+(RMS IFI)
+    strip it off and return the ifi, if any
+*/
+    ifi  = 0;
+    if (result[0] == 0x1b && result[1] == 0x00) {
+        memcpy(&ifi,result+2,2);
+        strcpy(result,result+4);
+    }
+    return ifi;     /* this is the RMS internal file id */
+}
+
+#define MAX_DCL_SYMBOL        255
+static void pipe_infromchild_ast(pPipe p);
+
+/*
+    I'm using LIB$(GET|FREE)_VM here so that we can allocate and deallocate
+    inside an AST routine without worrying about reentrancy and which Perl
+    memory allocator is being used.
+
+    We read data and queue up the buffers, then spit them out one at a
+    time to the output mailbox when the output mailbox is ready for one.
+
+*/
+#define INITIAL_TOCHILDQUEUE  2
+
+static pPipe
+pipe_tochild_setup(char *rmbx, char *wmbx)
+{
+    dTHX;
+    pPipe p;
+    pCBuf b;
+    char mbx1[64], mbx2[64];
+    struct dsc$descriptor_s d_mbx1 = {sizeof mbx1, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, mbx1},
+                            d_mbx2 = {sizeof mbx2, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, mbx2};
+    unsigned int dviitm = DVI$_DEVBUFSIZ;
+    int j, n;
+
+    New(1368, p, 1, Pipe);
+
+    create_mbx(&p->chan_in , &d_mbx1);
+    create_mbx(&p->chan_out, &d_mbx2);
+    _ckvmssts(lib$getdvi(&dviitm, &p->chan_in, 0, &p->bufsize));
+
+    p->buf           = 0;
+    p->shut_on_empty = FALSE;
+    p->need_wake     = FALSE;
+    p->type          = 0;
+    p->retry         = 0;
+    p->iosb.status   = SS$_NORMAL;
+    p->iosb2.status  = SS$_NORMAL;
+    p->free          = RQE_ZERO;
+    p->wait          = RQE_ZERO;
+    p->curr          = 0;
+    p->curr2         = 0;
+    p->info          = 0;
+
+    n = sizeof(CBuf) + p->bufsize;
+
+    for (j = 0; j < INITIAL_TOCHILDQUEUE; j++) {
+        _ckvmssts(lib$get_vm(&n, &b));
+        b->buf = (char *) b + sizeof(CBuf);
+        _ckvmssts(lib$insqhi(b, &p->free));
+    }
+
+    pipe_tochild2_ast(p);
+    pipe_tochild1_ast(p);
+    strcpy(wmbx, mbx1);
+    strcpy(rmbx, mbx2);
+    return p;
+}
+
+/*  reads the MBX Perl is writing, and queues */
+
+static void
+pipe_tochild1_ast(pPipe p)
+{
+    dTHX;
+    pCBuf b = p->curr;
+    int iss = p->iosb.status;
+    int eof = (iss == SS$_ENDOFFILE);
+
+    if (p->retry) {
+        if (eof) {
+            p->shut_on_empty = TRUE;
+            b->eof     = TRUE;
+            _ckvmssts(sys$dassgn(p->chan_in));
+        } else  {
+            _ckvmssts(iss);
+        }
+
+        b->eof  = eof;
+        b->size = p->iosb.count;
+        _ckvmssts(lib$insqhi(b, &p->wait));
+        if (p->need_wake) {
+            p->need_wake = FALSE;
+            _ckvmssts(sys$dclast(pipe_tochild2_ast,p,0));
+        }
+    } else {
+        p->retry = 1;   /* initial call */
+    }
+
+    if (eof) {                  /* flush the free queue, return when done */
+        int n = sizeof(CBuf) + p->bufsize;
+        while (1) {
+            iss = lib$remqti(&p->free, &b);
+            if (iss == LIB$_QUEWASEMP) return;
+            _ckvmssts(iss);
+            _ckvmssts(lib$free_vm(&n, &b));
+        }
+    }
+
+    iss = lib$remqti(&p->free, &b);
+    if (iss == LIB$_QUEWASEMP) {
+        int n = sizeof(CBuf) + p->bufsize;
+        _ckvmssts(lib$get_vm(&n, &b));
+        b->buf = (char *) b + sizeof(CBuf);
+    } else {
+       _ckvmssts(iss);
+    }
+
+    p->curr = b;
+    iss = sys$qio(0,p->chan_in,
+             IO$_READVBLK|(p->shut_on_empty ? IO$M_NOWAIT : 0),
+             &p->iosb,
+             pipe_tochild1_ast, p, b->buf, p->bufsize, 0, 0, 0, 0);
+    if (iss == SS$_ENDOFFILE && p->shut_on_empty) iss = SS$_NORMAL;
+    _ckvmssts(iss);
+}
+
+
+/* writes queued buffers to output, waits for each to complete before
+   doing the next */
+
+static void
+pipe_tochild2_ast(pPipe p)
+{
+    dTHX;
+    pCBuf b = p->curr2;
+    int iss = p->iosb2.status;
+    int n = sizeof(CBuf) + p->bufsize;
+    int done = (p->info && p->info->done) ||
+              iss == SS$_CANCEL || iss == SS$_ABORT;
+
+    do {
+        if (p->type) {         /* type=1 has old buffer, dispose */
+            if (p->shut_on_empty) {
+                _ckvmssts(lib$free_vm(&n, &b));
+            } else {
+                _ckvmssts(lib$insqhi(b, &p->free));
+            }
+            p->type = 0;
+        }
+
+        iss = lib$remqti(&p->wait, &b);
+        if (iss == LIB$_QUEWASEMP) {
+            if (p->shut_on_empty) {
+                if (done) {
+                    _ckvmssts(sys$dassgn(p->chan_out));
+                    *p->pipe_done = TRUE;
+                    _ckvmssts(sys$setef(pipe_ef));
+                } else {
+                    _ckvmssts(sys$qio(0,p->chan_out,IO$_WRITEOF,
+                        &p->iosb2, pipe_tochild2_ast, p, 0, 0, 0, 0, 0, 0));
+                }
+                return;
+            }
+            p->need_wake = TRUE;
+            return;
+        }
+        _ckvmssts(iss);
+        p->type = 1;
+    } while (done);
+
+
+    p->curr2 = b;
+    if (b->eof) {
+        _ckvmssts(sys$qio(0,p->chan_out,IO$_WRITEOF,
+            &p->iosb2, pipe_tochild2_ast, p, 0, 0, 0, 0, 0, 0));
+    } else {
+        _ckvmssts(sys$qio(0,p->chan_out,IO$_WRITEVBLK,
+            &p->iosb2, pipe_tochild2_ast, p, b->buf, b->size, 0, 0, 0, 0));
+    }
+
+    return;
+
+}
+
+
+static pPipe
+pipe_infromchild_setup(char *rmbx, char *wmbx)
+{
+    dTHX;
+    pPipe p;
+    char mbx1[64], mbx2[64];
+    struct dsc$descriptor_s d_mbx1 = {sizeof mbx1, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, mbx1},
+                            d_mbx2 = {sizeof mbx2, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, mbx2};
+    unsigned int dviitm = DVI$_DEVBUFSIZ;
+
+    New(1367, p, 1, Pipe);
+    create_mbx(&p->chan_in , &d_mbx1);
+    create_mbx(&p->chan_out, &d_mbx2);
+
+    _ckvmssts(lib$getdvi(&dviitm, &p->chan_in, 0, &p->bufsize));
+    New(1367, p->buf, p->bufsize, char);
+    p->shut_on_empty = FALSE;
+    p->info   = 0;
+    p->type   = 0;
+    p->iosb.status = SS$_NORMAL;
+    pipe_infromchild_ast(p);
+
+    strcpy(wmbx, mbx1);
+    strcpy(rmbx, mbx2);
+    return p;
+}
+
+static void
+pipe_infromchild_ast(pPipe p)
+{
+    dTHX;
+    int iss = p->iosb.status;
+    int eof = (iss == SS$_ENDOFFILE);
+    int myeof = (eof && (p->iosb.dvispec == mypid || p->iosb.dvispec == 0));
+    int kideof = (eof && (p->iosb.dvispec == p->info->pid));
+
+    if (p->info && p->info->closing && p->chan_out)  {           /* output shutdown */
+        _ckvmssts(sys$dassgn(p->chan_out));
+        p->chan_out = 0;
+    }
+
+    /* read completed:
+            input shutdown if EOF from self (done or shut_on_empty)
+            output shutdown if closing flag set (my_pclose)
+            send data/eof from child or eof from self
+            otherwise, re-read (snarf of data from child)
+    */
+
+    if (p->type == 1) {
+        p->type = 0;
+        if (myeof && p->chan_in) {                  /* input shutdown */
+            _ckvmssts(sys$dassgn(p->chan_in));
+            p->chan_in = 0;
+        }
+
+        if (p->chan_out) {
+            if (myeof || kideof) {      /* pass EOF to parent */
+                _ckvmssts(sys$qio(0,p->chan_out,IO$_WRITEOF, &p->iosb,
+                              pipe_infromchild_ast, p,
+                              0, 0, 0, 0, 0, 0));
+                return;
+            } else if (eof) {       /* eat EOF --- fall through to read*/
+
+            } else {                /* transmit data */
+                _ckvmssts(sys$qio(0,p->chan_out,IO$_WRITEVBLK,&p->iosb,
+                              pipe_infromchild_ast,p,
+                              p->buf, p->iosb.count, 0, 0, 0, 0));
+                return;
+            }
+        }
+    }
+
+    /*  everything shut? flag as done */
+
+    if (!p->chan_in && !p->chan_out) {
+        *p->pipe_done = TRUE;
+        _ckvmssts(sys$setef(pipe_ef));
+        return;
+    }
+
+    /* write completed (or read, if snarfing from child)
+            if still have input active,
+               queue read...immediate mode if shut_on_empty so we get EOF if empty
+            otherwise,
+               check if Perl reading, generate EOFs as needed
+    */
+
+    if (p->type == 0) {
+        p->type = 1;
+        if (p->chan_in) {
+            iss = sys$qio(0,p->chan_in,IO$_READVBLK|(p->shut_on_empty ? IO$M_NOW : 0),&p->iosb,
+                          pipe_infromchild_ast,p,
+                          p->buf, p->bufsize, 0, 0, 0, 0);
+            if (p->shut_on_empty && iss == SS$_ENDOFFILE) iss = SS$_NORMAL;
+            _ckvmssts(iss);
+        } else {           /* send EOFs for extra reads */
+            p->iosb.status = SS$_ENDOFFILE;
+            p->iosb.dvispec = 0;
+            _ckvmssts(sys$qio(0,p->chan_out,IO$_SETMODE|IO$M_READATTN,
+                      0, 0, 0,
+                      pipe_infromchild_ast, p, 0, 0, 0, 0));
+        }
+    }
+}
+
+static pPipe
+pipe_mbxtofd_setup(int fd, char *out)
+{
+    dTHX;
+    pPipe p;
+    char mbx[64];
+    unsigned long dviitm = DVI$_DEVBUFSIZ;
+    struct stat s;
+    struct dsc$descriptor_s d_mbx = {sizeof mbx, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, mbx};
+
+    /* things like terminals and mbx's don't need this filter */
+    if (fd && fstat(fd,&s) == 0) {
+        unsigned long dviitm = DVI$_DEVCHAR, devchar;
+        struct dsc$descriptor_s d_dev = {strlen(s.st_dev), DSC$K_DTYPE_T,
+                                         DSC$K_CLASS_S, s.st_dev};
+
+        _ckvmssts(lib$getdvi(&dviitm,0,&d_dev,&devchar,0,0));
+        if (!(devchar & DEV$M_DIR)) {  /* non directory structured...*/
+            strcpy(out, s.st_dev);
+            return 0;
+        }
+    }
+
+    New(1366, p, 1, Pipe);
+    p->fd_out = dup(fd);
+    create_mbx(&p->chan_in, &d_mbx);
+    _ckvmssts(lib$getdvi(&dviitm, &p->chan_in, 0, &p->bufsize));
+    New(1366, p->buf, p->bufsize+1, char);
+    p->shut_on_empty = FALSE;
+    p->retry = 0;
+    p->info  = 0;
+    strcpy(out, mbx);
+
+    _ckvmssts(sys$qio(0, p->chan_in, IO$_READVBLK, &p->iosb,
+                  pipe_mbxtofd_ast, p,
+                  p->buf, p->bufsize, 0, 0, 0, 0));
+
+    return p;
+}
+
+static void
+pipe_mbxtofd_ast(pPipe p)
+{
+    dTHX;
+    int iss = p->iosb.status;
+    int done = p->info->done;
+    int iss2;
+    int eof = (iss == SS$_ENDOFFILE);
+    int myeof = eof && ((p->iosb.dvispec == mypid)||(p->iosb.dvispec == 0));
+    int err = !(iss&1) && !eof;
+
+
+    if (done && myeof) {               /* end piping */
+        close(p->fd_out);
+        sys$dassgn(p->chan_in);
+        *p->pipe_done = TRUE;
+        _ckvmssts(sys$setef(pipe_ef));
+        return;
+    }
+
+    if (!err && !eof) {             /* good data to send to file */
+        p->buf[p->iosb.count] = '\n';
+        iss2 = write(p->fd_out, p->buf, p->iosb.count+1);
+        if (iss2 < 0) {
+            p->retry++;
+            if (p->retry < MAX_RETRY) {
+                _ckvmssts(sys$setimr(0,delaytime,pipe_mbxtofd_ast,p));
+                return;
+            }
+        }
+        p->retry = 0;
+    } else if (err) {
+        _ckvmssts(iss);
+    }
+
+
+    iss = sys$qio(0, p->chan_in, IO$_READVBLK|(p->shut_on_empty ? IO$M_NOW : 0), &p->iosb,
+          pipe_mbxtofd_ast, p,
+          p->buf, p->bufsize, 0, 0, 0, 0);
+    if (p->shut_on_empty && (iss == SS$_ENDOFFILE)) iss = SS$_NORMAL;
+    _ckvmssts(iss);
+}
+
+
+typedef struct _pipeloc     PLOC;
+typedef struct _pipeloc*   pPLOC;
+
+struct _pipeloc {
+    pPLOC   next;
+    char    dir[NAM$C_MAXRSS+1];
+};
+static pPLOC  head_PLOC = 0;
+
+
+static void
+store_pipelocs()
+{
+    int    i;
+    pPLOC  p;
+    AV    *av = GvAVn(PL_incgv);
+    SV    *dirsv;
+    GV    *gv;
+    char  *dir, *x;
+    char  *unixdir;
+    char  temp[NAM$C_MAXRSS+1];
+    STRLEN n_a;
+
+/*  the . directory from @INC comes last */
+
+    New(1370,p,1,PLOC);
+    p->next = head_PLOC;
+    head_PLOC = p;
+    strcpy(p->dir,"./");
+
+/*  get the directory from $^X */
+
+    if (PL_origargv && PL_origargv[0]) {    /* maybe nul if embedded Perl */
+        strcpy(temp, PL_origargv[0]);
+        x = strrchr(temp,']');
+        if (x) x[1] = '\0';
+
+        if ((unixdir = tounixpath(temp, Nullch)) != Nullch) {
+            New(1370,p,1,PLOC);
+            p->next = head_PLOC;
+            head_PLOC = p;
+            strncpy(p->dir,unixdir,sizeof(p->dir)-1);
+            p->dir[NAM$C_MAXRSS] = '\0';
+        }
+    }
+
+/*  reverse order of @INC entries, skip "." since entered above */
+
+    for (i = 0; i <= AvFILL(av); i++) {
+        dirsv = *av_fetch(av,i,TRUE);
+
+        if (SvROK(dirsv)) continue;
+        dir = SvPVx(dirsv,n_a);
+        if (strcmp(dir,".") == 0) continue;
+        if ((unixdir = tounixpath(dir, Nullch)) == Nullch)
+            continue;
+
+        New(1370,p,1,PLOC);
+        p->next = head_PLOC;
+        head_PLOC = p;
+        strncpy(p->dir,unixdir,sizeof(p->dir)-1);
+        p->dir[NAM$C_MAXRSS] = '\0';
+    }
+
+/* most likely spot (ARCHLIB) put first in the list */
+
+#ifdef ARCHLIB_EXP
+    if ((unixdir = tounixpath(ARCHLIB_EXP, Nullch)) != Nullch) {
+        New(1370,p,1,PLOC);
+        p->next = head_PLOC;
+        head_PLOC = p;
+        strncpy(p->dir,unixdir,sizeof(p->dir)-1);
+        p->dir[NAM$C_MAXRSS] = '\0';
+    }
+#endif
+
+}
+
+
+static char *
+find_vmspipe(void)
+{
+    static int   vmspipe_file_status = 0;
+    static char  vmspipe_file[NAM$C_MAXRSS+1];
+
+    /* already found? Check and use ... need read+execute permission */
+
+    if (vmspipe_file_status == 1) {
+        if (cando_by_name(S_IRUSR, 0, vmspipe_file)
+         && cando_by_name(S_IXUSR, 0, vmspipe_file)) {
+            return vmspipe_file;
+        }
+        vmspipe_file_status = 0;
+    }
+
+    /* scan through stored @INC, $^X */
+
+    if (vmspipe_file_status == 0) {
+        char file[NAM$C_MAXRSS+1];
+        pPLOC  p = head_PLOC;
+
+        while (p) {
+            strcpy(file, p->dir);
+            strncat(file, "vmspipe.com",NAM$C_MAXRSS);
+            file[NAM$C_MAXRSS] = '\0';
+            p = p->next;
+
+            if (!do_tovmsspec(file,vmspipe_file,0)) continue;
+
+            if (cando_by_name(S_IRUSR, 0, vmspipe_file)
+             && cando_by_name(S_IXUSR, 0, vmspipe_file)) {
+                vmspipe_file_status = 1;
+                return vmspipe_file;
+            }
+        }
+        vmspipe_file_status = -1;   /* failed, use tempfiles */
+    }
+
+    return 0;
+}
+
+static FILE *
+vmspipe_tempfile(void)
+{
+    char file[NAM$C_MAXRSS+1];
+    FILE *fp;
+    static int index = 0;
+    stat_t s0, s1;
+
+    /* create a tempfile */
+
+    /* we can't go from   W, shr=get to  R, shr=get without
+       an intermediate vulnerable state, so don't bother trying...
+
+       and lib$spawn doesn't shr=put, so have to close the write
+
+       So... match up the creation date/time and the FID to
+       make sure we're dealing with the same file
+
+    */
+
+    index++;
+    sprintf(file,"sys$scratch:perlpipe_%08.8x_%d.com",mypid,index);
+    fp = fopen(file,"w");
+    if (!fp) {
+        sprintf(file,"sys$login:perlpipe_%08.8x_%d.com",mypid,index);
+        fp = fopen(file,"w");
+        if (!fp) {
+            sprintf(file,"sys$disk:[]perlpipe_%08.8x_%d.com",mypid,index);
+            fp = fopen(file,"w");
+        }
+    }
+    if (!fp) return 0;  /* we're hosed */
+
+    fprintf(fp,"$! 'f$verify(0)\n");
+    fprintf(fp,"$!  ---  protect against nonstandard definitions ---\n");
+    fprintf(fp,"$ perl_cfile  = f$environment(\"procedure\")\n");
+    fprintf(fp,"$ perl_define = \"define/nolog\"\n");
+    fprintf(fp,"$ perl_on     = \"set noon\"\n");
+    fprintf(fp,"$ perl_exit   = \"exit\"\n");
+    fprintf(fp,"$ perl_del    = \"delete\"\n");
+    fprintf(fp,"$ pif         = \"if\"\n");
+    fprintf(fp,"$!  --- define i/o redirection (sys$output set by lib$spawn)\n");
+    fprintf(fp,"$ pif perl_popen_in  .nes. \"\" then perl_define sys$input  'perl_popen_in'\n");
+    fprintf(fp,"$ pif perl_popen_err .nes. \"\" then perl_define sys$error  'perl_popen_err'\n");
+    fprintf(fp,"$ cmd = perl_popen_cmd\n");
+    fprintf(fp,"$!  --- get rid of global symbols\n");
+    fprintf(fp,"$ perl_del/symbol/global perl_popen_in\n");
+    fprintf(fp,"$ perl_del/symbol/global perl_popen_err\n");
+    fprintf(fp,"$ perl_del/symbol/global perl_popen_cmd\n");
+    fprintf(fp,"$ perl_on\n");
+    fprintf(fp,"$ 'cmd\n");
+    fprintf(fp,"$ perl_status = $STATUS\n");
+    fprintf(fp,"$ perl_del 'perl_cfile'\n");
+    fprintf(fp,"$ perl_exit 'perl_status'\n");
+    fsync(fileno(fp));
+
+    fgetname(fp, file, 1);
+    fstat(fileno(fp), &s0);
+    fclose(fp);
+
+    fp = fopen(file,"r","shr=get");
+    if (!fp) return 0;
+    fstat(fileno(fp), &s1);
+
+    if (s0.st_ino[0] != s1.st_ino[0] ||
+        s0.st_ino[1] != s1.st_ino[1] ||
+        s0.st_ino[2] != s1.st_ino[2] ||
+        s0.st_ctime  != s1.st_ctime  )  {
+        fclose(fp);
+        return 0;
+    }
+
+    return fp;
+}
+
+
+
 static PerlIO *
 safe_popen(char *cmd, char *mode)
 {
+    dTHX;
     static int handler_set_up = FALSE;
-    char mbxname[64];
-    unsigned short int chan;
     unsigned long int sts, flags=1;  /* nowait - gnu c doesn't allow &1 */
-    dTHX;
-    struct pipe_details *info;
-    struct dsc$descriptor_s namdsc = {sizeof mbxname, DSC$K_DTYPE_T,
-                                      DSC$K_CLASS_S, mbxname},
-                            cmddsc = {0, DSC$K_DTYPE_T,
+    unsigned int table = LIB$K_CLI_GLOBAL_SYM;
+    char *p, symbol[MAX_DCL_SYMBOL+1], *vmspipe;
+    char in[512], out[512], err[512], mbx[512];
+    FILE *tpipe = 0;
+    char tfilebuf[NAM$C_MAXRSS+1];
+    pInfo info;
+    struct dsc$descriptor_s d_symbol= {0, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, symbol};
+    struct dsc$descriptor_s d_out = {0, DSC$K_DTYPE_T,
+                                      DSC$K_CLASS_S, out};
+    struct dsc$descriptor_s vmspipedsc = {0, DSC$K_DTYPE_T,
                                       DSC$K_CLASS_S, 0};
+    $DESCRIPTOR(d_sym_cmd,"PERL_POPEN_CMD");
+    $DESCRIPTOR(d_sym_in ,"PERL_POPEN_IN");
+    $DESCRIPTOR(d_sym_err,"PERL_POPEN_ERR");
                             
+    /* once-per-program initialization...
+       note that the SETAST calls and the dual test of pipe_ef
+       makes sure that only the FIRST thread through here does
+       the initialization...all other threads wait until it's
+       done.
+
+       Yeah, uglier than a pthread call, it's got all the stuff inline
+       rather than in a separate routine.
+    */
+
+    if (!pipe_ef) {
+        _ckvmssts(sys$setast(0));
+        if (!pipe_ef) {
+            unsigned long int pidcode = JPI$_PID;
+            $DESCRIPTOR(d_delay, RETRY_DELAY);
+            _ckvmssts(lib$get_ef(&pipe_ef));
+            _ckvmssts(lib$getjpi(&pidcode,0,0,&mypid,0,0));
+            _ckvmssts(sys$bintim(&d_delay, delaytime));
+        }
+        if (!handler_set_up) {
+          _ckvmssts(sys$dclexh(&pipe_exitblock));
+          handler_set_up = TRUE;
+        }
+        _ckvmssts(sys$setast(1));
+    }
+
+    /* see if we can find a VMSPIPE.COM */
+
+    tfilebuf[0] = '@';
+    vmspipe = find_vmspipe();
+    if (vmspipe) {
+        strcpy(tfilebuf+1,vmspipe);
+    } else {        /* uh, oh...we're in tempfile hell */
+        tpipe = vmspipe_tempfile();
+        if (!tpipe) {       /* a fish popular in Boston */
+            if (ckWARN(WARN_PIPE)) {
+                Perl_warner(aTHX_ WARN_PIPE,"unable to find VMSPIPE.COM for i/o piping");
+            }
+        return Nullfp;
+        }
+        fgetname(tpipe,tfilebuf+1,1);
+    }
+    vmspipedsc.dsc$a_pointer = tfilebuf;
+    vmspipedsc.dsc$w_length  = strlen(tfilebuf);
 
     if (!(setup_cmddsc(cmd,0) & 1)) { set_errno(EINVAL); return Nullfp; }
-    New(1301,info,1,struct pipe_details);
+    New(1301,info,1,Info);
+        
+    info->mode = *mode;
+    info->done = FALSE;
+    info->completion = 0;
+    info->closing    = FALSE;
+    info->in         = 0;
+    info->out        = 0;
+    info->err        = 0;
+    info->in_done    = TRUE;
+    info->out_done   = TRUE;
+    info->err_done   = TRUE;
+
+    if (*mode == 'r') {             /* piping from subroutine */
+        in[0] = '\0';
+
+        info->out = pipe_infromchild_setup(mbx,out);
+        if (info->out) {
+            info->out->pipe_done = &info->out_done;
+            info->out_done = FALSE;
+            info->out->info = info;
+        }
+        info->fp  = PerlIO_open(mbx, mode);
+        if (!info->fp && info->out) {
+            sys$cancel(info->out->chan_out);
+        
+            while (!info->out_done) {
+                int done;
+                _ckvmssts(sys$setast(0));
+                done = info->out_done;
+                if (!done) _ckvmssts(sys$clref(pipe_ef));
+                _ckvmssts(sys$setast(1));
+                if (!done) _ckvmssts(sys$waitfr(pipe_ef));
+    }
+
+            if (info->out->buf) Safefree(info->out->buf);
+            Safefree(info->out);
+            Safefree(info);
+            return Nullfp;
+    }
+
+        info->err = pipe_mbxtofd_setup(fileno(stderr), err);
+        if (info->err) {
+            info->err->pipe_done = &info->err_done;
+            info->err_done = FALSE;
+            info->err->info = info;
+        }
 
-    /* create mailbox */
-    create_mbx(&chan,&namdsc);
+    } else {                        /* piping to subroutine , mode=w*/
+        int melded;
 
-    /* open a FILE* onto it */
-    info->fp = PerlIO_open(mbxname, mode);
+        info->in = pipe_tochild_setup(in,mbx);
+        info->fp  = PerlIO_open(mbx, mode);
+        if (info->in) {
+            info->in->pipe_done = &info->in_done;
+            info->in_done = FALSE;
+            info->in->info = info;
+        }
 
-    /* give up other channel onto it */
-    _ckvmssts(sys$dassgn(chan));
+        /* error cleanup */
+        if (!info->fp && info->in) {
+            info->done = TRUE;
+            _ckvmssts(sys$qiow(0,info->in->chan_in, IO$_WRITEOF, 0,
+                              0, 0, 0, 0, 0, 0, 0, 0));
+
+            while (!info->in_done) {
+                int done;
+                _ckvmssts(sys$setast(0));
+                done = info->in_done;
+                if (!done) _ckvmssts(sys$clref(pipe_ef));
+                _ckvmssts(sys$setast(1));
+                if (!done) _ckvmssts(sys$waitfr(pipe_ef));
+            }
 
-    if (!info->fp)
+            if (info->in->buf) Safefree(info->in->buf);
+            Safefree(info->in);
+            Safefree(info);
         return Nullfp;
+        }
         
-    info->mode = *mode;
-    info->done = FALSE;
-    info->completion=0;
+        /* if SYS$ERROR == SYS$OUTPUT, use only one mbx */
         
-    if (*mode == 'r') {
-      _ckvmssts(lib$spawn(&VMScmd, &nl_desc, &namdsc, &flags,
-                     0  /* name */, &info->pid, &info->completion,
-                     0, popen_completion_ast,info,0,0,0));
+        melded = FALSE;
+        fgetname(stderr, err);
+        if (strncmp(err,"SYS$ERROR:",10) == 0) {
+            fgetname(stdout, out);
+            if (strncmp(out,"SYS$OUTPUT:",11) == 0) {
+                if (popen_translate("SYS$OUTPUT",out) == popen_translate("SYS$ERROR",err)) {
+                    melded = TRUE;
+                }
+    }
+    }
+
+        info->out = pipe_mbxtofd_setup(fileno(stdout), out);
+        if (info->out) {
+            info->out->pipe_done = &info->out_done;
+            info->out_done = FALSE;
+            info->out->info = info;
+        }
+        if (!melded) {
+            info->err = pipe_mbxtofd_setup(fileno(stderr), err);
+            if (info->err) {
+                info->err->pipe_done = &info->err_done;
+                info->err_done = FALSE;
+                info->err->info = info;
     }
-    else {
-      _ckvmssts(lib$spawn(&VMScmd, &namdsc, 0 /* sys$output */, &flags,
-                     0  /* name */, &info->pid, &info->completion,
-                     0, popen_completion_ast,info,0,0,0));
+        } else {
+            err[0] = '\0';
     }
-
-    vms_execfree(aTHX);
-    if (!handler_set_up) {
-      _ckvmssts(sys$dclexh(&pipe_exitblock));
-      handler_set_up = TRUE;
     }
+    d_out.dsc$w_length = strlen(out);   /* lib$spawn sets SYS$OUTPUT so can meld*/
+
+    symbol[MAX_DCL_SYMBOL] = '\0';
+
+    strncpy(symbol, in, MAX_DCL_SYMBOL);
+    d_symbol.dsc$w_length = strlen(symbol);
+    _ckvmssts(lib$set_symbol(&d_sym_in, &d_symbol, &table));
+
+    strncpy(symbol, err, MAX_DCL_SYMBOL);
+    d_symbol.dsc$w_length = strlen(symbol);
+    _ckvmssts(lib$set_symbol(&d_sym_err, &d_symbol, &table));
+
+
+    p = VMScmd.dsc$a_pointer;
+    while (*p && *p != '\n') p++;
+    *p = '\0';                                  /* truncate on \n */
+    p = VMScmd.dsc$a_pointer;
+    while (*p == ' ' || *p == '\t') p++;        /* remove leading whitespace */
+    if (*p == '$') p++;                         /* remove leading $ */
+    while (*p == ' ' || *p == '\t') p++;
+    strncpy(symbol, p, MAX_DCL_SYMBOL);
+    d_symbol.dsc$w_length = strlen(symbol);
+    _ckvmssts(lib$set_symbol(&d_sym_cmd, &d_symbol, &table));
+
+    _ckvmssts(sys$setast(0));
     info->next=open_pipes;  /* prepend to list */
     open_pipes=info;
+    _ckvmssts(sys$setast(1));
+    _ckvmssts(lib$spawn(&vmspipedsc, &nl_desc, &d_out, &flags,
+                      0, &info->pid, &info->completion,
+                      0, popen_completion_ast,info,0,0,0));
+
+    /* if we were using a tempfile, close it now */
+
+    if (tpipe) fclose(tpipe);
+
+    /* once the subprocess is spawned, its copied the symbols and
+       we can get rid of ours */
+
+    _ckvmssts(lib$delete_symbol(&d_sym_cmd, &table));
+    _ckvmssts(lib$delete_symbol(&d_sym_in,  &table));
+    _ckvmssts(lib$delete_symbol(&d_sym_err, &table));
+
+    vms_execfree(aTHX);
         
     PL_forkprocess = info->pid;
     return info->fp;
@@ -1195,9 +2121,10 @@ Perl_my_popen(pTHX_ char *cmd, char *mode)
 /*{{{  I32 my_pclose(FILE *fp)*/
 I32 Perl_my_pclose(pTHX_ FILE *fp)
 {
-    struct pipe_details *info, *last = NULL;
+    dTHX;
+    pInfo info, last = NULL;
     unsigned long int retsts;
-    int need_eof;
+    int done, iss;
     
     for (info = open_pipes; info != NULL; last = info, info = info->next)
         if (info->fp == fp) break;
@@ -1210,21 +2137,67 @@ I32 Perl_my_pclose(pTHX_ FILE *fp)
 
     /* If we were writing to a subprocess, insure that someone reading from
      * the mailbox gets an EOF.  It looks like a simple fclose() doesn't
-     * produce an EOF record in the mailbox.  */
+     * produce an EOF record in the mailbox.
+     *
+     *  well, at least sometimes it *does*, so we have to watch out for
+     *  the first EOF closing the pipe (and DASSGN'ing the channel)...
+     */
+
+     fsync(fileno(info->fp));   /* first, flush data */
+
     _ckvmssts(sys$setast(0));
-    need_eof = info->mode != 'r' && !info->done;
+     info->closing = TRUE;
+     done = info->done && info->in_done && info->out_done && info->err_done;
+     /* hanging on write to Perl's input? cancel it */
+     if (info->mode == 'r' && info->out && !info->out_done) {
+        if (info->out->chan_out) {
+            _ckvmssts(sys$cancel(info->out->chan_out));
+            if (!info->out->chan_in) {   /* EOF generation, need AST */
+                _ckvmssts(sys$dclast(pipe_infromchild_ast,info->out,0));
+            }
+        }
+     }
+     if (info->in && !info->in_done && !info->in->shut_on_empty)  /* EOF if hasn't had one yet */
+         _ckvmssts(sys$qio(0,info->in->chan_in,IO$_WRITEOF,0,0,0,
+                           0, 0, 0, 0, 0, 0));
     _ckvmssts(sys$setast(1));
-    if (need_eof) pipe_eof(info->fp,0);
     PerlIO_close(info->fp);
 
-    if (info->done) retsts = info->completion;
-    else waitpid(info->pid,(int *) &retsts,0);
+     /*
+        we have to wait until subprocess completes, but ALSO wait until all
+        the i/o completes...otherwise we'll be freeing the "info" structure
+        that the i/o ASTs could still be using...
+     */
+
+     while (!done) {
+         _ckvmssts(sys$setast(0));
+         done = info->done && info->in_done && info->out_done && info->err_done;
+         if (!done) _ckvmssts(sys$clref(pipe_ef));
+         _ckvmssts(sys$setast(1));
+         if (!done) _ckvmssts(sys$waitfr(pipe_ef));
+     }
+     retsts = info->completion;
 
     /* remove from list of open pipes */
     _ckvmssts(sys$setast(0));
     if (last) last->next = info->next;
     else open_pipes = info->next;
     _ckvmssts(sys$setast(1));
+
+    /* free buffers and structures */
+
+    if (info->in) {
+        if (info->in->buf) Safefree(info->in->buf);
+        Safefree(info->in);
+    }
+    if (info->out) {
+        if (info->out->buf) Safefree(info->out->buf);
+        Safefree(info->out);
+    }
+    if (info->err) {
+        if (info->err->buf) Safefree(info->err->buf);
+        Safefree(info->err);
+    }
     Safefree(info);
 
     return retsts;
@@ -1236,7 +2209,8 @@ I32 Perl_my_pclose(pTHX_ FILE *fp)
 Pid_t
 my_waitpid(Pid_t pid, int *statusp, int flags)
 {
-    struct pipe_details *info;
+    pInfo info;
+    int done;
     dTHX;
     
     for (info = open_pipes; info != NULL; info = info->next)
@@ -1244,8 +2218,11 @@ my_waitpid(Pid_t pid, int *statusp, int flags)
 
     if (info != NULL) {  /* we know about this child */
       while (!info->done) {
-        waitpid_asleep = 1;
-        sys$hiber();
+          _ckvmssts(sys$setast(0));
+          done = info->done;
+          if (!done) _ckvmssts(sys$clref(pipe_ef));
+          _ckvmssts(sys$setast(1));
+          if (!done) _ckvmssts(sys$waitfr(pipe_ef));
       }
 
       *statusp = info->completion;
@@ -1268,6 +2245,7 @@ my_waitpid(Pid_t pid, int *statusp, int flags)
         _ckvmssts(sys$schdwk(0,0,interval,0));
         _ckvmssts(sys$hiber());
       }
+      if (sts == SS$_NONEXPR) sts = SS$_NORMAL;
       _ckvmssts(sts);
 
       /* There's no easy way to find the termination status a child we're
@@ -2900,7 +3878,16 @@ vms_image_init(int *argcp, char ***argvp)
        * buffer much larger than $GETJPI wants (rsz is size in bytes that
        * were needed to hold all identifiers at time of last call; we'll
        * allocate that many unsigned long ints), and go back and get 'em.
+       * If it gave us less than it wanted to despite ample buffer space, 
+       * something's broken.  Is your system missing a system identifier?
        */
+      if (rsz <= jpilist[1].buflen) { 
+         /* Perl_croak accvios when used this early in startup. */
+         fprintf(stderr, "vms_image_init: $getjpiw refuses to store RIGHTSLIST of %u bytes in buffer of %u bytes.\n%s", 
+                         rsz, (unsigned long) jpilist[1].buflen,
+                         "Check your rights database for corruption.\n");
+         exit(SS$_ABORT);
+      }
       if (jpilist[1].bufadr != rlst) Safefree(jpilist[1].bufadr);
       jpilist[1].bufadr = New(1320,mask,rsz,unsigned long int);
       jpilist[1].buflen = rsz * sizeof(unsigned long int);
@@ -2966,7 +3953,7 @@ vms_image_init(int *argcp, char ***argvp)
   if (tabidx) { tabvec[tabidx] = NULL; env_tables = tabvec; }
 
   getredirection(argcp,argvp);
-#if defined(USE_THREADS) && defined(__DECC)
+#if defined(USE_THREADS) && ( defined(__DECC) || defined(__DECCXX) )
   {
 # include <reentrancy.h>
   (void) decc$set_reentrancy(C$C_MULTITHREAD);
@@ -3731,24 +4718,37 @@ do_spawn(char *cmd)
 /* 
  * A simple fwrite replacement which outputs itmsz*nitm chars without
  * introducing record boundaries every itmsz chars.
+ * We are using fputs, which depends on a terminating null.  We may
+ * well be writing binary data, so we need to accommodate not only
+ * data with nulls sprinkled in the middle but also data with no null 
+ * byte at the end.
  */
 /*{{{ int my_fwrite(void *src, size_t itmsz, size_t nitm, FILE *dest)*/
 int
 my_fwrite(void *src, size_t itmsz, size_t nitm, FILE *dest)
 {
-  register char *cp, *end;
+  register char *cp, *end, *cpd, *data;
+  int retval;
+  int bufsize = itmsz*nitm+1;
+
+  _ckvmssts_noperl(lib$get_vm( &bufsize, &data ));
+  memcpy( data, src, itmsz*nitm );
+  data[itmsz*nitm] = '\0';
 
-  end = (char *)src + itmsz * nitm;
+  end = data + itmsz * nitm;
+  retval = (int) nitm; /* on success return # items written */
 
-  while ((char *)src <= end) {
-    for (cp = src; cp <= end; cp++) if (!*cp) break;
-    if (fputs(src,dest) == EOF) return EOF;
+  cpd = data;
+  while (cpd <= end) {
+    for (cp = cpd; cp <= end; cp++) if (!*cp) break;
+    if (fputs(cpd,dest) == EOF) { retval = EOF; break; }
     if (cp < end)
-      if (fputc('\0',dest) == EOF) return EOF;
-    src = cp + 1;
+      if (fputc('\0',dest) == EOF) { retval = EOF; break; }
+    cpd = cp + 1;
   }
 
-  return 1;
+  if (data) _ckvmssts_noperl(lib$free_vm( &bufsize, &data ));
+  return retval;
 
 }  /* end of my_fwrite() */
 /*}}}*/
@@ -3765,6 +4765,13 @@ my_flush(FILE *fp)
 #endif
            res = fsync(fileno(fp));
     }
+/*
+ * If the flush succeeded but set end-of-file, we need to clear
+ * the error because our caller may check ferror().  BTW, this 
+ * probably means we just flushed an empty file.
+ */
+    if (res == 0 && vaxc$errno == RMS$_EOF) clearerr(fp);
+
     return res;
 }
 /*}}}*/
@@ -4144,9 +5151,6 @@ static long int utc_offset_secs;
 #undef localtime
 #undef time
 
-#if defined(__VMS_VER) && __VMS_VER >= 70000000 && __DECC_VER >= 50200000
-#  define RTL_USES_UTC 1
-#endif
 
 /*
  * DEC C previous to 6.0 corrupts the behavior of the /prefix
@@ -4195,6 +5199,289 @@ static time_t toloc_dst(time_t utc) {
        (gmtime_emulation_type == 1 ? toloc_dst(secs) : \
        ((secs) + utc_offset_secs))))
 
+#ifndef RTL_USES_UTC
+/*
+  
+    ucx$tz = "EST5EDT4,M4.1.0,M10.5.0"  typical 
+        DST starts on 1st sun of april      at 02:00  std time
+            ends on last sun of october     at 02:00  dst time
+    see the UCX management command reference, SET CONFIG TIMEZONE
+    for formatting info.
+
+    No, it's not as general as it should be, but then again, NOTHING
+    will handle UK times in a sensible way. 
+*/
+
+
+/* 
+    parse the DST start/end info:
+    (Jddd|ddd|Mmon.nth.dow)[/hh:mm:ss]
+*/
+
+static char *
+tz_parse_startend(char *s, struct tm *w, int *past)
+{
+    int dinm[] = {31,28,31,30,31,30,31,31,30,31,30,31};
+    int ly, dozjd, d, m, n, hour, min, sec, j, k;
+    time_t g;
+
+    if (!s)    return 0;
+    if (!w) return 0;
+    if (!past) return 0;
+
+    ly = 0;
+    if (w->tm_year % 4        == 0) ly = 1;
+    if (w->tm_year % 100      == 0) ly = 0;
+    if (w->tm_year+1900 % 400 == 0) ly = 1;
+    if (ly) dinm[1]++;
+
+    dozjd = isdigit(*s);
+    if (*s == 'J' || *s == 'j' || dozjd) {
+        if (!dozjd && !isdigit(*++s)) return 0;
+        d = *s++ - '0';
+        if (isdigit(*s)) {
+            d = d*10 + *s++ - '0';
+            if (isdigit(*s)) {
+                d = d*10 + *s++ - '0';
+            }
+        }
+        if (d == 0) return 0;
+        if (d > 366) return 0;
+        d--;
+        if (!dozjd && d > 58 && ly) d++;  /* after 28 feb */
+        g = d * 86400;
+        dozjd = 1;
+    } else if (*s == 'M' || *s == 'm') {
+        if (!isdigit(*++s)) return 0;
+        m = *s++ - '0';
+        if (isdigit(*s)) m = 10*m + *s++ - '0';
+        if (*s != '.') return 0;
+        if (!isdigit(*++s)) return 0;
+        n = *s++ - '0';
+        if (n < 1 || n > 5) return 0;
+        if (*s != '.') return 0;
+        if (!isdigit(*++s)) return 0;
+        d = *s++ - '0';
+        if (d > 6) return 0;
+    }
+
+    if (*s == '/') {
+        if (!isdigit(*++s)) return 0;
+        hour = *s++ - '0';
+        if (isdigit(*s)) hour = 10*hour + *s++ - '0';
+        if (*s == ':') {
+            if (!isdigit(*++s)) return 0;
+            min = *s++ - '0';
+            if (isdigit(*s)) min = 10*min + *s++ - '0';
+            if (*s == ':') {
+                if (!isdigit(*++s)) return 0;
+                sec = *s++ - '0';
+                if (isdigit(*s)) sec = 10*sec + *s++ - '0';
+            }
+        }
+    } else {
+        hour = 2;
+        min = 0;
+        sec = 0;
+    }
+
+    if (dozjd) {
+        if (w->tm_yday < d) goto before;
+        if (w->tm_yday > d) goto after;
+    } else {
+        if (w->tm_mon+1 < m) goto before;
+        if (w->tm_mon+1 > m) goto after;
+
+        j = (42 + w->tm_wday - w->tm_mday)%7;   /*dow of mday 0 */
+        k = d - j; /* mday of first d */
+        if (k <= 0) k += 7;
+        k += 7 * ((n>4?4:n)-1);  /* mday of n'th d */
+        if (n == 5 && k+7 <= dinm[w->tm_mon]) k += 7;
+        if (w->tm_mday < k) goto before;
+        if (w->tm_mday > k) goto after;
+    }
+
+    if (w->tm_hour < hour) goto before;
+    if (w->tm_hour > hour) goto after;
+    if (w->tm_min  < min)  goto before;
+    if (w->tm_min  > min)  goto after;
+    if (w->tm_sec  < sec)  goto before;
+    goto after;
+
+before:
+    *past = 0;
+    return s;
+after:
+    *past = 1;
+    return s;
+}
+
+
+
+
+/*  parse the offset:   (+|-)hh[:mm[:ss]]  */
+
+static char *
+tz_parse_offset(char *s, int *offset)
+{
+    int hour = 0, min = 0, sec = 0;
+    int neg = 0;
+    if (!s) return 0;
+    if (!offset) return 0;
+
+    if (*s == '-') {neg++; s++;}
+    if (*s == '+') s++;
+    if (!isdigit(*s)) return 0;
+    hour = *s++ - '0';
+    if (isdigit(*s)) hour = hour*10+(*s++ - '0');
+    if (hour > 24) return 0;
+    if (*s == ':') {
+        if (!isdigit(*++s)) return 0;
+        min = *s++ - '0';
+        if (isdigit(*s)) min = min*10 + (*s++ - '0');
+        if (min > 59) return 0;
+        if (*s == ':') {
+            if (!isdigit(*++s)) return 0;
+            sec = *s++ - '0';
+            if (isdigit(*s)) sec = sec*10 + (*s++ - '0');
+            if (sec > 59) return 0;
+        }
+    }
+
+    *offset = (hour*60+min)*60 + sec;
+    if (neg) *offset = -*offset;
+    return s;
+}
+
+/*
+    input time is w, whatever type of time the CRTL localtime() uses.
+    sets dst, the zone, and the gmtoff (seconds)
+
+    caches the value of TZ and UCX$TZ env variables; note that 
+    my_setenv looks for these and sets a flag if they're changed
+    for efficiency. 
+
+    We have to watch out for the "australian" case (dst starts in
+    october, ends in april)...flagged by "reverse" and checked by
+    scanning through the months of the previous year.
+
+*/
+
+static int
+tz_parse(time_t *w, int *dst, char *zone, int *gmtoff)
+{
+    time_t when;
+    struct tm *w2;
+    char *s,*s2;
+    char *dstzone, *tz, *s_start, *s_end;
+    int std_off, dst_off, isdst;
+    int y, dststart, dstend;
+    static char envtz[1025];  /* longer than any logical, symbol, ... */
+    static char ucxtz[1025];
+    static char reversed = 0;
+
+    if (!w) return 0;
+
+    if (tz_updated) {
+        tz_updated = 0;
+        reversed = -1;  /* flag need to check  */
+        envtz[0] = ucxtz[0] = '\0';
+        tz = my_getenv("TZ",0);
+        if (tz) strcpy(envtz, tz);
+        tz = my_getenv("UCX$TZ",0);
+        if (tz) strcpy(ucxtz, tz);
+        if (!envtz[0] && !ucxtz[0]) return 0;  /* we give up */
+    }
+    tz = envtz;
+    if (!*tz) tz = ucxtz;
+
+    s = tz;
+    while (isalpha(*s)) s++;
+    s = tz_parse_offset(s, &std_off);
+    if (!s) return 0;
+    if (!*s) {                  /* no DST, hurray we're done! */
+        isdst = 0;
+        goto done;
+    }
+
+    dstzone = s;
+    while (isalpha(*s)) s++;
+    s2 = tz_parse_offset(s, &dst_off);
+    if (s2) {
+        s = s2;
+    } else {
+        dst_off = std_off - 3600;
+    }
+
+    if (!*s) {      /* default dst start/end?? */
+        if (tz != ucxtz) {          /* if TZ tells zone only, UCX$TZ tells rule */
+            s = strchr(ucxtz,',');
+        }
+        if (!s || !*s) s = ",M4.1.0,M10.5.0";   /* we know we do dst, default rule */
+    }
+    if (*s != ',') return 0;
+
+    when = *w;
+    when = _toutc(when);      /* convert to utc */
+    when = when - std_off;    /* convert to pseudolocal time*/
+
+    w2 = localtime(&when);
+    y = w2->tm_year;
+    s_start = s+1;
+    s = tz_parse_startend(s_start,w2,&dststart);
+    if (!s) return 0;
+    if (*s != ',') return 0;
+
+    when = *w;
+    when = _toutc(when);      /* convert to utc */
+    when = when - dst_off;    /* convert to pseudolocal time*/
+    w2 = localtime(&when);
+    if (w2->tm_year != y) {   /* spans a year, just check one time */
+        when += dst_off - std_off;
+        w2 = localtime(&when);
+    }
+    s_end = s+1;
+    s = tz_parse_startend(s_end,w2,&dstend);
+    if (!s) return 0;
+
+    if (reversed == -1) {  /* need to check if start later than end */
+        int j, ds, de;
+
+        when = *w;
+        if (when < 2*365*86400) {
+            when += 2*365*86400;
+        } else {
+            when -= 365*86400;
+        }
+        w2 =localtime(&when);
+        when = when + (15 - w2->tm_yday) * 86400;   /* jan 15 */
+
+        for (j = 0; j < 12; j++) {
+            w2 =localtime(&when);
+            (void) tz_parse_startend(s_start,w2,&ds);
+            (void) tz_parse_startend(s_end,w2,&de);
+            if (ds != de) break;
+            when += 30*86400;
+        }
+        reversed = 0;
+        if (de && !ds) reversed = 1;
+    }
+
+    isdst = dststart && !dstend;
+    if (reversed) isdst = dststart  || !dstend;
+
+done:
+    if (dst)    *dst = isdst;
+    if (gmtoff) *gmtoff = isdst ? dst_off : std_off;
+    if (isdst)  tz = dstzone;
+    if (zone) {
+        while(isalpha(*tz))  *zone++ = *tz++;
+        *zone = '\0';
+    }
+    return 1;
+}
+
+#endif /* !RTL_USES_UTC */
 
 /* my_time(), my_localtime(), my_gmtime()
  * By default traffic in UTC time values, using CRTL gmtime() or
@@ -4226,6 +5513,7 @@ time_t my_time(time_t *timep)
       gmtime_emulation_type++;
       if (!vmstrnenv("SYS$TIMEZONE_DIFFERENTIAL",off,0,fildev,0)) {
         gmtime_emulation_type++;
+        utc_offset_secs = 0;
         Perl_warn(aTHX_ "no UTC offset information; assuming local time is UTC");
       }
       else { utc_offset_secs = atol(off); }
@@ -4294,8 +5582,9 @@ struct tm *
 my_localtime(const time_t *timep)
 {
   dTHX;
-  time_t when;
+  time_t when, whenutc;
   struct tm *rsltmp;
+  int dst, offset;
 
   if (timep == NULL) {
     set_errno(EINVAL); set_vaxc_errno(LIB$_INVARG);
@@ -4311,15 +5600,24 @@ my_localtime(const time_t *timep)
 # endif
   /* CRTL localtime() wants UTC as input, does tz correction itself */
   return localtime(&when);
-# else
+  
+# else /* !RTL_USES_UTC */
+  whenutc = when;
 # ifdef VMSISH_TIME
-  if (!VMSISH_TIME) when = _toloc(when);   /*  Input was UTC */
+  if (!VMSISH_TIME) when = _toloc(whenutc);  /*  input was UTC */
+  if (VMSISH_TIME) whenutc = _toutc(when);   /*  input was truelocal */
 # endif
+  dst = -1;
+#ifndef RTL_USES_UTC
+  if (tz_parse(&when, &dst, 0, &offset)) {   /* truelocal determines DST*/
+      when = whenutc - offset;                   /* pseudolocal time*/
+  }
 # endif
   /* CRTL localtime() wants local time as input, so does no tz correction */
   rsltmp = localtime(&when);
-  if (rsltmp && gmtime_emulation_type != 1) rsltmp->tm_isdst = -1;
+  if (rsltmp && gmtime_emulation_type != 1) rsltmp->tm_isdst = dst;
   return rsltmp;
+# endif
 
 } /*  end of my_localtime() */
 /*}}}*/
@@ -4471,7 +5769,7 @@ int my_utime(char *file, struct utimbuf *utimes)
   fnmdsc.dsc$w_length = mynam.nam$b_name + mynam.nam$b_type + mynam.nam$b_ver;
 
   memset((void *) &myfib, 0, sizeof myfib);
-#ifdef __DECC
+#if defined(__DECC) || defined(__DECCXX)
   for (i=0;i<3;i++) myfib.fib$w_fid[i] = mynam.nam$w_fid[i];
   for (i=0;i<3;i++) myfib.fib$w_did[i] = mynam.nam$w_did[i];
   /* This prevents the revision time of the file being reset to the current
@@ -4608,6 +5906,7 @@ is_null_device(name)
 bool
 Perl_cando(pTHX_ Mode_t bit, Uid_t effective, Stat_t *statbufp)
 {
+  char fname_phdev[NAM$C_MAXRSS+1];
   if (statbufp == &PL_statcache) return cando_by_name(bit,effective,namecache);
   else {
     char fname[NAM$C_MAXRSS+1];
@@ -4626,7 +5925,15 @@ Perl_cando(pTHX_ Mode_t bit, Uid_t effective, Stat_t *statbufp)
                              &namdsc,&namdsc.dsc$w_length,0,0);
     if (retsts & 1) {
       fname[namdsc.dsc$w_length] = '\0';
-      return cando_by_name(bit,effective,fname);
+/* 
+ * lib$fid_to_name returns DVI$_LOGVOLNAM as the device part of the name,
+ * but if someone has redefined that logical, Perl gets very lost.  Since
+ * we have the physical device name from the stat buffer, just paste it on.
+ */
+      strcpy( fname_phdev, statbufp->st_devnam );
+      strcat( fname_phdev, strrchr(fname, ':') );
+
+      return cando_by_name(bit,effective,fname_phdev);
     }
     else if (retsts == SS$_NOSUCHDEV || retsts == SS$_NOSUCHFILE) {
       Perl_warn(aTHX_ "Can't get filespec - stale stat buffer?\n");
@@ -4695,7 +6002,7 @@ cando_by_name(I32 bit, Uid_t effective, char *fname)
   retsts = sys$check_access(&objtyp,&namdsc,&usrdsc,armlst);
   if (retsts == SS$_NOPRIV      || retsts == SS$_NOSUCHOBJECT ||
       retsts == SS$_INVFILFOROP || retsts == RMS$_FNF || retsts == RMS$_SYN ||
-      retsts == RMS$_DIR        || retsts == RMS$_DEV) {
+      retsts == RMS$_DIR        || retsts == RMS$_DEV || retsts == RMS$_DNF) {
     set_vaxc_errno(retsts);
     if (retsts == SS$_NOPRIV) set_errno(EACCES);
     else if (retsts == SS$_INVFILFOROP) set_errno(EINVAL);
@@ -4718,12 +6025,6 @@ cando_by_name(I32 bit, Uid_t effective, char *fname)
   if (retsts == SS$_ACCONFLICT) {
     return TRUE;
   }
-
-#if defined(__ALPHA) && defined(__VMS_VER) && __VMS_VER == 70100022 &&  defined(__DECC_VER) && __DECC_VER == 6009001
-  /* XXX Hideous kluge to accomodate error in specific version of RTL;
-     we hope it'll be buried soon */
-  if (retsts == 114762) return TRUE;
-#endif
   _ckvmssts(retsts);
 
   return FALSE;  /* Should never get here */
@@ -5329,6 +6630,8 @@ init_os_extras()
   newXSproto("DynaLoader::mod2fname", mod2fname, file, "$");
   newXS("File::Copy::rmscopy",rmscopy_fromperl,file);
 
+  store_pipelocs();
+
   return;
 }
   
index 104eabc..8d2a628 100644 (file)
@@ -22,6 +22,9 @@
 #ifdef __DECC
 #  pragma message disable (ADDRCONSTEXT,NEEDCONSTEXT)
 #endif
+#ifdef __DECCXX 
+#  pragma message disable (ADDRCONSTEXT,NEEDCONSTEXT)
+#endif
 
 /* DEC's C compilers and gcc use incompatible definitions of _to(upp|low)er() */
 #ifdef _toupper
@@ -34,7 +37,7 @@
 #define _tolower(c) (((c) < 'A' || (c) > 'Z') ? (c) : (c) | 040)
 /* DECC 1.3 has a funny definition of abs; it's fixed in DECC 4.0, so this
  * can go away once DECC 1.3 isn't in use any more. */
-#if defined(__ALPHA) && defined(__DECC)
+#if defined(__ALPHA) && (defined(__DECC) || defined(__DECCXX))
 #undef abs
 #define abs(__x)        __ABS(__x)
 #undef labs
@@ -54,6 +57,9 @@
 #if defined(__DECC) && defined(__DECC_VER) && __DECC_VER > 20000000
 #  include <unistd.h> /* DECC has this; VAXC and gcc don't */
 #endif
+#ifdef __DECCXX 
+#  include <unistd.h> /* DECC has this; VAXC and gcc don't */
+#endif
 
 /* VAXC doesn't have a unary plus operator, so we need to get there indirectly */
 #if defined(VAXC) && !defined(__DECC)
@@ -473,7 +479,7 @@ struct utimbuf {
 #define ENVgetenv_len(v,l) my_getenv_len(v,l,FALSE)
 
 
-/* Thin jacket around cuserid() tomatch Unix' calling sequence */
+/* Thin jacket around cuserid() to match Unix' calling sequence */
 #define getlogin my_getlogin
 
 /* Ditto for sys$hash_passwrod() . . . */
@@ -539,7 +545,7 @@ struct passwd {
  * to map the unsigned int we want and the unsigned short[3] the CRTL
  * returns into the same member, since gcc has different ideas than DECC
  * and VAXC about sizing union types.
- * N.B 2. The routine cando() in vms.c assumes that &stat.st_ino is the
+ * N.B. 2. The routine cando() in vms.c assumes that &stat.st_ino is the
  * address of a FID.
  */
 /* First, grab the system types, so we don't clobber them later */
@@ -777,4 +783,6 @@ typedef char __VMS_SEPYTOTORP__;
 #  undef fileno 
 #endif 
 
+#define NO_ENVIRON_ARRAY
+
 #endif  /* __vmsish_h_included */
diff --git a/vms/vmspipe.com b/vms/vmspipe.com
new file mode 100644 (file)
index 0000000..bbb4461
--- /dev/null
@@ -0,0 +1,18 @@
+$! 'f$verify(0)         
+$!  ---  protect against nonstandard definitions ---
+$ perl_define = "define/nolog"
+$ perl_on     = "on error then exit $STATUS"
+$ perl_exit   = "exit"
+$ perl_del    = "delete"
+$ pif         = "if"
+$!  --- define i/o redirection (sys$output set by lib$spawn)
+$ pif perl_popen_in  .nes. "" then perl_define sys$input  'perl_popen_in'
+$ pif perl_popen_err .nes. "" then perl_define sys$error  'perl_popen_err'
+$ cmd = perl_popen_cmd
+$!  --- get rid of global symbols
+$ perl_del/symbol/global perl_popen_in
+$ perl_del/symbol/global perl_popen_err
+$ perl_del/symbol/global perl_popen_cmd
+$ perl_on
+$ 'cmd
+$ perl_exit '$STATUS'
index 1ef1eff..4edc806 100644 (file)
@@ -167,8 +167,12 @@ $d_pause='define'
 $d_phostname='undef'
 $d_pipe='define'
 $d_poll='define'
+$d_PRIeldbl='define'
 $d_PRIfldbl='define'
 $d_PRIgldbl='define'
+$d_PRIEUldbl='define'
+$d_PRIFUldbl='define'
+$d_PRIGUldbl='define'
 $d_pthread_yield='undef'
 $d_pwage='undef'
 $d_pwchange='undef'
@@ -208,6 +212,7 @@ $d_setpgid='undef'
 $d_setpgrp2='undef'
 $d_setpgrp='undef'
 $d_setprior='undef'
+$d_setproctitle='undef'
 $d_setpwent='undef'
 $d_setregid='undef'
 $d_setresgid='undef'
@@ -226,6 +231,7 @@ $d_sigsetjmp='undef'
 $d_sitearch='undef'
 $d_socket='define'
 $d_sockpair='undef'
+$d_socks5_init='undef'
 $d_sqrtl='undef'
 $d_statblks='undef'
 $d_statfs_f_flags='undef'
@@ -312,6 +318,7 @@ $i_grp='undef'
 $i_iconv='undef'
 $i_ieeefp='undef'
 $i_inttypes='undef'
+$i_libutil='undef'
 $i_limits='define'
 $i_locale='define'
 $i_machcthr='undef'
@@ -390,6 +397,10 @@ $netdb_hlen_type='int'
 $netdb_host_type='char *'
 $netdb_name_type='char *'
 $netdb_net_type='long'
+$nveformat='"e"'
+$nvfformat='"f"'
+$nvgformat='"g"'
+$nvsize='8'
 $nvtype='double'
 $o_nonblock='O_NONBLOCK'
 $old_pthread_create_joinable=''
@@ -397,9 +408,9 @@ $osname='VOS'
 $otherlibdirs=''
 $package='perl5'
 $pidtype='pid_t'
-$pm_apiversion='5.00563'
-$privlib='/system/ported/perl/lib/5.005'
-$privlibexp='/system/ported/perl/lib/5.005'
+$pm_apiversion='5.005'
+$privlib='/system/ported/perl/lib/5.7'
+$privlibexp='/system/ported/perl/lib/5.7'
 $prototype='define'
 $ptrsize='4'
 $quadkind='_error_'
@@ -471,5 +482,6 @@ $vendorarch=''
 $vendorarchexp=''
 $vendorlib_stem=''
 $vendorlibexp=''
+$versiononly='undef'
 $voidflags='15'
 $xs_apiversion='5.00563'
index 4794225..985e6ea 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * This file was produced by running the config_h.SH script, which
- * gets its values from config.sh, which is generally produced by
+ * gets its values from $CONFIG_SH, which is generally produced by
  * running Configure.
  *
  * Feel free to modify any of this as the need arises.  Note, however,
  * that running config_h.SH again will wipe out any changes you've made.
- * For a more permanent change edit config.sh and rerun config_h.SH.
+ * For a more permanent change edit $CONFIG_SH and rerun config_h.SH.
  *
  * \$Id: Config_h.U,v 3.0.1.5 1997/02/28 14:57:43 ram Exp $
  */
  */
 /*#define HAS_GETPGID          /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#define HAS_GETPGRP            /**/
-/*#define USE_BSD_GETPGRP      /**/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
  */
 /*#define HAS_SETPGID  /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-/*#define HAS_SETPGRP          /**/
-/*#define USE_BSD_SETPGRP      /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
  *     This macro surrounds its token with double quotes.
  */
 #if 42 == 1
-#  define CAT2(a,b)    a/**/b
-#  define STRINGIFY(a) "a"
+#define CAT2(a,b)      a/**/b
+#define STRINGIFY(a)   "a"
                /* If you can get stringification with catify, tell me how! */
 #endif
 #if 42 == 42
-#  define PeRl_CaTiFy(a, b)    a ## b  
-#  define PeRl_StGiFy(a)       #a
+#define PeRl_CaTiFy(a, b)      a ## b  
+#define PeRl_StGiFy(a) #a
 /* the additional level of indirection enables these macros to be
  * used as arguments to other macros.  See K&R 2nd ed., page 231. */
-#  define CAT2(a,b)    PeRl_CaTiFy(a,b)
-#  define StGiFy(a)    PeRl_StGiFy(a)
-#  define STRINGIFY(a) PeRl_StGiFy(a)
+#define CAT2(a,b)      PeRl_CaTiFy(a,b)
+#define StGiFy(a)      PeRl_StGiFy(a)
+#define STRINGIFY(a)   PeRl_StGiFy(a)
 #endif
 #if 42 != 1 && 42 != 42
 #   include "Bletch: How does this C preprocessor catenate tokens?"
  */
 #define HAS_SETPROTOENT                /**/
 
+/* HAS_SETPROCTITLE:
+ *     This symbol, if defined, indicates that the setproctitle routine is
+ *     available to set process title.
+ */
+/*#define HAS_SETPROCTITLE             /**/
+
 /* HAS_SETPWENT:
  *     This symbol, if defined, indicates that the setpwent routine is
  *     available for initializing sequential access of the passwd database.
 /*#define      HAS_MSG_PROXY   /**/
 /*#define      HAS_SCM_RIGHTS  /**/
 
+/* HAS_SOCKS5_INIT:
+ *     This symbol, if defined, indicates that the socks5_init routine is
+ *     available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT              /**/
+
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
  */
 /*#define   I_INTTYPES                /**/
 
+/* I_LIBUTIL:
+ *     This symbol, if defined, indicates that <libutil.h> exists and
+ *     should be included.
+ */
+/*#define      I_LIBUTIL               /**/
+
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <mach/cthreads.h>.
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'g') for output.
  */
+/* PERL_PRIeldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'f') for input.
+ */
 #define PERL_PRIfldbl  "Lf"    /**/
 #define PERL_PRIgldbl  "Lg"    /**/
+#define PERL_PRIeldbl  $sPRIeldbl      /**/
+# PERL_SCNfldbl        $sSCNfldbl      /**/
 
 /* Off_t:
  *     This symbol holds the type used to declare offsets in the kernel.
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bits of a variable of type UVTYPE.
  */
+/* NV_PRESERVES_UV_BITS:
+ *     This symbol contains the number of bits a variable of type NVTYPE
+ *     can preserve of a variable of type UVTYPE.
+ */
 #define        IVTYPE          int             /**/
 #define        UVTYPE          unsigned int            /**/
 #define        I8TYPE          char            /**/
 #define        I64SIZE         _error_ /**/
 #define        U64SIZE         _error_ /**/
 #endif
-#define        NVSIZE          $nvsize         /**/
+#define        NVSIZE          8               /**/
 #define        NV_PRESERVES_UV
+#define        NV_PRESERVES_UV_BITS    32
 
 /* IVdf:
  *     This symbol defines the format string used for printing a Perl IV
  */
 /* UVxf:
  *     This symbol defines the format string used for printing a Perl UV
- *     as an unsigned hexadecimal integer.
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
  */
 #define        IVdf            "d"             /**/
 #define        UVuf            "u"             /**/
 #define        UVof            "o"             /**/
 #define        UVxf            "x"             /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/system/ported/perl/lib/5.005"                /**/
-#define PRIVLIB_EXP "/system/ported/perl/lib/5.005"            /**/
+#define PRIVLIB "/system/ported/perl/lib/5.7"          /**/
+#define PRIVLIB_EXP "/system/ported/perl/lib/5.7"              /**/
 
 /* PTRSIZE:
  *     This symbol contains the size of a pointer, so that the C preprocessor
  *     See the INSTALL file for how this works.
  */
 #define PERL_XS_APIVERSION "5.00563"
-#define PERL_PM_APIVERSION "5.00563"
+#define PERL_PM_APIVERSION "5.005"
+
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#define HAS_GETPGRP            /**/
+/*#define USE_BSD_GETPGRP      /**/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+/*#define HAS_SETPGRP          /**/
+/*#define USE_BSD_SETPGRP      /**/
 
 #endif
index 1781def..a209e6d 100755 (executable)
@@ -1,29 +1,35 @@
+case "$CONFIG_SH" in
+'') CONFIG_SH=config.sh ;;
+esac
+case "$CONFIG_H" in
+'') CONFIG_H=config.h ;;
+esac
 case $CONFIG in
 '')
-       if test -f config.sh; then TOP=.;
-       elif test -f ../config.sh; then TOP=..;
-       elif test -f ../../config.sh; then TOP=../..;
-       elif test -f ../../../config.sh; then TOP=../../..;
-       elif test -f ../../../../config.sh; then TOP=../../../..;
+       if test -f $CONFIG_SH; then TOP=.;
+       elif test -f ../$CONFIG_SH; then TOP=..;
+       elif test -f ../../$CONFIG_SH; then TOP=../..;
+       elif test -f ../../../$CONFIG_SH; then TOP=../../..;
+       elif test -f ../../../../$CONFIG_SH; then TOP=../../../..;
        else
-               echo "Can't find config.sh."; exit 1
+               echo "Can't find $CONFIG_SH."; exit 1
        fi
-       . $TOP/config.sh
+       . $TOP/$CONFIG_SH
        ;;
 esac
 case "$0" in
 */*) cd `expr X$0 : 'X\(.*\)/'` ;;
 esac
-echo "Extracting config.h (with variable substitutions)"
-sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!'
+echo "Extracting $CONFIG_H (with variable substitutions)"
+sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-def!#undef!'
 /*
  * This file was produced by running the config_h.SH script, which
- * gets its values from config.sh, which is generally produced by
+ * gets its values from $CONFIG_SH, which is generally produced by
  * running Configure.
  *
  * Feel free to modify any of this as the need arises.  Note, however,
  * that running config_h.SH again will wipe out any changes you've made.
- * For a more permanent change edit config.sh and rerun config_h.SH.
+ * For a more permanent change edit $CONFIG_SH and rerun config_h.SH.
  *
  * \$Id: Config_h.U,v 3.0.1.5 1997/02/28 14:57:43 ram Exp $
  */
@@ -238,17 +244,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_getpgid HAS_GETPGID                /**/
 
-/* HAS_GETPGRP:
- *     This symbol, if defined, indicates that the getpgrp routine is
- *     available to get the current process group.
- */
-/* USE_BSD_GETPGRP:
- *     This symbol, if defined, indicates that getpgrp needs one
- *     arguments whereas USG one needs none.
- */
-#$d_getpgrp HAS_GETPGRP                /**/
-#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
-
 /* HAS_GETPGRP2:
  *     This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
  *     routine is available to get the current process group.
@@ -503,18 +498,6 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_setpgid HAS_SETPGID        /**/
 
-/* HAS_SETPGRP:
- *     This symbol, if defined, indicates that the setpgrp routine is
- *     available to set the current process group.
- */
-/* USE_BSD_SETPGRP:
- *     This symbol, if defined, indicates that setpgrp needs two
- *     arguments whereas USG one needs none.  See also HAS_SETPGID
- *     for a POSIX interface.
- */
-#$d_setpgrp HAS_SETPGRP                /**/
-#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
-
 /* HAS_SETPGRP2:
  *     This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
  *     routine is available to set the current process group.
@@ -1198,18 +1181,18 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  *     This macro surrounds its token with double quotes.
  */
 #if $cpp_stuff == 1
-#  define CAT2(a,b)    a/**/b
-#  define STRINGIFY(a) "a"
+#define CAT2(a,b)      a/**/b
+#define STRINGIFY(a)   "a"
                /* If you can get stringification with catify, tell me how! */
 #endif
 #if $cpp_stuff == 42
-#  define PeRl_CaTiFy(a, b)    a ## b  
-#  define PeRl_StGiFy(a)       #a
+#define PeRl_CaTiFy(a, b)      a ## b  
+#define PeRl_StGiFy(a) #a
 /* the additional level of indirection enables these macros to be
  * used as arguments to other macros.  See K&R 2nd ed., page 231. */
-#  define CAT2(a,b)    PeRl_CaTiFy(a,b)
-#  define StGiFy(a)    PeRl_StGiFy(a)
-#  define STRINGIFY(a) PeRl_StGiFy(a)
+#define CAT2(a,b)      PeRl_CaTiFy(a,b)
+#define StGiFy(a)      PeRl_StGiFy(a)
+#define STRINGIFY(a)   PeRl_StGiFy(a)
 #endif
 #if $cpp_stuff != 1 && $cpp_stuff != 42
 #   include "Bletch: How does this C preprocessor catenate tokens?"
@@ -1876,6 +1859,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_setpent HAS_SETPROTOENT            /**/
 
+/* HAS_SETPROCTITLE:
+ *     This symbol, if defined, indicates that the setproctitle routine is
+ *     available to set process title.
+ */
+#$d_setproctitle HAS_SETPROCTITLE              /**/
+
 /* HAS_SETPWENT:
  *     This symbol, if defined, indicates that the setpwent routine is
  *     available for initializing sequential access of the passwd database.
@@ -1991,6 +1980,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #$d_msg_proxy  HAS_MSG_PROXY   /**/
 #$d_scm_rights HAS_SCM_RIGHTS  /**/
 
+/* HAS_SOCKS5_INIT:
+ *     This symbol, if defined, indicates that the socks5_init routine is
+ *     available to initialize SOCKS 5.
+ */
+#$d_socks5_init HAS_SOCKS5_INIT                /**/
+
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
@@ -2326,6 +2321,12 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$i_inttypes   I_INTTYPES                /**/
 
+/* I_LIBUTIL:
+ *     This symbol, if defined, indicates that <libutil.h> exists and
+ *     should be included.
+ */
+#$i_libutil    I_LIBUTIL               /**/
+
 /* I_MACH_CTHREADS:
  *     This symbol, if defined, indicates to the C program that it should
  *     include <mach/cthreads.h>.
@@ -2524,8 +2525,18 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  *     This symbol, if defined, contains the string used by stdio to
  *     format long doubles (format 'g') for output.
  */
+/* PERL_PRIeldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ *     This symbol, if defined, contains the string used by stdio to
+ *     format long doubles (format 'f') for input.
+ */
 #$d_PRIfldbl PERL_PRIfldbl     $sPRIfldbl      /**/
 #$d_PRIgldbl PERL_PRIgldbl     $sPRIgldbl      /**/
+#$d_PRIeldbl PERL_PRIeldbl     $sPRIeldbl      /**/
+#$d_SCNfldbl PERL_SCNfldbl     $sSCNfldbl      /**/
 
 /* Off_t:
  *     This symbol holds the type used to declare offsets in the kernel.
@@ -2693,6 +2704,10 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  *     This symbol, if defined, indicates that a variable of type NVTYPE
  *     can preserve all the bits of a variable of type UVTYPE.
  */
+/* NV_PRESERVES_UV_BITS:
+ *     This symbol contains the number of bits a variable of type NVTYPE
+ *     can preserve of a variable of type UVTYPE.
+ */
 #define        IVTYPE          $ivtype         /**/
 #define        UVTYPE          $uvtype         /**/
 #define        I8TYPE          $i8type         /**/
@@ -2720,6 +2735,7 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #endif
 #define        NVSIZE          $nvsize         /**/
 #$d_nv_preserves_uv    NV_PRESERVES_UV
+#define        NV_PRESERVES_UV_BITS    $d_nv_preserves_uv_bits
 
 /* IVdf:
  *     This symbol defines the format string used for printing a Perl IV
@@ -2735,12 +2751,27 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 /* UVxf:
  *     This symbol defines the format string used for printing a Perl UV
- *     as an unsigned hexadecimal integer.
+ *     as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
  */
 #define        IVdf            $ivdformat              /**/
 #define        UVuf            $uvuformat              /**/
 #define        UVof            $uvoformat              /**/
 #define        UVxf            $uvxformat              /**/
+#define        NVef            $nveformat              /**/
+#define        NVff            $nvfformat              /**/
+#define        NVgf            $nvgformat              /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
@@ -3139,5 +3170,28 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
 #define PERL_XS_APIVERSION "$xs_apiversion"
 #define PERL_PM_APIVERSION "$pm_apiversion"
 
+/* HAS_GETPGRP:
+ *     This symbol, if defined, indicates that the getpgrp routine is
+ *     available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ *     This symbol, if defined, indicates that getpgrp needs one
+ *     arguments whereas USG one needs none.
+ */
+#$d_getpgrp HAS_GETPGRP                /**/
+#$d_bsdgetpgrp USE_BSD_GETPGRP /**/
+
+/* HAS_SETPGRP:
+ *     This symbol, if defined, indicates that the setpgrp routine is
+ *     available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ *     This symbol, if defined, indicates that setpgrp needs two
+ *     arguments whereas USG one needs none.  See also HAS_SETPGID
+ *     for a POSIX interface.
+ */
+#$d_setpgrp HAS_SETPGRP                /**/
+#$d_bsdsetpgrp USE_BSD_SETPGRP /**/
+
 #endif
 !GROK!THIS!
index 0e74f3d..0c2d2ec 100644 (file)
@@ -348,6 +348,14 @@ warnings - Perl pragma to control optional warnings
         warnings::warn("void", "some warning");
     }
 
+    if (warnings::enabled($object)) {
+        warnings::warn($object, "some warning");
+    }
+
+    warnif("some warning");
+    warnif("void", "some warning");
+    warnif($object, "some warning");
+
 =head1 DESCRIPTION
 
 If no import list is supplied, all possible warnings are either enabled
@@ -359,26 +367,78 @@ A number of functions are provided to assist module authors.
 
 =item use warnings::register
 
-Creates a new warnings category which has the same name as the module
-where the call to the pragma is used.
+Creates a new warnings category with the same name as the package where
+the call to the pragma is used.
+
+=item warnings::enabled()
+
+Use the warnings category with the same name as the current package.
+
+Return TRUE if that warnings category is enabled in the calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($category)
+
+Return TRUE if the warnings category, C<$category>, is enabled in the
+calling module.
+Otherwise returns FALSE.
+
+=item warnings::enabled($object)
+
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
+
+Return TRUE if that warnings category is enabled in the first scope
+where the object is used.
+Otherwise returns FALSE.
+
+=item warnings::warn($message)
+
+Print C<$message> to STDERR.
+
+Use the warnings category with the same name as the current package.
+
+If that warnings category has been set to "FATAL" in the calling module
+then die. Otherwise return.
+
+=item warnings::warn($category, $message)
+
+Print C<$message> to STDERR.
+
+If the warnings category, C<$category>, has been set to "FATAL" in the
+calling module then die. Otherwise return.
+
+=item warnings::warn($object, $message)
 
-=item warnings::enabled([$category])
+Print C<$message> to STDERR.
 
-Returns TRUE if the warnings category C<$category> is enabled in the
-calling module.  Otherwise returns FALSE.
+Use the name of the class for the object reference, C<$object>, as the
+warnings category.
 
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+If that warnings category has been set to "FATAL" in the scope where C<$object>
+is first used then die. Otherwise return.
 
-=item warnings::warn([$category,] $message)
 
-If the calling module has I<not> set C<$category> to "FATAL", print
-C<$message> to STDERR.
-If the calling module has set C<$category> to "FATAL", print C<$message>
-STDERR then die.
+=item warnings::warnif($message)
 
-If the parameter, C<$category>, isn't supplied, the current package name
-will be used.
+Equivalent to:
+
+    if (warnings::enabled())
+      { warnings::warn($message) }
+
+=item warnings::warnif($category, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($category))
+      { warnings::warn($category, $message) }
+
+=item warnings::warnif($object, $message)
+
+Equivalent to:
+
+    if (warnings::enabled($object))
+      { warnings::warn($object, $message) }
 
 =back
 
@@ -413,44 +473,80 @@ sub bits {
 
 sub import {
     shift;
-    ${^WARNING_BITS} |= bits(@_ ? @_ : 'all') ;
+    my $mask = ${^WARNING_BITS} ;
+    if (vec($mask, $Offsets{'all'}, 1)) {
+        $mask |= $Bits{'all'} ;
+        $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
+    }
+    ${^WARNING_BITS} = $mask | bits(@_ ? @_ : 'all') ;
 }
 
 sub unimport {
     shift;
     my $mask = ${^WARNING_BITS} ;
     if (vec($mask, $Offsets{'all'}, 1)) {
-        $mask = $Bits{'all'} ;
+        $mask |= $Bits{'all'} ;
         $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1);
     }
     ${^WARNING_BITS} = $mask & ~ (bits(@_ ? @_ : 'all') | $All) ;
 }
 
-sub enabled
+sub __chk
 {
-    croak("Usage: warnings::enabled([category])")
-       unless @_ == 1 || @_ == 0 ;
-    local $Carp::CarpLevel = 1 ;
     my $category ;
     my $offset ;
-    my $callers_bitmask = (caller(1))[9] ; 
-    return 0 unless defined $callers_bitmask ;
-
+    my $isobj = 0 ;
 
     if (@_) {
         # check the category supplied.
         $category = shift ;
+        if (ref $category) {
+            croak ("not an object")
+                if $category !~ /^([^=]+)=/ ;+
+           $category = $1 ;
+            $isobj = 1 ;
+        }
         $offset = $Offsets{$category};
         croak("unknown warnings category '$category'")
            unless defined $offset;
     }
     else {
-        $category = (caller(0))[0] ; 
+        $category = (caller(1))[0] ; 
         $offset = $Offsets{$category};
         croak("package '$category' not registered for warnings")
            unless defined $offset ;
     }
 
+    my $this_pkg = (caller(1))[0] ; 
+    my $i = 2 ;
+    my $pkg ;
+
+    if ($isobj) {
+        while (do { { package DB; $pkg = (caller($i++))[0] } } ) {
+            last unless @DB::args && $DB::args[0] =~ /^$category=/ ;
+        }
+       $i -= 2 ;
+    }
+    else {
+        for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) {
+            last if $pkg ne $this_pkg ;
+        }
+        $i = 2 
+            if !$pkg || $pkg eq $this_pkg ;
+    }
+
+    my $callers_bitmask = (caller($i))[9] ; 
+    return ($callers_bitmask, $offset, $i) ;
+}
+
+sub enabled
+{
+    croak("Usage: warnings::enabled([category])")
+       unless @_ == 1 || @_ == 0 ;
+
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+
+    return 0 unless defined $callers_bitmask ;
     return vec($callers_bitmask, $offset, 1) ||
            vec($callers_bitmask, $Offsets{'all'}, 1) ;
 }
@@ -460,29 +556,34 @@ sub warn
 {
     croak("Usage: warnings::warn([category,] 'message')")
        unless @_ == 2 || @_ == 1 ;
-    local $Carp::CarpLevel = 1 ;
-    my $category ;
-    my $offset ;
-    my $callers_bitmask = (caller(1))[9] ; 
-
-    if (@_ == 2) {
-        $category = shift ;
-        $offset = $Offsets{$category};
-        croak("unknown warnings category '$category'")
-           unless defined $offset ;
-    }
-    else {
-        $category = (caller(0))[0] ; 
-        $offset = $Offsets{$category};
-        croak("package '$category' not registered for warnings")
-           unless defined $offset ;
-    }
 
-    my $message = shift ;
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+    local $Carp::CarpLevel = $i ;
     croak($message) 
        if vec($callers_bitmask, $offset+1, 1) ||
           vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
     carp($message) ;
 }
 
+sub warnif
+{
+    croak("Usage: warnings::warnif([category,] 'message')")
+       unless @_ == 2 || @_ == 1 ;
+
+    my $message = pop ;
+    my ($callers_bitmask, $offset, $i) = __chk(@_) ;
+    local $Carp::CarpLevel = $i ;
+
+    return 
+        unless defined $callers_bitmask &&
+               (vec($callers_bitmask, $offset, 1) ||
+               vec($callers_bitmask, $Offsets{'all'}, 1)) ;
+
+    croak($message) 
+       if vec($callers_bitmask, $offset+1, 1) ||
+          vec($callers_bitmask, $Offsets{'all'}+1, 1) ;
+
+    carp($message) ;
+}
 1;
index 1bcda28..af11990 100644 (file)
@@ -594,7 +594,7 @@ SETARGV_OBJ = setargv$(o)
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B re \
                Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
-               Sys/Hostname
+               Sys/Hostname Storable
 STATIC_EXT     = DynaLoader
 NONXS_EXT      = Errno
 
@@ -616,6 +616,7 @@ BYTELOADER  = $(EXTDIR)\ByteLoader\ByteLoader
 DPROF          = $(EXTDIR)\Devel\DProf\DProf
 GLOB           = $(EXTDIR)\File\Glob\Glob
 HOSTNAME       = $(EXTDIR)\Sys\Hostname\Hostname
+STORABLE       = $(EXTDIR)\Storable\Storable
 
 SOCKET_DLL     = $(AUTODIR)\Socket\Socket.dll
 FCNTL_DLL      = $(AUTODIR)\Fcntl\Fcntl.dll
@@ -633,6 +634,7 @@ BYTELOADER_DLL      = $(AUTODIR)\ByteLoader\ByteLoader.dll
 DPROF_DLL      = $(AUTODIR)\Devel\DProf\DProf.dll
 GLOB_DLL       = $(AUTODIR)\File\Glob\Glob.dll
 HOSTNAME_DLL   = $(AUTODIR)\Sys\Hostname\Hostname.dll
+STORABLE_DLL   = $(AUTODIR)\Storable\Storable.dll
 
 ERRNO_PM       = $(LIBDIR)\Errno.pm
 
@@ -652,7 +654,8 @@ EXTENSION_C =               \
                $(BYTELOADER).c \
                $(DPROF).c      \
                $(GLOB).c       \
-               $(HOSTNAME).c
+               $(HOSTNAME).c   \
+               $(STORABLE).c
 
 EXTENSION_DLL  =               \
                $(SOCKET_DLL)   \
@@ -670,7 +673,8 @@ EXTENSION_DLL       =               \
                $(BYTELOADER_DLL)       \
                $(DPROF_DLL)    \
                $(GLOB_DLL)     \
-               $(HOSTNAME_DLL)
+               $(HOSTNAME_DLL) \
+               $(STORABLE_DLL)
 
 EXTENSION_PM   =               \
                $(ERRNO_PM)
@@ -948,6 +952,12 @@ $(BYTELOADER_DLL): $(PERLEXE) $(BYTELOADER).xs
        $(MAKE)
        cd ..\..\win32
 
+$(STORABLE_DLL): $(PERLEXE) $(STORABLE).xs
+       cd $(EXTDIR)\$(*B)
+       ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
+       $(MAKE)
+       cd ..\..\win32
+
 $(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL
        cd $(EXTDIR)\$(*B)
        ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
@@ -993,10 +1003,11 @@ distclean: clean
        -del /f $(LIBDIR)\Data\Dumper.pm $(LIBDIR)\ByteLoader.pm
        -del /f $(LIBDIR)\Devel\Peek.pm $(LIBDIR)\Devel\DProf.pm
        -del /f $(LIBDIR)\File\Glob.pm
-       -rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
-       -rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
-       -rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
-       -rmdir /s /q $(LIBDIR)\Data || rmdir /s $(LIBDIR)\Data
+       -del /f $(LIBDIR)\Storable.pm
+       -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
+       -if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
+       -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
+       -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data || rmdir /s $(LIBDIR)\Data
        -del /f $(PODDIR)\*.html
        -del /f $(PODDIR)\*.bat
        cd ..\utils
@@ -1013,8 +1024,8 @@ distclean: clean
        cd $(EXTDIR)
        -del /s *.lib *.def *.map *.pdb *.bs Makefile *$(o) pm_to_blib
        cd ..\win32
-       -rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
-       -rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
+       -if exist $(AUTODIR) rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
+       -if exist $(COREDIR) rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
 
 install : all installbare installhtml
 
@@ -1082,7 +1093,7 @@ clean :
        -@erase $(WPERLEXE)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
-       -rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
+       -if exist $(MINIDIR) rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
        -@erase $(WIN32_OBJ)
        -@erase $(DLL_OBJ)
        -@erase $(X2P_OBJ)
@@ -1091,3 +1102,19 @@ clean :
        -@erase ..\x2p\*.exe ..\x2p\*.bat
        -@erase *.ilk
        -@erase *.pdb
+# Handy way to run perlbug -ok without having to install and run the
+# installed perlbug. We don't re-run the tests here - we trust the user.
+# Please *don't* use this unless all tests pass.
+# If you want to report test failures, use "nmake nok" instead.
+ok: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -ok -s "(UNINSTALLED)"
+
+okfile: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -ok -s "(UNINSTALLED)" -F perl.ok
+nok: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)"
+nokfile: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok
index 4bce61b..097d429 100644 (file)
@@ -7,7 +7,6 @@ Header=''
 Id='$Id'
 Locker=''
 Log='$Log'
-Mcc='Mcc'
 RCSfile='$RCSfile'
 Revision='$Revision'
 Source=''
@@ -72,10 +71,10 @@ crosscompile='undef'
 cryptlib=''
 csh='undef'
 d_Gconvert='gcvt((x),(n),(b))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
 d_PRId64='undef'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
@@ -312,6 +311,7 @@ d_sigsetjmp='undef'
 d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
+d_socks5_init='undef'
 d_sqrtl='undef'
 d_statblks='undef'
 d_statfs_f_flags='undef'
@@ -412,7 +412,6 @@ h_fcntl='false'
 h_sysfile='true'
 hint='recommended'
 hostcat='ypcat hosts'
-huge=''
 i16size='2'
 i16type='short'
 i32size='4'
@@ -528,7 +527,6 @@ ivsize='4'
 ivtype='long'
 known_extensions='~static_ext~ ~dynamic_ext~ ~nonxs_ext~'
 ksh=''
-large=''
 ld='tlink32'
 lddlflags='-Tpd ~LINK_FLAGS~'
 ldflags='~LINK_FLAGS~'
@@ -566,17 +564,30 @@ make_set_make='#'
 mallocobj='malloc.o'
 mallocsrc='malloc.c'
 malloctype='void *'
+man1='man1'
 man1dir='~INST_TOP~~INST_VER~\man\man1'
 man1direxp='~INST_TOP~~INST_VER~\man\man1'
 man1ext='1'
+man2='man2'
+man2ext='2'
+man3='man3'
 man3dir='~INST_TOP~~INST_VER~\man\man3'
 man3direxp='~INST_TOP~~INST_VER~\man\man3'
 man3ext='3'
-medium=''
+man4='man4'
+man4ext='4'
+man5='man5'
+man5ext='5'
+man6='man6'
+man6ext='6'
+man7='man7'
+man7ext='7'
+man8='man8'
+man8ext='8'
+mandirstyle='bsd'
 mips_type=''
 mkdir='mkdir'
 mmaptype='void *'
-models='none'
 modetype='mode_t'
 more='more /e'
 multiarch='undef'
@@ -595,6 +606,9 @@ nm_opt=''
 nm_so_opt=''
 nonxs_ext='Errno'
 nroff=''
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
 nvsize='8'
 nvtype='double'
 o_nonblock='O_NONBLOCK'
@@ -638,10 +652,10 @@ revision='5'
 rm='del'
 rmail=''
 runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
 sPRId64='"ld"'
 sPRIeldbl='"e"'
 sPRIfldbl='"f"'
@@ -684,7 +698,6 @@ sizesize='4'
 sizetype='size_t'
 sleep=''
 smail=''
-small=''
 so='dll'
 sockethdr=''
 socketlib=''
@@ -692,7 +705,6 @@ socksizetype='int'
 sort='sort'
 spackage='Perl5'
 spitshell=''
-split=''
 src=''
 ssizetype='int'
 startperl='#!perl'
@@ -772,6 +784,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='~VERSION~'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth='/usr/lib/386 /lib/386'
index 7f6a63c..9251b24 100644 (file)
@@ -7,7 +7,6 @@ Header=''
 Id='$Id'
 Locker=''
 Log='$Log'
-Mcc='Mcc'
 RCSfile='$RCSfile'
 Revision='$Revision'
 Source=''
@@ -72,10 +71,10 @@ crosscompile='undef'
 cryptlib=''
 csh='undef'
 d_Gconvert='sprintf((b),"%.*g",(n),(x))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
 d_PRId64='undef'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
@@ -312,6 +311,7 @@ d_sigsetjmp='undef'
 d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
+d_socks5_init='undef'
 d_sqrtl='undef'
 d_statblks='undef'
 d_statfs_f_flags='undef'
@@ -412,7 +412,6 @@ h_fcntl='false'
 h_sysfile='true'
 hint='recommended'
 hostcat='ypcat hosts'
-huge=''
 i16size='2'
 i16type='short'
 i32size='4'
@@ -528,7 +527,6 @@ ivsize='4'
 ivtype='long'
 known_extensions='~static_ext~ ~dynamic_ext~ ~nonxs_ext~'
 ksh=''
-large=''
 ld='gcc'
 lddlflags='-mdll ~LINK_FLAGS~'
 ldflags='~LINK_FLAGS~'
@@ -566,17 +564,30 @@ make_set_make='#'
 mallocobj='malloc.o'
 mallocsrc='malloc.c'
 malloctype='void *'
+man1='man1'
 man1dir='~INST_TOP~~INST_VER~\man\man1'
 man1direxp='~INST_TOP~~INST_VER~\man\man1'
 man1ext='1'
+man2='man2'
+man2ext='2'
+man3='man3'
 man3dir='~INST_TOP~~INST_VER~\man\man3'
 man3direxp='~INST_TOP~~INST_VER~\man\man3'
 man3ext='3'
-medium=''
+man4='man4'
+man4ext='4'
+man5='man5'
+man5ext='5'
+man6='man6'
+man6ext='6'
+man7='man7'
+man7ext='7'
+man8='man8'
+man8ext='8'
+mandirstyle='bsd'
 mips_type=''
 mkdir='mkdir'
 mmaptype='void *'
-models='none'
 modetype='mode_t'
 more='more /e'
 multiarch='undef'
@@ -595,6 +606,9 @@ nm_opt=''
 nm_so_opt=''
 nonxs_ext='Errno'
 nroff=''
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
 nvsize='8'
 nvtype='double'
 o_nonblock='O_NONBLOCK'
@@ -638,10 +652,10 @@ revision='5'
 rm='del'
 rmail=''
 runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
 sPRId64='"ld"'
 sPRIeldbl='"e"'
 sPRIfldbl='"f"'
@@ -684,7 +698,6 @@ sizesize='4'
 sizetype='size_t'
 sleep=''
 smail=''
-small=''
 so='dll'
 sockethdr=''
 socketlib=''
@@ -692,7 +705,6 @@ socksizetype='int'
 sort='sort'
 spackage='Perl5'
 spitshell=''
-split=''
 src=''
 ssizetype='int'
 startperl='#!perl'
@@ -772,6 +784,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='~VERSION~'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth='/usr/lib/386 /lib/386'
index 853290d..61558e5 100644 (file)
@@ -7,7 +7,6 @@ Header=''
 Id='$Id'
 Locker=''
 Log='$Log'
-Mcc='Mcc'
 RCSfile='$RCSfile'
 Revision='$Revision'
 Source=''
@@ -72,10 +71,10 @@ crosscompile='undef'
 cryptlib=''
 csh='undef'
 d_Gconvert='sprintf((b),"%.*g",(n),(x))'
-d_PRIEldbl='undef'
-d_PRIFldbl='undef'
-d_PRIGldbl='undef'
-d_PRIX64='undef'
+d_PRIEUldbl='undef'
+d_PRIFUldbl='undef'
+d_PRIGUldbl='undef'
+d_PRIXU64='undef'
 d_PRId64='undef'
 d_PRIeldbl='undef'
 d_PRIfldbl='undef'
@@ -312,6 +311,7 @@ d_sigsetjmp='undef'
 d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
+d_socks5_init='undef'
 d_sqrtl='undef'
 d_statblks='undef'
 d_statfs_f_flags='undef'
@@ -412,7 +412,6 @@ h_fcntl='false'
 h_sysfile='true'
 hint='recommended'
 hostcat='ypcat hosts'
-huge=''
 i16size='2'
 i16type='short'
 i32size='4'
@@ -528,7 +527,6 @@ ivsize='4'
 ivtype='long'
 known_extensions='~static_ext~ ~dynamic_ext~ ~nonxs_ext~'
 ksh=''
-large=''
 ld='link'
 lddlflags='-dll ~LINK_FLAGS~'
 ldflags='~LINK_FLAGS~'
@@ -566,17 +564,30 @@ make_set_make='#'
 mallocobj='malloc.o'
 mallocsrc='malloc.c'
 malloctype='void *'
+man1='man1'
 man1dir='~INST_TOP~~INST_VER~\man\man1'
 man1direxp='~INST_TOP~~INST_VER~\man\man1'
 man1ext='1'
+man2='man2'
+man2ext='2'
+man3='man3'
 man3dir='~INST_TOP~~INST_VER~\man\man3'
 man3direxp='~INST_TOP~~INST_VER~\man\man3'
 man3ext='3'
-medium=''
+man4='man4'
+man4ext='4'
+man5='man5'
+man5ext='5'
+man6='man6'
+man6ext='6'
+man7='man7'
+man7ext='7'
+man8='man8'
+man8ext='8'
+mandirstyle='bsd'
 mips_type=''
 mkdir='mkdir'
 mmaptype='void *'
-models='none'
 modetype='mode_t'
 more='more /e'
 multiarch='undef'
@@ -595,6 +606,9 @@ nm_opt=''
 nm_so_opt=''
 nonxs_ext='Errno'
 nroff=''
+nveformat='"e"'
+nvfformat='"f"'
+nvgformat='"g"'
 nvsize='8'
 nvtype='double'
 o_nonblock='O_NONBLOCK'
@@ -638,10 +652,10 @@ revision='5'
 rm='del'
 rmail=''
 runnm='true'
-sPRIEldbl='"E"'
-sPRIFldbl='"F"'
-sPRIGldbl='"G"'
-sPRIX64='"lX"'
+sPRIEUldbl='"E"'
+sPRIFUldbl='"F"'
+sPRIGUldbl='"G"'
+sPRIXU64='"lX"'
 sPRId64='"ld"'
 sPRIeldbl='"e"'
 sPRIfldbl='"f"'
@@ -684,7 +698,6 @@ sizesize='4'
 sizetype='size_t'
 sleep=''
 smail=''
-small=''
 so='dll'
 sockethdr=''
 socketlib=''
@@ -692,7 +705,6 @@ socksizetype='int'
 sort='sort'
 spackage='Perl5'
 spitshell=''
-split=''
 src=''
 ssizetype='int'
 startperl='#!perl'
@@ -772,6 +784,7 @@ vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
 version='~VERSION~'
+versiononly='undef'
 vi=''
 voidflags='15'
 xlibpth='/usr/lib/386 /lib/386'
index 3ed8e04..d71db98 100644 (file)
  *     This symbol defines the format string used for printing a Perl UV
  *     as an unsigned hexadecimal integer.
  */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
+ */
 #define        IVdf            "ld"            /**/
 #define        UVuf            "lu"            /**/
 #define        UVof            "lo"            /**/
 #define        UVxf            "lx"            /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
index dca79c1..f943aad 100644 (file)
  *     This symbol defines the format string used for printing a Perl UV
  *     as an unsigned hexadecimal integer.
  */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
+ */
 #define        IVdf            "ld"            /**/
 #define        UVuf            "lu"            /**/
 #define        UVof            "lo"            /**/
 #define        UVxf            "lx"            /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
index cc92646..6b8d234 100644 (file)
  *     This symbol defines the format string used for printing a Perl UV
  *     as an unsigned hexadecimal integer.
  */
+/* NVef:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %e-ish floating point format.
+ */
+/* NVff:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %f-ish floating point format.
+ */
+/* NVgf:
+ *     This symbol defines the format string used for printing a Perl NV
+ *     using %g-ish floating point format.
+ */
 #define        IVdf            "ld"            /**/
 #define        UVuf            "lu"            /**/
 #define        UVof            "lo"            /**/
 #define        UVxf            "lx"            /**/
+#define        NVef            "e"             /**/
+#define        NVff            "f"             /**/
+#define        NVgf            "g"             /**/
 
 /* Pid_t:
  *     This symbol holds the type used to declare process ids in the kernel.
index 6722a5e..86a2bf4 100644 (file)
@@ -712,7 +712,7 @@ SETARGV_OBJ = setargv$(o)
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B re \
                Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
-               Sys/Hostname
+               Sys/Hostname Storable
 STATIC_EXT     = DynaLoader
 NONXS_EXT      = Errno
 
@@ -734,6 +734,7 @@ BYTELOADER  = $(EXTDIR)\ByteLoader\ByteLoader
 DPROF          = $(EXTDIR)\Devel\DProf\DProf
 GLOB           = $(EXTDIR)\File\Glob\Glob
 HOSTNAME       = $(EXTDIR)\Sys\Hostname\Hostname
+STORABLE       = $(EXTDIR)\Storable\Storable
 
 SOCKET_DLL     = $(AUTODIR)\Socket\Socket.dll
 FCNTL_DLL      = $(AUTODIR)\Fcntl\Fcntl.dll
@@ -751,6 +752,7 @@ BYTELOADER_DLL      = $(AUTODIR)\ByteLoader\ByteLoader.dll
 DPROF_DLL      = $(AUTODIR)\Devel\DProf\DProf.dll
 GLOB_DLL       = $(AUTODIR)\File\Glob\Glob.dll
 HOSTNAME_DLL   = $(AUTODIR)\Sys\Hostname\Hostname.dll
+STORABLE_DLL   = $(AUTODIR)\Storable\Storable.dll
 
 ERRNO_PM       = $(LIBDIR)\Errno.pm
 
@@ -770,7 +772,8 @@ EXTENSION_C =               \
                $(BYTELOADER).c \
                $(DPROF).c      \
                $(GLOB).c       \
-               $(HOSTNAME).c
+               $(HOSTNAME).c   \
+               $(STORABLE).c
 
 EXTENSION_DLL  =               \
                $(SOCKET_DLL)   \
@@ -788,7 +791,8 @@ EXTENSION_DLL       =               \
                $(BYTELOADER_DLL)       \
                $(DPROF_DLL)    \
                $(GLOB_DLL)     \
-               $(HOSTNAME_DLL)
+               $(HOSTNAME_DLL) \
+               $(STORABLE_DLL)
 
 EXTENSION_PM   =               \
                $(ERRNO_PM)
@@ -1170,6 +1174,11 @@ $(BYTELOADER_DLL): $(PERLEXE) $(BYTELOADER).xs
        ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
        cd $(EXTDIR)\$(*B) && $(MAKE)
 
+$(STORABLE_DLL): $(PERLEXE) $(STORABLE).xs
+       cd $(EXTDIR)\$(*B) && \
+       ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
+       cd $(EXTDIR)\$(*B) && $(MAKE)
+
 $(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL
        cd $(EXTDIR)\$(*B) && \
        ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
@@ -1210,10 +1219,11 @@ distclean: clean
        -del /f $(LIBDIR)\Data\Dumper.pm $(LIBDIR)\ByteLoader.pm
        -del /f $(LIBDIR)\Devel\Peek.pm $(LIBDIR)\Devel\DProf.pm
        -del /f $(LIBDIR)\File\Glob.pm
-       -rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
-       -rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
-       -rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
-       -rmdir /s /q $(LIBDIR)\Data || rmdir /s $(LIBDIR)\Data
+       -del /f $(LIBDIR)\Storable.pm
+       -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
+       -if exist $(LIBDIR)\Thread rmdir /s /q $(LIBDIR)\Thread || rmdir /s $(LIBDIR)\Thread
+       -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
+       -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data || rmdir /s $(LIBDIR)\Data
        -del /f $(PODDIR)\*.html
        -del /f $(PODDIR)\*.bat
        -cd ..\utils && del /f h2ph splain perlbug pl2pm c2ph h2xs perldoc \
@@ -1224,8 +1234,8 @@ distclean: clean
        -del /f bin\*.bat
        -cd $(EXTDIR) && del /s *$(a) *.def *.map *.pdb *.bs Makefile *$(o) \
            pm_to_blib
-       -rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
-       -rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
+       -if exist $(AUTODIR) rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
+       -if exist $(COREDIR) rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
 
 install : all installbare installhtml
 
@@ -1292,7 +1302,7 @@ clean :
        -@erase $(WPERLEXE)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
-       -rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
+       -if exist $(MINIDIR) rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
        -@erase $(WIN32_OBJ)
        -@erase $(DLL_OBJ)
        -@erase $(X2P_OBJ)
@@ -1301,3 +1311,19 @@ clean :
        -@erase ..\x2p\*.exe ..\x2p\*.bat
        -@erase *.ilk
        -@erase *.pdb
+
+# Handy way to run perlbug -ok without having to install and run the
+# installed perlbug. We don't re-run the tests here - we trust the user.
+# Please *don't* use this unless all tests pass.
+# If you want to report test failures, use "dmake nok" instead.
+ok: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -ok -s "(UNINSTALLED)"
+
+okfile: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -ok -s "(UNINSTALLED)" -F perl.ok
+nok: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)"
+nokfile: utils
+       $(PERLEXE) -I..\lib ..\utils\perlbug -nok -s "(UNINSTALLED)" -F perl.nok
index ea0d31d..7807495 100644 (file)
@@ -940,7 +940,7 @@ PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
 int
 PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
 {
-    return fstat(handle, buffer);
+    return win32_fstat(handle, buffer);
 }
 
 int
@@ -1666,6 +1666,11 @@ win32_start_child(LPVOID arg)
     w32_pseudo_id = id;
 #else
     w32_pseudo_id = GetCurrentThreadId();
+    if (IsWin95()) {
+       int pid = (int)w32_pseudo_id;
+       if (pid < 0)
+           w32_pseudo_id = -pid;
+    }
 #endif
     if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
        sv_setiv(GvSV(tmpgv), -(IV)w32_pseudo_id);
@@ -1746,7 +1751,13 @@ PerlProcFork(struct IPerlProc* piPerl)
 #ifdef USE_ITHREADS
     DWORD id;
     HANDLE handle;
-    CPerlHost *h = new CPerlHost(*(CPerlHost*)w32_internal_host);
+    CPerlHost *h;
+
+    if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
+       errno = EAGAIN;
+       return -1;
+    }
+    h = new CPerlHost(*(CPerlHost*)w32_internal_host);
     PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHXo, 1,
                                                 h->m_pHostperlMem,
                                                 h->m_pHostperlMemShared,
@@ -1775,6 +1786,11 @@ PerlProcFork(struct IPerlProc* piPerl)
        errno = EAGAIN;
        return -1;
     }
+    if (IsWin95()) {
+       int pid = (int)id;
+       if (pid < 0)
+           id = -pid;
+    }
     w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
     w32_pseudo_child_pids[w32_num_pseudo_children] = id;
     ++w32_num_pseudo_children;
@@ -2202,7 +2218,7 @@ CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
        dwEnvIndex = 0;
        lpLocalEnv = GetIndex(dwEnvIndex);
        while(*lpEnvPtr != '\0') {
-           if(lpLocalEnv == NULL) {
+           if(!lpLocalEnv) {
                // all environment overrides have been added
                // so copy string into place
                strcpy(lpStr, lpEnvPtr);
@@ -2234,6 +2250,16 @@ CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
            }
        }
 
+       while(lpLocalEnv) {
+           // still have environment overrides to add
+           // so copy the strings into place
+           strcpy(lpStr, lpLocalEnv);
+           nLength = strlen(lpLocalEnv) + 1;
+           lpStr += nLength;
+           lpEnvPtr += nLength;
+           lpLocalEnv = GetIndex(dwEnvIndex);
+       }
+
        // add final NULL
        *lpStr = '\0';
     }
index fae3346..e2b245d 100644 (file)
@@ -372,6 +372,10 @@ DllMain(HANDLE hModule,            /* DLL module handle */
         */
     case DLL_PROCESS_DETACH:
        EndSockets();
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+       if (PL_curinterp)
+           FREE_THREAD_KEY;
+#endif
        break;
 
        /* The attached process creates a new thread. */
index 0b634a8..37cb4a5 100644 (file)
@@ -461,29 +461,37 @@ int VDir::SetCurrentDirectoryA(char *lpBuffer)
 }
 
 DWORD VDir::CalculateEnvironmentSpace(void)
-{   /* the current directory environment strings are stored as '=d=d:\path' */
+{   /* the current directory environment strings are stored as '=D:=d:\path' */
     int index;
     DWORD dwSize = 0;
     for (index = 0; index < driveCount; ++index) {
        if (dirTableA[index] != NULL) {
-           dwSize += strlen(dirTableA[index]) + 4;  /* add 1 for trailing NULL and 3 for '=d=' */
+           dwSize += strlen(dirTableA[index]) + 5;  /* add 1 for trailing NULL and 4 for '=D:=' */
        }
     }
     return dwSize;
 }
 
 LPSTR VDir::BuildEnvironmentSpace(LPSTR lpStr)
-{   /* store the current directory environment strings as '=d=d:\path' */
-    int index;
+{   /* store the current directory environment strings as '=D:=d:\path' */
+    int index, length;
     LPSTR lpDirStr;
     for (index = 0; index < driveCount; ++index) {
        lpDirStr = dirTableA[index];
        if (lpDirStr != NULL) {
            lpStr[0] = '=';
            lpStr[1] = lpDirStr[0];
-           lpStr[2] = '=';
-           strcpy(&lpStr[3], lpDirStr);
-           lpStr += strlen(lpDirStr) + 4; /* add 1 for trailing NULL and 3 for '=d=' */
+           lpStr[2] = '\0';
+           CharUpper(&lpStr[1]);
+           lpStr[2] = ':';
+           lpStr[3] = '=';
+           strcpy(&lpStr[4], lpDirStr);
+           length = strlen(lpDirStr);
+           lpStr += length + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+           if (length > 3 && IsPathSep(lpStr[-2])) {
+               lpStr[-2] = '\0';   /* remove the trailing path separator */
+               --lpStr;
+           }
        }
     }
     return lpStr;
index 6856884..2b31878 100644 (file)
@@ -436,12 +436,19 @@ win32_os_id(void)
 DllExport int
 win32_getpid(void)
 {
+    int pid;
 #ifdef USE_ITHREADS
     dTHXo;
     if (w32_pseudo_id)
        return -((int)w32_pseudo_id);
 #endif
-    return _getpid();
+    pid = _getpid();
+    /* Windows 9x appears to always reports a pid for threads and processes
+     * that has the high bit set. So we treat the lower 31 bits as the
+     * "real" PID for Perl's purposes. */
+    if (IsWin95() && pid < 0)
+       pid = -pid;
+    return pid;
 }
 
 /* Tokenize a string.  Words are null-separated, and the list
@@ -568,7 +575,11 @@ do_aspawn(void *vreally, void **vmark, void **vsp)
                               (const char* const*)argv);
     }
 
-    if (flag != P_NOWAIT) {
+    if (flag == P_NOWAIT) {
+       if (IsWin95())
+           PL_statusvalue = -1;        /* >16bits hint for pp_system() */
+    }
+    else {
        if (status < 0) {
            dTHR;
            if (ckWARN(WARN_EXEC))
@@ -657,7 +668,11 @@ do_spawn2(char *cmd, int exectype)
        cmd = argv[0];
        Safefree(argv);
     }
-    if (exectype != EXECF_SPAWN_NOWAIT) {
+    if (exectype == EXECF_SPAWN_NOWAIT) {
+       if (IsWin95())
+           PL_statusvalue = -1;        /* >16bits hint for pp_system() */
+    }
+    else {
        if (status < 0) {
            dTHR;
            if (ckWARN(WARN_EXEC))
@@ -1021,10 +1036,11 @@ win32_kill(int pid, int sig)
 {
     dTHXo;
     HANDLE hProcess;
+    long child;
 #ifdef USE_ITHREADS
     if (pid < 0) {
        /* it is a pseudo-forked child */
-       long child = find_pseudo_pid(-pid);
+       child = find_pseudo_pid(-pid);
        if (child >= 0) {
            if (!sig)
                return 0;
@@ -1034,11 +1050,15 @@ win32_kill(int pid, int sig)
                return 0;
            }
        }
+       else if (IsWin95()) {
+           pid = -pid;
+           goto alien_process;
+       }
     }
     else
 #endif
     {
-       long child = find_pid(pid);
+       child = find_pid(pid);
        if (child >= 0) {
            if (!sig)
                return 0;
@@ -1049,7 +1069,9 @@ win32_kill(int pid, int sig)
            }
        }
        else {
-           hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
+alien_process:
+           hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE,
+                                  (IsWin95() ? -pid : pid));
            if (hProcess) {
                if (!sig)
                    return 0;
@@ -1611,7 +1633,7 @@ win32_uname(struct utsname *name)
        char *arch;
        GetSystemInfo(&info);
 
-#if defined(__BORLANDC__) || defined(__MINGW32__)
+#if (defined(__BORLANDC__)&&(__BORLANDC__<=0x520)) || defined(__MINGW32__)
        switch (info.u.s.wProcessorArchitecture) {
 #else
        switch (info.wProcessorArchitecture) {
@@ -1636,15 +1658,16 @@ DllExport int
 win32_waitpid(int pid, int *status, int flags)
 {
     dTHXo;
+    DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
     int retval = -1;
+    long child;
     if (pid == -1)                             /* XXX threadid == 1 ? */
        return win32_wait(status);
 #ifdef USE_ITHREADS
     else if (pid < 0) {
-       long child = find_pseudo_pid(-pid);
+       child = find_pseudo_pid(-pid);
        if (child >= 0) {
            HANDLE hThread = w32_pseudo_child_handles[child];
-           DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
            DWORD waitcode = WaitForSingleObject(hThread, timeout);
            if (waitcode == WAIT_TIMEOUT) {
                return 0;
@@ -1654,41 +1677,59 @@ win32_waitpid(int pid, int *status, int flags)
                    *status = (int)((waitcode & 0xff) << 8);
                    retval = (int)w32_pseudo_child_pids[child];
                    remove_dead_pseudo_process(child);
-                   return retval;
+                   return -retval;
                }
            }
            else
                errno = ECHILD;
        }
+       else if (IsWin95()) {
+           pid = -pid;
+           goto alien_process;
+       }
     }
 #endif
     else {
-       long child = find_pid(pid);
+       HANDLE hProcess;
+       DWORD waitcode;
+       child = find_pid(pid);
        if (child >= 0) {
-           HANDLE hProcess = w32_child_handles[child];
-           DWORD timeout = (flags & WNOHANG) ? 0 : INFINITE;
-           DWORD waitcode = WaitForSingleObject(hProcess, timeout);
+           hProcess = w32_child_handles[child];
+           waitcode = WaitForSingleObject(hProcess, timeout);
            if (waitcode == WAIT_TIMEOUT) {
                return 0;
            }
            else if (waitcode != WAIT_FAILED) {
-                if (GetExitCodeProcess(hProcess, &waitcode)) {
-                    *status = (int)((waitcode & 0xff) << 8);
-                    retval = (int)w32_child_pids[child];
-                    remove_dead_process(child);
-                    return retval;
-                }
+               if (GetExitCodeProcess(hProcess, &waitcode)) {
+                   *status = (int)((waitcode & 0xff) << 8);
+                   retval = (int)w32_child_pids[child];
+                   remove_dead_process(child);
+                   return retval;
+               }
            }
            else
                errno = ECHILD;
        }
        else {
-           retval = cwait(status, pid, WAIT_CHILD);
-           /* cwait() returns "correctly" on Borland */
-#ifndef __BORLANDC__
-           if (status)
-               *status *= 256;
-#endif
+alien_process:
+           hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE,
+                                  (IsWin95() ? -pid : pid));
+           if (hProcess) {
+               waitcode = WaitForSingleObject(hProcess, timeout);
+               if (waitcode == WAIT_TIMEOUT) {
+                   return 0;
+               }
+               else if (waitcode != WAIT_FAILED) {
+                   if (GetExitCodeProcess(hProcess, &waitcode)) {
+                       *status = (int)((waitcode & 0xff) << 8);
+                       CloseHandle(hProcess);
+                       return pid;
+                   }
+               }
+               CloseHandle(hProcess);
+           }
+           else
+               errno = ECHILD;
        }
     }
     return retval >= 0 ? pid : retval;                
@@ -1720,7 +1761,7 @@ win32_wait(int *status)
                *status = (int)((exitcode & 0xff) << 8);
                retval = (int)w32_pseudo_child_pids[i];
                remove_dead_pseudo_process(i);
-               return retval;
+               return -retval;
            }
        }
     }
@@ -1817,53 +1858,6 @@ win32_crypt(const char *txt, const char *salt)
 #endif
 }
 
-/* C doesn't like repeat struct definitions */
-
-#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
-
-#ifndef _CRTIMP
-#define _CRTIMP __declspec(dllimport)
-#endif
-
-/*
- * Control structure for lowio file handles
- */
-typedef struct {
-    long osfhnd;    /* underlying OS file HANDLE */
-    char osfile;    /* attributes of file (e.g., open in text mode?) */
-    char pipech;    /* one char buffer for handles opened on pipes */
-    int lockinitflag;
-    CRITICAL_SECTION lock;
-} ioinfo;
-
-
-/*
- * Array of arrays of control structures for lowio files.
- */
-EXTERN_C _CRTIMP ioinfo* __pioinfo[];
-
-/*
- * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
- * array of ioinfo structs.
- */
-#define IOINFO_L2E         5
-
-/*
- * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
- */
-#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
-
-/*
- * Access macros for getting at an ioinfo struct and its fields from a
- * file handle
- */
-#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfhnd(i)  (_pioinfo(i)->osfhnd)
-#define _osfile(i)  (_pioinfo(i)->osfile)
-#define _pipech(i)  (_pioinfo(i)->pipech)
-
-#endif
-
 #ifdef USE_FIXED_OSFHANDLE
 
 #define FOPEN                  0x01    /* file handle open */
@@ -1902,10 +1896,6 @@ EXTERN_C _CRTIMP ioinfo* __pioinfo[];
  *     -- BKS, 1-23-2000
 */
 
-/* since we are not doing a dup2(), this works fine */
-
-#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = osfh)
-
 /* create an ioinfo entry, kill its handle, and steal the entry */
 
 static int
@@ -2322,7 +2312,25 @@ win32_abort(void)
 DllExport int
 win32_fstat(int fd,struct stat *sbufptr)
 {
+#ifdef __BORLANDC__
+    /* A file designated by filehandle is not shown as accessible
+     * for write operations, probably because it is opened for reading.
+     * --Vadim Konovalov
+     */ 
+    int rc = fstat(fd,sbufptr);
+    BY_HANDLE_FILE_INFORMATION bhfi;
+    if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &bhfi)) {
+        sbufptr->st_mode &= 0xFE00;
+        if (bhfi.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+            sbufptr->st_mode |= (S_IREAD + (S_IREAD >> 3) + (S_IREAD >> 6));
+        else
+            sbufptr->st_mode |= ((S_IREAD|S_IWRITE) + ((S_IREAD|S_IWRITE) >> 3)
+              + ((S_IREAD|S_IWRITE) >> 6));
+    }
+    return rc;
+#else
     return fstat(fd,sbufptr);
+#endif
 }
 
 DllExport int
@@ -3273,9 +3281,12 @@ RETRY:
 
     if (mode == P_NOWAIT) {
        /* asynchronous spawn -- store handle, return PID */
-       w32_child_handles[w32_num_children] = ProcessInformation.hProcess;
-       w32_child_pids[w32_num_children] = ProcessInformation.dwProcessId;
        ret = (int)ProcessInformation.dwProcessId;
+       if (IsWin95() && ret < 0)
+           ret = -ret;
+
+       w32_child_handles[w32_num_children] = ProcessInformation.hProcess;
+       w32_child_pids[w32_num_children] = (DWORD)ret;
        ++w32_num_children;
     }
     else  {
@@ -3520,6 +3531,25 @@ win32_dynaload(const char* filename)
 {
     dTHXo;
     HMODULE hModule;
+    char buf[MAX_PATH+1];
+    char *first;
+
+    /* LoadLibrary() doesn't recognize forward slashes correctly,
+     * so turn 'em back. */
+    first = strchr(filename, '/');
+    if (first) {
+       STRLEN len = strlen(filename);
+       if (len <= MAX_PATH) {
+           strcpy(buf, filename);
+           filename = &buf[first - filename];
+           while (*filename) {
+               if (*filename == '/')
+                   *(char*)filename = '\\';
+               ++filename;
+           }
+           filename = buf;
+       }
+    }
     if (USING_WIDE()) {
        WCHAR wfilename[MAX_PATH+1];
        A2WHELPER(filename, wfilename, sizeof(wfilename));
@@ -3835,8 +3865,11 @@ XS(w32_Spawn)
                &stStartInfo,           /* -> Startup info */
                &stProcInfo))           /* <- Process info (if OK) */
     {
+       int pid = (int)stProcInfo.dwProcessId;
+       if (IsWin95() && pid < 0)
+           pid = -pid;
+       sv_setiv(ST(2), pid);
        CloseHandle(stProcInfo.hThread);/* library source code does this. */
-       sv_setiv(ST(2), stProcInfo.dwProcessId);
        bSuccess = TRUE;
     }
     XSRETURN_IV(bSuccess);
@@ -3865,6 +3898,9 @@ XS(w32_GetShortPathName)
 
     shortpath = sv_mortalcopy(ST(0));
     SvUPGRADE(shortpath, SVt_PV);
+    if (!SvPVX(shortpath) || !SvLEN(shortpath))
+        XSRETURN_UNDEF;
+
     /* src == target is allowed */
     do {
        len = GetShortPathName(SvPVX(shortpath),
@@ -3894,6 +3930,9 @@ XS(w32_GetFullPathName)
     filename = ST(0);
     fullpath = sv_mortalcopy(filename);
     SvUPGRADE(fullpath, SVt_PV);
+    if (!SvPVX(fullpath) || !SvLEN(fullpath))
+        XSRETURN_UNDEF;
+
     do {
        len = GetFullPathName(SvPVX(filename),
                              SvLEN(fullpath),
@@ -4090,7 +4129,7 @@ Perl_sys_intern_dup(pTHX_ struct interp_intern *src, struct interp_intern *dst)
     Newz(1313, dst->children, 1, child_tab);
     dst->pseudo_id             = 0;
     Newz(1313, dst->pseudo_children, 1, child_tab);
-    dst->thr_intern.Winit_socktype = src->thr_intern.Winit_socktype;
+    dst->thr_intern.Winit_socktype = 0;
 }
 #  endif /* USE_ITHREADS */
 #endif /* HAVE_INTERP_INTERN */
index eb5ecd2..d9ffbfe 100644 (file)
@@ -159,6 +159,11 @@ struct utsname {
 #  define      F_OK    0
 #endif
 
+/* for waitpid() */
+#ifndef WNOHANG
+#  define WNOHANG      1
+#endif
+
 #define PERL_GET_CONTEXT_DEFINED
 
 /* Compiler-specific stuff. */
@@ -194,6 +199,8 @@ struct utsname {
 /* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
 #define PERL_MEMBER_PTR_SIZE   12
 
+#define isnan          _isnan
+
 #endif
 
 #ifdef _MSC_VER                        /* Microsoft Visual C++ */
@@ -486,15 +493,61 @@ struct interp_intern {
     } STMT_END
 #endif
 
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
+#ifdef PERL_CORE
+
+/* C doesn't like repeat struct definitions */
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
+
+/*
+ * Control structure for lowio file handles
+ */
+typedef struct {
+    long osfhnd;    /* underlying OS file HANDLE */
+    char osfile;    /* attributes of file (e.g., open in text mode?) */
+    char pipech;    /* one char buffer for handles opened on pipes */
+    int lockinitflag;
+    CRITICAL_SECTION lock;
+} ioinfo;
+
+
+/*
+ * Array of arrays of control structures for lowio files.
+ */
+EXTERN_C _CRTIMP ioinfo* __pioinfo[];
+
+/*
+ * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
+ * array of ioinfo structs.
+ */
+#define IOINFO_L2E         5
+
+/*
+ * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
+ */
+#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
+
+/*
+ * Access macros for getting at an ioinfo struct and its fields from a
+ * file handle
+ */
+#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
+#define _osfhnd(i)  (_pioinfo(i)->osfhnd)
+#define _osfile(i)  (_pioinfo(i)->osfile)
+#define _pipech(i)  (_pioinfo(i)->pipech)
+
+/* since we are not doing a dup2(), this works fine */
+#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (long)osfh)
+#endif
+#endif
+
 /*
  * This provides a layer of functions and macros to ensure extensions will
  * get to use the same RTL functions as the core.
  */
 #include "win32iop.h"
 
-#ifndef WNOHANG
-#  define WNOHANG 1
-#endif
-
 #endif /* _INC_WIN32_PERL5 */
 
index f7d101b..3b81d8b 100644 (file)
@@ -426,15 +426,27 @@ my_fclose (FILE *pf)
     if (!wsock_started)                /* No WinSock? */
        return(fclose(pf));     /* Then not a socket. */
     osf = TO_SOCKET(fileno(pf));/* Get it now before it's gone! */
-    if (osf != -1
-       && closesocket(osf) == SOCKET_ERROR
-       && WSAGetLastError() != WSAENOTSOCK)
-    {
-       (void)fclose(pf);
-       return EOF;
+    if (osf != -1) {
+       int err;
+       win32_fflush(pf);
+       err = closesocket(osf);
+       if (err == 0) {
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
+            _set_osfhnd(fileno(pf), INVALID_HANDLE_VALUE);
+#endif
+           (void)fclose(pf);   /* handle already closed, ignore error */
+           return 0;
+       }
+       else if (err == SOCKET_ERROR) {
+           err = WSAGetLastError();
+           if (err != WSAENOTSOCK) {
+               (void)fclose(pf);
+               errno = err;
+               return EOF;
+           }
+       }
     }
-    else
-       return fclose(pf);
+    return fclose(pf);
 }
 
 struct hostent *
index 809e0f7..a52118b 100644 (file)
@@ -175,6 +175,11 @@ END_EXTERN_C
        }                                                               \
     } STMT_END
 
+#define FREE_THREAD_KEY \
+    STMT_START {                                                       \
+       TlsFree(PL_thr_key);                                            \
+    } STMT_END
+
 #if defined(USE_RTL_THREAD_API) && !defined(_MSC_VER)
 #define JOIN(t, avp)                                                   \
     STMT_START {                                                       \
index ce5c46c..a0ba96a 100755 (executable)
@@ -34,10 +34,7 @@ cat >Makefile <<!GROK!THIS!
 CC = $cc
 BYACC = $byacc
 LDFLAGS = $ldflags
-SMALL = $small
-LARGE = $large $split
-# XXX Perl malloc temporarily unusable (declaration collisions with
-# stdlib.h)
+# XXX Perl malloc temporarily unusable (declaration collisions with stdlib.h)
 #mallocsrc = $mallocsrc
 #mallocobj = $mallocobj
 shellflags = $shellflags
@@ -129,7 +126,7 @@ a2p.c: a2p.y
 
 a2p$(OBJ_EXT): a2p.c a2py.c a2p.h EXTERN.h util.h INTERN.h \
                ../handy.h ../config.h str.h hash.h
-       $(CCCMD) $(LARGE) a2p.c
+       $(CCCMD) a2p.c
 
 clean:
        rm -f a2p *$(OBJ_EXT) $(plexe) $(plc) $(plm)
@@ -138,6 +135,9 @@ realclean: clean
        rm -f core $(addedbyconf) all malloc.c
        rm -f $(FIRSTMAKEFILE) $(FIRSTMAKEFILE).old
 
+veryclean: realclean
+       rm -f *~ *.orig
+
 # The following lint has practically everything turned on.  Unfortunately,
 # you have to wade through a lot of mumbo jumbo that can't be suppressed.
 # If the source file has a /*NOSTRICT*/ somewhere, ignore the lint message
index b5ef917..dcd97a1 100755 (executable)
@@ -84,8 +84,8 @@ for file do
 
     ccflags="`echo $ccflags | sed -e 's/-DMULTIPLICITY//'`"
 
-    echo "$cc -c $ccflags $optimize $large $split"
-    eval "$also "'"$cc -c $ccflags $optimize $large $split"'
+    echo "$cc -c $ccflags $optimize"
+    eval "$also "'"$cc -c $ccflags $optimize"'
 
     . $TOP/config.sh
 
index 4f7bf8c..21a5ee8 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/local/bin/perl
+#!/usr/bin/perl
 
 use Config;
 use File::Basename qw(&basename &dirname);
@@ -29,823 +29,1927 @@ print OUT <<"!GROK!THIS!";
 $Config{startperl}
     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
        if \$running_under_some_shell;
-\$startperl = "$Config{startperl}";
-\$perlpath = "$Config{perlpath}";
+my \$startperl = "$Config{startperl}";
+my \$perlpath  = "$Config{perlpath}";
 !GROK!THIS!
 
 # In the following, perl variables are not expanded during extraction.
 
 print OUT <<'!NO!SUBS!';
 
-# $RCSfile: s2p.SH,v $$Revision: 4.1 $$Date: 92/08/07 18:29:23 $
-#
-# $Log:        s2p.SH,v $
+$0 =~ s/^.*?(\w+)$/$1/;
+
+# (p)sed - a stream editor
+# History:  Aug 12 2000: Original version.
+
+use strict;
+use integer;
+use Symbol;
 
 =head1 NAME
 
-s2p - Sed to Perl translator
+sed - a stream editor
 
 =head1 SYNOPSIS
 
-B<s2p [options] filename>
+   sed [-an] script [file ...]
+   sed [-an] [-e script] [-f script-file] [file ...]
 
 =head1 DESCRIPTION
 
-I<s2p> takes a sed script specified on the command line (or from
-standard input) and produces a comparable I<perl> script on the
-standard output.
+A stream editor reads the input stream consisting of the specified files
+(or standard input, if none are given), processes is line by line by
+applying a script consisting of edit commands, and writes resulting lines
+to standard output. The filename `C<->' may be used to read standard input.
+
+The edit script is composed from arguments of B<-e> options and
+script-files, in the given order. A single script argument may be specified
+as the first parameter.
+
+If this program is invoked with the name F<s2p>, it will act as a
+sed-to-Perl translator. See L<"sed Script Translation">.
 
-=head2 Options
+B<sed> returns an exit code of 0 on success or >0 if an error occurred.
 
-Options include:
+=head1 OPTIONS
 
-=over 5
+=over 4
 
-=item B<-DE<lt>numberE<gt>>
+=item B<-a>
 
-sets debugging flags.
+A file specified as argument to the B<w> edit command is by default
+opened before input processing starts. Using B<-a>, opening of such
+files is delayed until the first line is actually written to the file.
+
+=item B<-e> I<script>
+
+The editing commands defined by I<script> are appended to the script.
+Multiple commands must be separated by newlines.
+
+=item B<-f> I<script-file>
+
+Editing commands from the specified I<script-file> are read and appended
+to the script.
 
 =item B<-n>
 
-specifies that this sed script was always invoked with a B<sed -n>.
-Otherwise a switch parser is prepended to the front of the script.
+By default, a line is written to standard output after the editing script
+has been applied to it. The B<-n> option suppresses automatic printing.
+
+=back
+
+=head1 COMMANDS
+
+B<sed> command syntax is defined as
+
+Z<> Z<> Z<> Z<>[I<address>[B<,>I<address>]][B<!>]I<function>[I<argument>]
+
+with whitespace being permitted before or after addresses, and between
+the function character and the argument. The I<address>es and the
+address inverter (C<!>) are used to restrict the application of a
+command to the selected line(s) of input.
+
+Each command must be on a line of its own, except where noted in
+the synopses below.
+
+The edit cycle performed on each input line consist of reading the line
+(without its trailing newline character) into the I<pattern space>,
+applying the applicable commands of the edit script, writing the final
+contents of the pattern space and a newline to the standard output.
+A I<hold space> is provided for saving the contents of the
+pattern space for later use.
+
+=head2 Addresses
+
+A sed address is either a line number or a pattern, which may be combined
+arbitrarily to construct ranges. Lines are numbered across all input files.
+
+Any address may be followed by an exclamation mark (`C<!>'), selecting
+all lines not matching that address.
 
-=item B<-p>
+=over 4
 
-specifies that this sed script was never invoked with a B<sed -n>.
-Otherwise a switch parser is prepended to the front of the script.
+=item I<number>
+
+The line with the given number is selected.
+
+=item B<$>
+
+A dollar sign (C<$>) is the line number of the last line of the input stream.
+
+=item B</>I<regular expression>B</>
+
+A pattern address is a basic regular expression (see 
+L<"Basic Regular Expressions">), between the delimiting character C</>.
+Any other character except C<\> or newline may be used to delimit a
+pattern address when the initial delimiter is prefixed with a
+backslash (`C<\>').
 
 =back
 
-=head2 Considerations
+If no address is given, the command selects every line.
 
-The perl script produced looks very sed-ish, and there may very well
-be better ways to express what you want to do in perl.  For instance,
-s2p does not make any use of the split operator, but you might want
-to.
+If one address is given, it selects the line (or lines) matching the
+address.
 
-The perl script you end up with may be either faster or slower than
-the original sed script.  If you're only interested in speed you'll
-just have to try it both ways.  Of course, if you want to do something
-sed doesn't do, you have no choice.  It's often possible to speed up
-the perl script by various methods, such as deleting all references to
-$\ and chop.
+Two addresses select a range that begins whenever the first address
+matches, and ends (including that line) when the second address matches.
+If the first (second) address is a matching pattern, the second 
+address is not applied to the very same line to determine the end of
+the range. Likewise, if the second address is a matching pattern, the
+first address is not applied to the very same line to determine the
+begin of another range. If both addresses are line numbers,
+and the second line number is less than the first line number, then
+only the first line is selected.
 
-=head1 ENVIRONMENT
 
-s2p uses no environment variables.
+=head2 Functions
 
-=head1 AUTHOR
+The maximum permitted number of addresses is indicated with each
+function synopsis below.
 
-Larry Wall E<lt>F<larry@wall.org>E<gt>
+The argument I<text> consists of one or more lines following the command.
+Embedded newlines in I<text> must be preceded with a backslash.  Other
+backslashes in I<text> are deleted and the following character is taken
+literally.
 
-=head1 FILES
+=over 4
 
-=head1 SEE ALSO
+=cut
+
+my %ComTab;
+#--------------------------------------------------------------------------
+$ComTab{'a'}=[ 1, 'txt', \&Emit,       '{ push( @Q, <<'."'TheEnd' ) }\n" ]; #ok
+
+=item [1addr]B<a\> I<text>
+
+Write I<text> (which must start on the line following the command)
+to standard output immediately before reading the next line
+of input, either by executing the B<N> function or by beginning a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'b'}=[ 2, 'str', \&Branch,     '{ goto XXX; }'                   ]; #ok
+
+=item [2addr]B<b> [I<label>]
+
+Branch to the B<:> function with the specified I<label>. If no label
+is given, branch to the end of the script.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'c'}=[ 2, 'txt', \&Change,     <<'-X-'                           ]; #ok
+{ print <<'TheEnd'; } $doPrint = 0; goto EOS;
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<c\> I<text>
+
+The line, or range of lines, selected by the address is deleted. 
+The I<text> (which must start on the line following the command)
+is written to standard output. With an address range, this occurs at
+the end of the range.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'d'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ $doPrint = 0;
+  goto EOS;
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<d>
+
+Deletes the pattern space and starts the next cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'D'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ s/^.*\n?//;
+  if(length($_)){ goto BOS } else { goto EOS }
+}
+-X-
+### continue OK => next CYCLE;
+
+=item [2addr]B<D>
+
+Deletes the pattern space through the first embedded newline or to the end.
+If the pattern space becomes empty, a new cycle is started, otherwise
+execution of the script is restarted.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'g'}=[ 2, '',    \&Emit,       '{ $_ = $Hold };'                 ]; #ok
+
+=item [2addr]B<g>
+
+Replace the contents of the pattern space with the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'G'}=[ 2, '',    \&Emit,       '{ $_ .= "\n"; $_ .= $Hold };'    ]; #ok
+
+=item [2addr]B<G>
+
+Append a newline and the contents of the hold space to the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'h'}=[ 2, '',    \&Emit,       '{ $Hold = $_ }'                  ]; #ok
+
+=item [2addr]B<h>
+
+Replace the contents of the hold space with the pattern space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'H'}=[ 2, '',    \&Emit,       '{ $Hold .= "\n"; $Hold .= $_; }' ]; #ok
+
+=item [2addr]B<H>
+
+Append a newline and the contents of the pattern space to the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'i'}=[ 1, 'txt', \&Emit,       '{ print <<'."'TheEnd' }\n"       ]; #ok
+
+=item [1addr]B<i\> I<text>
+
+Write the I<text> (which must start on the line following the command)
+to standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'l'}=[ 2, '',    \&Emit,       '{ _l() }'                        ]; #okUTF8
+
+=item [2addr]B<l>
+
+Print the contents of the pattern space: non-printable characters are
+shown in C-style escaped form; long lines are split and have a trailing
+`C<\>' at the point of the split; the true end of a line is marked with
+a `C<$>'. Escapes are: `\a', `\t', `\n', `\f', `\r', `\e' for
+BEL, HT, LF, FF, CR, ESC, respectively, and `\' followed by a three-digit
+octal number for all other non-printable characters.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'n'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  printQ if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV();
+  chomp();
+}
+-X-
+
+=item [2addr]B<n>
+
+If automatic printing is enabled, write the pattern space to the standard
+output. Replace the pattern space with the next line of input. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'N'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ printQ if @Q;
+  $CondReg = 0;
+  last CYCLE unless getsARGV( $h );
+  chomp( $h );
+  $_ .= "\n$h";
+}
+-X-
+
+=item [2addr]B<N>
+
+Append a newline and the next line of input to the pattern space. If
+there is no more input, processing is terminated.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'p'}=[ 2, '',    \&Emit,       '{ print $_, "\n"; }'             ]; #ok
+
+=item [2addr]B<p>
+
+Print the pattern space to the standard output. (Use the B<-n> option
+to suppress automatic printing at the end of a cycle if you want to
+avoid double printing of lines.)
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'P'}=[ 2, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ if( /^(.*)/ ){ print $1, "\n"; } }
+-X-
+
+=item [2addr]B<P>
+
+Prints the pattern space through the first embedded newline or to the end.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'q'}=[ 1, '',    \&Emit,       <<'-X-'                           ]; #ok
+{ print $_, "\n" if $doPrint;
+  last CYCLE;
+}
+-X-
+
+=item [1addr]B<q>
+
+Branch to the end of the script and quit without starting a new cycle.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'r'}=[ 1, 'str', \&Emit,       "{ _r( '-X-' ) }"                 ]; #ok
+### FIXME: lazy reading - big files???
+
+=item [1addr]B<r> I<file>
+
+Copy the contents of the I<file> to standard output immediately before
+the next attempt to read a line of input. Any error encountered while
+reading I<file> is silently ignored.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'s'}=[ 2, 'sub', \&Emit,       ''                                ]; #ok
+
+=item [2addr]B<s/>I<regular expression>B</>I<replacement>B</>I<flags>
+
+Substitute the I<replacement> string for the first substring in
+the pattern space that matches the I<regular expression>.
+Any character other than backslash or newline can be used instead of a 
+slash to delimit the regular expression and the replacement.
+To use the delimiter as a literal character within the regular expression
+and the replacement, precede the character by a backslash (`C<\>').
+
+Literal newlines may be embedded in the replacement string by
+preceding a newline with a backslash.
+
+Within the replacement, an ampersand (`C<&>') is replaced by the string
+matching the regular expression. The strings `C<\1>' through `C<\9>' are
+replaced by the corresponding subpattern (see L<"Basic Regular Expressions">).
+To get a literal `C<&>' or `C<\>' in the replacement text, precede it
+by a backslash.
+
+The following I<flags> modify the behaviour of the B<s> command:
+
+=over 8
+
+=item B<g>
+
+The replacement is performed for all matching, non-overlapping substrings
+of the pattern space.
+
+=item B<1>..B<9>
+
+Replace only the n-th matching substring of the pattern space.
+
+=item B<p>
+
+If the substitution was made, print the new value of the pattern space.
+
+=item B<w> I<file>
+
+If the substitution was made, write the new value of the pattern space
+to the specified file.
+
+=back
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'t'}=[ 2, 'str', \&Branch,     '{ goto XXX if _t() }'            ]; #ok
+
+=item [2addr]B<t> [I<label>]
+
+Branch to the B<:> function with the specified I<label> if any B<s>
+substitutions have been made since the most recent reading of an input line
+or execution of a B<t> function. If no label is given, branch to the end of
+the script. 
+
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'w'}=[ 2, 'str', \&Write,      "{ _w( '-X-' ) }"                 ]; #ok
+
+=item [2addr]B<w> I<file>
+
+The contents of the pattern space are written to the I<file>.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'x'}=[ 2, '',    \&Emit,       '{ ($Hold, $_) = ($_, $Hold) }'   ]; #ok
+
+=item [2addr]B<x>
+
+Swap the contents of the pattern space and the hold space.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'y'}=[ 2, 'tra', \&Emit,       ''                                ]; #ok
+=item [2addr]B<y>B</>I<string1>B</>I<string2>B</>
+
+In the pattern space, replace all characters occuring in I<string1> by the
+character at the corresponding position in I<string2>. It is possible
+to use any character (other than a backslash or newline) instead of a
+slash to delimit the strings.  Within I<string1> and I<string2>, a
+backslash followed by any character other than a newline is that literal
+character, and a backslash followed by an `n' is replaced by a newline
+character.
+
+=cut
 
- perl  The perl compiler/interpreter
+#--------------------------------------------------------------------------
+$ComTab{'='}=[ 1, '',    \&Emit,       '{ print "$.\n" }'                ]; #ok
+
+=item [1addr]B<=>
+
+Prints the current line number on the standard output.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{':'}=[ 0, 'str', \&Label,      ''                                ]; #ok
+=item [0addr]B<:> [I<label>]
+
+The command specifies the position of the I<label>. It has no other effect.
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'{'}=[ 2, '',    \&BeginBlock, '{'                               ]; #ok
+$ComTab{'}'}=[ 0, '',    \&EndBlock,   ';}'                              ]; #ok
+# ';' to avoid warning on empty {}-block
+
+=item [2addr]B<{> [I<command>]
+
+=item [0addr]B<}>
+
+These two commands begin and end a command list. The first command may
+be given on the same line as the opening B<{> command. The commands
+within the list are jointly selected by the address(es) given on the
+B<{> command (but may still have individual addresses).
+
+=cut
+
+#--------------------------------------------------------------------------
+$ComTab{'#'}=[ 0, 'str', \&Comment,    ''                                ]; #ok
+
+=item [0addr]B<#> [I<comment>]
+
+The entire line is ignored (treated as a comment). If, however, the first
+two characters in the script are `C<#n>', automatic printing of output is
+suppressed, as if the B<-n> option were given on the command line.
+
+=back
+
+=cut
+
+use vars qw{ $isEOF $Hold %wFiles @Q $CondReg $doPrint };
+
+my $useDEBUG    = exists( $ENV{PSEDDEBUG} );
+my $useEXTBRE   = $ENV{PSEDEXTBRE} || '';
+$useEXTBRE =~ s/[^<>wWyB]//g; # gawk RE's handle these
+
+my $doAutoPrint = 1;          # automatic printing of pattern space (-n => 0)
+my $doOpenWrite = 1;          # open w command output files at start (-a => 0)
+my $svOpenWrite = 0;          # save $doOpenWrite
+my $doGenerate  = $0 eq 's2p';
+
+# Collected and compiled script
+#
+my( @Commands, %Defined, @BlockStack, %Label, $labNum, $Code );
+
+##################
+#  Compile Time
+#
+# Labels
+# 
+# Error handling
+#
+sub Warn($;$){
+    my( $msg, $loc ) = @_;
+    $loc ||= '';
+    $loc .= ': ' if length( $loc );
+    warn( "$0: $loc$msg\n" );
+}
+
+$labNum = 0;
+sub newLabel(){
+    return 'L_'.++$labNum;
+}
+
+# safeHere: create safe here delimiter and  modify opcode and argument
+#
+sub safeHere($$){
+    my( $codref, $argref ) = @_;
+    my $eod = 'EOD000';
+    while( $$argref =~ /^$eod$/m ){
+        $eod++;
+    }
+    $$codref =~ s/TheEnd/$eod/e;
+    $$argref .= "$eod\n"; 
+}
+
+# Emit: create address logic and emit command
+#
+sub Emit($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $cond = '';
+    if( defined( $addr1 ) ){
+        if( defined( $addr2 ) ){
+           $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+        } else {
+           $addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+       }
+       $cond = $negated ? "unless( $addr1 )\n" : "if( $addr1 )\n";
+    }
+
+    if( $opcode eq '' ){
+       $Code .= "$cond$arg\n";
+
+    } elsif( $opcode =~ s/-X-/$arg/e ){
+       $Code .= "$cond$opcode\n";
+
+    } elsif( $opcode =~ /TheEnd/ ){
+       safeHere( \$opcode, \$arg );
+       $Code .= "$cond$opcode$arg";
+
+    } else {
+       $Code .= "$cond$opcode\n";
+    }
+    0;
+}
+
+# Write (w command, w flag): store pathname
+#
+sub Write($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $path, $fl ) = @_;
+    $wFiles{$path} = '';
+    Emit( $addr1, $addr2, $negated, $opcode, $path, $fl );
+}
+
+
+# Label (: command): label definition
+#
+sub Label($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    my $rc = 0;
+    $lab =~ s/\s+//;
+    if( length( $lab ) ){
+       my $h;
+       if( ! exists( $Label{$lab} ) ){
+           $h = $Label{$lab}{name} = newLabel();
+        } else {
+           $h = $Label{$lab}{name};
+           if( exists( $Label{$lab}{defined} ) ){
+               my $dl = $Label{$lab}{defined};
+               Warn( "duplicate label $lab (first defined at $dl)", $fl );
+               $rc = 1;
+           }
+       }
+        $Label{$lab}{defined} = $fl;
+       $Code .= "$h:;\n";
+    }
+    $rc;
+}
+
+# BeginBlock ({ command): push block start
+#
+sub BeginBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    push( @BlockStack, [ $fl, $addr1, $addr2, $negated ] );
+    Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+}
+
+# EndBlock (} command): check proper nesting
+#
+sub EndBlock($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $rc;
+    my $jcom = pop( @BlockStack );
+    if( defined( $jcom ) ){
+       $rc = Emit( $addr1, $addr2, $negated, $opcode, $arg, $fl );
+    } else {
+       Warn( "unexpected `}'", $fl );
+       $rc = 1;
+    }
+    $rc;
+}
+
+# Branch (t, b commands): check or create label, substitute default
+#
+sub Branch($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $lab, $fl ) = @_;
+    $lab =~ s/\s+//; # no spaces at end
+    my $h;
+    if( length( $lab ) ){
+       if( ! exists( $Label{$lab} ) ){
+           $h = $Label{$lab}{name} = newLabel();
+        } else {
+           $h = $Label{$lab}{name};
+       }
+       push( @{$Label{$lab}{used}}, $fl );
+    } else {
+       $h = 'EOS';
+    }
+    $opcode =~ s/XXX/$h/e;
+    Emit( $addr1, $addr2, $negated, $opcode, '', $fl );
+}
+
+# Change (c command): is special due to range end watching
+#
+sub Change($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+    my $kwd = $negated ? 'unless' : 'if';
+    if( defined( $addr2 ) ){
+        $addr1 .= $addr2 =~ /^\d+$/ ? "..$addr2" : "...$addr2";
+       if( ! $negated ){
+           $addr1  = '$icnt = ('.$addr1.')';
+           $opcode = 'if( $icnt =~ /E0$/ )' . $opcode;
+       }
+    } else {
+       $addr1 .= ' == $.' if $addr1 =~ /^\d+$/;
+    }
+    safeHere( \$opcode, \$arg );
+    $Code .= "$kwd( $addr1 ){\n  $opcode$arg}\n";
+    0;
+}
+
+
+# Comment (# command): A no-op. Who would've thought that!
+#
+sub Comment($$$$$$){
+    my( $addr1, $addr2, $negated, $opcode, $arg, $fl ) = @_;
+### $Code .= "# $arg\n";
+    0;
+}
+
+
+sub stripRegex($$){
+    my( $del, $sref ) = @_;
+    my $regex = $del;
+    print "stripRegex:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E(\s*)}{}s ){
+        my $sl = $2;
+       $regex .= $1.$sl.$del;
+       if( length( $sl ) % 2 == 0 ){
+           return $regex;
+       }
+       $regex .= $3;
+    }
+    undef();
+}
+
+# stripTrans: take a <del> terminated string from y command
+#   honoring and cleaning up of \-escaped <del>'s
+#
+sub stripTrans($$){
+    my( $del, $sref ) = @_;
+    my $t = '';
+    print "stripTrans:$del:$$sref:\n" if $useDEBUG;
+    while( $$sref =~ s{^(.*?)(\\*)\Q$del\E}{}s ){
+        my $sl = $2;
+       $t .= $1;
+       if( length( $sl ) % 2 == 0 ){
+           $t .= $sl;
+           $t =~ s/\\\\/\\/g;
+           return $t;
+       }
+       chop( $sl );
+       $t .= $sl.$del.$3;
+    }
+    undef();
+}
+
+# makey - construct Perl y/// from sed y///
+#
+sub makey($$$){
+    my( $fr, $to, $fl ) = @_;
+    my $error = 0;
+
+    # Ensure that any '-' is up front.
+    # Diagnose duplicate contradicting mappings
+    my %tr;
+    for( my $i = 0; $i < length($fr); $i++ ){
+       my $fc = substr($fr,$i,1);
+       my $tc = substr($to,$i,1);
+       if( exists( $tr{$fc} ) && $tr{$fc} ne $tc ){
+           Warn( "ambiguos translation for character `$fc' in `y' command",
+                 $fl );
+           $error++;
+       }
+       $tr{$fc} = $tc;
+    }
+    $fr = $to = '';
+    if( exists( $tr{'-'} ) ){
+       ( $fr, $to ) = ( '-', $tr{'-'} );
+       delete( $tr{'-'} );
+    } else {
+       $fr = $to = '';
+    }
+    # might just as well sort it...
+    for my $fc ( sort keys( %tr ) ){
+       $fr .= $fc;
+       $to .= $tr{$fc};
+    }
+    # make embedded delimiters and newlines safe
+    $fr =~ s/([{}])/\$1/g;
+    $to =~ s/([{}])/\$1/g;
+    $fr =~ s/\n/\\n/g;
+    $to =~ s/\n/\\n/g;
+    return $error ? undef() : "{ y{$fr}{$to}; }";
+}
+
+######
+# makes - construct Perl s/// from sed s///
+#
+sub makes($$$$$$$){
+    my( $regex, $subst, $path, $global, $print, $nmatch, $fl ) = @_;
+
+    # make embedded newlines safe
+    $regex =~ s/\n/\\n/g;
+    $subst =~ s/\n/\\n/g;
+    my $code;
+    # n-th occurrence
+    #
+    if( length( $nmatch ) ){
+       $code = <<TheEnd;
+{ \$n = $nmatch;
+  while( --\$n && ( \$s = m ${regex}g ) ){}
+  \$s = ( substr( \$_, pos() ) =~ s ${regex}${subst}s ) if \$s;
+  \$CondReg ||= \$s;
+TheEnd
+    } else {
+        $code = <<TheEnd;
+{ \$s = s ${regex}${subst}s${global};
+  \$CondReg ||= \$s;
+TheEnd
+    }
+    if( $print ){
+        $code .= '  print $_, "\n" if $s;'."\n";
+    }
+    if( defined( $path ) ){
+        $wFiles{$path} = '';
+       $code .= " _w( '$path' ) if \$s;\n";
+    }
+    $code .= "}";
+}
+
+=head1 BASIC REGULAR EXPRESSIONS
+
+A I<Basic Regular Expression> (BRE), as defined in POSIX 1003.2, consists
+of I<atoms>, for matching parts of a string, and I<bounds>, specifying
+repetitions of a preceding atom.
+
+=head2 Atoms
+
+The possible atoms of a BRE are: B<.>, matching any single character;
+B<^> and B<$>, matching the null string at the beginning or end
+of a string, respectively; a I<bracket expressions>, enclosed
+in B<[> and B<]> (see below); and any single character with no
+other significance (matching that character). A B<\> before one
+of: B<.>, B<^>, B<$>, B<[>, B<*>, B<\>, matching the character
+after the backslash. A sequence of atoms enclosed in B<\(> and B<\)>
+becomes an atom and establishes the target for a I<backreference>,
+consisting of the substring that actually matches the enclosed atoms.
+Finally, B<\> followed by one of the digits B<0> through B<9> is a
+backreference.
+
+A B<^> that is not first, or a B<$> that is not last does not have
+a special significance and need not be preceded by a backslash to
+become literal. The same is true for a B<]>, that does not terminate
+a bracket expression.
+
+An unescaped backslash cannot be last in a BRE.
+
+=head2 Bounds
+
+The BRE bounds are: B<*>, specifying 0 or more matches of the preceding
+atom; B<\{>I<count>B<\}>, specifying that many repetitions;
+B<\{>I<minimum>B<,\}>, giving a lower limit; and
+B<\{>I<minimum>B<,>I<maximum>B<\}> finally defines a lower and upper
+bound. 
+
+A bound appearing as the first item in a BRE is taken literally.
+
+=head2 Bracket Expressions
+
+A I<bracket expression> is a list of characters, character ranges
+and character classes enclosed in B<[> and B<]> and matches any
+single character from the represented set of characters.
+
+A character range is written as two characters separated by B<-> and
+represents all characters (according to the character collating sequence)
+that are not less than the first and not greater than the second.
+(Ranges are very collating-sequence-dependent, and portable programs
+should avoid relying on them.)
+
+A character class is one of the class names
+
+   alnum     digit     punct
+   alpha     graph     space
+   blank     lower     upper
+   cntrl     print     xdigit
+
+enclosed in B<[:> and B<:]> and represents the set of characters
+as defined in ctype(3).
+
+If the first character after B<[> is B<^>, the sense of matching is
+inverted.
+
+To include a literal `C<^>', place it anywhere else but first. To
+include a literal 'C<]>' place it first or immediately after an
+initial B<^>. To include a literal `C<->' make it the first (or
+second after B<^>) or last character, or the second endpoint of
+a range.
+
+The special bracket expression constructs C<[[:E<lt>:]]> and C<[[:E<gt>:]]> 
+match the null string at the beginning and end of a word respectively.
+(Note that neither is identical to Perl's `\b' atom.)
+
+=head2 Additional Atoms
+
+Since some sed implementations provide additional regular expression
+atoms (not defined in POSIX 1003.2), B<psed> is capable of translating
+the following backslash escapes:
+
+=over 4
+
+=item B<\E<lt>> This is the same as C<[[:E<gt>:]]>.
+
+=item B<\E<gt>> This is the same as C<[[:E<lt>:]]>.
+
+=item B<\w> This is an abbreviation for C<[[:alnum:]_]>.
+
+=item B<\W> This is an abbreviation for C<[^[:alnum:]_]>.
+
+=item B<\y> Match the empty string at a word boundary.
+
+=item B<\B> Match the empty string between any two either word or non-word characters.
+
+=back
+
+To enable this feature, the environment variable PSEDEXTBRE must be set
+to a string containing the requested characters, e.g.:
+C<PSEDEXTBRE='E<lt>E<gt>wW'>.
+
+=cut
+
+#####
+# bre2p - convert BRE to Perl RE
+#
+sub peek(\$$){
+    my( $pref, $ic ) = @_;
+    $ic < length($$pref)-1 ? substr( $$pref, $ic+1, 1 ) : '';
+}
+
+sub bre2p($$$){
+    my( $del, $pat, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $pat = substr( $pat, 1, length($pat) - 2 );
+    my $res = '';
+    my $bracklev = 0;
+    my $backref  = 0;
+    my $parlev = 0;
+    for( my $ic = 0; $ic < length( $pat ); $ic++ ){
+        my $c = substr( $pat, $ic, 1 );
+        if( $c eq '\\' ){
+           ### backslash escapes
+            my $nc = peek($pat,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in pattern", $fl );
+                return undef();
+            }
+           $ic++;
+            if( $nc eq $del ){ ## \<pattern del> => \<pattern del>
+                $res .= "\\$del";
+
+           } elsif( $nc =~ /([[.*\\n])/ ){
+               ## check for \-escaped magics and \n:
+               ## \[ \. \* \\ \n stay as they are
+                $res .= '\\'.$nc;
+
+            } elsif( $nc eq '(' ){ ## \( => (
+                $parlev++;
+                $res .= '(';
+
+            } elsif( $nc eq ')' ){ ## \) => )
+                $parlev--;
+               $backref++;
+                if( $parlev < 0 ){
+                    Warn( "unmatched `\\)'", $fl );
+                    return undef();
+                }
+                $res .= ')';
+
+            } elsif( $nc eq '{' ){ ## repetition factor \{<i>[,[<j>]]\}
+                my $endpos = index( $pat, '\\}', $ic );
+                if( $endpos < 0 ){
+                    Warn( "unmatched `\\{'", $fl );
+                    return undef();
+                }
+                my $rep = substr( $pat, $ic+1, $endpos-($ic+1) );
+                $ic = $endpos + 1;
+
+               if( $res =~ /^\^?$/ ){
+                   $res .= "\\{$rep\}";
+                } elsif( $rep =~ /^(\d+)(,?)(\d*)?$/ ){
+                    my $min = $1;
+                    my $com = $2 || '';
+                    my $max = $3;
+                    if( length( $max ) ){
+                        if( $max < $min ){
+                            Warn( "maximum less than minimum in `\\{$rep\\}'",
+                                 $fl );
+                            return undef();
+                        }
+                    } else {
+                        $max = '';
+                    }
+                   # simplify some
+                   if( $min == 0 && $max eq '1' ){
+                       $res .= '?';
+                   } elsif( $min == 1 && "$com$max" eq ',' ){
+                       $res .= '+';
+                   } elsif( $min == 0 && "$com$max" eq ',' ){
+                       $res .= '*';
+                   } else {
+                       $res .= "{$min$com$max}";
+                   }
+                } else {
+                    Warn( "invalid repeat clause `\\{$rep\\}'", $fl );
+                    return undef();
+                }
+
+            } elsif( $nc =~ /^[1-9]$/ ){
+               ## \1 .. \9 => \1 .. \9, but check for a following digit
+               if( $nc > $backref ){
+                    Warn( "invalid backreference ($nc)", $fl );
+                    return undef();
+               }
+                $res .= "\\$nc";
+               if( peek($pat,$ic) =~ /[0-9]/ ){
+                   $res .= '(?:)';
+               }
+
+            } elsif( $useEXTBRE && ( $nc =~ /[$useEXTBRE]/ ) ){
+               ## extensions - at most <>wWyB - not in POSIX
+                if(      $nc eq '<' ){ ## \< => \b(?=\w), be precise
+                    $res .= '\\b(?<=\\W)';
+                } elsif( $nc eq '>' ){ ## \> => \b(?=\W), be precise
+                    $res .= '\\b(?=\\W)';
+                } elsif( $nc eq 'y' ){ ## \y => \b
+                    $res .= '\\b';
+                } else {               ## \B, \w, \W remain the same
+                    $res .= "\\$nc";
+                } 
+           } elsif( $nc eq $led ){
+               ## \<closing bracketing-delimiter> - keep '\'
+               $res .= "\\$nc";
+
+            } else { ## \ <char> => <char> ("as if `\' were not present")
+                $res .= $nc;
+            }
+
+        } elsif( $c eq '.' ){ ## . => .
+            $res .= $c;
+
+       } elsif( $c eq '*' ){ ## * => * but \* if there's nothing preceding it
+           if( $res =~ /^\^?$/ ){
+                $res .= '\\*';
+            } elsif( substr( $res, -1, 1 ) ne '*' ){
+               $res .= $c;
+           }
+
+        } elsif( $c eq '[' ){
+           ## parse []: [^...] [^]...] [-...]
+           my $add = '[';
+           if( peek($pat,$ic) eq '^' ){
+               $ic++;
+               $add .= '^';
+           }
+           my $nc = peek($pat,$ic);
+           if( $nc eq ']' || $nc eq '-' ){
+               $add .= $nc;
+                $ic++;
+           }
+           # check that [ is not trailing
+           if( $ic >= length( $pat ) - 1 ){
+               Warn( "unmatched `['", $fl );
+               return undef();
+           }
+           # look for [:...:] and x-y
+           my $rstr = substr( $pat, $ic+1 );
+           if( $rstr =~ /^((?:\[:\(\w+|[><]\):\]|[^]-](?:-[^]])?)*)/ ){
+               my $cnt = $1;
+               $ic += length( $cnt );
+               $cnt =~ s/([\\\$])/\\$1/g; # `\', `$' are magic in Perl []
+               # try some simplifications
+               my $red = $cnt;
+               if( $red =~ s/0-9// ){
+                   $cnt = $red.'\d';
+                   if( $red =~ s/A-Z// && $red =~ s/a-z// && $red =~ s/_// ){
+                       $cnt = $red.'\w';
+                    }
+               }
+               $add .= $cnt;
+
+               # POSIX 1003.2 has this (optional) for begin/end word
+               $add = '\\b(?=\\W)'  if $add eq '[[:<:]]';
+               $add = '\\b(?<=\\W)' if $add eq '[[:>:]]';
+
+           }
+
+           ## may have a trailing `-' before `]'
+           if( $ic < length($pat) - 1 &&
+                substr( $pat, $ic+1 ) =~ /^(-?])/ ){
+               $ic += length( $1 );
+               $add .= $1;
+               # another simplification
+               $add =~ s/^\[(\^?)(\\[dw])]$/ $1 eq '^' ? uc($2) : $2 /e;
+               $res .= $add;
+           } else {
+               Warn( "unmatched `['", $fl );
+               return undef();
+           }
 
- a2p   awk to perl translator
+        } elsif( $c eq $led ){ ## unescaped <closing bracketing-delimiter>
+            $res .= "\\$c";
 
-=head1 DIAGNOSTICS
+        } elsif( $c eq ']' ){ ## unmatched ] is not magic
+            $res .= ']';
 
-=head1 BUGS
+        } elsif( $c =~ /[|+?{}()]/ ){ ## not magic in BRE, but in Perl: \-quote
+            $res .= "\\$c";
 
-=cut
+        } elsif( $c eq '^' ){ ## not magic unless 1st, but in Perl: \-quote
+            $res .= length( $res ) ? '\\^' : '^';
 
-$indent = 4;
-$shiftwidth = 4;
-$l = '{'; $r = '}';
+        } elsif( $c eq '$' ){ ## not magic unless last, but in Perl: \-quote
+            $res .= $ic == length( $pat ) - 1 ? '$' : '\\$';
 
-while ($ARGV[0] =~ /^-/) {
-    $_ = shift;
-  last if /^--/;
-    if (/^-D/) {
-       $debug++;
-       open(BODY,'>-');
-       next;
-    }
-    if (/^-n/) {
-       $assumen++;
-       next;
-    }
-    if (/^-p/) {
-       $assumep++;
-       next;
-    }
-    die "I don't recognize this switch: $_\n";
-}
-
-unless ($debug) {
-    open(BODY,"+>/tmp/sperl$$") ||
-      &Die("Can't open temp file: $!\n");
-}
-
-if (!$assumen && !$assumep) {
-    print BODY &q(<<'EOT');
-:      while ($ARGV[0] =~ /^-/) {
-:          $_ = shift;
-:        last if /^--/;
-:          if (/^-n/) {
-:              $nflag++;
-:              next;
-:          }
-:          die "I don't recognize this switch: $_\\n";
-:      }
-:      
-EOT
-}
-
-print BODY &q(<<'EOT');
-:      #ifdef PRINTIT
-:      #ifdef ASSUMEP
-:      $printit++;
-:      #else
-:      $printit++ unless $nflag;
-:      #endif
-:      #endif
-:      <><>
-:      $\ = "\n";              # automatically add newline on print
-:      <><>
-:      #ifdef TOPLABEL
-:      LINE:
-:      while (chop($_ = <>)) {
-:      #else
-:      LINE:
-:      while (<>) {
-:          chop;
-:      #endif
-EOT
-
-LINE:
-while (<>) {
-
-    # Wipe out surrounding whitespace.
-
-    s/[ \t]*(.*)\n$/$1/;
-
-    # Perhaps it's a label/comment.
-
-    if (/^:/) {
-       s/^:[ \t]*//;
-       $label = &make_label($_);
-       if ($. == 1) {
-           $toplabel = $label;
-           if (/^(top|(re)?start|redo|begin(ning)|again|input)$/i) {
-               $_ = <>;
-               redo LINE; # Never referenced, so delete it if not a comment.
-           }
-       }
-       $_ = "$label:";
-       if ($lastlinewaslabel++) {
-           $indent += 4;
-           print BODY &tab, ";\n";
-           $indent -= 4;
-       }
-       if ($indent >= 2) {
-           $indent -= 2;
-           $indmod = 2;
-       }
-       next;
-    } else {
-       $lastlinewaslabel = '';
+        } else {
+            $res .= $c;
+        }
     }
 
-    # Look for one or two address clauses
-
-    $addr1 = '';
-    $addr2 = '';
-    if (s/^([0-9]+)//) {
-       $addr1 = "$1";
-       $addr1 = "\$. == $addr1" unless /^,/;
-    }
-    elsif (s/^\$//) {
-       $addr1 = 'eof()';
-    }
-    elsif (s|^/||) {
-       $addr1 = &fetchpat('/');
-    }
-    if (s/^,//) {
-       if (s/^([0-9]+)//) {
-           $addr2 = "$1";
-       } elsif (s/^\$//) {
-           $addr2 = "eof()";
-       } elsif (s|^/||) {
-           $addr2 = &fetchpat('/');
-       } else {
-           &Die("Invalid second address at line $.\n");
-       }
-       if ($addr2 =~ /^\d+$/) {
-           $addr1 .= "..$addr2";
-       }
-       else {
-           $addr1 .= "...$addr2";
-       }
+    if( $parlev ){
+       Warn( "unmatched `\\('", $fl );
+       return undef();
     }
 
-    # Now we check for metacommands {, }, and ! and worry
-    # about indentation.
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return $del . $res . ( $led ? $led : $del );
+}
 
-    s/^[ \t]+//;
-    # a { to keep vi happy
-    if ($_ eq '}') {
-       $indent -= 4;
-       next;
-    }
-    if (s/^!//) {
-       $if = 'unless';
-       $else = "$r else $l\n";
-    } else {
-       $if = 'if';
-       $else = '';
-    }
-    if (s/^{//) {      # a } to keep vi happy
-       $indmod = 4;
-       $redo = $_;
-       $_ = '';
-       $rmaybe = '';
-    } else {
-       $rmaybe = "\n$r";
-       if ($addr2 || $addr1) {
-           $space = ' ' x $shiftwidth;
-       } else {
-           $space = '';
+
+#####
+# sub2p - convert sed substitution to Perl substitution
+#
+sub sub2p($$$){
+    my( $del, $subst, $fl ) = @_;
+    my $led = $del;
+    $led =~ tr/{([</})]>/;
+    $led = '' if $led eq $del;
+
+    $subst = substr( $subst, 1, length($subst) - 2 );
+    my $res = '';
+    for( my $ic = 0; $ic < length( $subst ); $ic++ ){
+        my $c = substr( $subst, $ic, 1 );
+        if( $c eq '\\' ){
+           ### backslash escapes
+            my $nc = peek($subst,$ic);
+            if( $nc eq '' ){
+                Warn( "`\\' cannot be last in substitution", $fl );
+                return undef();
+            }
+           $ic++;
+           if( $nc =~ /[\\$del$led]/ ){ ## \ and delimiter
+               $res .= '\\' . $nc;
+            } elsif( $nc =~ /[1-9]/ ){ ## \1 - \9 => ${1} - ${9}
+                $res .= '${' . $nc . '}';
+           } else { ## everything else (includes &): omit \
+               $res .= $nc;
+           }
+        } elsif( $c eq '&' ){ ## & => $&
+            $res .= '$&';
+       } elsif( $c =~ /[\$\@$led]/ ){ ## magic in Perl's substitution string
+           $res .= '\\' . $c;
+        } else {
+           $res .= $c;
        }
-       $_ = &transmogrify();
     }
 
-    # See if we can optimize to modifier form.
+    # final cleanup: eliminate raw HTs
+    $res =~ s/\t/\\t/g;
+    return ( $led ? $del : $led ) . $res . ( $led ? $led : $del );
+}
 
-    if ($addr1) {
-       if ($_ !~ /[\n{}]/ && $rmaybe && !$change &&
-         $_ !~ / if / && $_ !~ / unless /) {
-           s/;$/ $if $addr1;/;
-           $_ = substr($_,$shiftwidth,1000);
-       } else {
-           $_ = "$if ($addr1) $l\n$change$_$rmaybe";
-       }
-       $change = '';
-       next LINE;
-    }
-} continue {
-    @lines = split(/\n/,$_);
-    for (@lines) {
-       unless (s/^ *<<--//) {
-           print BODY &tab;
-       }
-       print BODY $_, "\n";
-    }
-    $indent += $indmod;
-    $indmod = 0;
-    if ($redo) {
-       $_ = $redo;
-       $redo = '';
-       redo LINE;
-    }
-}
-if ($lastlinewaslabel++) {
-    $indent += 4;
-    print BODY &tab, ";\n";
-    $indent -= 4;
-}
-
-if ($appendseen || $tseen || !$assumen) {
-    $printit++ if $dseen || (!$assumen && !$assumep);
-    print BODY &q(<<'EOT');
-:      #ifdef SAWNEXT
-:      }
-:      continue {
-:      #endif
-:      #ifdef PRINTIT
-:      #ifdef DSEEN
-:      #ifdef ASSUMEP
-:          print if $printit++;
-:      #else
-:          if ($printit)
-:              { print; }
-:          else
-:              { $printit++ unless $nflag; }
-:      #endif
-:      #else
-:          print if $printit;
-:      #endif
-:      #else
-:          print;
-:      #endif
-:      #ifdef TSEEN
-:          $tflag = 0;
-:      #endif
-:      #ifdef APPENDSEEN
-:          if ($atext) { chop $atext; print $atext; $atext = ''; }
-:      #endif
-EOT
-}
-
-print BODY &q(<<'EOT');
-:      }
-EOT
-
-unless ($debug) {
-
-    print &q(<<"EOT");
-:      $startperl
-:      eval 'exec $perlpath -S \$0 \${1+"\$@"}'
-:              if \$running_under_some_shell;
-:      
-EOT
-    print"$opens\n" if $opens;
-    seek(BODY, 0, 0) || die "Can't rewind temp file: $!\n";
-    while (<BODY>) {
-       /^[ \t]*$/ && next;
-       /^#ifdef (\w+)/ && ((${lc $1} || &skip), next);
-       /^#else/ && (&skip, next);
-       /^#endif/ && next;
-       s/^<><>//;
-       print;
-    }
-}
-
-&Cleanup;
-exit;
-
-sub Cleanup {
-    unlink "/tmp/sperl$$";
-}
-sub Die {
-    &Cleanup;
-    die $_[0];
-}
-sub tab {
-    "\t" x ($indent / 8) . ' ' x ($indent % 8);
-}
-sub make_filehandle {
-    local($_) = $_[0];
-    local($fname) = $_;
-    if (!$seen{$fname}) {
-       $_ = "FH_" . $_ if /^\d/;
-       s/[^a-zA-Z0-9]/_/g;
-       s/^_*//;
-       $_ = "\U$_";
-       if ($fhseen{$_}) {
-           for ($tmp = "a"; $fhseen{"$_$tmp"}; $a++) {}
-           $_ .= $tmp;
+
+sub Parse(){
+    my $error = 0;
+    my( $pdef, $pfil, $plin );
+    for( my $icom = 0; $icom < @Commands; $icom++ ){
+       my $cmd = $Commands[$icom];
+       print "Parse:$cmd:\n" if $useDEBUG;
+       $cmd =~ s/^\s+//;
+       next unless length( $cmd );
+       my $scom = $icom;
+       if( exists( $Defined{$icom} ) ){
+           $pdef = $Defined{$icom};
+           if( $pdef =~ /^ #(\d+)/ ){
+               $pfil = 'expression #';
+               $plin = $1;
+           } else {
+               $pfil = "$pdef l.";
+               $plin = 1;
+            }
+        } else {
+           $plin++;
+        }
+        my $fl = "$pfil$plin";
+
+        # insert command as comment in gnerated code
+       #
+       $Code .= "# $cmd\n" if $doGenerate;
+
+       # The Address(es)
+       #
+       my( $negated, $naddr, $addr1, $addr2 );
+       $naddr = 0;
+       if(      $cmd =~ s/^(\d+)\s*// ){
+           $addr1 = "$1"; $naddr++;
+       } elsif( $cmd =~ s/^\$\s*// ){
+           $addr1 = 'eofARGV()'; $naddr++;
+       } elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+           my $del = $1;
+           my $regex = stripRegex( $del, \$cmd );
+           if( defined( $regex ) ){
+               $addr1 = 'm '.bre2p( $del, $regex, $fl ).'s';
+               $naddr++;
+           } else {
+               Warn( "malformed regex, 1st address", $fl );
+               $error++;
+               next;
+           }
+        }
+        if( defined( $addr1 ) && $cmd =~ s/,\s*// ){
+           if(      $cmd =~ s/^(\d+)\s*// ){
+               $addr2 = "$1"; $naddr++;
+           } elsif( $cmd =~ s/^\$\s*// ){
+               $addr2 = 'eofARGV()'; $naddr++;
+           } elsif( $cmd =~ s{^(/)}{} || $cmd =~ s{^\\(.)}{} ){
+               my $del = $1;
+               my $regex = stripRegex( $del, \$cmd );
+               if( defined( $regex ) ){
+                   $addr2 = 'm '. bre2p( $del, $regex, $fl ).'s';
+                   $naddr++;
+               } else {
+                   Warn( "malformed regex, 2nd address", $fl );
+                   $error++;
+                   next;
+               }
+            } else {
+               Warn( "invalid address after `,'", $fl );
+               $error++;
+               next;
+            }
+        }
+
+        # address modifier `!'
+        #
+        $negated = $cmd =~ s/^!\s*//;
+       if( defined( $addr1 ) ){
+           print "Parse: addr1=$addr1" if $useDEBUG;
+           if( defined( $addr2 ) ){
+               print ", addr2=$addr2 " if $useDEBUG;
+               # both numeric and addr1 > addr2 => eliminate addr2
+               undef( $addr2 ) if $addr1 =~ /^\d+$/ &&
+                                   $addr2 =~ /^\d+$/ && $addr1 > $addr2;
+           }
        }
-       $fhseen{$_} = 1;
-       $opens .= &q(<<"EOT");
-:      open($_, '>$fname') || die "Can't create $fname: \$!";
-EOT
-       $seen{$fname} = $_;
-    }
-    $seen{$fname};
-}
-
-sub make_label {
-    local($label) = @_;
-    $label =~ s/[^a-zA-Z0-9]/_/g;
-    if ($label =~ /^[0-9_]/) { $label = 'L' . $label; }
-    $label = substr($label,0,8);
-
-    # Could be a reserved word, so capitalize it.
-    substr($label,0,1) =~ y/a-z/A-Z/
-      if $label =~ /^[a-z]/;
-
-    $label;
-}
-
-sub transmogrify {
-    {  # case
-       if (/^d/) {
-           $dseen++;
-           chop($_ = &q(<<'EOT'));
-:      <<--#ifdef PRINTIT
-:      $printit = 0;
-:      <<--#endif
-:      next LINE;
-EOT
-           $sawnext++;
+       print 'negated' if $useDEBUG && $negated;
+       print " command:$cmd\n" if $useDEBUG;
+
+       # The Command
+       #
+        if( $cmd !~ s/^([:#={}abcdDgGhHilnNpPqrstwxy])\s*// ){
+           my $h = substr( $cmd, 0, 1 );
+           Warn( "unknown command `$h'", $fl );
+           $error++;
            next;
        }
+        my $key = $1;
 
-       if (/^n/) {
-           chop($_ = &q(<<'EOT'));
-:      <<--#ifdef PRINTIT
-:      <<--#ifdef DSEEN
-:      <<--#ifdef ASSUMEP
-:      print if $printit++;
-:      <<--#else
-:      if ($printit)
-:          { print; }
-:      else
-:          { $printit++ unless $nflag; }
-:      <<--#endif
-:      <<--#else
-:      print if $printit;
-:      <<--#endif
-:      <<--#else
-:      print;
-:      <<--#endif
-:      <<--#ifdef APPENDSEEN
-:      if ($atext) {chop $atext; print $atext; $atext = '';}
-:      <<--#endif
-:      $_ = <>;
-:      chop;
-:      <<--#ifdef TSEEN
-:      $tflag = 0;
-:      <<--#endif
-EOT
+       my $tabref = $ComTab{$key};
+       if( $naddr > $tabref->[0] ){
+           Warn( "excess address(es)", $fl );
+           $error++;
            next;
        }
 
-       if (/^a/) {
-           $appendseen++;
-           $command = $space . "\$atext .= <<'End_Of_Text';\n<<--";
-           $lastline = 0;
-           while (<>) {
-               s/^[ \t]*//;
-               s/^[\\]//;
-               unless (s|\\$||) { $lastline = 1;}
-               s/^([ \t]*\n)/<><>$1/;
-               $command .= $_;
-               $command .= '<<--';
-               last if $lastline;
+       my $arg = '';
+       if(      $tabref->[1] eq 'str' ){
+           # take remainder - don't care if it is empty
+           $arg = $cmd;
+            $cmd = '';
+
+       } elsif( $tabref->[1] eq 'txt' ){
+           # multi-line text
+           my $goon = $cmd =~ /(.*)\\$/;
+           if( length( $1 ) ){
+               Warn( "extra characters after command ($cmd)", $fl );
+               $error++;
            }
-           $_ = $command . "End_Of_Text";
-           last;
-       }
-
-       if (/^[ic]/) {
-           if (/^c/) { $change = 1; }
-           $addr1 = 1 if $addr1 eq '';
-           $addr1 = '$iter = (' . $addr1 . ')';
-           $command = $space .
-             "    if (\$iter == 1) { print <<'End_Of_Text'; }\n<<--";
-           $lastline = 0;
-           while (<>) {
-               s/^[ \t]*//;
-               s/^[\\]//;
-               unless (s/\\$//) { $lastline = 1;}
-               s/'/\\'/g;
-               s/^([ \t]*\n)/<><>$1/;
-               $command .= $_;
-               $command .= '<<--';
-               last if $lastline;
-           }
-           $_ = $command . "End_Of_Text";
-           if ($change) {
-               $dseen++;
-               $change = "$_\n";
-               chop($_ = &q(<<"EOT"));
-:      <<--#ifdef PRINTIT
-:      $space\$printit = 0;
-:      <<--#endif
-:      ${space}next LINE;
-EOT
-               $sawnext++;
+           while( $goon ){
+               $icom++;
+               if( $icom > $#Commands ){
+                   Warn( "unexpected end of script", $fl );
+                   $error++;
+                   last;
+               }
+               $cmd = $Commands[$icom];
+               $Code .= "# $cmd\n" if $doGenerate;
+               $goon = $cmd =~ s/\\$//;
+               $cmd =~ s/\\(.)/$1/g;
+               $arg .= "\n" if length( $arg );
+               $arg .= $cmd;
            }
-           last;
-       }
+           $arg .= "\n" if length( $arg );
+           $cmd = '';
 
-       if (/^s/) {
-           $delim = substr($_,1,1);
-           $len = length($_);
-           $repl = $end = 0;
-           $inbracket = 0;
-           for ($i = 2; $i < $len; $i++) {
-               $c = substr($_,$i,1);
-               if ($c eq $delim) {
-                   if ($inbracket) {
-                       substr($_, $i, 0) = '\\';
-                       $i++;
-                       $len++;
-                   }
-                   else {
-                       if ($repl) {
-                           $end = $i;
-                           last;
-                       } else {
-                           $repl = $i;
-                       }
-                   }
+       } elsif( $tabref->[1] eq 'sub' ){
+           # s///
+           if( ! length( $cmd ) ){
+               Warn( "`s' command requires argument", $fl );
+               $error++;
+               next;
+           }
+           if( $cmd =~ s{^([^\\\n])}{} ){
+               my $del = $1;
+               my $regex = stripRegex( $del, \$cmd );
+               if( ! defined( $regex ) ){
+                   Warn( "malformed regular expression", $fl );
+                   $error++;
+                   next;
                }
-               elsif ($c eq '\\') {
-                   $i++;
-                   if ($i >= $len) {
-                       $_ .= 'n';
-                       $_ .= <>;
-                       $len = length($_);
-                       $_ = substr($_,0,--$len);
-                   }
-                   elsif (substr($_,$i,1) =~ /^[n]$/) {
-                       ;
-                   }
-                   elsif (!$repl &&
-                     substr($_,$i,1) =~ /^[(){}\w]$/) {
-                       $i--;
-                       $len--;
-                       substr($_, $i, 1) = '';
+               $regex = bre2p( $del, $regex, $fl );
+
+               # a trailing \ indicates embedded NL (in replacement string)
+               while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+                   $icom++;
+                   if( $icom > $#Commands ){
+                       Warn( "unexpected end of script", $fl );
+                       $error++;
+                       last;
                    }
-                   elsif (!$repl &&
-                     substr($_,$i,1) =~ /^[<>]$/) {
-                       substr($_,$i,1) = 'b';
-                   }
-                   elsif ($repl && substr($_,$i,1) =~ /^\d$/) {
-                       substr($_,$i-1,1) = '$';
-                   }
-               }
-               elsif ($c eq '@') {
-                   substr($_, $i, 0) = '\\';
-                   $i++;
-                   $len++;
-               }
-               elsif ($c eq '&' && $repl) {
-                   substr($_, $i, 0) = '$';
-                   $i++;
-                   $len++;
-               }
-               elsif ($c eq '$' && $repl) {
-                   substr($_, $i, 0) = '\\';
-                   $i++;
-                   $len++;
-               }
-               elsif ($c eq '[' && !$repl) {
-                   $i++ if substr($_,$i,1) eq '^';
-                   $i++ if substr($_,$i,1) eq ']';
-                   $inbracket = 1;
-               }
-               elsif ($c eq ']') {
-                   $inbracket = 0;
-               }
-               elsif ($c eq "\t") {
-                   substr($_, $i, 1) = '\\t';
-                   $i++;
-                   $len++;
+                   $cmd .= $Commands[$icom];
+                   $Code .= "# $Commands[$icom]\n" if $doGenerate;
                }
-               elsif (!$repl && index("()+",$c) >= 0) {
-                   substr($_, $i, 0) = '\\';
-                   $i++;
-                   $len++;
-               }
-           }
-           &Die("Malformed substitution at line $.\n")
-             unless $end;
-           $pat = substr($_, 0, $repl + 1);
-           $repl = substr($_, $repl+1, $end-$repl-1);
-           $end = substr($_, $end + 1, 1000);
-           &simplify($pat);
-           $subst = "$pat$repl$delim";
-           $cmd = '';
-           while ($end) {
-               if ($end =~ s/^g//) {
-                   $subst .= 'g';
+
+               my $subst = stripRegex( $del, \$cmd );
+               if( ! defined( $regex ) ){
+                   Warn( "malformed substitution expression", $fl );
+                   $error++;
                    next;
                }
-               if ($end =~ s/^p//) {
-                   $cmd .= ' && (print)';
+               $subst = sub2p( $del, $subst, $fl );
+
+               # parse s/// modifier: g|p|0-9|w <file>
+               my( $global, $nmatch, $print, $write ) =
+                 ( '',      '',      0,      undef );
+               while( $cmd =~ s/^([gp0-9])// ){
+                   $1 eq 'g' ? ( $global = 'g' ) :
+                   $1 eq 'p' ? ( $print  = $1  ) : ( $nmatch .= $1 );
+                }
+               $write = $1 if $cmd =~ s/w\s*(.*)$//;
+               ### $nmatch =~ s/^(\d)\1*$/$1/; ### may be dangerous?
+               if( $global && length( $nmatch ) || length( $nmatch ) > 1 ){
+                   Warn( "conflicting flags `$global$nmatch'", $fl );
+                   $error++;
                    next;
                }
-               if ($end =~ s/^w[ \t]*//) {
-                   $fh = &make_filehandle($end);
-                   $cmd .= " && (print $fh \$_)";
-                   $end = '';
+
+               $arg = makes( $regex, $subst,
+                             $write, $global, $print, $nmatch, $fl );
+               if( ! defined( $arg ) ){
+                   $error++;
                    next;
                }
-               &Die("Unrecognized substitution command".
-                 "($end) at line $.\n");
+
+            } else {
+               Warn( "improper delimiter in s command", $fl );
+               $error++;
+               next;
+            }
+
+       } elsif( $tabref->[1] eq 'tra' ){
+           # y///
+           # a trailing \ indicates embedded newline
+           while( $cmd =~ s/(?<!\\)\\$/\n/ ){
+               $icom++;
+               if( $icom > $#Commands ){
+                   Warn( "unexpected end of script", $fl );
+                   $error++;
+                   last;
+               }
+               $cmd .= $Commands[$icom];
+                $Code .= "# $Commands[$icom]\n" if $doGenerate;
+           }
+           if( ! length( $cmd ) ){
+               Warn( "`y' command requires argument", $fl );
+               $error++;
+               next;
+           }
+           my $d = substr( $cmd, 0, 1 ); $cmd = substr( $cmd, 1 );
+           if( $d eq '\\' ){
+               Warn( "`\\' not valid as delimiter in `y' command", $fl );
+               $error++;
+               next;
+           }
+           my $fr = stripTrans( $d, \$cmd );
+           if( ! defined( $fr ) || ! length( $cmd ) ){
+               Warn( "malformed `y' command argument", $fl );
+               $error++;
+               next;
+           }
+           my $to = stripTrans( $d, \$cmd );
+           if( ! defined( $to ) ){
+               Warn( "malformed `y' command argument", $fl );
+               $error++;
+               next;
+           }
+           if( length($fr) != length($to) ){
+               Warn( "string lengths in `y' command differ", $fl );
+               $error++;
+               next;
+           }
+           if( ! defined( $arg = makey( $fr, $to, $fl ) ) ){
+               $error++;
+               next;
            }
-           chop ($_ = &q(<<"EOT"));
-:      <<--#ifdef TSEEN
-:      $subst && \$tflag++$cmd;
-:      <<--#else
-:      $subst$cmd;
-:      <<--#endif
-EOT
-           next;
-       }
 
-       if (/^p/) {
-           $_ = 'print;';
-           next;
        }
 
-       if (/^w/) {
-           s/^w[ \t]*//;
-           $fh = &make_filehandle($_);
-           $_ = "print $fh \$_;";
-           next;
+       # $cmd must be now empty - exception is {
+       if( $cmd !~ /^\s*$/ ){
+           if( $key eq '{' ){
+               # dirty hack to process command on '{' line
+               $Commands[$icom--] = $cmd;
+           } else {
+               Warn( "extra characters after command ($cmd)", $fl );
+               $error++;
+               next;
+           }
        }
 
-       if (/^r/) {
-           $appendseen++;
-           s/^r[ \t]*//;
-           $file = $_;
-           $_ = "\$atext .= `cat $file 2>/dev/null`;";
-           next;
+       # Make Code
+        #
+       if( &{$tabref->[2]}( $addr1, $addr2, $negated,
+                             $tabref->[3], $arg, $fl ) ){
+           $error++;
        }
+    }
 
-       if (/^P/) {
-           $_ = 'print $1 if /^(.*)/;';
-           next;
-       }
+    while( @BlockStack ){
+       my $bl = pop( @BlockStack );
+       Warn( "start of unterminated `{'", $bl );
+        $error++;
+    }
 
-       if (/^D/) {
-           chop($_ = &q(<<'EOT'));
-:      s/^.*\n?//;
-:      redo LINE if $_;
-:      next LINE;
-EOT
-           $sawnext++;
-           next;
+    for my $lab ( keys( %Label ) ){
+       if( ! exists( $Label{$lab}{defined} ) ){
+           for my $used ( @{$Label{$lab}{used}} ){
+               Warn( "undefined label `$lab'", $used );
+               $error++;
+           }
        }
+    }
 
-       if (/^N/) {
-           chop($_ = &q(<<'EOT'));
-:      $_ .= "\n";
-:      $len1 = length;
-:      $_ .= <>;
-:      chop if $len1 < length;
-:      <<--#ifdef TSEEN
-:      $tflag = 0;
-:      <<--#endif
-EOT
-           next;
-       }
+    exit( 1 ) if $error;
+}
 
-       if (/^h/) {
-           $_ = '$hold = $_;';
-           next;
-       }
 
-       if (/^H/) {
-           $_ = '$hold .= "\n", $hold .= $_;';
-           next;
-       }
+##############
+#### MAIN ####
+##############
 
-       if (/^g/) {
-           $_ = '$_ = $hold;';
-           next;
-       }
+sub usage(){
+    print STDERR "Usage: sed [-an] command [file...]\n";
+    print STDERR "           [-an] [-e command] [-f script-file] [file...]\n";
+}
 
-       if (/^G/) {
-           $_ = '$_ .= "\n", $_ .= $hold;';
-           next;
+###################
+# Here we go again...
+#
+my $expr = 0;
+while( @ARGV && $ARGV[0] =~ /^-(.)(.*)$/ ){
+    my $opt = $1;
+    my $arg = $2;
+    shift( @ARGV );
+    if(      $opt eq 'e' ){
+        if( length( $arg ) ){
+           push( @Commands, split( "\n", $arg ) );
+        } elsif( @ARGV ){
+           push( @Commands, shift( @ARGV ) ); 
+        } else {
+            Warn( "option -e requires an argument" );
+            usage();
+            exit( 1 );
+        }
+       $expr++;
+        $Defined{$#Commands} = " #$expr";
+       next;
+    }
+    if( $opt eq 'f' ){
+        my $path;
+        if( length( $arg ) ){
+           $path = $arg;
+        } elsif( @ARGV ){
+           $path = shift( @ARGV ); 
+        } else {
+            Warn( "option -f requires an argument" );
+            usage();
+            exit( 1 );
+        }
+       my $fst = $#Commands + 1;
+        open( SCRIPT, "<$path" ) || die( "$0: $path: could not open ($!)\n" );
+        my $cmd;
+        while( defined( $cmd = <SCRIPT> ) ){
+            chomp( $cmd );
+            push( @Commands, $cmd );
+        }
+        close( SCRIPT );
+       if( $#Commands >= $fst ){
+           $Defined{$fst} = "$path";
        }
+       next;
+    }
+    if( $opt eq '-' && $arg eq '' ){
+       last;
+    }
+    if( $opt eq 'h' || $opt eq '?' ){
+        usage();
+        exit( 0 );
+    }
+    if( $opt eq 'n' ){
+       $doAutoPrint = 0;
+    } elsif( $opt eq 'a' ){
+       $doOpenWrite = 0;
+    } else {
+        Warn( "illegal option `$opt'" );
+        usage();
+        exit( 1 );
+    }
+    if( length( $arg ) ){
+       unshift( @ARGV, "-$arg" );
+    }
+}
 
-       if (/^x/) {
-           $_ = '($_, $hold) = ($hold, $_);';
-           next;
-       }
+# A singleton command may be the 1st argument when there are no options.
+#
+if( @Commands == 0 ){
+    if( @ARGV == 0 ){
+        Warn( "no script command given" );
+        usage();
+        exit( 1 );
+    }
+    push( @Commands, split( "\n", shift( @ARGV ) ) );
+    $Defined{0} = ' #1';
+}
 
-       if (/^b$/) {
-           $_ = 'next LINE;';
-           $sawnext++;
-           next;
-       }
+print STDERR "Files: @ARGV\n" if $useDEBUG;
 
-       if (/^b/) {
-           s/^b[ \t]*//;
-           $lab = &make_label($_);
-           if ($lab eq $toplabel) {
-               $_ = 'redo LINE;';
-           } else {
-               $_ = "goto $lab;";
-           }
-           next;
-       }
+# generate leading code
+#
+    $Code = <<'[TheEnd]';
+
+sub openARGV(){
+    unshift( @ARGV, '-' ) unless @ARGV;
+    my $file = shift( @ARGV );
+    open( ARG, "<$file" )
+    || die( "$0: can't open $file for reading ($!)\n" );
+    $isEOF = 0;
+}
 
-       if (/^t$/) {
-           $_ = 'next LINE if $tflag;';
-           $sawnext++;
-           $tseen++;
-           next;
-       }
+sub getsARGV(;\$){
+    my $argref = @_ ? shift() : \$_; 
+    while( $isEOF || ! defined( $$argref = <ARG> ) ){
+       close( ARG );
+       return 0 unless @ARGV;
+       my $file = shift( @ARGV );
+       open( ARG, "<$file" )
+       || die( "$0: can't open $file for reading ($!)\n" );
+       $isEOF = 0;
+    }
+    1;
+}
 
-       if (/^t/) {
-           s/^t[ \t]*//;
-           $lab = &make_label($_);
-           $_ = q/if ($tflag) {$tflag = 0; /;
-           if ($lab eq $toplabel) {
-               $_ .= 'redo LINE;}';
-           } else {
-               $_ .= "goto $lab;}";
-           }
-           $tseen++;
-           next;
-       }
+sub eofARGV(){
+    return @ARGV == 0 && ( $isEOF = eof( ARG ) );
+}
 
-       if (/^y/) {
-           s/abcdefghijklmnopqrstuvwxyz/a-z/g;
-           s/ABCDEFGHIJKLMNOPQRSTUVWXYZ/A-Z/g;
-           s/abcdef/a-f/g;
-           s/ABCDEF/A-F/g;
-           s/0123456789/0-9/g;
-           s/01234567/0-7/g;
-           $_ .= ';';
+sub makeHandle($){
+    my( $path ) = @_;
+    my $handle;
+    if( ! exists( $wFiles{$path} ) || $wFiles{$path} eq '' ){
+        $handle = $wFiles{$path} = gensym();
+       if( $doOpenWrite ){
+           if( ! open( $handle, ">$path" ) ){
+               die( "$0: can't open $path for writing: ($!)\n" );
+           }
        }
+    } else {
+        $handle = $wFiles{$path};
+    }
+    return $handle;
+}
 
-       if (/^=/) {
-           $_ = 'print $.;';
-           next;
-       }
+sub _r($){
+    my $path = shift();
+    push( @Q, \$path );
+}
 
-       if (/^q/) {
-           chop($_ = &q(<<'EOT'));
-:      close(ARGV);
-:      @ARGV = ();
-:      next LINE;
-EOT
-           $sawnext++;
-           next;
-       }
-    } continue {
-       if ($space) {
-           s/^/$space/;
-           s/(\n)(.)/$1$space$2/g;
+sub _l(){        
+    my $h = $_;
+    my $mcpl = 70;
+    $h =~ s/\\/\\\\/g;
+    if( $h =~ /[^[:print:]]/ ){
+       $h =~ s/\a/\\a/g;
+       $h =~ s/\f/\\f/g;
+       $h =~ s/\n/\\n/g;
+       $h =~ s/\t/\\t/g;
+       $h =~ s/\r/\\r/g;
+       $h =~ s/\e/\\e/g;
+        $h =~ s/([^[:print:]])/sprintf("\\%03o", ord($1))/ge;
+    }
+    while( length( $h ) > $mcpl ){
+       my $l = substr( $h, 0, $mcpl-1 );
+       $h = substr( $h, $mcpl );
+       # remove incomplete \-escape from end of line
+       if( $l =~ s/(?<!\\)(\\[0-7]{0,2})$// ){
+           $h = $1 . $h;
        }
-       last;
+       print $l, "\\\n";
     }
-    $_;
+    print "$h\$\n";
 }
 
-sub fetchpat {
-    local($outer) = @_;
-    local($addr) = $outer;
-    local($inbracket);
-    local($prefix,$delim,$ch);
+sub _w($){
+    my $path   = shift();
+    my $handle = $wFiles{$path};
+    if( ! $doOpenWrite &&
+       ! defined( fileno( $handle ) ) ){
+       open( $handle, ">$path" )
+       || die( "$0: $path: cannot open ($!)\n" );
+    }
+    print $handle $_, "\n";
+}
 
-    # Process pattern one potential delimiter at a time.
+# condition register test/reset
+#
+sub _t(){
+    my $res = $CondReg;
+    $CondReg = 0;
+    $res;
+}
 
-    DELIM: while (s#^([^\]+(|)[\\/]*)([]+(|)[\\/])##) {
-       $prefix = $1;
-       $delim = $2;
-       if ($delim eq '\\') {
-           s/(.)//;
-           $ch = $1;
-           $delim = '' if $ch =~ /^[(){}A-Za-mo-z]$/;
-           $ch = 'b' if $ch =~ /^[<>]$/;
-           $delim .= $ch;
-       }
-       elsif ($delim eq '[') {
-           $inbracket = 1;
-           s/^\^// && ($delim .= '^');
-           s/^]// && ($delim .= ']');
-       }
-       elsif ($delim eq ']') {
-           $inbracket = 0;
-       }
-       elsif ($inbracket || $delim ne $outer) {
-           $delim = '\\' . $delim;
+# printQ
+#
+sub printQ(){
+    for my $q ( @Q ){
+       if( ref( $q ) ){
+           if( exists( $wFiles{$$q} ) && $wFiles{$$q} ne '' ){
+               open( $wFiles{$$q}, ">>$$q" );
+           }
+           if( open( RF, "<$$q" ) ){
+               my $line;
+               while( defined( $line = <RF> ) ){
+                   print $line;
+               }
+               close( RF );
+           }
+       } else {
+           print $q;
        }
-       $addr .= $prefix;
-       $addr .= $delim;
-       if ($delim eq $outer && !$inbracket) {
-           last DELIM;
+    }
+    undef( @Q );
+}
+
+sub Run(){
+    my( $h, $icnt, $s, $n );
+    # hack (not unbreakable :-/) to avoid // matching an empty string
+    my $z = "\000"; $z =~ /$z/;
+    # Initialize.
+    openARGV();
+    $Hold    = '';
+    $CondReg = 0;
+    $doPrint = $doAutoPrint;
+CYCLE:
+    while( getsARGV() ){
+       chomp();
+       $CondReg = 0;   # cleared on t
+BOS:;
+[TheEnd]
+
+    # parse - avoid opening files when doing s2p
+    #
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+    Parse();
+    ( $svOpenWrite, $doOpenWrite ) = (  $doOpenWrite, $svOpenWrite )
+      if $doGenerate;
+
+    # append trailing code
+    #
+    $Code .= <<'[TheEnd]';
+EOS:    if( $doPrint ){
+            print $_, "\n";
+        } else {
+           $doPrint = $doAutoPrint;
        }
+        printQ() if @Q;
     }
-    $addr =~ s/\t/\\t/g;
-    $addr =~ s/\@/\\@/g;
-    &simplify($addr);
-    $addr;
+
+    exit( 0 );
 }
+[TheEnd]
+
+# magic "#n" - same as -n option
+#
+$doAutoPrint = 0 if substr( $Commands[0], 0, 2 ) eq '#n';
 
-sub q {
-    local($string) = @_;
-    local($*) = 1;
-    $string =~ s/^:\t?//g;
-    $string;
+# eval code - check for errors
+#
+print "Code:\n$Code" if $useDEBUG;
+eval $Code;
+if( $@ ){
+    print "Code:\n$Code";
+    die( "$0: internal error - generated incorrect Perl code: $@\n" );
 }
 
-sub simplify {
-    $_[0] =~ s/_a-za-z0-9/\\w/ig;
-    $_[0] =~ s/a-z_a-z0-9/\\w/ig;
-    $_[0] =~ s/a-za-z_0-9/\\w/ig;
-    $_[0] =~ s/a-za-z0-9_/\\w/ig;
-    $_[0] =~ s/_0-9a-za-z/\\w/ig;
-    $_[0] =~ s/0-9_a-za-z/\\w/ig;
-    $_[0] =~ s/0-9a-z_a-z/\\w/ig;
-    $_[0] =~ s/0-9a-za-z_/\\w/ig;
-    $_[0] =~ s/\[\\w\]/\\w/g;
-    $_[0] =~ s/\[^\\w\]/\\W/g;
-    $_[0] =~ s/\[0-9\]/\\d/g;
-    $_[0] =~ s/\[^0-9\]/\\D/g;
-    $_[0] =~ s/\\d\\d\*/\\d+/g;
-    $_[0] =~ s/\\D\\D\*/\\D+/g;
-    $_[0] =~ s/\\w\\w\*/\\w+/g;
-    $_[0] =~ s/\\t\\t\*/\\t+/g;
-    $_[0] =~ s/(\[.[^]]*\])\1\*/$1+/g;
-    $_[0] =~ s/([\w\s!@#%^&-=,:;'"])\1\*/$1+/g;
+if( $doGenerate ){
+
+    # write full Perl program
+    #
+    # bang line, declarations
+    print <<TheEnd;
+#!$perlpath -w
+eval 'exec $perlpath -S \$0 \${1+"\$@"}'
+  if 0;
+\$0 =~ s/^.*?(\\w+)\$/\$1/;
+
+use strict;
+use Symbol;
+use vars qw{ \$isEOF \$Hold \%wFiles \@Q \$CondReg
+            \$doAutoPrint \$doOpenWrite \$doPrint };
+\$doAutoPrint = $doAutoPrint;
+\$doOpenWrite = $doOpenWrite;
+TheEnd
+
+    my $wf = "'" . join( "', '",  keys( %wFiles ) ) . "'";
+    if( $wf ne "''" ){
+       print <<TheEnd;
+sub makeHandle(\$);
+for my \$p ( $wf ){
+   exit( 1 ) unless makeHandle( \$p );
 }
+TheEnd
+   }
 
-sub skip {
-    local($level) = 0;
+   print $Code;
+   print "&Run()\n";
+   exit( 0 );
 
-    while(<BODY>) {
-       /^#ifdef/ && $level++;
-       /^#else/  && !$level && return;
-       /^#endif/ && !$level-- && return;
-    }
+} else {
+
+    # execute: make handles (and optionally open) all w files; run!
 
-    die "Unterminated `#ifdef' conditional\n";
+    for my $p ( keys( %wFiles ) ){
+        exit( 1 ) unless makeHandle( $p );
+    }
+    &Run();
 }
+
+
+=head1 ENVIRONMENT
+
+The environment variable C<PSEDEXTBRE> may be set to extend BREs.
+See L<"Additional Atoms">.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item ambiguos translation for character `%s' in `y' command
+
+The indicated character appears twice, with different translations.
+
+=item `[' cannot be last in pattern
+
+A `[' in a BRE indicates the beginning of a I<bracket expression>.
+
+=item `\' cannot be last in pattern
+
+A `\' in a BRE is used to make the subsequent character literal.
+
+=item `\' cannot be last in substitution
+
+A `\' in a subsitution string is used to make the subsequent character literal.
+
+=item conflicting flags `%s'
+
+In an B<s> command, either the `g' flag and an n-th occurrence flag, or
+multiple n-th occurrence flags are specified. Note that only the digits
+`1' through `9' are permitted.
+
+=item duplicate label %s (first defined at %s)
+
+=item excess address(es)
+
+The command has more than the permitted number of addresses.
+
+=item extra characters after command (%s)
+
+=item illegal option `%s'
+
+=item improper delimiter in s command
+
+The BRE and substitution may not be delimited with `\' or newline.
+
+=item invalid address after `,'
+
+=item invalid backreference (%s)
+
+The specified backreference number exceeds the number of backreferences
+in the BRE.
+
+=item invalid repeat clause `\{%s\}'
+
+The repeat clause does not contain a valid integer value, or pair of
+values.
+
+=item malformed regex, 1st address
+
+=item malformed regex, 2nd address
+
+=item malformed regular expression
+
+=item malformed substitution expression
+
+=item malformed `y' command argument
+
+The first or second string of a B<y> command  is syntactically incorrect.
+
+=item maximum less than minimum in `\{%s\}'
+
+=item no script command given
+
+There must be at least one B<-e> or one B<-f> option specifying a
+script or script file.
+
+=item `\' not valid as delimiter in `y' command
+
+=item option -e requires an argument
+
+=item option -f requires an argument
+
+=item `s' command requires argument
+
+=item start of unterminated `{'
+
+=item string lengths in `y' command differ
+
+The translation table strings in a B<y> commanf must have equal lengths.
+
+=item undefined label `%s'
+
+=item unexpected `}'
+
+A B<}> command without a preceding B<{> command was encountered.
+
+=item unexpected end of script
+
+The end of the script was reached although a text line after a
+B<a>, B<c> or B<i> command indicated another line.
+
+=item unknown command `%s'
+
+=item unterminated `['
+
+A BRE contains an unterminated bracket expression.
+
+=item unterminated `\('
+
+A BRE contains an unterminated backreference.
+
+=item `\{' without closing `\}'
+
+A BRE contains an unterminated bounds specification.
+
+=item `\)' without preceding `\('
+
+=item `y' command requires argument
+
+=back
+
+=head1 EXAMPLE
+
+The basic material for the preceding section was generated by running
+the sed script
+
+   #no autoprint
+   s/^.*Warn( *"\([^"]*\)".*$/\1/
+   t process
+   b
+   :process
+   s/$!/%s/g
+   s/$[_[:alnum:]]\{1,\}/%s/g
+   s/\\\\/\\/g
+   s/^/=item /
+   p
+
+on the program's own text, and piping the output into C<sort -u>.
+
+
+=head1 SED SCRIPT TRANSLATION
+
+If this program is invoked with the name F<s2p> it will act as a
+sed-to-Perl translator. After option processing (all other
+arguments are ignored), a Perl program is printed on standard
+output, which will process the input stream (as read from all
+arguments) in the way defined by the sed script and the option setting
+used for the translation.
+
+=head1 SEE ALSO
+
+perl(1), re_format(7)
+
+=head1 BUGS
+
+The B<l> command will show escape characters (ESC) as `C<\e>', but
+a vertical tab (VT) in octal.
+
+Trailing spaces are truncated from labels in B<:>, B<t> and B<b> commands.
+
+The meaning of an empty regular expression (`C<//>'), as defined by B<sed>,
+is "the last pattern used, at run time". This deviates from the Perl
+interpretation, which will re-use the "last last successfully executed
+regular expression". Since keeping track of pattern usage would create
+terribly cluttered code, and differences would only appear in obscure
+context (where other B<sed> implementations appear to deviate, too),
+the Perl semantics was adopted. Note that common usage of this feature,
+such as in C</abc/s//xyz/>, will work as expected.
+
+Collating elements (of bracket expressions in BREs) are not implemented.
+
+=head1 STANDARDS
+
+This B<sed> implementation conforms to the IEEE Std1003.2-1992 ("POSIX.2")
+definition of B<sed>, and is compatible with the I<OpenBSD>
+implementation, except where otherwise noted (see L<"BUGS">).
+
+=head1 AUTHOR
+
+This Perl implementation of I<sed> was written by Wolfgang Laun,
+I<Wolfgang.Laun@alcatel.at>.
+
+=head1 COPYRIGHT and LICENSE
+
+This program is free and open software. You may use, modify,
+distribute, and sell this program (and any modified variants) in any
+way you wish, provided you do not restrict others from doing the same.
+
+=cut
+
 !NO!SUBS!
 
 close OUT or die "Can't close $file: $!";