%D \module
%D   [       file=context,
%D        version=2008.28.10, % 1995.10.10,
%D          title=\CONTEXT,
%D       subtitle=\CONTEXT\ Format Generation,
%D         author=Hans Hagen, % ɦɑns ɦɑˈχən
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D There is some residual code in \MKIV\ that results from the transition to \LMTX\
%D but removeing it can have side effects due to oversights. There is no impact on
%D performance to I leave at that.

% Here is some timing (2015-04-01) luajittex format generation:
%
% 2.6 sec : normal make
% 2.0 sec : with terminal output piped to file
% 0.2 sec : format dumped
% 0.2 sec : char-def/char-ini (no bytecode)
%
%D So a format still saves some 1.5 seconds (with luajjitex) startup and on network
%D shares cq. when no files are cached by the os it's of course much worse. A zero
%D run is .27 sec with luajittex. In luametatex it's faster anyway (2.4 sec).

%D The real minimal startup time can be measured by uncommenting \type {\normalend}
%D in the \type {cont-new.mkiv} file. When we subtract .250 for \LUA\ initialization
%D from 0.300 runtime and also subtract some 0.030 for the resolver, we get about
%D 0.020 for format loading which is pretty fast. We're talking \LUAMETATEX\ here.

% http://build.contextgarden.net/waterfall?tag=c/lua(meta)tex

%D Welcome to context, pronounced as kontekst (rather dutch) and not as conτεχt.

\catcode`\{=1 \catcode`\}=2 \catcode`\#=6

%D From the next string (which is set by the script that assembles the distribution)
%D later on we will calculate a number that can be used by use modules to identify
%D the feature level. Starting with version 2004.8.30 the low level interface is
%D english. Watch out and adapt your styles an modules.

% \everypar{\writestatus{!!!!}{some spurious input in line \the\inputlineno}\wait}

%D The order of loading will change when all modules have been cleaned up and the
%D dependencies are more consistent. Beware, the version number has to match \type
%D {YYYY.MM.DD HH:MM} format.

\edef\contextformat {\jobname}
\edef\contextversion{2024.01.08 11:23}

%D Kind of special:

\chardef\contextlmtxmode\directlua{tex.print(CONTEXTLMTXMODE or 0)}\relax

%D For those who want to use this:

\let\fmtname   \contextformat
\let\fmtversion\contextversion

%D Loading:

\edef\mksuffix   {mkiv}
\edef\contextmark{MKIV}

\ifx\normalinput\undefined \let\normalinput\input \fi

\def\loadmarkfile#1{\normalinput{#1.\mksuffix}}
\def\loadmkivfile#1{\normalinput{#1.mkiv}}
\def\loadmkvifile#1{\normalinput{#1.mkvi}}
%def\loadmkilfile#1{\normalinput{#1.mkil}}
%def\loadmklifile#1{\normalinput{#1.mkli}}

%D First we load the system modules. These implement a lot of manipulation macros.
%D We start with setting up some basic \TEX\ machinery.

\loadmarkfile{syst-ini}

%D We just quit if new functionality is expected.

\ifnum\luatexversion<110 % also change message
    \writestatus{!!!!}{Your luatex binary is too old, you need at least version 1.10!}
    \expandafter\end
\fi

%D Some checking (more primitives are now defined):

\ifdefined\defaultinterface   \else \def\defaultinterface  {english}         \fi
%ifdefined\messageinterface   \else \let\messageinterface  \defaultinterface \fi
\ifdefined\defaultlanguagetag \else \def\defaultlanguagetag{en}              \fi

%D There is only this way to pass the version info to \LUA\ (currently). Hm, we could
%D now put it into the environment.

\newtoks\contextversiontoks \contextversiontoks\expandafter{\contextversion}

% \normaleverypar{\wait} % uncomment for test of funny injections

%D Now the more fundamental code gets defined.

\loadmarkfile{norm-ctx}
\loadmarkfile{syst-pln}
\loadmarkfile{syst-mes}

\loadmarkfile{luat-cod}
\loadmarkfile{luat-bas}
\loadmarkfile{luat-lib}
\loadmarkfile{luat-soc}

\loadmarkfile{catc-ini}
\loadmarkfile{catc-act}
\loadmarkfile{catc-def}
\loadmarkfile{catc-ctx}
\loadmarkfile{catc-sym}

\loadmarkfile{toks-ini}
\loadmarkfile{cldf-ini}

% \tracecatcodetables

%D From here on we have \unexpanded being \normalprotected, as we already had
%D \type {\unexpanded} long before etex came around.

\loadmarkfile{luat-ini}
\loadmarkfile{toks-scn}

\loadmarkfile{syst-aux}
\loadmarkfile{syst-lua}
\loadmarkfile{syst-con}

\loadmarkfile{syst-fnt}
\loadmarkfile{syst-rtp}

\loadmarkfile{luat-usr}

\loadmkvifile{file-ini}
\loadmkvifile{file-res}
\loadmkivfile{file-lib}

%D This needs more checking for clashes:
%D
%D \starttyping
%D \doifelsefileexists{l-macro-imp-codes-luatex.lua}{\registerctxluafile{l-macro-imp-codes-luatex}{}}{}
%D \stoptyping

\loadmarkfile{supp-dir}

\loadmarkfile{char-utf} % generic code (i.e. not much tex) ... could become unic-ini
\loadmarkfile{char-ini} % tex / context specific
\loadmarkfile{char-act} % even more specific

\loadmarkfile{mult-ini}
\loadmarkfile{mult-sys}
\loadmarkfile{mult-aux}
\loadmarkfile{mult-def}
\loadmarkfile{mult-chk}
\loadmkvifile{mult-dim}

\loadmarkfile{cldf-int} % interface

\loadmarkfile{trac-ctx} % maybe move up

% \loadmarkfile{luat-ini}

%loadmarkfile{toks-tra}
\loadmarkfile{toks-aux}
%loadmarkfile{toks-map} % obsolete, never used

\loadmarkfile{attr-ini}

\loadmarkfile{core-ini}
\loadmarkfile{core-env}

\loadmarkfile{layo-ini}

\loadmarkfile{node-ini}

\loadmarkfile{cldf-bas} % basics / depends on nodes

\loadmarkfile{node-fin}
\loadmarkfile{node-mig}
%loadmarkfile{node-pag}

\loadmarkfile{driv-ini} % lmtx

\loadmarkfile{back-ini}
\loadmarkfile{back-res}
\loadmarkfile{back-trf}

\loadmarkfile{attr-col}
\loadmarkfile{attr-lay}
\loadmarkfile{attr-neg}
\loadmarkfile{attr-eff}
\loadmarkfile{attr-mkr}

\loadmarkfile{trac-tex}
\loadmarkfile{trac-deb} % will move up

\loadmarkfile{supp-box}

\loadmarkfile{supp-ran}
\loadmarkfile{supp-mat}

\loadmarkfile{core-uti}
\loadmkvifile{file-job}

\loadmarkfile{anch-pos}

\loadmarkfile{typo-ini}
\loadmarkfile{typo-lin}
\loadmarkfile{typo-bld} % par builders

\loadmarkfile{typo-inj}

\loadmkvifile{file-syn}
\loadmkvifile{file-mod}

\loadmarkfile{core-sys}
\loadmarkfile{core-con}

\loadmarkfile{cont-fil}

\loadmarkfile{regi-ini}
\loadmarkfile{enco-ini}
\loadmarkfile{hand-ini}

\loadmarkfile{lang-ini}
\loadmarkfile{lang-hyp} % also loads dis
\loadmarkfile{lang-lab}

\loadmarkfile{unic-ini}

% \loadmarkfile{core-uti}
\loadmarkfile{core-two}
\loadmarkfile{core-dat}

\loadmarkfile{colo-ini}
\loadmarkfile{colo-grp} % optional
\loadmarkfile{colo-ext}

\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented)

\loadmarkfile{pack-cut}

\loadmarkfile{lang-mis}
\loadmarkfile{lang-url}
\loadmarkfile{lang-def}

% \loadmkvifile{file-job} % why so late?

\loadmarkfile{symb-ini} % brrr depends on fonts

\loadmarkfile{sort-ini}

\loadmkvifile{pack-mis}
\loadmarkfile{pack-rul}
\loadmarkfile{pack-mrl}
\loadmkvifile{pack-bck}
\loadmarkfile{pack-fen}

\loadmarkfile{lxml-ini}
\loadmarkfile{lxml-sor}

\loadmkvifile{typo-prc}
\loadmkivfile{typo-plc}

% \loadmarkfile{anch-pos}

\loadmkvifile{strc-ini}
\loadmarkfile{strc-tag}
\loadmarkfile{strc-doc}
\loadmarkfile{strc-num}
\loadmarkfile{strc-mar}
\loadmarkfile{strc-sbe}
\loadmkvifile{strc-lst}
\loadmarkfile{strc-sec}
\loadmarkfile{strc-pag} % hm, depends on core-num
\loadmarkfile{strc-ren}
\loadmarkfile{strc-xml}
\loadmarkfile{strc-def} % might happen later
\loadmkvifile{strc-ref}
%loadmarkfile{strc-reg}
\loadmkvifile{strc-lev} % experiment

\loadmarkfile{spac-hor}
\loadmarkfile{spac-ali}
\loadmarkfile{spac-flr}
\loadmarkfile{spac-ver} % beware, hooks into strc-sec
\loadmarkfile{spac-lin}
\loadmarkfile{spac-pag}
\loadmarkfile{spac-par}
\loadmarkfile{spac-def}
\loadmkvifile{spac-prf}
\loadmarkfile{spac-grd}

%loadmarkfile{anch-pos}

\loadmkvifile{scrn-ini}
\loadmkvifile{scrn-ref}

\loadmarkfile{pack-obj}

\loadmkvifile{strc-itm}

\loadmkvifile{strc-con}
\loadmkvifile{strc-des}
\loadmkvifile{strc-enu}

\loadmarkfile{strc-ind}
\loadmarkfile{strc-lab}
\loadmarkfile{strc-syn}

% \loadmarkfile{core-sys}

\loadmarkfile{page-var}
\loadmkvifile{page-otr}
\loadmarkfile{page-ini}
\loadmarkfile{page-ins}
\loadmarkfile{page-fac}
\loadmarkfile{page-brk}
\loadmarkfile{page-col}
\loadmarkfile{page-inf}
\loadmarkfile{page-flt}
\loadmarkfile{page-bck}
\loadmarkfile{page-not}
\loadmarkfile{page-one}
\loadmarkfile{page-lay}
\loadmkvifile{page-box}
\loadmkvifile{page-txt}
\loadmarkfile{page-sid} % when

\loadmkvifile{strc-flt}

\loadmarkfile{page-pst}
\loadmkvifile{page-mbk}
%loadmarkfile{page-mul} % \usecolumns[old-multicolumns]
\loadmarkfile{page-mix}
\loadmarkfile{page-smp}
%loadmarkfile{page-set} % \usecolumns[old-columnsets]
\loadmarkfile{page-cst}
\loadmarkfile{page-pcl} % new
\loadmarkfile{pack-lyr}
\loadmarkfile{pack-pos}
\loadmkvifile{page-mak}

\loadmarkfile{strc-reg} % uses mixed columns

\loadmkvifile{page-lin}
\loadmarkfile{page-par}
\loadmarkfile{typo-pag}
\loadmarkfile{typo-mar}
\loadmarkfile{typo-itm}

\loadmarkfile{buff-ini}
\loadmarkfile{buff-ver}
\loadmkvifile{buff-par}

\loadmarkfile{buff-imp-tex}        % optional as also runtime if not loaded
\loadmarkfile{buff-imp-mp}         % optional as also runtime if not loaded
\loadmarkfile{buff-imp-lua}        % optional as also runtime if not loaded
\loadmarkfile{buff-imp-xml}        % optional as also runtime if not loaded

\loadmarkfile{buff-imp-parsed-xml} % optional
%loadmarkfile{buff-imp-parsed-lua} % optional

\loadmarkfile{strc-blk}

\loadmarkfile{page-imp}
\loadmkvifile{page-sel} % optional
\loadmkvifile{page-inj} % optional

\loadmkvifile{scrn-pag}
\loadmkvifile{scrn-wid}
\loadmkvifile{scrn-but}
\loadmkvifile{scrn-bar}

\loadmarkfile{page-com} % optional (after scrn-pag)

\loadmarkfile{strc-bkm} % bookmarks

\loadmarkfile{java-ini}

\loadmkvifile{scrn-fld}
\loadmkvifile{scrn-hlp}

\loadmarkfile{char-enc} % will move up

\loadmkvifile{font-lib} % way too late but after language
\loadmkvifile{font-fil}
\loadmkvifile{font-var}
\loadmkvifile{font-fea}
\loadmkvifile{font-mat}
\loadmkvifile{font-ini}
\loadmkvifile{font-sym}
\loadmkvifile{font-sty}
\loadmkvifile{font-set}
\loadmkvifile{font-emp}
\loadmarkfile{font-pre}
\loadmarkfile{font-unk}
\loadmarkfile{font-tra}
\loadmarkfile{font-chk}
\loadmarkfile{font-uni}
\loadmkvifile{font-col}
\loadmkvifile{font-gds}
\loadmkvifile{font-aux}
\loadmkvifile{font-sel}

\loadmarkfile{typo-tal}
\loadmarkfile{typo-par} % par builders (uses fonts)

\loadmarkfile{tabl-com}
\loadmarkfile{tabl-pln}

\loadmarkfile{tabl-tab} % thrd-tab stripped and merged

\loadmarkfile{tabl-tbl}
\loadmarkfile{tabl-ntb}
\loadmarkfile{tabl-nte}
\loadmarkfile{tabl-ltb}
\loadmarkfile{tabl-frm}
\loadmarkfile{tabl-tsp}
\loadmkvifile{tabl-xtb}
\loadmarkfile{tabl-mis}

\loadmarkfile{typo-lan}

\loadmarkfile{lxml-css}

\loadmarkfile{spac-chr} % depends on fonts

\loadmarkfile{blob-ini}

\loadmarkfile{trac-vis}
\loadmarkfile{trac-jus}

\loadmarkfile{typo-cln}
\loadmarkfile{typo-wrp}
\loadmarkfile{typo-spa}
\loadmarkfile{typo-krn}
\loadmkvifile{typo-itc}
\loadmarkfile{typo-dir}
\loadmarkfile{typo-brk}
\loadmarkfile{typo-cap}
\loadmarkfile{typo-dig}
\loadmarkfile{typo-rep}
\loadmkvifile{typo-txt}
\loadmarkfile{typo-drp}
\loadmarkfile{typo-fln}
\loadmarkfile{typo-sus}
\loadmarkfile{typo-lig}
\loadmarkfile{typo-chr}
\loadmarkfile{typo-rub}
\loadmkivfile{typo-fkr}
\loadmkivfile{typo-pnc}

\loadmkvifile{type-ini}
\loadmarkfile{type-set}

\loadmarkfile{scrp-ini}

\loadmarkfile{symb-emj}

\loadmarkfile{lang-tra}
\loadmarkfile{lang-wrd} % can be optional (discussion with mm sideeffect)
\loadmarkfile{lang-rep} % can be optional (bt 2013 side effect)

\loadmarkfile{mlib-ctx} % messy order

\loadmarkfile{meta-ini}
\loadmarkfile{meta-tex}
\loadmarkfile{meta-fun}
\loadmarkfile{meta-pag}
\loadmarkfile{meta-grd}
\loadmarkfile{meta-fnt}
\loadmarkfile{meta-nod}
\loadmarkfile{meta-lua}

\loadmarkfile{page-mrk} % depends on mp

\loadmarkfile{page-flw}
\loadmarkfile{page-spr}
\loadmarkfile{page-plg}
\loadmarkfile{page-str}

\loadmarkfile{anch-pgr} % can be moved up (nicer for dependencies)
\loadmkvifile{anch-bck}
\loadmarkfile{anch-tab} % overloads tabl-tbl
\loadmarkfile{anch-bar}
%loadmarkfile{anch-snc} % when needed this one will be redone

\loadmarkfile{math-ini} % way after font-pre !
\loadmarkfile{math-pln}
\loadmarkfile{math-for}
\loadmarkfile{math-def} % also saves some meanings
\loadmarkfile{math-ali}
%loadmarkfile{math-arr}
\loadmkvifile{math-stc}
\loadmarkfile{math-frc}
\loadmarkfile{math-mis}
\loadmarkfile{math-scr}
\loadmarkfile{math-int}
\loadmarkfile{math-del}
\loadmarkfile{math-fen}
\loadmkvifile{math-acc}
\loadmkvifile{math-rad}
\loadmarkfile{math-inl}
\loadmarkfile{math-dis}
%loadmarkfile{math-lan}

%loadmarkfile{phys-dim} % moved to after typo-scr

\loadmarkfile{strc-mat}

\loadmarkfile{chem-ini}
\loadmarkfile{chem-str}

\loadmarkfile{typo-scr}
\loadmarkfile{phys-dim}

\loadmarkfile{node-rul} % beware, defined \underbar so after math
\loadmkvifile{font-sol} % font solutions

\loadmkvifile{strc-not}
\loadmkvifile{strc-lnt}
\loadmkivfile{strc-tnt}
\loadmkivfile{strc-usr}

\loadmarkfile{pack-com}
\loadmarkfile{typo-del}

\loadmarkfile{grph-trf}
\loadmarkfile{grph-inc}
\loadmarkfile{grph-fig}
\loadmarkfile{grph-raw}
\loadmarkfile{grph-rul}
\loadmarkfile{grph-pat}

\loadmarkfile{pack-box}
\loadmarkfile{pack-bar}
\loadmarkfile{page-app}
\loadmarkfile{meta-fig}

\loadmarkfile{page-ffl}

\loadmarkfile{lang-spa} % will become obsolete

\loadmarkfile{typo-ovl} % fuzzy project (tracing) code

% old bibtex support: (will be m-oldbibtex.mkiv)

% \loadmarkfile{bibl-bib}
% \loadmarkfile{bibl-tra}

% new bibtex support:

\loadmarkfile{publ-ini}
\loadmarkfile{publ-tra}
\loadmarkfile{publ-xml}
\loadmarkfile{publ-old}

%loadmarkfile{x-xtag}  % no longer preloaded

\loadmarkfile{meta-xml}

\loadmarkfile{cont-log}

% \loadmarkfile{task-ini}

\loadmarkfile{cldf-ver} % verbatim, this can come late
\loadmarkfile{cldf-com} % commands, this can come late

\loadmarkfile{core-ctx} % this order might change but we need to check depedencies / move to another namespace

\loadmarkfile{core-def}

%usemodule[x][res-04] % xml resource libraries
%usemodule[x][res-08] % rlx runtime conversion
%usemodule[x][res-12] % rli external indentification

% now we hook in backend code (needs checking)

\loadmarkfile{back-exp}
\loadmarkfile{back-pdf}

\loadmarkfile{mlib-pdf}
\loadmarkfile{mlib-pps}
\loadmarkfile{meta-pdf}
\loadmarkfile{meta-blb}
\loadmarkfile{grph-epd}

\loadmarkfile{math-inc} % an experiment
\loadmarkfile{publ-inc} % an experiment

\loadmarkfile{task-ini}

\loadmarkfile{syst-cmp} % compatibility stuff moved here

\loadmarkfile{cont-run} % the main runner (used in cont-yes.mkiv)

\setupcurrentlanguage[\defaultlanguagetag]

\prependtoks
    \ctxlua{statistics.starttiming(statistics)}%
\to \everyjob

\appendtoks
    \ctxlua{statistics.stoptiming(statistics)}%
\to \everyjob

% \appendtoks
%     \ctxlua{job.prepare()}%
% \to \everyjob

% \appendtoks
%     \enabletrackers[*]%
% \to \everyjob

\appendtoks
    \ctxlua{statistics.savefmtstatus("\jobname","\contextversion","context.mkiv","\contextbanner")}% can become automatic
\to \everydump

\errorstopmode \dump \endinput

