LORD FP on Synchronet - Sysop Guide
===================================

How to set up dosemu2 for Synchronet on Linux, install DOS and Linux door
games, and install both versions of LORD FP (Legend of the Red Dragon, Free
Pascal edition) with their In-Game Modules.

  Before you start
  Part 1  dosemu2 for Synchronet
  Part 2  Installing doors in Synchronet
  Part 3  LORD FP for DOS
  Part 4  LORD FP for Linux
  Part 5  In-Game Modules
  Part 6  Troubleshooting
  Credits


BEFORE YOU START
================

LORD FP is a port of lord.js, the JavaScript LORD that ships with
Synchronet, to Free Pascal.  One source tree builds two versions:

  DOS version - LORDFP.ZIP
    A complete DOS LORD game: unzip it into an empty directory, run
    LORDCFG, and it is ready to play.  It keeps LORD 4.06's file formats,
    so it can also be dropped into an existing LORD 4.06 game, whose
    players and IGMs carry on.  On Synchronet for Linux it runs under
    dosemu2, like any DOS door.

  Linux version - LORDFPL.ZIP
    A complete native Linux LORD game: unzip it, run lordcfg, and add it
    to Synchronet.  It reads and writes the same files as lord.js, so it
    can also take over an existing lord.js game.  DOS LORD IGMs run from
    it under dosemu2.

Both zips are complete games that install from scratch.  Nothing else is
needed: each one includes LORD 4.06's stock files (screens, scripts, docs
and the data files IGMs look for), and the source (LORDSRC.ZIP) is inside
each one.  Upgrading an existing LORD 4.06 or lord.js game is optional and
covered separately.

What you need
-------------
  - Synchronet BBS on Linux, installed in /sbbs.  This guide was written
    against Synchronet 3.21 on Ubuntu and 3.22 on Debian 13.
  - dosemu2, for the DOS version, for any other DOS door, and for DOS IGMs
    in the Linux version.
  - A shell login as the user Synchronet runs as.  Door files must be
    owned by, or writable by, that user.
  - A backup of /sbbs before you change anything.

Paths: everything below assumes Synchronet lives in /sbbs, with doors under
/sbbs/xtrn.  If yours is elsewhere, change the paths in the dosemu files as
well.


PART 1 - DOSEMU2 FOR SYNCHRONET
===============================

This part follows Nigel Reed's dosemu2 setup for Synchronet (original work
by Eric Oulashin), with notes added from running it on two BBSes.  His
files are a complete, working setup: a set of config files plus a
ready-made DOS boot environment.

Install dosemu2
---------------
Ubuntu:

  sudo add-apt-repository ppa:dosemu2/ppa
  sudo apt update
  sudo apt install dosemu2

Debian 13 (trixie):

Debian has no dosemu2 package, but the Ubuntu 24.04 (noble) PPA builds
install on Debian 13.  Two extra steps are needed.  Debian's signature
checker rejects the PPA key as Launchpad serves it, because of an old SHA-1
binding, so take the key from the Ubuntu keyserver instead.  Then pin the
PPA low, so it only supplies the packages Debian doesn't have.

  # the signing key, from the Ubuntu keyserver
  sudo mkdir -p /etc/apt/keyrings
  curl -s "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x6D9CD73B401A130336ED0A56EBE1B5DED2AD45D6" \
    | sudo tee /etc/apt/keyrings/dosemu2-ppa.asc >/dev/null

  # /etc/apt/sources.list.d/dosemu2-ppa-noble.sources
  Types: deb
  URIs: https://ppa.launchpadcontent.net/dosemu2/ppa/ubuntu/
  Suites: noble
  Components: main
  Signed-By: /etc/apt/keyrings/dosemu2-ppa.asc

  # /etc/apt/preferences.d/dosemu2-ppa
  # Debian packages always win; the PPA only fills in what Debian lacks
  Package: *
  Pin: origin ppa.launchpadcontent.net
  Pin-Priority: 100

  sudo apt update
  sudo apt install dosemu2

Copy the setup files
--------------------
Nigel Reed's package contains these files.  Put each one where the list
says, then restart the BBS.

  dosemu.conf        -> /sbbs/ctrl
      dosemu2 settings for doors run by the BBS.  COM1 is "virtual": it
      is wired to the caller.

  dosemu-local.conf  -> /sbbs/ctrl
      Settings for the local DOS prompt (de).  Same as above but without
      the virtual COM1, so programs draw on your screen.

  dosemu.ini         -> /sbbs/exec
      The command line Synchronet uses to start dosemu2.  A copy in a
      door's own directory overrides it for that door.

  external.bat       -> /sbbs/exec
      The DOS batch file run for every DOS door: it changes to the door's
      directory, loads drivers and runs the door's command line.

  sbbs/ctrl/.dosemu  -> /sbbs/ctrl/.dosemu
      A preconfigured dosemu2 boot environment (its drive_c is DOS drive
      C:).

  de                 -> /sbbs/exec or /sbbs/bin
      Opens a local DOS prompt with the same drives the BBS uses, for
      running door setup programs.  Make it executable and put its
      directory on your PATH.

  scfg.txt           (reference)
      A sample SCFG entry for a DOS door.

Settings in sbbs.ini
--------------------
In /sbbs/ctrl/sbbs.ini, check these lines in the [BBS] section:

  UseDOSemu = true
  DOSemuPath = /usr/bin/dosemu
  DOSemuConfPath = /sbbs/ctrl/dosemu.conf

The path is /usr/bin/dosemu, the launcher script, not dosemu.bin.

Restart Synchronet after copying the files.  On a systemd install that is
"sudo systemctl restart sbbs".

The FOSSIL driver
-----------------
A FOSSIL driver is the standard DOS interface doors use to talk to a serial
port.  dosemu2 has one built in, but it only becomes active when its
fossil.com is run inside DOS before the door starts.  It is not loaded just
because dosemu2 is running.

Many doors work without it, because when no FOSSIL driver is loaded they
talk to the virtual COM port directly.  LORD 4.06, LORD FP, TradeWars 2002,
Barren Realms Elite and Esterian Conquest all work either way.  Some doors
only use a FOSSIL driver.  The Pawn Shop 3.40 IGM is one: without the
driver it shows the caller nothing.

external.bat looks for a file called EMUSETUP.BAT, first in the door's own
directory, then in /sbbs/ctrl (drive F:).  To load the FOSSIL driver for
every DOS door, create /sbbs/ctrl/EMUSETUP.BAT:

  REM Global DOS door setup, CALLed by Synchronet's external.bat before each
  REM DOS door (a door's own EMUSETUP.BAT in its folder is used instead).
  REM FOSSIL driver: dosemu2's fossil.com, for doors that need one.
  fossil.com >NUL

  - Save it with DOS line endings (CR LF).
  - A door with its own EMUSETUP.BAT uses that file instead of the global
    one.  Add the fossil.com line to it too.
  - Load only one FOSSIL driver.  The package's external.bat would also try
    to load X00 from a DOSUTILS directory, but only when there is no
    EMUSETUP.BAT and that directory exists.
  - Without any EMUSETUP.BAT or DOSUTILS, external.bat prints "ERROR: No
    emusetup.bat" and carries on.  That message is harmless.

DOS drive letters
-----------------
When the BBS starts a DOS door, dosemu.ini maps the Synchronet directories
to these drives.  Door configuration files must use these DOS paths, not
Linux paths.

  C:  /sbbs/ctrl/.dosemu/drive_c   dosemu2's own boot drive
  D:  /sbbs/node1, /sbbs/node2...  the caller's node directory: drop files
                                   (DOOR.SYS, DORINFO1.DEF...)
  E:  /sbbs/xtrn                   the doors; /sbbs/xtrn/lordf is E:\LORDF
  F:  /sbbs/ctrl                   global EMUSETUP.BAT
  G:  /sbbs/data                   BBS data
  H:  /sbbs/exec                   BBS programs

dosemu2's own commands, including fossil.com, are already on the DOS PATH.

The local DOS prompt
--------------------
Most DOS doors have a setup program that has to be run once on the local
screen.  Run "de" from a shell: it opens a DOS prompt with the drives
above, using /sbbs/node1 as D:.  Then change to the door and run its setup:

  $ de
  C:\> E:
  E:\> CD \LORDF
  E:\LORDF> LORDCFG
  ...
  E:\LORDF> exitemu

Run de from a real terminal.  dosemu2 needs a terminal with a known size.
It draws nothing when started from a script or a terminal that doesn't
report its size.


PART 2 - INSTALLING DOORS IN SYNCHRONET
=======================================

Synchronet calls doors "external programs".  Each one gets a directory
under /sbbs/xtrn and an entry in SCFG, under External Programs -> Online
Programs (Doors), inside a program section such as "Games".

A DOS door, step by step
------------------------
 1. Make a directory for the door under /sbbs/xtrn, with a short name that
    is also a valid DOS name (8 characters or fewer, no spaces), for
    example /sbbs/xtrn/bre.  Unzip the door into it.

 2. Make sure the user Synchronet runs as owns the files:
    "chown -R <bbsuser> /sbbs/xtrn/bre".  Doors write their data files as
    they run.

 3. Run the door's setup program under de (see "The local DOS prompt").
    Wherever it asks for paths, give DOS paths: the game directory is
    E:\BRE\, and the drop file is in D:\.

 4. If the door expects a batch file to start it (most do), check that it
    changes to the door's directory or doesn't need to.  external.bat has
    already changed to the start-up directory before it runs the command
    line.

 5. Run scfg, go to External Programs -> Online Programs (Doors), pick a
    section and add the door with the settings below.

 6. Log in to the BBS and run the door.  Test entering, a few keys, and
    quitting back to the BBS.

 7. If the door has a daily maintenance program, add it as a timed event
    (SCFG -> External Programs -> Timed Events) or use the door's own "run
    maintenance at first login" option.

SCFG settings for a DOS door
----------------------------
  Name                       What callers see
  Internal Code              e.g. BRE (up to 8 characters, unique)
  Start-up Directory         ../xtrn/bre
                             Relative to /sbbs/ctrl, so it starts with
                             ../xtrn/.  A wrong path here is the most
                             common cause of a door that hangs at start.
  Command Line               e.g. bre.bat or start.bat %#
                             (%# is the node number)
  Multiple Concurrent Users  Yes, if the door supports it
  I/O Method                 FOSSIL or UART (not Standard)
  Native Executable/Script   No ("DOS program, use dosemu2")
  Use Shell or New Context   Yes
  BBS Drop File Type         What the door reads (see below)
  Place Drop File In         Node Directory (the door finds it on D:\)

Drop file types
---------------
The drop file tells the door who the caller is, their time left and their
terminal.  Pick the one the door's documentation asks for:

  GAP (extended)   DOOR.SYS, 52 lines    TradeWars 2002, most 1990s doors
  GAP (original)   DOOR.SYS, 31 lines    LORD (either works)
  RBBS/QuickBBS    DORINFO1.DEF          Barren Realms Elite, Esterian
                                         Conquest
  Mystic           DOOR32.SYS            newer and native Linux doors
  Others           CHAIN.TXT, CALLINFO.BBS, PCBOARD.SYS, SFDOORS.DAT,
                   DOORFILE.SR - doors written for those BBS packages

A native Linux door
-------------------
A Linux program that talks to the caller on standard input and output needs
no dosemu2.  The differences in SCFG:

  Command Line               the full path to the program and its options
  Native Executable/Script   Yes
  I/O Method                 Standard (stdio); turn input echo off if the
                             program echoes for itself
  Use Shell or New Context   No

Working examples
----------------
These are the door entries on Kalgoorlie Retro BBS, all in a section called
"Games Hosted by Kalgoorlie Retro":

  LORD 4.06            ../xtrn/lord4   start.bat %#       GAP (original)
  LORD FP (DOS)        ../xtrn/lordf   start.bat %#       GAP (original)
  LORD FP (Linux)      ../xtrn/lordfp  /sbbs/xtrn/lordfp/lord -d %n -r %r
                                       (native)           GAP (original)
  TradeWars 2002       ../xtrn/tw2002  tw.bat %#          GAP (extended)
  Barren Realms Elite  ../xtrn/bre     bre.bat            DORINFO1.DEF
  Esterian Conquest    ../xtrn/EC      ec.bat             DORINFO1.DEF

Their batch files, for reference:

  REM tw.bat - TradeWars 2002
  @ECHO OFF
  SET RTM=EXTMAX 1024
  TW2002 TWNODE=%1 SHARE VIDEO=SLOW > TWERR%1.LOG

  REM bre.bat - Barren Realms Elite
  @ECHO OFF
  E:
  CD \BRE
  SRDOOR
  BRE

  REM ec.bat - Esterian Conquest (game in a subdirectory)
  @ECHO OFF
  CD GAME01
  ..\ECGAME D:\DORINFO1.DEF
  CD ..


PART 3 - LORD FP FOR DOS
========================

The DOS version runs under dosemu2, the same way LORD 4.06 does.  Set up
dosemu2 first (Part 1).  LORDFP.ZIP is a complete game, so a new install
needs nothing else: you don't need a copy of LORD 4.06.

New game (from scratch)
-----------------------
 1. Make the game directory and unzip LORDFP.ZIP into it:

      mkdir /sbbs/xtrn/lordf
      cd /sbbs/xtrn/lordf
      unzip /path/to/LORDFP.ZIP

 2. Run the setup program under de:

      $ de
      C:\> E:
      E:\> CD \LORDF
      E:\LORDF> LORDCFG

    The first run writes LORD.INI with the default game options.  Check
    them with 1, then set up each BBS node with N:

      Drop file type      DOORSYS (matches GAP DOOR.SYS in SCFG)
      Drop file location  D:\ (the node directory)
      COM port            leave it to the drop file

    This writes NODE1.DAT, NODE2.DAT and so on.  Set up as many nodes as
    your BBS has.

 3. Still at the DOS prompt, type START 0 to try the game on the local
    screen.  Node 0 is the sysop's local node and needs no setup.

 4. Add the door in SCFG:

      Start-up Directory         ../xtrn/lordf
      Command Line               start.bat %#
      Multiple Concurrent Users  Yes
      I/O Method                 FOSSIL or UART
      Native Executable/Script   No
      Use Shell or New Context   Yes
      BBS Drop File Type         GAP DOOR.SYS
      Place Drop File In         Node Directory

 5. Log in and play.  START.BAT loops: when a player enters an IGM, LORD
    ends with errorlevel 254, START.BAT runs the IGM and then starts LORD
    again, which puts the player back where they were.

Optional: upgrading an existing LORD 4.06 game
----------------------------------------------
Skip this for a new install.  If you already run LORD 4.06 and want to keep
its players, LORD FP can replace its programs: it uses LORD 4.06's player
file, mail, news, node files and IGM list as they are.

 1. Back up the LORD directory.
 2. Rename LORD.EXE to LORD406.EXE and LORDCFG.EXE to LORDC406.EXE.
 3. From the zip, copy only LORD.EXE, LORDFP.STR, LORDCFG.EXE, LORDTXT.LRD,
    FLOOKS.TXT, MLOOKS.TXT and GSTART.LRD.  Leave out the LORD 4.06 files:
    your game already has them, perhaps changed.  Copy LORDTXT.DAT only if
    yours is missing.
 4. Run LORDCFG and check the game options and the node setup.

To go back to LORD 4.06, rename LORD406.EXE and LORDC406.EXE back.

Good to know
------------
  - Registration.  LORD 4.06 checks its own registration code, so it is
    entered with LORDC406.EXE.  Option G in LORDCFG explains how.
  - Daily maintenance.  After LORD's own daily maintenance, the first login
    of the day runs MAINT.BAT from the game directory, if there is one.
    IGMs put their upkeep there, for example Pawn Shop's PSETUP /M.  LORD
    4.06 does the same.
  - Memory.  The game needs about 600K of conventional memory.
  - The game's files.  LORD FP adds LORDFPX.DAT (the player fields
    PLAYER.DAT has no room for), LORDFPS.DAT (game state) and LORDFPM.DAT
    (the day MAINT.BAT last ran).
  - The full manual is LORDFP.DOC in the zip.  LORD 4.06's own LORD.DOC,
    LADY.DOC and TROUBLE.TXT are included.


PART 4 - LORD FP FOR LINUX
==========================

The Linux version is a native door.  It needs no dosemu2 to run, only to
run DOS IGMs from Other Places.  LORDFPL.ZIP is a complete game, so a new
install needs nothing else.

New game (from scratch)
-----------------------
 1. Make the game directory and unzip LORDFPL.ZIP into it.  The zip keeps
    the programs executable; check with "ls -l lord lordcfg".

      mkdir /sbbs/xtrn/lordfp
      cd /sbbs/xtrn/lordfp
      unzip /path/to/LORDFPL.ZIP
      chmod 755 lord lordcfg     # only if unzip dropped the permissions

 2. Run the setup program from a shell: ./lordcfg.  The first run writes
    lord.ini.  Option 1 covers the game options, and option 8 shows the
    Synchronet settings.

 3. Try it locally: ./lord -l plays on your terminal, as $USER or the name
    given with -u.

 4. Add the door in SCFG:

      Start-up Directory         ../xtrn/lordfp
      Command Line               /sbbs/xtrn/lordfp/lord -d %n -r %r
      Multiple Concurrent Users  Yes
      I/O Method                 Standard (stdio), input echo off
      Native Executable/Script   Yes
      Use Shell or New Context   No
      BBS Drop File Type         DOOR32.SYS or GAP DOOR.SYS (any type
                                 the game reads works)
      Place Drop File In         Node Directory

    -d %n gives the node directory, and the game finds the drop file
    there.  -r %r passes the caller's screen rows.

Optional: taking over an existing lord.js game
----------------------------------------------
Skip this for a new install.  The Linux version uses lord.js's data files
in the same format: player.bin, state.bin, lord.ini, lordtxt.lrd and the
other .lrd screens.  Point it at an existing lord.js game directory with
-p, or copy lord and lordcfg into it.  Players are matched to BBS users by
the real name in the drop file, as lord.js does.

Command line
------------
  lord -d <drop file or node dir> [-r rows] [-n node] [-p gamedir]
  lord -l [-u name] [-p gamedir]      sysop local play
  lord 0                              local play as node 0, as LORD 4.06
  lord -d <drop file> -i              show what the drop file says
  lordcfg [-p gamedir]                setup
  lordcfg -406 -p <LORD 4.06 dir>     player editor for a DOS LORD 4.06
                                      game

Drop files read: DOOR32.SYS, DOOR.SYS, DORINFOx.DEF, CHAIN.TXT,
CALLINFO.BBS, SFDOORS.DAT, PCBOARD.SYS and EXITINFO.BBS (name only).

Setting up DOS IGMs
-------------------
The Linux version starts DOS IGMs under dosemu2 itself, with the caller
attached.  It doesn't go through external.bat, so the global EMUSETUP.BAT
is not used.  The settings are in the [IGM] section of lord.ini:

  [IGM]
  DOSGameDir=   E:\LORDFP\
  PreCommands=  fossil.com >NUL

  DOSGameDir     The game directory as DOS sees it.  Blank means worked
                 out from /sbbs/xtrn.
  PreCommands    DOS commands run before each IGM, separated by ;.  Set it
                 to "fossil.com >NUL" so IGMs that need a FOSSIL driver
                 work.
  DOSemuCommand  How dosemu2 is started.  The default matches the
                 Synchronet setup in Part 1, so it normally isn't in the
                 file.  %d is the node directory, %b the batch file's DOS
                 path and %n the node.

For each IGM visit the game writes the LORD 4.06 files IGMs expect:
PLAYER.DAT, INFO.<node>, OUT.<account>, NODE<n>.DAT, TIME.DAT, LOGNOW.TXT
and the rest, plus a DOOR.SYS in the node directory.  Afterwards it reads
back what the IGM changed: player stats, the fairy, mail, new Daily
Happenings lines and Violet's marriage.

MAINT.BAT is run the same way, once a day at the first login after the
daily maintenance, as LORD 4.06 does.  Its output is hidden from the
caller, and it adds a few seconds to that first login.


PART 5 - IN-GAME MODULES
========================

IGMs are separate DOS programs that add places to LORD's "Other Places"
menu.  Both versions of LORD FP run LORD 4.06 IGMs, listed in 3RDPARTY.DAT
in the game directory: two lines per IGM, the DOS command line (* is
replaced by the node number) and then the name players see, with LORD
colour codes.

  ;-=-=-=-= LORD'S INTERNAL 3RD PARTY SOFTWARE OPTION =-=-=-
  E:\LORDF\IGMS\VAULT\VAULT.EXE * E:\LORDF\ 1
  `0The `@Dragon `0Vault
  E:\LORDF\IGMS\PAWN\PAWNSHOP.EXE /N* /GE:\LORDF\
  `@THE PAWN SHOP `0v3.40

The Linux version's lordcfg has an "Other Places" screen that adds and
removes entries.

General steps
-------------
 1. Make a directory for the IGM inside the game directory, for example
    igms/pawn, and unzip it there.
 2. Run the IGM's install or setup program under de, from the IGM's
    directory.  Most ask for LORD's directory: give the DOS path of THIS
    game, such as E:\LORDF\ or E:\LORDFP\.
 3. Check 3RDPARTY.DAT: the installer usually adds its entry.  Remove any
    older entry for the same IGM.
 4. If the IGM needs daily maintenance, check that MAINT.BAT runs it
    exactly once.
 5. Test it: go to Other Places, enter the IGM, and quit back to LORD.

One game per IGM install.  IGMs keep their own configuration naming LORD's
directory.  If two games share one IGM directory, they share and overwrite
its data.  Give each game its own copy.

Example: The Pawn Shop 3.40
---------------------------
 1. Unzip pawn340.zip into /sbbs/xtrn/lordf/igms/pawn.
 2. Under de: E:, CD \LORDF\IGMS\PAWN, then PSETUP /C.  Press I to install,
    and give E:\LORDF\ as LORD's directory and your BBS name.  It writes
    PAWNSHOP.CFG and PSLIMITS.CFG, adds its line to 3RDPARTY.DAT and adds
    PSETUP.EXE /M to MAINT.BAT.
 3. Check that MAINT.BAT has PSETUP.EXE /M only once.
 4. Pawn Shop 3.40 needs a FOSSIL driver: the global EMUSETUP.BAT for the
    DOS version, or PreCommands=fossil.com >NUL for the Linux version.

Pawn Shop's documentation warns that PSETUP /M has crashed some older LORD
versions at maintenance with a "player.dat is corrupted" message.  Watch
the first daily maintenance after installing it.


PART 6 - TROUBLESHOOTING
========================

The door hangs as soon as it starts.
  Wrong Start-up Directory, for example ../lord4 instead of ../xtrn/lord4.
  Correct it in SCFG; it is relative to /sbbs/ctrl.

Blank screen and a blinking cursor; LORD shows "HOLD ON.." and nothing
after it.
  The door or IGM only talks through a FOSSIL driver and none is loaded.
  Add fossil.com: the global EMUSETUP.BAT (Part 1), or PreCommands for the
  Linux version (Part 4).

A door says someone is already playing, or won't start for a while.
  A caller dropped carrier and the door left its "in use" file (Pawn Shop:
  LOCKFILE.DAT; BRE: INUSE.FLG).  When nobody is in the door, delete the
  file.

The door can't find the drop file.
  The drop file is placed in the start-up directory, or the door's config
  points at a Linux path.  Set Place Drop File In: Node Directory, and
  point the door at D:\.

The door's setup program shows nothing.
  It was run with the BBS settings, whose virtual COM1 hides the local
  screen, or from a script.  Run it with de, which uses dosemu-local.conf,
  from a real terminal.

Files can't be written; the game says it can't open a file.
  The door's files belong to another user.  chown -R them to the user the
  BBS runs as.

A prompt seems to ignore a key.
  Some prompts need Enter after the letter (TradeWars' X to exit; EC's
  graphics question).  Press Enter after the key.

Something else - check the logs:
  /sbbs/node<n>/dosemu_boot.log                for DOS doors
  error.log and igmnode<n>/dosemu_igm.log      in the LORD FP Linux game
                                               directory
  Synchronet's own log                         journalctl -u sbbs on
                                               systemd


CREDITS
=======

  Legend of the Red Dragon by Seth Robinson.  LORD 4.06 (c) Robinson
  Technologies / Metropolis Gameport.
  lord.js, the JavaScript LORD that LORD FP follows, by Deuce; it ships
  with Synchronet BBS.
  dosemu2 setup for Synchronet by Nigel Reed (End of the Line BBS), from
  original work by Eric Oulashin (Nightfox).
  Synchronet BBS by Rob Swindell (Digital Man).
  The Pawn Shop by Chris MacPherson, updated by Donald Tidmore and Charlie
  Wardick.
  LORD FP, the Free Pascal port, from Kalgoorlie Retro BBS.

Written October 2026 against Synchronet 3.21 and 3.22, dosemu2 2.0pre9.
