diff options
Diffstat (limited to 'Build/source/libs/xpdf/xpdf-3.03/vms_make.com')
-rw-r--r-- | Build/source/libs/xpdf/xpdf-3.03/vms_make.com | 736 |
1 files changed, 736 insertions, 0 deletions
diff --git a/Build/source/libs/xpdf/xpdf-3.03/vms_make.com b/Build/source/libs/xpdf/xpdf-3.03/vms_make.com new file mode 100644 index 00000000000..d70caad765b --- /dev/null +++ b/Build/source/libs/xpdf/xpdf-3.03/vms_make.com @@ -0,0 +1,736 @@ +$!======================================================================== +$! +$! Main Xpdf compile script for VMS. +$! +$! Written by Patrick Moreau, Martin P.J. Zinser. +$! +$! Copyright 1996-2003 Glyph & Cog, LLC +$! +$!======================================================================== +$! +$! This procedure takes up to three (optional) parameters: +$! +$! 1.) Configuration settings: +$! +$! a4 - Use european A4 as the default paper size. +$! +$! no_text_select - Disable text selection in Xpdf +$! +$! opi_support - Compile Xpdf with support for the Open Prepress +$! Interface (OPI) +$! +$! 2.) Compiler detection: +$! +$! In case you want to override the automatic compiler detection +$! specify either DECC or GCC as the second paramter, +$! e.g. @vms_make "" GCC +$! +$! 3.) System Xpdf resource file +$! +$! The default for this is decw$system_defaults:xpdfrc.dat, since this +$! is the standard place for systemwide Xdefaults files on OpenVMS. You +$! may provide a different file in p3. +$! +$! External libraries (like T1lib, Freetype, and XPM) are supported via the +$! config file VMSLIB.DAT. Please check the sample file, which will be created +$! by this procedure upon first invocation, for the information you need to +$! provide +$! +$! Sample invocation of the script: +$! @vms_make a4,opi_support "" +$! +$! In case of problems with the compile you may contact me at +$! zinser@decus.de (preferred) or zinser@sysdev.deutsche-boerse.com (work). +$! +$!======================================================================== +$! +$ on error then goto err_exit +$! +$! +$! Just some general constants... +$! +$ true = 1 +$ false = 0 +$ xpdf_link :== link +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tc = tmpnam + ".c" +$! +$! Setup variables holding "config" information +$! +$ aconf_in_file = "aconf_h.in#aconf.h_in#aconf.h.in" +$ name = "Xpdf" +$ version = "?.?" +$ mydefs = "#" +$ xlibs = "xt#xmu#motif" +$ cxxdefs = "" +$ libdefs = "\" +$ libincs = "" +$ float = "" +$ compress_def = false +$ ft2def = false +$ x11_save = "" +$ p2 = f$edit(p2,"upcase,trim") +$ if f$edit(p3,"trim") .eqs. "" +$ then +$ resfil = "decw$system_defaults:xpdfrc.dat" +$ else +$ resfil = "'p3'" +$ endif +$! +$ gosub proc_config +$ gosub check_version +$! +$! Start building the option file +$! +$ open/write optf xpdf.opt +$ open/write topt tmp.opt +$ write optf "Identification=""''name' ''version'""" +$ gosub check_create_vmslib +$ gosub check_xlib +$! +$ if (f$getsyi("HW_MODEL").ge.1024) .and. - + (f$locate("T1LIB",f$edit(libdefs,"UPCASE")) .lt. f$length(libdefs)) - + then float = "/float=ieee_float" +$ incs = "sys$library:,[-],[],[-.goo]''libincs'" +$! +$ gosub check_compiler +$ close optf +$ close topt +$! +$! aconf.h.in might be mapped in different ways, so go figure +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf aconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ write aconf line +$ else +$ def = f$element(1," ",work) +$ if ((f$locate("\''def'\",f$edit(libdefs,"UPCASE")) .lt. f$length(libdefs)) - + .or. (f$locate("#''def'#",f$edit(mydefs,"UPCASE")) .lt. f$length(mydefs))) +$ then +$ write aconf "#define ", def, " 1" +$ else +$ gosub check_config +$ endif +$ endif +$! +$! Make sure old-style VMS is defined along with __VMS +$! +$ if f$locate("define ACONF_H",line) .lt. f$length(line) +$ then +$ write aconf "#define VMS 1" +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ close aconf_in +$ close aconf +$ write sys$output "Compiling in [.GOO]" +$ set default [.goo] +$ @vms_make +$ write sys$output "Compiling in [.XPDF]" +$ set default [-.xpdf] +$ @vms_make +$ set default [-] +$ gosub reset_env +$ dele/noconf/nolog tmp.opt;* +$ exit +$ACONF_ERR: +$ write sys$output "Input file ''fname' could not be opened" +$ goto err_exit +$AMISS_ERR: +$ write sys$output "No source for aconf.h found." +$ write sys$output "Tried any of ''aconf_in_file'" +$CXX_ERR: +$ write sys$output "C++ compiler required to build Xpdf" +$ goto err_exit +$FT2_ERR: +$ write sys$output "Can not find [.internal] sub-dir in Freetype 2 tree" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ gosub reset_env +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog optf +$ close/nolog tmpc +$ close/nolop topt +$ write sys$output "Exiting..." +$ exit 2 +$!------------------------------------------------------------------------------ +$! +$! Take care of driver file with information about external libraries +$! +$CHECK_CREATE_VMSLIB: +$! +$ if f$search("VMSLIB.DAT") .eqs. "" +$ then +$ type/out=vmslib.dat sys$input +! +! This is a simple driver file with information used by vms_make.com to +! check if external libraries (like t1lib and freetype) are available on +! the system. +! +! Layout of the file: +! +! - Lines starting with ! are treated as comments +! - Elements in a data line are separated by # signs +! - The elements need to be listed in the following order +! 1.) Name of the Library (only used for informative messages +! from vms_make.com) +! 2.) Location where the object library can be found +! 3.) Location where the include files for the library can be found +! 4.) Include file used to verify library location +! 5.) CPP define to pass to the build to indicate availability of +! the library +! +! Example: The following lines show how definitions +! might look like. They are site specific and the locations of the +! library and include files need almost certainly to be changed. +! +! Location: All of the libaries can be found at the following addresses +! +! T1LIB: http://www.decus.de:8080/www/vms/sw/t1lib.htmlx +! FREETYPE: http://www.decus.de:8080/www/vms/sw/freetype2.htmlx +! XPM: http://www.decus.de:8080/www/vms/sw/xpm.htmlx +! LIBPAPER: http://www.decus.de:8080/www/vms/sw/libpaper.htmlx +! +!T1LIB # pubbin:t1shr.exe # public$root:[xtools.libs.t1lib.lib.t1lib] # t1lib.h # HAVE_T1LIB_H +!FREETYPE # pubbin:freetype2shr.exe # public$root:[xtools.libs.ft2.include.freetype],public$root:[xtools.libs.ft2.include] # freetype.h # HAVE_FREETYPE_H\FREETYPE2 +!XPM # pubbin:libxpm.olb # X11: # xpm.h # HAVE_X11_XPM_H +!LIBPAPER # pubbin:libpapershr.exe # public$root:[util.libs.paper.lib] # paper.h # HAVE_PAPER_H +$ write sys$output "New driver file vmslib.dat created." +$ write sys$output "Please customize libary locations for your site" +$ write sys$output "and afterwards re-execute vms_make.com" +$ write sys$output "Exiting..." +$ close/nolog optf +$ exit +$ endif +$! +$! Open data file with location of libraries +$! +$ open/read/end=end_lib/err=err_lib libdata VMSLIB.DAT +$LIB_LOOP: +$ read/end=end_lib libdata libline +$ libline = f$edit(libline, "UNCOMMENT,COLLAPSE") +$ if libline .eqs. "" then goto LIB_LOOP ! Comment line +$ libname = f$edit(f$element(0,"#",libline),"UPCASE") +$ write sys$output "Processing ''libname' setup ..." +$ libloc = f$element(1,"#",libline) +$ libsrc = f$element(2,"#",libline) +$ testinc = f$element(3,"#",libline) +$ cppdef = f$element(4,"#",libline) +$ old_cpp = f$locate("=1",cppdef) +$ if old_cpp.lt.f$length(cppdef) then cppdef = f$extract(0,old_cpp,cppdef) +$ if f$search("''libloc'").eqs. "" +$ then +$ write sys$output "Can not find library ''libloc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ libsrc_elem = 0 +$ libsrc_found = false +$LIBSRC_LOOP: +$ libsrcdir = f$element(libsrc_elem,",",libsrc) +$ if (libsrcdir .eqs. ",") then goto END_LIBSRC +$ if f$search("''libsrcdir'''testinc'") .nes. "" then libsrc_found = true +$ libsrc_elem = libsrc_elem + 1 +$ goto LIBSRC_LOOP +$END_LIBSRC: +$ if .not. libsrc_found +$ then +$ write sys$output "Can not find includes at ''libsrc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ libdefs = libdefs + cppdef + "\" +$ libincs = libincs + "," + libsrc +$ lqual = "/lib" +$ libtype = f$edit(f$parse(libloc,,,"TYPE"),"UPCASE") +$ if f$locate("EXE",libtype) .lt. f$length(libtype) then lqual = "/share" +$ write optf libloc , lqual +$ write topt libloc , lqual +$! +$! Nasty hack to get the freetype includes to work +$! +$ if ((libname .eqs. "FREETYPE") .and. - + (f$locate("FREETYPE2",cppdef) .lt. f$length(cppdef))) +$ then +$ if ((f$search("freetype:freetype.h") .nes. "") .and. - + (f$search("freetype:[internal]ftobjs.h") .nes. "")) +$ then +$ write sys$output "Will use local definition of freetype logical" +$ ft2def = false +$ else +$ ft2elem = 0 +$FT2_LOOP: +$ ft2srcdir = f$element(ft2elem,",",libsrc) +$ if f$search("''ft2srcdir'''testinc'") .nes. "" +$ then +$ if f$search("''ft2srcdir'internal.dir") .nes. "" +$ then +$ ft2dev = f$parse("''ft2srcdir'",,,"device","no_conceal") +$ ft2dir = f$parse("''ft2srcdir'",,,"directory","no_conceal") +$ ft2conc = f$locate("][",ft2dir) +$ ft2len = f$length(ft2dir) +$ if ft2conc .lt. ft2len +$ then +$ ft2dir = f$extract(0,ft2conc,ft2dir) + - + f$extract(ft2conc+2,ft2len-2,ft2dir) +$ endif +$ ft2dir = ft2dir - "]" + ".]" +$ define freetype 'ft2dev''ft2dir','ft2srcdir' +$ ft2def = true +$ else +$ goto ft2_err +$ endif +$ else +$ ft2elem = ft2elem + 1 +$ goto ft2_loop +$ endif +$ endif +$ endif +$! +$! Yet another special treatment for Xpm/X11 +$! +$ if (libname .eqs. "XPM") +$ then +$ my_x11 = f$parse("''libsrc'xpm.h",,,"device") + - + f$parse("''libsrc'xpm.h",,,"directory") +$ x11_save = f$trnlnm("X11") +$ define x11 'my_x11',decw$include +$ endif +$ goto LIB_LOOP +$END_LIB: +$ close libdata +$ return +$!------------------------------------------------------------------------------ +$! +$! Take care of driver file with information about external libraries +$! +$CHECK_CONFIG: +$! +$ if (def .eqs. "SYSTEM_XPDFRC") +$ then +$ write aconf "#define SYSTEM_XPDFRC """, resfil, """" +$ else +$ gosub check_cc_def +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$CHECK_CC_DEF: +$ if (def .eqs. "HAVE_DIRENT_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <dirent.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_SYS_NDIR_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <sys/ndir.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_SYS_DIR_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <sys/dir.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_NDIR_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <ndir.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_SYS_SELECT_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <sys/select.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_SYS_BSDTYPES_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <sys/bsdtypes.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_STRINGS_H") +$ then +$ copy sys$input: 'tc +$ deck +#include <strings.h> +int main(){ +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_POPEN") +$ then +$ copy sys$input: 'tc +$ deck +#include <stdio.h> + +int main(){ +FILE *pipe; + pipe = popen("DIR","r"); + pclose(pipe); +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_MKSTEMP") +$ then +$ copy sys$input: 'tc +$ deck +#include <stdlib.h> + +int main(){ + mkstemp("tempXXXXXX"); +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_FSEEKO") +$ then +$ copy sys$input: 'tc +$ deck +#define _LARGEFILE +#include <stdio.h> + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "_LARGE_FILES") +$ then +$ copy sys$input: 'tc +$ deck +#define _LARGEFILE +#include <stdio.h> + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ if (def .eqs. "HAVE_XTAPPSETEXITFLAG") +$ then +$ copy sys$input: 'tc +$ deck +#include <X11/Intrinsic.h> + +int main(){ + XtAppContext app_context; + app_context = XtCreateApplicationContext(); + XtAppSetExitFlag(app_context); + return 0; +} +$ eod +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Process config settings passed from the command line +$! (analog to Unix --enable-xxx) +$! +$PROC_CONFIG: +$ if (p1.nes."") +$ then +$ i = 0 +$ qual_list = f$edit(p1,"upcase") +$DEF_LOOP: +$ qual = f$element(i,",",qual_list) +$ if qual .eqs. "," then goto FINISH_DEF +$ i = i + 1 +$ if (qual .eqs. "A4") +$ then +$ mydefs = mydefs + "A4_PAPER#" +$ goto def_loop +$ endif +$ if (qual .eqs. "NO_TEXT_SELECT") +$ then +$ mydefs = mydefs + "NO_TEXT_SELECT#" +$ goto def_loop +$ endif +$ if (qual .eqs. "OPI_SUPPORT") +$ then +$ mydefs = mydefs + "OPI_SUPPORT#" +$ goto def_loop +$ endif +$ if (qual .eqs. "COMPRESS") +$ then +$ compress_def = true +$ goto def_loop +$ endif +$ write sys$output "Qualifier ''qual' not recognized, will be ignored" +$ goto def_loop +$ endif +$FINISH_DEF: +$ return +$! +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$CHECK_COMPILER: +$ its_decc = (f$search("SYS$SYSTEM:CXX$COMPILER.EXE") .nes. "") +$ its_gnuc = .not. its_decc .and. (f$trnlnm("gnu_cc") .nes. "") +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_gnuc)) then goto CXX_ERR +$! +$! Override if requested from the commandline +$! +$ if (p2 .eqs. "DECC") +$ then +$ its_decc = true +$ its_gnuc = false +$ endif +$ if (p1 .eqs. "GNUC") +$ then +$ its_decc = false +$ its_gnuc = true +$ endif +$! +$ if its_decc +$ then +$ ccomp :== "cc/decc/prefix=all ''float'" +$! +$! Take care of includes +$! +$ cc_user = f$trnlnm("DECC$USER_INCLUDE") +$ cc_system = f$trnlnm("DECC$SYSTEM_INCLUDE") +$ cxx_user = f$trnlnm("CXX$USER_INCLUDE") +$ cxx_system = f$trnlnm("CXX$SYSTEM_INCLUDE") +$ define decc$system_include 'incs' +$ define decc$user_include 'incs' +$ define cxx$user_include 'incs' +$ define cxx$system_include 'incs' +$! +$! Check version of the C++ compiler +$! +$ create vms_xpdf_cc_test.cc +$ cxx/lis=vms_xpdf_cc_test.lis/show=all vms_xpdf_cc_test.cc +$ open list vms_xpdf_cc_test.lis +$CXX_LIST: +$ read/end=close_cxx list line +$ start = f$locate("__DECCXX_VER",line) +$ if start .ne. f$length(line) +$ then +$ cxx_ver = f$extract(start+13,8,line) +$ if cxx_ver .gt. 60000000 +$ then +$ cxxdefs = "/warn=(disable=nosimpint)" +$ xpdf_link :== cxxlink +$ endif +$ goto close_cxx +$ endif +$ goto cxx_list +$CLOSE_CXX: +$ close list +$ delete/noconfirm vms_xpdf_cc_test.*;* +$ cxxcomp :== "cxx/prefix=all ''cxxdefs' ''float' /include=cxx$user_include" +$ endif +$! +$ if its_gnuc +$ then +$ ccomp :== "gcc/nocase/include=(''incs')" +$ cxxcomp :== "gcc/plusplus/nocase/include=(''incs')" +$ write optf "gnu_cc:[000000]gcclib.olb/lib" +$ write optf "sys$share:vaxcrtl.exe/share" +$ endif +$ return +$------------------------------------------------------------------------------- +$RESET_ENV: +$ delete/sym/glob cxxcomp +$ delete/sym/glob ccomp +$ delete/sym/glob xpdf_link +$ if (ft2def) then deassign freetype +$ if its_decc +$ then +$ if cc_user .eqs. "" +$ then +$ deass decc$user_include +$ else +$ define decc$user_include 'cc_user' +$ endif +$ if cc_system .eqs. "" +$ then +$ deass decc$system_include +$ else +$ define decc$system_include 'cc_system' +$ endif +$ if cxx_user .eqs. "" +$ then +$ deass cxx$user_include +$ else +$ define cxx$user_include 'cxx_user' +$ endif +$ if cxx_system .eqs. "" +$ then +$ deass cxx$system_include +$ else +$ define cxx$system_include 'cxx_system' +$ endif +$ endif +$ if (x11_save .nes. "") then define x11 'x11_save' +$ return +$! +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$CC_PROP_CHECK: +$ cc_prop = true +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link/opt=tmp.opt 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;* +$ if cc_prop +$ then +$ write sys$output "Checking for ''def'... yes" +$ write aconf "#define ''def' 1" +$ if (def .eqs. "HAVE_FSEEKO") .or. (def .eqs. "_LARGE_FILES") then - + write aconf "#define _LARGEFILE" +$ else +$ write sys$output "Checking for ''def'... no" +$ write aconf line +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check Xlibs and write to options file +$! +$CHECK_XLIB: +$ If F$Type (xlibs) .nes. "STRING" Then xlibs = "" +$ need_xt = f$locate("XT",f$edit(xlibs,"upcase")) .lt. f$length(xlibs) +$ need_xmu = f$locate("XMU",f$edit(xlibs,"upcase")) .lt. f$length(xlibs) +$ need_xm = f$locate("MOTIF",f$edit(xlibs,"upcase")) .lt. f$length(xlibs) +$ On Error Then GoTo XUI +$ @sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.0" +$ then +$ if need_xt .or. need_xmu .or. need_xm +$ then +$ write optf "Sys$share:DECW$DWTLIBSHR.EXE/Share" +$ write topt "Sys$share:DECW$DWTLIBSHR.EXE/Share" +$ endif +$ endif +$ if f$extract(4,3,decw$version).eqs."1.1" +$ then +$ if need_xm then write optf "sys$share:decw$xmlibshr.exe/share" +$ if need_xt then write optf "sys$share:decw$xtshr.exe/share" +$ if nedd_xmu then write optf "sys$share:decw$xmulibshr.exe/share" +$ if need_xm then write topt "sys$share:decw$xmlibshr.exe/share" +$ if need_xt then write topt "sys$share:decw$xtshr.exe/share" +$ if nedd_xmu then write topt "sys$share:decw$xmulibshr.exe/share" +$ endif +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$ if need_xm then write optf "sys$share:decw$xmlibshr12.exe/share" +$ if need_xt then write optf "sys$share:decw$xtlibshrr5.exe/share" +$ if need_xmu then write optf "sys$share:decw$xmulibshrr5.exe/share" +$ if need_xm then write topt "sys$share:decw$xmlibshr12.exe/share" +$ if need_xt then write topt "sys$share:decw$xtlibshrr5.exe/share" +$ if need_xmu then write topt "sys$share:decw$xmulibshrr5.exe/share" +$ endif +$ GoTo MAIN +$ XUI: +$! +$ if need_xt .or. need_xmu +$ then +$ write optf "Sys$share:DECW$DWTLIBSHR.EXE/Share" +$ write topt "Sys$share:DECW$DWTLIBSHR.EXE/Share" +$ endif +$ MAIN: +$ on error then goto err_exit +$ write optf "sys$share:decw$xlibshr.exe/share" +$ write topt "sys$share:decw$xlibshr.exe/share" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check version of Xpdf to build +$! +$CHECK_VERSION: +$ open/read in [.xpdf]config.h +$ check_string = "xpdfVersionNum" +$vloop: +$ read/end=vdone in rec +$ if (f$element(1," " ,rec) .nes. check_string) then goto vloop +$ start = f$locate(check_string,rec) + f$length(check_string) +$ len = f$length(rec) - start +$ version = f$edit(f$extract(start,len,rec),"COLLAPSE") +$vdone: +$ close in +$ return +$!------------------------------------------------------------------------------ |