2006-06-08 15:57:45 +00:00
|
|
|
=========================
|
|
|
|
Building LyX with SCons
|
|
|
|
=========================
|
|
|
|
|
2006-07-07 02:39:54 +00:00
|
|
|
July, 2006
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
The GNU Build System (autoconf, automake and make) has been used to build
|
|
|
|
and distribute lyx. These de facto *nix tools are readily available and
|
|
|
|
widely supported on the *nix systems, but not so under windows. They are
|
|
|
|
not necessarily easy to use and maintain (at least to non-m4 experts)
|
|
|
|
either. Because of these, a scons (http://www.scons.org) build system has
|
|
|
|
been set up as an alternative way to build lyx. As of writing, this system
|
2006-10-21 08:35:47 +00:00
|
|
|
only supports the qt4 frontend.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
This file is organized as follows:
|
2006-06-08 15:57:45 +00:00
|
|
|
1. General usage of scons
|
|
|
|
2. *nix systems (Linux, Solaris and Mac OSX)
|
|
|
|
3. Windows/mingw
|
|
|
|
4. Windows/cygwin
|
2006-07-07 02:39:54 +00:00
|
|
|
5. Windows/msvc
|
2006-08-13 16:23:50 +00:00
|
|
|
6. Tips and hints
|
|
|
|
7. Troubleshooting
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
1. General usage of scons
|
|
|
|
=========================
|
|
|
|
|
|
|
|
Prerequisites:
|
|
|
|
--------------
|
|
|
|
|
|
|
|
* Python:
|
2006-06-15 08:44:28 +00:00
|
|
|
Python >= 1.5.2 is required to run scons, but Python >= 2.3 is used by
|
|
|
|
lyx itself so the newer version is needed. Python is widely
|
2006-06-08 15:57:45 +00:00
|
|
|
available on non-windows systems. Windows users can download and install
|
|
|
|
python from http://www.python.org.
|
|
|
|
|
|
|
|
* SCons:
|
|
|
|
scons >= 0.96.92 is needed. You can either use a full system-wide scons
|
|
|
|
distribution or a light-weight one (called scons-local) installed along
|
2006-07-03 02:02:11 +00:00
|
|
|
with the lyx source tree. Both variants of scons are freely available
|
2006-06-08 15:57:45 +00:00
|
|
|
from http://www.scons.org. Note that LyX source may ship with scons-base
|
|
|
|
in the near future.
|
2006-07-03 02:02:11 +00:00
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
* Other libraries:
|
2006-10-21 08:35:47 +00:00
|
|
|
These include zlib (required), qt4 (required), gettext
|
2006-07-03 02:02:11 +00:00
|
|
|
(optional), boost (optional), aspell (optional) and Aiksaurus
|
|
|
|
(optional). Please refer to the system-specific sections regarding the
|
2006-06-08 15:57:45 +00:00
|
|
|
availability and installation of them.
|
|
|
|
|
|
|
|
|
|
|
|
Start scons:
|
|
|
|
------------
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
The scons system resides under development/scons. You can invoke it from
|
2006-06-08 15:57:45 +00:00
|
|
|
either development/scons by, for example:
|
|
|
|
> cd development/scons
|
|
|
|
> scons frontend=qt4 qt_dir=d:/qt4 -j3 lyx
|
2006-12-16 16:31:28 +00:00
|
|
|
or from any other directory and use -f option to point to the SConstruct
|
|
|
|
file:
|
|
|
|
> mkdir build
|
|
|
|
> cd build
|
|
|
|
> scons -f ../development/scons/SConstruct frontend=qt4 all
|
2007-07-30 16:07:07 +00:00
|
|
|
If you are tired of typing development/scons/SConstruct, you can link
|
|
|
|
development/scons/SConstruct to the top source directory and use this
|
|
|
|
SConstruct file.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
There are three types of command line options:
|
|
|
|
* key=value are user options. They are used to tell scons which
|
2006-07-03 02:02:11 +00:00
|
|
|
frontend to use, whether or not use included boost libraries etc.
|
2006-06-08 15:57:45 +00:00
|
|
|
You can use 'scons -h' to list all of the options.
|
|
|
|
* parameters start with - or -- are scons options. Useful ones include
|
|
|
|
-j3 (with three threads) and --config=force (force reconfiguration).
|
|
|
|
* others options are targets, which are lyx objects to build.
|
|
|
|
|
|
|
|
|
|
|
|
User Options:
|
|
|
|
-------------
|
|
|
|
|
|
|
|
Here I only list important options that you will likely use. Full option
|
|
|
|
list with detailed description and default value can be displayed using
|
|
|
|
command 'scons -h'.
|
|
|
|
|
|
|
|
Components to use/build:
|
|
|
|
|
2006-10-21 08:35:47 +00:00
|
|
|
* frontend=qt4: qt4 is the only option right now.
|
2006-07-03 02:02:11 +00:00
|
|
|
* mode=debug/release: lyx will be built under the debug or release
|
2006-06-08 15:57:45 +00:00
|
|
|
directory, with different default build options.
|
|
|
|
* boost=included/system/auto: whether or not use included boost, system
|
2006-07-03 02:02:11 +00:00
|
|
|
boost, or try to detect system boost first. Note that boost=included
|
|
|
|
is safer if system boost has a different version from the included
|
|
|
|
one.
|
2006-06-08 15:57:45 +00:00
|
|
|
* gettext=included/system/auto
|
|
|
|
* nls=yes/no whether or not enable natural language support.
|
|
|
|
* spell=aspell/pspell/ispell/auto: spell engine
|
|
|
|
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
Paths: Most of them will be probed if not specified.
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
* qt_dir: top level directory of qt (with at least subdirectory bin
|
|
|
|
containing commands uic and moc)
|
|
|
|
* qt_lib_path: path to the qt library, use only if there is no
|
2006-06-08 15:57:45 +00:00
|
|
|
$qt_dir/lib
|
2006-07-03 02:02:11 +00:00
|
|
|
* qt_inc_path: path to qt include directory, use only if there is no
|
2006-06-08 15:57:45 +00:00
|
|
|
$qt_dir/include
|
|
|
|
* extra_inc_path, extra_inc_path1, extra_lib_path, extra_lib_path1:
|
|
|
|
additional paths to other libraries
|
2006-06-10 21:02:11 +00:00
|
|
|
* extra_bin_path: a convenient way to add an extra path to $PATH
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
Convenience options:
|
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
* load_option=yes/no/opt1,opt2/-opt1,opt2: if true, load previously saved
|
2006-07-03 02:02:11 +00:00
|
|
|
command line options so you can run 'scons install' directly after a
|
2006-06-14 20:10:36 +00:00
|
|
|
long 'scons all' building command. You can load selected options using
|
|
|
|
load_option=opt1,opt2,... or exclude options using the - version of it.
|
2007-03-23 14:36:07 +00:00
|
|
|
Note that the option 'bundle' is not reloaded.
|
2006-07-03 02:02:11 +00:00
|
|
|
* rebuild=target1,target2... By default, scons will exam all components
|
2006-06-08 15:57:45 +00:00
|
|
|
when you build lyx. You can free scons from some hard work and save
|
|
|
|
yourself some time by telling scons to rebuild only specified
|
2006-07-13 17:52:41 +00:00
|
|
|
component(s). rebuild=no, none, yes or all can be used as well.
|
2006-06-08 15:57:45 +00:00
|
|
|
* log_file: a log file of executed commands, default to scons_lyx.log
|
|
|
|
|
|
|
|
|
|
|
|
Installation options:
|
|
|
|
|
|
|
|
* prefix: directory where lyx will be installed
|
2006-07-03 02:02:11 +00:00
|
|
|
* exec_dir: directory where lyx binaries will be installed.
|
2006-06-08 15:57:45 +00:00
|
|
|
Default to $prefix/bin
|
2006-12-16 16:31:28 +00:00
|
|
|
* DESTDIR: if specified, install to this directory instead of $prefix.
|
2006-07-07 15:11:37 +00:00
|
|
|
* version_suffix=yes/no/something : if specified, this suffix will be
|
|
|
|
appended to the user data directory.
|
2007-01-25 19:13:22 +00:00
|
|
|
* win_installer: if specified under windows, and if 'installer' target
|
|
|
|
is given, generate NSIS installer specifed as win_installer which can
|
|
|
|
be a full path name. The default is lyx-version-timestamp-Installer.exe
|
|
|
|
for a development version, and lyx-version-Installer.exe for a released
|
|
|
|
version.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
Compiler choice and flags:
|
|
|
|
* use_vc: use msvc instead of mingw g++ under windows
|
2006-06-14 20:10:36 +00:00
|
|
|
* optimization: optimization flag to use (e.g. -O2)
|
2006-07-03 02:02:11 +00:00
|
|
|
* CC, LINK, CPP, CXX, CCFLAGS, LINKFLAGS etc: compiler commands and
|
2006-06-14 20:10:36 +00:00
|
|
|
flags. Setting CCFLAGS etc will replace default flags. These variables
|
|
|
|
can be set as environment variables as well.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
Targets:
|
|
|
|
--------
|
|
|
|
|
|
|
|
You can specify one or more of the following targets:
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
Static libraries (names correspond to their directories):
|
|
|
|
boost, intl, support, mathed, insets, frontends, graphics,
|
2006-10-21 08:35:47 +00:00
|
|
|
controllers, client, qt4, lyxbase
|
2006-06-08 15:57:45 +00:00
|
|
|
Programs:
|
|
|
|
tex2lyx, client, lyx, all = tex2lyx + client + lyx
|
|
|
|
Installation:
|
2007-01-25 19:13:22 +00:00
|
|
|
po, install = all + po, installer (windows only, need NSIS)
|
2006-06-08 15:57:45 +00:00
|
|
|
Misc:
|
2007-03-23 14:36:07 +00:00
|
|
|
msvs_projects, update_po
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-10 21:02:11 +00:00
|
|
|
Your built targets are put into $build_dir, which is debug (mode=debug),
|
|
|
|
release (mode=release) or any name specified via build_dir=name. The
|
|
|
|
directory structure is:
|
|
|
|
$build_dir
|
|
|
|
- common: most of the intermediate files, mostly object files
|
|
|
|
- libs: all static libraries
|
2006-07-03 02:02:11 +00:00
|
|
|
- executables: lyxclient, tex2lyx, lyx
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
MSVS projects will be put to development/scons (and you should invoke
|
|
|
|
scons from there for this target).
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2007-03-23 14:36:07 +00:00
|
|
|
update_po is similar to 'cd po; make update-po' but does not generate
|
|
|
|
.gmo files, which is the task of the install target. Note that this
|
|
|
|
target is the only target that changes files (po/*.po in this case)
|
|
|
|
of the lyx source tree.
|
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
A typical working sequence:
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
> cd development/scons
|
|
|
|
> scons frontend=qt4 qt_dir=/path/to/qt4
|
2006-06-14 20:10:36 +00:00
|
|
|
(build lyx, and all needed libraries...)
|
2006-06-08 15:57:45 +00:00
|
|
|
> scons all -j3
|
|
|
|
(build lyx, client and tex2lyx, options like qt_dir will be carried
|
|
|
|
over here)
|
|
|
|
> scons rebuild=lyxbase
|
2007-04-26 04:41:58 +00:00
|
|
|
(working on LyX.cpp, so only need to rebuild lyxbase)
|
2006-06-08 15:57:45 +00:00
|
|
|
> scons
|
|
|
|
(build again, only lyxbase will be rebuilt)
|
2006-12-16 16:31:28 +00:00
|
|
|
> scons prefix=/usr/site DESTDIR=/install/dir
|
2006-06-08 15:57:45 +00:00
|
|
|
(lyx is built for /usr/site, but install to /install/dir)
|
|
|
|
|
|
|
|
|
|
|
|
2. *nix systems (Linux, Solaris and Mac OSX)
|
|
|
|
============================================
|
|
|
|
|
|
|
|
Proper use of extra_inc_path, qt_dir etc should solve most of the
|
|
|
|
problems.
|
|
|
|
|
|
|
|
|
|
|
|
3. Windows/mingw
|
2006-06-10 21:02:11 +00:00
|
|
|
================
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
* install mingw with the following packages:
|
2006-06-10 21:02:11 +00:00
|
|
|
binutils-2.16.91-...tar.gz
|
|
|
|
gcc-core-3.4.5-...tar.gz
|
|
|
|
gcc-g++-3.4.5-...tar.gz
|
|
|
|
mingw-runtime-3.9.tar.gz
|
|
|
|
mingw-utils-0.3.tar.gz
|
|
|
|
MSYS-1.0.11-...exe
|
|
|
|
msysDTK-1.0.1.exe
|
2006-07-03 02:02:11 +00:00
|
|
|
w32api-3.6.tar.gz
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
* install the latest Qt official "open source" binary package for
|
2006-06-14 20:10:36 +00:00
|
|
|
Windows/Mingw (required)
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
* install mingw/zlib (required):
|
2006-07-03 02:02:11 +00:00
|
|
|
Download zlib binaries and developer files (zlib-1.2.3-bin.zip and
|
2006-06-14 20:10:36 +00:00
|
|
|
zlib-1.2.3-lib.zip) from http://gnuwin32.sourceforge.net/packages/zlib.htm .
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
* install iconv (optional):
|
|
|
|
Download libiconv from http://gnuwin32.sourceforge.net/packages/libiconv.htm
|
|
|
|
The complete package (without source) is recommended.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
You may also try the windows binary (libiconv-x.x.x.bin.woe32.zip) of
|
|
|
|
iconv from one of the GNU mirrors listed in http://www.gnu.org/prep/ftp.html.
|
2006-06-10 21:02:11 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
* install gettext (optional):
|
|
|
|
Download gettext from http://gnuwin32.sourceforge.net/packages/gettext.htm
|
|
|
|
The complete package (without source) is recommended.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-06-14 20:10:36 +00:00
|
|
|
You may also try the windows binary (gettext-runtime-x.x.x.bin.woe32.zip
|
2006-07-03 02:02:11 +00:00
|
|
|
and gettext-tools-x.x.x.bin.woe32.zip) from one of the GNU mirrors
|
2006-06-14 20:10:36 +00:00
|
|
|
(e.g. http://mirrors.usc.edu/pub/gnu/gettext/).
|
|
|
|
|
|
|
|
* install aspell (optional):
|
|
|
|
LyX uses aspell 0.60.4 and there is no, as of now, official windows
|
|
|
|
version. If you do not want to compile aspell from source by yourself,
|
|
|
|
your best bet is using Abdel's lyx 1.5.0svn experimental package located
|
|
|
|
at http://wiki.lyx.org/Windows/LyX150Experimental. The link to his
|
|
|
|
pre-built aspell package is http://younes.a.free.fr/Lyx-15-experimental
|
|
|
|
|
|
|
|
* install aiksaurus (optional):
|
|
|
|
Try to build aiksaurus from source (both mingw or msvc should work),
|
|
|
|
or look for pre-built package from the lyx 1.5.0svn experimental page.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
* Open a mingw xterm, and start scons as usual.
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
Note: gettext, iconv and zlib are usually decompressed to c:/mingw so no
|
2006-06-10 21:02:11 +00:00
|
|
|
extra_inc_path etc is needed.
|
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
4. Windows/cygwin
|
2006-06-10 21:02:11 +00:00
|
|
|
=================
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-07-07 02:39:54 +00:00
|
|
|
LyX should be easy to compile, but you must use the most recent cygwin
|
2006-10-21 08:35:47 +00:00
|
|
|
dll (version 1.5.20-1 as of July 2006) because qt library in older
|
2006-07-07 02:39:54 +00:00
|
|
|
cygwin distribution does not work with previous versions due to broken
|
|
|
|
threading support.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
To build lyx for cygwin, you should
|
|
|
|
|
|
|
|
* install (using the cygwin setup program) at least the following
|
|
|
|
packages and all other packages pulled in by dependencies:
|
|
|
|
|
2006-10-21 08:35:47 +00:00
|
|
|
aspell gzip libiconv qt4-bin
|
|
|
|
aspell-dev jpeg libpng qt4-devel
|
2006-07-07 02:39:54 +00:00
|
|
|
gcc libintl libpng2
|
|
|
|
gettext libintl1 jpeg
|
|
|
|
gettext-devel libintl2 python
|
|
|
|
|
|
|
|
* install aiksaurus (http://aiksaurus.sourceforge.net/, optional):
|
|
|
|
There is no cygwin package for aiksaurus, so you should build it from
|
|
|
|
source. However, aiksaurus builds smoothly on cygwin.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
* run scons as you would do under linux.
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
Note: cygwin/qt does not follow the usual $qt_dir/include, $qt_dir/bin,
|
2006-10-21 08:35:47 +00:00
|
|
|
$qt_dir/lib directory structure. For example, cygwin/qt4 uses directories
|
|
|
|
/usr/include/qt4, /usr/lib/qt4/bin and /usr/lib/qt4/lib. If these
|
2006-07-03 02:02:11 +00:00
|
|
|
directories can not be detected automatically, use options, for example,
|
2006-10-21 08:35:47 +00:00
|
|
|
qt_dir=/usr/lib/qt4 qt_inc_path=/usr/include/qt4
|
2006-07-03 02:02:11 +00:00
|
|
|
|
|
|
|
|
2006-06-08 15:57:45 +00:00
|
|
|
5. Windows/msvc
|
2006-06-10 21:02:11 +00:00
|
|
|
===============
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
To build lyx with msvc, you should
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
* install msvc
|
|
|
|
It is recommended that you use MSVC2005 Express edition which is
|
|
|
|
freely available from microsoft.
|
|
|
|
|
|
|
|
* get windows platform SDK
|
2006-06-10 21:02:11 +00:00
|
|
|
Please follow the link in the MSVC webpage to download and configure.
|
|
|
|
It is important that you add SDK paths to %INCLUDE% and %LIB% in, e.g.,
|
|
|
|
C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\vsvars32.bat.
|
2006-07-03 02:02:11 +00:00
|
|
|
If you plan to use the MSVS IDE, you should also update the Visual C++
|
2006-06-10 21:02:11 +00:00
|
|
|
directories in VCProjectEngine.dll.express.config, as suggested in
|
|
|
|
http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
2006-10-21 08:35:47 +00:00
|
|
|
* build qt4
|
2006-06-08 15:57:45 +00:00
|
|
|
- download qt4 source from trolltech (not the binary version, which
|
|
|
|
only works with mingw)
|
|
|
|
- get q../free patch for qt4
|
|
|
|
- compile qt4 as instructed
|
|
|
|
|
|
|
|
* download and install the official zlib library from www.zlib.org.
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
* optionally install iconv, gettext, aspell, aiksaurus following
|
2006-06-14 20:10:36 +00:00
|
|
|
the mingw instructions.
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
* start from msvc command prompt, use the use_vc option to build lyx.
|
|
|
|
You may need to use extra_inc_path etc to point to zlib paths.
|
|
|
|
|
2006-07-03 02:02:11 +00:00
|
|
|
* you can use the msvs_projects target to obtain msvc project files
|
|
|
|
for each lyx component.
|
2006-06-08 15:57:45 +00:00
|
|
|
- go to development/scons (important)
|
2006-07-03 02:02:11 +00:00
|
|
|
- run
|
2006-06-08 15:57:45 +00:00
|
|
|
> scons [other options] msvs_projects
|
2006-07-03 02:02:11 +00:00
|
|
|
Note that
|
2006-06-10 21:02:11 +00:00
|
|
|
- The resulting project files will use scons to build lyx
|
2006-07-03 02:02:11 +00:00
|
|
|
- All command line options, including rebuild, can be used as usual
|
2006-06-10 21:02:11 +00:00
|
|
|
(when msvs invoke scons).
|
|
|
|
- To use the msvc debugger, you have to use mode=debug (default).
|
2006-06-08 15:57:45 +00:00
|
|
|
|
|
|
|
|
2006-08-13 04:54:25 +00:00
|
|
|
6. Tips and hints
|
2006-07-05 18:48:59 +00:00
|
|
|
=================
|
|
|
|
|
|
|
|
* Using external boost libraries (install boost libraries and use
|
|
|
|
option boost=system) can speed up scons' starting time a lot, since
|
|
|
|
the boost headers will then be considered as system headers and will
|
|
|
|
not be included in the dependency tree.
|
|
|
|
|
|
|
|
|
2006-08-13 04:54:25 +00:00
|
|
|
7. Troubleshooting
|
2006-06-08 15:57:45 +00:00
|
|
|
==================
|
|
|
|
|
|
|
|
When you get an error:
|
|
|
|
|
|
|
|
Q. Some path is not found.
|
|
|
|
A, Try options such as extra_inc_path, extra_lib_path.
|
|
|
|
|
|
|
|
Q. A test fails (failed to find zlib etc).
|
|
|
|
A. Have a look at config.log.
|
|
|
|
|
|
|
|
Q. I get a linking error.
|
|
|
|
A. Get the command sequence from scons_lyx.log and see what could
|
|
|
|
have gone wrong. You usually only need to tweak the last linking
|
|
|
|
command.
|
|
|
|
|
|
|
|
Q. Still can not figure it out.
|
|
|
|
A. Send an email to lyx-devel mailing list.
|
|
|
|
|
|
|
|
Q. Feeling too impatient/adventurous to wait for list response.
|
|
|
|
A. Read SConstruct and SConscript and see what went wrong. Trust me, they
|
|
|
|
are much easier to decipher than the autoconf/m4 files.
|
|
|
|
|
|
|
|
|